0

このアプリをVB6から変換しました。私は2つのフォームを持っています。Form1 は、メニュー項目を介して Form2 をインスタンス化します。閉じる (X) をクリックしたときに Form2 を終了させるのに問題があります。Form2 が「アイドル」の場合、正常に閉じます。しかし、何かを処理しているループにいる場合、すべてのイベントが発生しますが、Form2 で処理を続けます。Dispose、Close、Application.Exit、Application.ExitThreadをいじってみました。私の最後の試みは、Form1 に戻って Form2 を破棄する独自のイベントを作成することでした。契約は何ですか?ところで、Show vs ShowDialog だけを使用すると、Form2 が点滅して消えます。

Form1 does this
Dim f2 as Import
:
        Hide()
        f2 = New Import
        AddHandler f2.die, AddressOf killf2
        f2.ShowDialog(Me)
        Show()

Private Sub killf2()
        f2.Dispose()
        f2 = Nothing
End Sub

Form2

Public Event die()
Private Shadows Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        Dispose()
        Close()
        e.Cancel = False
        RaiseEvent die()
End Sub
4

2 に答える 2

0

あなたが話すこのループは何ですか?ユーザーインターフェイス(Windows)は、実行中のコードとは別のものです。クラス派生フォームフォームでは、フォームが作成される前とフォームが破棄された後の両方で、コードの実行が許可されます。コードがユーザーインターフェイスオブジェクトにアクセスしようとすると、例外が発生する可能性がありますが、それ以外の場合は、ユーザーインターフェイスがないときにコードの実行を停止することはできません。

「for」ループを終了させたい場合は、ブール値の「quit」メンバー変数を作成するなどして、何らかの方法でシグナルを送信する必要があります。フォームが閉じたら「quit=True」を設定し、「for」ループでそれがtrueかどうかを確認します。

于 2010-12-06T18:36:15.907 に答える
0

私はあなたのイベントが交差していると思います。form2 のインスタンスを含む form1 が、form2 の form_closing イベントをリッスンするようにします。次に、f2 = 何も設定できません。

Form1 は Form2 を完全に囲む必要があります。

例を次に示します。

Public Class MDIMain
    Private WithEvents _child As frmViewChild

    Friend Sub viewChildShow()
        _child = New frmViewChild
        _child.MdiParent = Me
        _child.WindowState = FormWindowState.Maximized
        _child.Show()
    End Sub

    Private Sub _child_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles _child.FormClosing
        _child = Nothing
    End Sub

form2 には何も追加しないでください。

Dim f2 as Import
        Hide()
        f2 = New Import
        f2.ShowDialog(Me)
        Show()

Private Sub f2_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles f2.FormClosing
        set f2 = nothing
End Sub

re: あなたのコメント は、form2 に戻り、クリック イベント ハンドラーで次のステートメントの処理を続行します。

これは機能であり、この動作を引き起こします。me.close または close me が form2 の最後のステートメントであり、実行するものが他にないことを確認する必要があります。

于 2010-11-04T20:27:46.003 に答える