2017-08-23 13 views
1

モジュールで 'Handles Me.FormClosing'の代替案を知りたいと思います。モジュールで 'Handles Me.FormClosing'の代わりに

「X」ボタンをクリックすると確認メッセージが表示されるコードを作成しました。問題は、このコードを私が呼び出せる複数のフォームで使用するモジュールに入れる必要がありますが、これを行うときに 'Handles Me.FormClosing'が機能しなくなります。ここで

は、私が使用していたコードです:

Dim newForm as Form = New YourFormClass() 
AddHandler newForm.FormClosing, AddressOf YourModule.Close 

この意志ルートあなたがそのサブ通過するすべてのクローズイベント:新しいフォームを作成するたびに

Private Sub Close(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing 

    Dim result As DialogResult = MessageBox.Show("Are you sure you want to Exit the application?", "Exit", MessageBoxButtons.YesNo) 

    If result = DialogResult.Yes Then 
     FrmLogin.Close() 
    Else 
     e.Cancel = True 
    End If 

End Sub 
+0

[AddHandler]を使用してください(https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/addhandler-statement) – Pikoh

答えて

7

。あなたが関連性のあるものではないことが表示されない限り、Handles Me.Closingを削除してください。

+0

申し訳ありません、私はちょっと新しくコーディングしています。これはどこで入力する必要がありますか? – SwiftWombat

+0

これを –

0

あなたのモジュールにMessageBoxを表示し、「はい」をクリックするとアプリケーションを終了する関数を作成する可能性があります。それ以外の場合はFalseを返します。

Module YourModule 

    Private dontAskAgain As Boolean 
    Public Function AskFormClosing() As Boolean 
     If dontAskAgain = False Then 
      Dim result As DialogResult = MessageBox.Show("Are you sure you want to Exit the application?", "Exit", MessageBoxButtons.YesNo) 

      If result = DialogResult.Yes Then 
       dontAskAgain = True 
       Application.Exit() 
      End If 
     End If 

     Return dontAskAgain 
    End Function 

End Module 

そしてあなただけの機能の反転結果にe.Cancelを設定する必要があります。

Private Sub Close(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing 
    e.Cancel = Not YourModule.AskFormClosing 
End Sub 

あなたが他の人によって提案されたとしてのAddHandlerを使用することを好む場合は、同じ結果につながる次のメソッドを使用することができます。

Module YourModule 

    Public Sub AskFormClosing(sender As Object, e As FormClosingEventArgs) 
     If dontAskAgain = False Then 
      Dim result As DialogResult = MessageBox.Show("Are you sure you want to Exit the application?", "Exit", MessageBoxButtons.YesNo) 

      If result = DialogResult.Yes Then 
       dontAskAgain = True 
       Application.Exit() 
      Else 
       e.Cancel = True 
      End If 
     End If 
    End Sub 

End Module 

そして、このようにハンドラを追加します。

Dim newForm as Form = New YourFormClass() 
AddHandler newForm.FormClosing, AddressOf YourModule.AskFormClosing 

しかし、あなたのメインフォームのためにあなたは、このように、ロードイベントにハンドラを追加する必要があります。

Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    AddHandler Me.FormClosing, AddressOf YourModule.AskFormClosing 
End Sub 
+1

に追加したいフォームを作成しているところでは、このコードはメッセージボックスをポップアップ表示します。ただし、はいをクリックしてもプログラムが終了しない場合は現在のフォーム – SwiftWombat

+0

あなたは書いています:_ "このコードを複数のフォームで使用するモジュールに入れる必要があります" _、他のすべてのフォームからアプリケーション全体を閉じるわけではありません。単純にするには、 'Return True'の前に' End'を置いてください。それはあなたが望むことをするでしょう。しかしこれはもっと残酷な方法です。 – MatSnow

+0

ありがとうございます。質問を正しく言い表せないのは残念です。あなたは助けのヒープだった – SwiftWombat

0

これを試して。

Module YourModule 

    Public Function AskFormClosing() As Boolean 
     Dim result As DialogResult = MessageBox.Show("Are you sure you want to Exit the application?", "Exit", MessageBoxButtons.YesNo) 

     If result = DialogResult.Yes Then 
      Return True 
     Else 
      Return False 
     End If 
    End Function 
End Module 

そして

Private Sub Close(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing 
    If YourModule.AskFormClosing Then 
     Application.Exit 
    Else 
     e.Cancel = True 
    End If 
End Sub 
+0

この方法では、MessageBoxで「いいえ」を押すと閉じがキャンセルされません。 – MatSnow

+0

私はちょうど答えとメソッドを編集しました閉じる –

+0

これは、MessageBoxポップアップを2回行います。そして、それは 'e.Cancel = True'でなければなりません。 – MatSnow

0

ではなく、再利用のためモジュールにこのコードを配置すること、あなたがしたい動作を持つベースFormを作成して検討した:あなたが望むように私は仕事に変更を加えました共有し、他の形式を持ってこのベースからForm(よりむしろSystem.Windows.Forms.Form)を継承します。

マイクロソフトWebサイトのHow to: Inherit Windows Formsを参照してください。

関連する問題