フォーム上のどの場所にフォーカスがあるかを取得したい

解決


やまさん  2005-02-14 20:15:20  No: 119606

初心者です。初めての質問なので、言葉足らずな面もあるかと思いますが、どなたか知識のある方がいらっしゃいましたらご教授お願いします。
現在自作アプリを作成中で、フォーム上にファイルメニュー、TreeView、TXTボックス、ボタンなどを配置しております。
ここで、ファイルメニューで「削除」を実行した時に、TreeViewに選択しているアイテムがあればそれを削除する!ということを実行したいのですが、どうもうまくいきません。

If TreeView1.SelectedItem Is Nothing Then
   'TreeViewのノードが選択されていません!のMsgbox表示
Else
   '選択しているノードを削除
   TreeView1.Nodes.Remove (TreeView1.SelectedItem.Index)
End If

上の場合、フォーム上のどこにフォーカスがある場合でも、TreeViewのアイテムがNothingになりません(T_T)[TreeViewのルートが選択されている状態になる]
色々と本やVBサイトを巡って調べているのですがわかりませんでした。
どなたかおわかりの方ご教授お願いいたします。

開発環境
Windows2000 Professional
VisualStudio 6.0

よろしくお願いいたしますm(__)m


やまさん  2005-02-14 20:39:03  No: 119607

ところで、もしかしてFocusの認識が間違ってる?かもしれないと思ったので追記させていただきました。
FocusってのはWindowのアクティブ/非アクティブであるかを判断するものなのかな?TabIndex順にコントロールを行き来するのはカーソル???
だとしたら表現を間違えているので訂正いたします。

...あと、タイトルと内容が微妙に異なっていたのについて説明します。

前に示した通り、フォーム上のどの場所にFocus(カーソル)があっても、TreeViewのアイテムはルートを選択した状態になってしまうので、

①フォーム上のどの場所にFocus(カーソル)があるかを取得
②アクティブなFocus(カーソル)がTreeViewでなければ「削除」の実行はしない。
③アクティブなFocus(カーソル)がTreeViewなら削除を実行

という手法に変えようかと考えていたので、このようなタイトルになってしまいました。無知な者で申し訳ないですが、よろしくおねがいします。<(_ _)>


ささ  2005-02-14 21:38:07  No: 119608

○数字は、機種依存文字なので、使わないようにしましょう。


。。。  2005-02-14 21:49:51  No: 119609

If ActiveControl Is TreeView1 Then
   '選択しているノードを削除
   TreeView1.Nodes.Remove (TreeView1.SelectedItem.Index)
Else
   'TreeViewのノードが選択されていません!のMsgbox表示
End If

と直してみてはどうでしょう。


やまさん  2005-02-14 21:57:24  No: 119610

おぉーーーー!!!
解決しました!!!
。。。さん、どうもありがとうございます。
ActiveControlっていうのがあるのですね。勉強不足でした(T_T;)
大変勉強になりました。早速使わせていただきます。m(_ _)m


特攻隊長まるるう  2005-02-14 22:07:15  No: 119611

Focus と SelectedItem がもともと無関係ですね。

Focus はコントロールが受け取ります。コントロールに含まれる
アイテムが受け取るわけではありません。ですから、フォーカスを
移す SetFocus メソッドは
   コントロール名.SetFocus
であって
   コントロール名.アイテム名.SetFocus
ではありませんよね?これはツリービューに限らず、リストビュー
でもコンボボックスでも同じです。やまさんさんの考え方でいくと
複数アイテム選択できるコントロールだと Focus が2個とか3個に
増える事に!?コントロールが Focus を受け取った時に選択されて
いるアイテムが色つき表示されるだけで、Focus を受け取るのとは
また違います。

…で、
アクティブなコントロールを取得するのは。。。さんの書き込みの
通りなんですが…
>ファイルメニューで「削除」を実行した時に
って時に Focus が移動しちゃってるかも?(^^;)


やまさん  2005-02-14 22:31:21  No: 119612

特攻隊長まるるうさん、Focusについてのコメントありがとうございます。
Focusは各コントロールに一つずつなんですね!ありがとうございます。
今回はツリービューにFocusがあるか否かの判定ができればよかったので
。。。さんからお聞きした「ActiveControl」プロパティで対処可能でした。

ということで、

1:ActiveControlプロパティでTreeViewにFocusがあるか否かを判断

2−1:TreeViewにFocusがなければ(他のコントロールにFocusがある場合)
        →Msgbox表示
2−2:TreeViewにFocusがあれば、当初の通り
        →TreeView1.Nodes.Remove (TreeView1.SelectedItem.Index)
        で削除する。

ことで解決できました。
ありがとうございます。m(_ _)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加