- PR -

ひとつ前のアクティブコントロール名

投稿者投稿内容
くんちん
常連さん
会議室デビュー日: 2002/10/07
投稿数: 46
投稿日時: 2003-02-06 11:00
いつもおせわになっております。
VB.Netでの質問です。よろしくお願い致します。
行いたい内容は下記の通りです。
************************************************
Form上にTextBox(複数)とHelpボタンがあります。
AというTextBoxにフォーカスがあり、その時点で
Helpボタンをクリックもしくは、F1KeyDownでAに関する
ヘルプを表示し、BというTextBoxにフォーカスがあり、その時点で
Helpボタンをクリックもしくは、F1KeyDownでBに関する
ヘルプを表示したいのですが、どうしてもうまくいきません。
************************************************

Helpボタンをクリック・F1Keydown時にAやBのText名
を取得しようとしても、どうやって取得したらよいか
わかりません。
1つ前のアクティブコントロール名を取得とか出来る
方法をご存知の方いらっしゃったらご教授お願い致します。



一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2003-02-06 11:51
FormクラスにはKeyPreviewというプロパティがあります。
これをtrueにすると、コントロールがキーイベントを発生させる前にフォーカスでキーイベントが発生するようです。

これによってフォームでキー入力を受け、F1であればControlsプロパティのそれぞれのFocusedを調べるというのはどうです?
試していないのでできるか分かりませんが。

1つ前のアクティブコントロール名を取得するというのは残念ながら分かりません。
くんちん
常連さん
会議室デビュー日: 2002/10/07
投稿数: 46
投稿日時: 2003-02-07 09:17
一郎さんありがとうございます。
KeyPreviewを使ってどうやればいいのかと
色々と調べてみました。
使用方法が分からなくてどうすればいいのか
困っています。もし、よろしければ、簡単な
例を教えて頂けないでしょうか?
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2003-02-07 10:25
例えばForm1に色々なコントロールが貼り付けてあるとします。

Form1.KeyPreviewをTrueにし、Form1.KeyDownイベントを受けて、

コード:
Public Sub Form1_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles MyBase.KeyDown

Dim ctrl As Control

If e.KeyCode = Keys.F1 Then
For Each ctrl In Me.Controls
If ctrl.Focused Then
'ctrlを使っていろいろな事
End If
Next
End If
End Sub


としてみてください。

余談ですが、VisualStudio開発環境を使ってVB.NETのソースを書いているときに、ctrlにFocusedプロパティがあるにも関わらず無いように見えました。(Ctrl+Spaceキーでの一覧に出てこなかった)
もしかするとつまづいたのはここですか?

C#のソースをいじっているときにはそんなことはないんですが、VB.NETの場合、いろいろ余計なことをしてくれますので、気をつけましょう。

[ メッセージ編集済み 編集者: 一郎 編集日時 2003-02-07 10:30 ]
くんちん
常連さん
会議室デビュー日: 2002/10/07
投稿数: 46
投稿日時: 2003-02-07 11:25
一郎さん本当にありがとうございます。
すごく参考になりました。
結果、下記のようにプログラムをかきました。

Private CtrlNm As String

Public Sub Form1_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles MyBase.KeyDown

If e.KeyCode = Keys.F1 Then
CtrlNm = Me.ActiveControl.Name
End If
End Sub

Private Sub btnFunc_01_MouseMove (ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)Handles btnFunc_01.MouseMove
CtrlNm = Me.ActiveControl.Name
End Sub

ctrlにFocusedプロパティでつまづいたのではなくて、 KeyPreviewをTrueにして
その後、どうしたらよいのかが理解できていませんでした。(どうしようもない悩み
でした)

マウスクリック時にはMouseMoveで、F1等押下時にはFormのKeyDownイベントで対応しました
ありがとうございました。


VB.Netは6.0とだいぶ違うみたいなので、色々と悩んでいます。

cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2003-02-07 11:36
MouseMoveではなくてLeaveの方がよいのではないでしょうか。
くんちん
常連さん
会議室デビュー日: 2002/10/07
投稿数: 46
投稿日時: 2003-02-13 16:57
Move時よりLeave時にする方がよいのですか?
調査します。ありがとうございます。

別の話になるのですが、Inputman.netを使用しているのですが、たまに
Focusがあるのに、目で確認できなくなる事がよくあります。
原因がさっぱりわかりません。。。。
原因は何なのでしょうか。何か入力を行うときちんと、文字が表示されるのですが
文字を入力するまでは、Focusがどこにあるのか、目で確認できない。。。
何かご存知ないでしょうか?
mikan
ベテラン
会議室デビュー日: 2002/08/19
投稿数: 58
投稿日時: 2003-02-13 18:25
こんばんわ、みかんです。

#試さずに言っているので適当に聞き流してもらっても。

「アクティブなTextBox」をGotFocusイベントあたりで覚えておくというのはどうでしょう。
初期状態及び、対象となるTextBox・ヘルプボタン以外がフォーカスを得たときは「なにもなし」を覚えるってことにして。

ボタンがMouseMoveやLeaveで反応するよりはいいような気がしません?

スキルアップ/キャリアアップ(JOB@IT)