0

非表示の子フォームを閉じて破棄することについて質問があります。

2 つのボタンを持つ親フォーム:

Public Class Form1
    Dim F2 As Form2

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        F2 = New Form2
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        F2.Show()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        F2.Hide()
    End Sub
End Class

子フォーム:

Public Class Form2
    Private Sub Form2_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            e.Cancel = True
            Me.Hide()
    End Sub

    Private Sub Form2_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.VisibleChanged
        MsgBox("Form2.Visible = " & Me.Visible.ToString)
    End Sub

    Private Sub Form2_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
        MsgBox("Form2 has been disposed.")
    End Sub
End Class

Form1 が開いている限り、Form2 を閉じたくありません。その部分が機能します。
しかし、Form1 を閉じたときに Form2 を閉じたいと思います。Form1 から明示的に閉じる必要がありますか? Form2_FormClosing() にさらにロジックを追加しますか?
現状では、Form2_Disposed() が呼び出されることはありません (メッセージ ボックスは表示されません)。これは正しいです?
Form1 が破棄されると、変数 F2 は存在しなくなります。Form2 は後でガベージ コレクターによって破棄されますか?

4

1 に答える 1

1

Form2_FormClosing イベントを Form1 クラスに移動してみます。
このようにして、Form1 インスタンスから Form2 インスタンスのクローズを制御できます。

' global instance flag
Dim globalCloseFlag As Boolean = False

...
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load  
    F2 = New Form2  
    AddHandler F2.FormClosing, New FormClosingEventHandler(AddressOf Form2ClosingHandler)
End Sub  

' This will get the event inside the form1 instance, you can control the close of F2 from here
Private Sub Form2ClosingHandler(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) 
    if globalCloseFlag = false then    
        e.Cancel = True    
        F2.Hide()
    end if

End Sub 

' Form1 closing, call the close of F2
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing      
      globalCloseFlag = True
      F2.Close()
End Sub      

これは一例であることに注意してください。FormClosingEventArgs.CloseReason プロパティを使用して、Windows のシャットダウンなどの特殊なケースを処理する必要があります。

于 2012-05-29T20:16:09.187 に答える