以前の記事「【VB.NET】MDIのアプリケーションを作成する」でMDIフォームの作成について説明した。
今回は、親フォームを閉じる時の注意点について説明する。
【子フォームが表示されていない場合】
・通常のフォーム(MDI以外のフォーム)と同じ。
(特に考慮する必要はない)
【子フォームが表示されている場合】
・子フォームのClosingイベント、及び、Closedイベントが先に実行される。
・子フォームのClosingイベントで「e.Cancel = True」となった場合、親フォームのe.CancelがTrueとなる。
→親フォームが閉じるのをキャンセルする。
上記を考慮してプログラムを作成する必要がある。
サンプルのソリューションは、こちら(MDISample2.zip)からダウンロードできます。
(VB2005で作成しています)
以下、サンプルの説明。
今回は、親フォームを閉じる時の注意点について説明する。
【子フォームが表示されていない場合】
・通常のフォーム(MDI以外のフォーム)と同じ。
(特に考慮する必要はない)
【子フォームが表示されている場合】
・子フォームのClosingイベント、及び、Closedイベントが先に実行される。
・子フォームのClosingイベントで「e.Cancel = True」となった場合、親フォームのe.CancelがTrueとなる。
→親フォームが閉じるのをキャンセルする。
上記を考慮してプログラムを作成する必要がある。
サンプルのソリューションは、こちら(MDISample2.zip)からダウンロードできます。
(VB2005で作成しています)
以下、サンプルの説明。
1.子フォーム(SubForm)クラスにイベントを追加
Public Class SubForm
:
(中略)
:
'子フォームを閉じかどうか確認する
Private Sub SubForm_Closing(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) _
Handles MyBase.Closing
If MessageBox.Show("閉じてもよろしいですか?", "確認", _
MessageBoxButtons.YesNo) <> _
Windows.Forms.DialogResult.Yes Then
e.Cancel = True
End If
End Sub
End Class
2.親フォーム(ContainerForm)クラスにイベントを追加
Public Class MDIContainerForm
Private Sub MDIContainerForm_Closing(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) _
Handles MyBase.Closing
'強制的に終了する場合には、以下の処理を有効化する
'e.Cancel = False
End Sub
End Class
【補足事項】
・イベントの発生順序は、以下の通り。
1.子フォームのClosingイベント
2.子フォームのClosedイベント
3.親フォームのClosingイベント
4.親フォームのClosedイベント
・親フォームのClosingイベントは必ず発生する。
・子フォームのClosingイベントで閉じるのをキャンセルした場合、親フォームを閉じるのもキャンセルされる。
・親フォームを閉じた場合に強制的にフォームを閉じる場合する方法は、以下の通り。
親フォームのClosingイベントで「e.Cansel = False」とする。
(子フォームのイベントが全て完了してから実行されるので、親フォームのイベントで強制的に上書きすれば良い)
※サンプルでは、コメント化しているので、確認する場合は有効化すること。
Public Class SubForm
:
(中略)
:
'子フォームを閉じかどうか確認する
Private Sub SubForm_Closing(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) _
Handles MyBase.Closing
If MessageBox.Show("閉じてもよろしいですか?", "確認", _
MessageBoxButtons.YesNo) <> _
Windows.Forms.DialogResult.Yes Then
e.Cancel = True
End If
End Sub
End Class
2.親フォーム(ContainerForm)クラスにイベントを追加
Public Class MDIContainerForm
Private Sub MDIContainerForm_Closing(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) _
Handles MyBase.Closing
'強制的に終了する場合には、以下の処理を有効化する
'e.Cancel = False
End Sub
End Class
【補足事項】
・イベントの発生順序は、以下の通り。
1.子フォームのClosingイベント
2.子フォームのClosedイベント
3.親フォームのClosingイベント
4.親フォームのClosedイベント
・親フォームのClosingイベントは必ず発生する。
・子フォームのClosingイベントで閉じるのをキャンセルした場合、親フォームを閉じるのもキャンセルされる。
・親フォームを閉じた場合に強制的にフォームを閉じる場合する方法は、以下の通り。
親フォームのClosingイベントで「e.Cansel = False」とする。
(子フォームのイベントが全て完了してから実行されるので、親フォームのイベントで強制的に上書きすれば良い)
※サンプルでは、コメント化しているので、確認する場合は有効化すること。
- カテゴリ:
- VB.NET