忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

フォームが閉じるのをキャンセルする方法

フォームが閉じる方法としては、自分のプログラムの中で Close を呼出すか、 またはウインドウの右上に表示された「X」をクリックするか、「Alt + F4」を押下するかになります。

この場合にフォームのイベントとしては FormClosingFormClosed がその順番に発生します。
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

コメント

コメントを書く