VB.NET Tips - フォームが閉じるのをキャンセルする方法
フォームが閉じる方法としては、自分のプログラムの中で 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イベントへと移ります。
フォームが閉じるのをキャンセルする方法
04 | Private mblnButtonClose As Boolean = False |
09 | Private Sub Button1_Click(sender As Object , e As EventArgs) Handles Button1.Click |
10 | Me .mblnButtonClose = True |
17 | Private Sub frmClose_FormClosing(sender As Object , e As FormClosingEventArgs) Handles Me .FormClosing |
18 | If e.CloseReason = CloseReason.UserClosing Then |
20 | If mblnButtonClose = False Then |
22 | Dim strDsp As String = "ウインドウ右上の[X]または[Alt + F4]で閉じようとしています。" _ |
24 | If MsgBox(strDsp, MsgBoxStyle.YesNo, "クローズテスト" ) = MsgBoxResult.No Then |
35 | Private Sub frmClose_FormClosed(sender As Object , e As FormClosedEventArgs) Handles Me .FormClosed |
以下の画像は、フォーム右上「X」を押下した時の様子です。