トップ回答者
モーダルフォームで呼び出し元フォームがアクティブ化してしまう件について

質問
-
VB2008 SP1で開発してます。
プロジェクトにはフォームが3つあります。
それぞれをform1、form2、form3とし、
form1、form2にはそれぞれボタンが1ずつあります。
プログラムはform1から始まり、
form1上のボタンをクリックするとform2をShowDialogで表示し、
form2上のボタンをクリックするとform3をShowDialogで表示するようなプログラムです。
このようにform1、form2、form3の順に表示した状態だと、
マウスで操作しようとしても当然form1、form2はアクティブ化しません。
しかし、タスクバーにあるform2をクリックすると
form2がアクティブ化してしまいます。
その状態でマウスで操作しようとしてもform3がアクティブ化し操作はできないのですが、
Enterキーを押下するとform2上のボタンのクリックイベントが走ってしまい、
form3がもう一つ表示される状態になり困っています。
この現象を回避する方法はありますでしょうか?
回答
-
外池です。私の手元の環境はVS2005のVBですが、同様の現象は確認できました。
回避方法は、対症療法的になってしまうのと、私の好みも入ってしまって、申し訳ありませんが、
1)form2とform3のShowInTaskbarをFalseにする。
2)ShowDialogの前にMe.Enabled=False、後にMe.Enabled=Trueを追加する。
どちらかのように思います。
2)にすると、二つ目のForm3が表示されることは防げますが、Form2がActiveになることは防げません。私なら1)選ぶと思います。
(ホームページを再開しました)- 回答としてマーク 高橋 春樹 2010年3月30日 6:37
-
外池です。
form3を表示する、他のform派生クラスが沢山あるということですね。できれば、form3側から表示しようとした元のformを制御できれば良いのだな、と考えてみたら、できそうですよ。
ShowDialog(Me)として表示してやれば、表示させられた側のform派生クラスのOwnerプロパティーは、表示した側のform派生クラスのオブジェクトを指します。
ですので、form3を表示するときには、form3Object.ShowDialog(Me)としてやって、form3側でMe.Owner.Enabledをいじってやればよいわけです。
form3のVisibleChangedイベントが、いじるタイミングとして良さそうです。
(ホームページを再開しました)- 回答としてマーク 高橋 春樹 2010年3月30日 6:37
すべての返信
-
外池です。私の手元の環境はVS2005のVBですが、同様の現象は確認できました。
回避方法は、対症療法的になってしまうのと、私の好みも入ってしまって、申し訳ありませんが、
1)form2とform3のShowInTaskbarをFalseにする。
2)ShowDialogの前にMe.Enabled=False、後にMe.Enabled=Trueを追加する。
どちらかのように思います。
2)にすると、二つ目のForm3が表示されることは防げますが、Form2がActiveになることは防げません。私なら1)選ぶと思います。
(ホームページを再開しました)- 回答としてマーク 高橋 春樹 2010年3月30日 6:37
-
外池です。
form3を表示する、他のform派生クラスが沢山あるということですね。できれば、form3側から表示しようとした元のformを制御できれば良いのだな、と考えてみたら、できそうですよ。
ShowDialog(Me)として表示してやれば、表示させられた側のform派生クラスのOwnerプロパティーは、表示した側のform派生クラスのオブジェクトを指します。
ですので、form3を表示するときには、form3Object.ShowDialog(Me)としてやって、form3側でMe.Owner.Enabledをいじってやればよいわけです。
form3のVisibleChangedイベントが、いじるタイミングとして良さそうです。
(ホームページを再開しました)- 回答としてマーク 高橋 春樹 2010年3月30日 6:37
-
外池さま
>ShowDialog(Me)として表示してやれば、表示させられた側のform派生クラスのOwnerプロパティーは、表示した側のform派生クラス のオブジェクトを指します。
>ですので、form3を表示するときには、form3Object.ShowDialog(Me)としてやって、form3側で Me.Owner.Enabledをいじってやればよいわけです。
→なるほど、早速form3に以下のコードを追加したらform2のボタンクリックイベントが発生しないことを確認しました。
これだとform3の修正だけで済みそうです。
ありがとうございます。
Public Class Form3 Private Sub Form3_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.VisibleChanged If Me.Visible Then Me.Owner.Enabled = False Else Me.Owner.Enabled = True End If End Sub End Class
anningoさま
>試してみたら Form3 の替わりに MessageBox.Show だと問題ないですね。。
→確かにMessageBox.Showだと問題ないですね。
form3のShowInTaskbarがFalseだと発生しないようです。
あと、追加情報です。
いろいろ試していたのですが、
form1からform2をShowDialogで表示するときに
以下のようにform1を非表示にすると現象は発生しなくなりました。
Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Hide() Using f As New Form2 f.ShowDialog() End Using Me.Show() End Sub End Class
しかし、このf.ShowDialogのところを、f.ShowDialog(Me)としてform1のインスタンスをownerとすると
この現象が発生し、form2がアクティブ化してしまいます。
form2がアクティブ化するのはform1が関係しているのかな?
ますます原因がわからなくなりました。