- PR -

MDI子フォームで自分自身をアクティブにしたい

投稿者投稿内容
pine
会議室デビュー日: 2004/11/10
投稿数: 10
投稿日時: 2007-06-20 15:56
VS2005でMDIのアプリ開発しています。
あるMDI子フォームがDeactivateイベントを拾ったときに、
その子フォームの状態応じて、自分自身を再度アクティブに
したいのですがうまくいきません。
VB6では、
  Me.SetFocus
でうまくいっていたのですが、VB.NETでは
  Me.Focus()
してもフォーカスが自分には戻ってきません。
どうすればいいでしょうか?
親フォームにアクティブにしてほしいといった依頼を掛ける
ようなことをしないといけないのでしょうか?
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-06-20 16:04
まんまのActivateメソッド
pine
会議室デビュー日: 2004/11/10
投稿数: 10
投稿日時: 2007-06-20 17:08
Activateメソッドでもだめです。

何かほかにありませんか?
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2007-06-20 17:28
引用:

Activateメソッドでもだめです。


MSDNのActivateメソッドから引用
引用:

フォームがマルチ ドキュメント インターフェイス (MDI) アプリケーションのフォームである場合に、アプリケーション内でアクティブなフォームを決定するには、ActiveForm プロパティまたは ActiveMdiChild プロパティを使用します。


というわけで、親フォームのMDIChildActivateイベントでごにょごにょしてみてください。
pine
会議室デビュー日: 2004/11/10
投稿数: 10
投稿日時: 2007-06-20 20:31
親フォームのMDIChildActivateイベント内で子フォームがアクティブになったことを
イベントでキャッチし、直前にアクティブだったフォームが該当するフォームのとき
に、そのフォームをActivateしてやればとりあえずいけるのですが、別の子フォームを
マウスクリックしたとき、そのクリックしたフォームがもう一度Activeになってしまい
結果、該当する子フォームのDeactivateイベントが2回入ってきてしまいます。

何か妙案は無いでしょうか?

ちなみにWindowリストから別のフォームを選択したときは1回しか入ってきません。
なんかTreeViewにしろFormにしろ、マウスクリックしたとき2回入ってきてしまう
ような感じです。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2007-06-21 17:38
いろいろ試しましたが困難なようです。
まず要求を実現するには、
きっかけ(あるウィンドウがアクティブになる)から派生するイベント(ウィンドウメッセージ)の一連の流れが
すべて終わってから処理をする必要があります。
今回の場合の困難な原因はイベントの対象(ウィンドウ)が一つではないことです。
おっしゃるようにイベントがイベントを呼び、最悪イベントの無限連鎖が発生します。

したがってポイントは事象がすべて終わったタイミングを知ることですが
標準のイベント(Framework)では無理ではないかと思います。
標準でできないならウィンドウメッセージで判断(WndProc)する方法を模索することになりますが
結局、「一連のメッセージ群が終わったタイミング」、
つまり「最後のメッセージは何か」を知る必要があります。
これについてはそういうものがあるか無いかを含めて調べなくてはなりません。

代替案としては、そのフォーカスを維持する条件があらかじめわかっているなら
他の子フォームを非表示にしておくというのが思いつきます。
#それがMDI子フォームの一部という性質のものなのかという根本の疑問はありますが。

あと半分冗談で書きますが、非同期タイマを仕掛けるという手もあります。
#一連のイベントが終わったと判断できる時間後にフォーカスを設定する。
ただし、「何秒後」が長ければ精度は上がりますが、UIレスポンスも遅くなり変な感じになります。
pine
会議室デビュー日: 2004/11/10
投稿数: 10
投稿日時: 2007-06-21 18:59
引用:

まどかさんの書き込み (2007-06-21 17:38) より:
いろいろ試しましたが困難なようです。



丁寧なご対応ありがとうございます。あれから、GotFocusやLostFocusなどのイベントで処理できないか確認していたのですが、無理のようですね。あきらめました。

VB6ではMe.SetFocusで簡単に実現できていたのですが、むしろVB6のほうが特殊だったということなのでしょうね。
ダッチ
大ベテラン
会議室デビュー日: 2005/10/31
投稿数: 113
投稿日時: 2007-06-21 22:18
pine さん、こんにちは
ダッチです。

「子フォームの状態に応じて」ということですので、その子フォームの Validating イベント でアクティブ状態を解除したくないのであれば、イベントをキャンセルしてしまうというのは、どうでしょうか。

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