none
モーダルフォームで呼び出し元フォームがアクティブ化してしまう件について RRS feed

  • 質問

  • 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がもう一つ表示される状態になり困っています。

    この現象を回避する方法はありますでしょうか?

    2010年3月16日 4:39

回答

  • 外池です。私の手元の環境はVS2005のVBですが、同様の現象は確認できました。

    回避方法は、対症療法的になってしまうのと、私の好みも入ってしまって、申し訳ありませんが、

    1)form2とform3のShowInTaskbarをFalseにする。

    2)ShowDialogの前にMe.Enabled=False、後にMe.Enabled=Trueを追加する。

    どちらかのように思います。

    2)にすると、二つ目のForm3が表示されることは防げますが、Form2がActiveになることは防げません。私なら1)選ぶと思います。
    (ホームページを再開しました)
    2010年3月16日 7:12
  • 外池です。

    form3を表示する、他のform派生クラスが沢山あるということですね。できれば、form3側から表示しようとした元のformを制御できれば良いのだな、と考えてみたら、できそうですよ。

    ShowDialog(Me)として表示してやれば、表示させられた側のform派生クラスのOwnerプロパティーは、表示した側のform派生クラスのオブジェクトを指します。

    ですので、form3を表示するときには、form3Object.ShowDialog(Me)としてやって、form3側でMe.Owner.Enabledをいじってやればよいわけです。

    form3のVisibleChangedイベントが、いじるタイミングとして良さそうです。
    (ホームページを再開しました)
    2010年3月17日 0:47

すべての返信

  • 外池と申します。いじわるな物言いで申し訳ないのですが・・・、

    >プログラムはform1から始まり、
    >form1上のボタンをクリックするとform2をShowDialogで表示し、
    >form2上のボタンをクリックするとform3をShowDialogで表示するようなプログラムです。

    で、どのようにプログラムされたか、また、ご紹介頂いているような動作になることも理解できました。

    では、どのような動作をご希望なんでしょうか? これをご説明頂いた方が、より素早くレスがつくと思います。


    (ホームページを再開しました)
    2010年3月16日 6:01
  • 外池さま

    返信ありがとうございます。

    form3をShowDialogで表示してますので、
    form2をアクティブ化しないで欲しいというのが一番の希望です。

    最悪、form2のボタンクリックイベントが走らないようにするだけでも構いません。
    2010年3月16日 6:29
  • 外池です。私の手元の環境はVS2005のVBですが、同様の現象は確認できました。

    回避方法は、対症療法的になってしまうのと、私の好みも入ってしまって、申し訳ありませんが、

    1)form2とform3のShowInTaskbarをFalseにする。

    2)ShowDialogの前にMe.Enabled=False、後にMe.Enabled=Trueを追加する。

    どちらかのように思います。

    2)にすると、二つ目のForm3が表示されることは防げますが、Form2がActiveになることは防げません。私なら1)選ぶと思います。
    (ホームページを再開しました)
    2010年3月16日 7:12
  • 外池さま

    やはりそういう対応になってしまいますか。

    2)の方法は私のほうでも存じ上げていたのですが、
    form3は他のいくつものフォームでも使用していますので、
    何かうまい方法はないかと考えていたのですが...

    2)の方法ですべてのフォームに制御を入れる方向で考えたいと思います。

    ありがとうございました。



    2010年3月17日 0:18
  • 外池です。

    form3を表示する、他のform派生クラスが沢山あるということですね。できれば、form3側から表示しようとした元のformを制御できれば良いのだな、と考えてみたら、できそうですよ。

    ShowDialog(Me)として表示してやれば、表示させられた側のform派生クラスのOwnerプロパティーは、表示した側のform派生クラスのオブジェクトを指します。

    ですので、form3を表示するときには、form3Object.ShowDialog(Me)としてやって、form3側でMe.Owner.Enabledをいじってやればよいわけです。

    form3のVisibleChangedイベントが、いじるタイミングとして良さそうです。
    (ホームページを再開しました)
    2010年3月17日 0:47
  • 試してみたら Form3 の替わりに MessageBox.Show だと問題ないですね。。
    2010年3月17日 0:48
  • 外池さま

    >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が関係しているのかな?
    ますます原因がわからなくなりました。

    2010年3月17日 7:13