プロが教えるわが家の防犯対策術!

こんにちは。

XP(SP2),VB6(SP6)で
親フォーム -> 子ダイアログ -> 孫ダイアログを表示する処理を作成し実行すると、
子ダイアログを閉じた際、親フォームが他のアプリケーションの下
にもぐってしまいます。
(例えばメモ帳上で実行して、子ダイアログを閉じた時にメモ帳の下に隠れてしまう、デバッグ時ならばVBの下に隠れる)

孫ダイアログを表示させずに、子を閉じるとこの様に減少は起こりません。

なぜこの様になるのでしょうか?
又、回避策はあるでしょうか?ご存じの方、教えてください。

以下、現象再現用のテストプログラムです。

親フォーム
Private Sub Command1_Click()
dlg1.Show vbModeless, Me
End Sub

子ダイアログ(dlg1)
Private Sub Command1_Click()
dlg2.Show vbModal, Me
End Sub
Private Sub CancelButton_Click()
Unload Me
End Sub

孫ダイアログ(dlg2)
Private Sub CancelButton_Click()
Unload Me
End Sub

A 回答 (1件)

親子関係ではなく モードレスかモーダルかの違いだと思いますよ



モーダルの場合(子から孫)は孫を閉じない限り子は操作ができません
モードレスの場合(親から子)は子を閉じなくても親の操作が可能です
モードレスの場合はプログラムの組み方によっては複数の子の生成も可能です

親 > 子 > 孫 が常に1つしか存在しないのなら
親で子を生成する際のコードを モードレスにしてみてはいかがでしょう

'親フォーム
Private Sub Command1_Click()
  dlg1.Show vbModal, Me
End Sub
といった具合で …

どーしてもモードレスにしなければいけないのであれば
WinAPIの AttachThreadInputとSetForgroundWindowなど組み合わせて
前面への移行処理が必要になると思います
# AttachThreadInputには ThreadIdが必要になるので
# 現在の最前面のウィンドウハンドルなどから取得する必要が出てきます
# AttachThreadInput 最前面 などキーワードに検索してみましょう

この回答への補足

子ダイアログは複数表示が必要のためモードレスとし、
newを使用して表示しています。

補足日時:2009/07/27 23:26
    • good
    • 0
この回答へのお礼

今回の動作については子ダイアログUnload時に
親Windowにフォーカスを当てることで回避できました。
何故、下にもぐるのかはわからずじまいでしたが・・・

AttachThreadInputは知らなかったため、
参考になりました、ありがとうございます。

お礼日時:2009/07/27 23:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!