2

次のことを行うボタンを設定しようとしています。

  1. フォームが開いている (そしてフォーカスを失っている) かどうかを確認します。もしそうなら、それはそのフォームを前面に持ってきます。
  2. そうでない場合は、フォームの新しいインスタンスを開きます。

ただし、いくつかの異なる方法を試してみましたが、常に新しいフォームを作成するか (チェックとして frm_About.visible を使用する場合)、単に何もしません (次のコードを使用)。

Private Sub counter_aboutClick(sender As Object, e As EventArgs) Handles counter_About.Click
    If Application.OpenForms().OfType(Of frm_About).Any Then
        frm_About.BringToFront()
    Else
        Dim oAbout As frm_About
        oAbout = New frm_About()
        oAbout.Show()
        oAbout = Nothing
    End If
End Sub

特定のシナリオで BringToFront にバグがあると聞きましたが、そのバグに該当するのでしょうか?

4

1 に答える 1

4

VB.Net はひどいことをし、フォームの既定のインスタンスを作成します (クラス名で参照できます)。これは際限のない混乱と頭痛の種を生み出します - デフォルトのインスタンスを読むことをお勧めします (Google は読むべきものがたくさんあるはずです)

この場合、 という名前のクラスとfrm_About、そのフォームのデフォルトのインスタンス ( とも呼ばれる) がありfrm_Aboutます。タイプの新しいフォームを作成した場合frm_About、次のコード

If Application.OpenForms().OfType(Of frm_About).Any Then
    frm_About.BringToFront()

開いているフォームを検索してタイプのフォームを探し、frm_About見つかった場合は、のデフォルトのインスタンスを前面に表示しようとしますfrm_About-開いているフォームはデフォルトではない可能性があることに注意してください(あなたの場合は可能性が高いです)インスタンスですが、 で作成されたすべてのインスタンスNew frm_About()

フォームの実際のインスタンスを見つけるには、次のようにする必要があります。

For Each openForm In Application.OpenForms()
    If TypeOf (openForm) Is frm_About Then _
                                   CType(openForm, frm_About).BringToFront()
Next
于 2013-07-30T14:09:38.330 に答える