モードレスでダイアログ(フォーム)を作った時の動作について
変な挙動のおかげでハマったので、その忘備録として。
環境はExcel2003
問題となる手順は以下のとおり
1)
モードレスで作ったフォーム上にあるテキストボックスにフォーカスをあてる
(カーソルキーをあてて、文字を入力できる状態にする)
2)
別のウィンドウ(アプリケーション)に移動して、再度Excelに戻ってくる
3)
テキストボックスのカーソルキーの表示がなくなる。
この時、Ctrl+C や Enterキーなどは効くので、フォーカス自体は
テキストボックスに存在すると思われるのだが、キー入力は不可。
やっかいなことに、Msgboxなどで子ウィンドウを生成して
戻ってきた場合にも、この現象は発生する。
フォームがアクティブになった時のイベント取得用に
Activateが用意されているので、ここで
SetFocusを読んであげればいいんだ、と思っていたら
ハマった
どうやらUserFormのActiveteがうまく機能していない様子。
この辺の記事
を参考にさせてもらいました。
バージョンによって動作が違うとは、なんとやっかいな
さらにこのSetFocusにも問題が、、、
例えば、UserForm上のどこかをクリックしたときに
テキストボックスにフォーカスを移そうと、
SetForcusを使ってみても、
期待通りの動作にはならない。
こんな感じで、いったん別なコントロールに対して
SetFocusを呼んであげたあと、本命のテキストボックスに対して
SetFocusを呼ぶとうまくいく。
↓
-------------------------------------------------
Private Sub UserForm_Click()
CommandButton.SetFocus
TextBox.SetFocus
End Sub
-------------------------------------------------
なんだコレって感じだなぁ、、、、
ただ、この回避策でも、
結局、タスクバーでExcelを選んだり、
Alt+Tabでウィンドを切り替えたりした場合は
当然、テキストボックスにフォーカスは移らない。
アクティブウィンドウのイベントがトラップできない以上
結局何をやってもダメ
本当の解決策は
Win32API使うか、モーダルで仕様を満足させるか、かな~
しかし、イベントドリブン型のプログラムで、
イベントハンドリングにバージョンごとの違いが存在するって
困った話だよ、ホント
だから
マイク○ソフトのアホめ!
って思うんだよな~(しみじみ)
もう、慣れたけど
P.S.
今回の件で、いろいろ調べるまで、モードレスのことを
ずっと、
モーダレスだと思っていました。