Top / .NET備忘録 / 00.コントロール共通 / 03.Enter, Leave イベント

Enter, Leave イベントの発生するタイミングが、VB6.0 と VB.NET で若干違います。

次のようなコードを書いて、検証してみます。

 Private Sub Command1_Click()
     Debug.Print "Start"
     Text1.SetFocus: Debug.Print "Text1.SetFocus"
     Text2.SetFocus: Debug.Print "Text2.SetFocus"
     Text3.SetFocus: Debug.Print "Text3.SetFocus"
     Debug.Print "End"
 End Sub
 
 Private Sub Text1_GotFocus()
     Debug.Print "Text1_GotFocus"
 End Sub
 
 Private Sub Text1_LostFocus()
     Debug.Print "Text1_LostFocus"
 End Sub
 
 Private Sub Text2_GotFocus()
     Debug.Print "Text2_GotFocus"
 End Sub
 
 Private Sub Text2_LostFocus()
     Debug.Print "Text2_LostFocus"
 End Sub
 
 Private Sub Text3_GotFocus()
     Debug.Print "Text3_GotFocus"
 End Sub
 
 Private Sub Text3_LostFocus()
     Debug.Print "Text3_LostFocus"
 End Sub

結果は、

Start
Text1.SetFocus
Text2.SetFocus
Text3.SetFocus
End
Text1_GotFocus
Text1_LostFocus
Text2_GotFocus
Text2_LostFocus
Text3_GotFocus

SetFocus したタイミングで発生するのではなく、Command1_Click イベントが終了してから、順次発生しています。

.NET の場合、Focus メソッドを実行すると、すぐに発生しているので、同様に処理するには、OnEnter/OnLeave をオーバーライドし、イベントを BeginInvoke します。

このとき、各コントロールで BeginInvoke してしまうと、順番がずれてしまうことがあるので、フォームに対して行います。

 // 順番がずれるので フォームから Invoke する
 private void FormBeginInvoke(Delegate invoker, params object[] args) {
     Form f = base.FindForm();
     if (f != null) {
         f.BeginInvoke(invoker, args);
     } else {
         // フォームが無ければ自身で Invoke
         base.BeginInvoke(invoker, args);
     }
 }
 
 protected override void OnEnter(EventArgs e) {
     Action<EventArgs> invoker = delegate(EventArgs eventArgs) {
         base.OnEnter(eventArgs);
     };
     FormBeginInvoke(invoker, e);
 }
 
 protected override void OnLeave(EventArgs e) {
     Action<EventArgs> invoker = delegate(EventArgs eventArgs) {
         base.OnLeave(eventArgs);
     };
     FormBeginInvoke(invoker, e);
 }



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2015-01-19 (月) 11:31:03 (1007d)