フォームが閉じる方法としては、自分のプログラムの中で Close を呼出すか、 またはウインドウの右上に表示された「X」をクリックするか、「Alt + F4」を押下するかになります。
この場合にフォームのイベントとしては FormClosing と FormClosed がその順番に発生します。
FormClosing は呼び出された関数の引数として FormClosingEventArgs を持ち、 その中のプロパティである CloseReason を調べることで、閉じられた原因が分かります。
MSDNの説明によれば以下の様になっています。
FormClosingEventArgsについて
・CloseReason :フォームの終了理由を示す値 ApplicationExitCall :Application.Exitによる FormOwnerClosing :所有側のフォームが閉じられようとしている MdiFormClosing :MDIの親フォームが閉じられようとしている TaskManagerClosing :タスクマネージャによる UserClosing :ユーザーインターフェイスによる WindowsShutDown :OSのシャットダウンによる None :未知の理由 ・Cancel:イベントをキャンセルする必要があるかどうかを示す値を設定します。 True :フォームを閉じない False :フォームを閉じる
以下のソースは、フォームの中に「ボタンでのクローズ指示フラグ」を宣言し、 ボタン押下時にはそのフラグをONして自分のフォームを Close しています。
フォーム右上「X」を押下したり、「Alt+F4」でウインドウを閉じる時にも フォームFormClosingイベントが発生しますが、ボタンでのクローズなのかを上記のフラグで区別しています。
フォームFormClosingイベントで CloseReason.UserClosing の場合しか処理しない様にしていますので、 その他のシャットダウン時等のクローズでは、素通りとなり、次のフォームFormClosedイベントへと移ります。
フォームが閉じるのをキャンセルする方法
Public Class frmClose 'ボタンでのクローズ指示フラグ Private mblnButtonClose As Boolean = False '''''' ボタンクリックイベント ''' Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Me.mblnButtonClose = True Me.Close() End Sub '''''' フォームFormClosingイベント ''' Private Sub frmClose_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing If e.CloseReason = CloseReason.UserClosing Then 'ボタンでのクローズかチェック If mblnButtonClose = False Then 'ボタンでは無い場合 Dim strDsp As String = "ウインドウ右上の[X]または[Alt + F4]で閉じようとしています。" _ & vbCrLf & "よろしいですか?" If MsgBox(strDsp, MsgBoxStyle.YesNo, "クローズテスト") = MsgBoxResult.No Then '「いいえ」⇒閉じるのを止める e.Cancel = True End If End If End If End Sub '''''' フォームFormClosedイベント ''' Private Sub frmClose_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed 'ここで通常はオブジェクトの廃棄等を行う End Sub End Class
以下の画像は、フォーム右上「X」を押下した時の様子です。
関連する記事
⇒フォームの位置設定を行う処理 :[Screen.PrimaryScreen.WorkingArea]⇒フォームクラスにプロパティ宣言し外からアクセスする方法
⇒親フォームのコントロールを子フォームからアクセスする方法
⇒フォームが閉じるのをキャンセルする方法:[FormClosingEventArgs,Cancel]
⇒フォームの表示をモジュールのMain関数から行う(エントリポイントの変更)
⇒フォームがKeyDownなどのキーイベントを受取り、ファンクションキー処理をする
⇒最初のフォームActivatedイベントでの処理(1回のみしか処理しない様にする)
⇒初回のフォームActivatedイベント発生させるフォーム継承について
PR
コメント