OrangeMaker_logo
memo アイコン C# - .net 備忘録

mfcプログラマからみたC#や.netに関するメモです。
(記載内容について正しいことを保証するものではありません。MSDN等で確認してください)

モーダルダイアログを作る

ダイアログアプリで設定ボタンを押下すると、設定画面を呼び出してOK,Canselで終了する定番の処理を考えてみる。

デザイナーでWindowsフォームをプロジェクトに追加します。今度のフォームのStartPositionプロパティはCenterParentに設定します。

ここにボタンを2個張り付けて、それぞれキャプションをOKとキャンセルに設定します。さらにボタンのDialogプロパティをそれぞれOKとCanselに設定します。

次に、ボタンハンドラにthis.Close()をコードとして追加します。

元のフォームには、ボタンを1個追加してこのボタンはキャプションを「設定」としてハンドラコードを次のようにします。

	Form2 dlg = new Form2();
	dlg.ShowDialog(this);
	if (dlg.DialogResult == DialogResult.OK)
	{
		MessageBox.Show("OKでダイアログは終了しました");
	}
	else
	{
		MessageBox.Show("Canselでダイアログは終了しました。");
	}
	dlg.Dispose();
		

2行目のdlg.ShowDialog(this)が今回のキーワードでこれで、mfc的にはDoModal()に相当する部分です。

ボタンのチェックは、DialogResultを調べることで終了方法をチェックします。

最後のdlg.Dispose()でダイアログウィンドウのリソースを破棄します。

このあたりは、.net的なお作法となります。.netではオブジェクトは参照が無くなった時点でオブジェクトは破棄されますが、実際の破棄動作はガベージコレクションのタイミングとなるので、参照がなくなってからタイムラグがあります。ウィンドウリソースの破棄などは明示的にDispose()をよんで破棄する必要があります。C++ではデストラクタでリソースの破棄を行うのは定番ですがC#ではデストラクタが実行されるタイミングがあいまいなのでデストラクタでの処理は慎重に考える必要があります。(というかデストラクタで何か処理をするということを考えない方がいいと思います)

設定ダイアログ1 呼び出す側のウィンドウです。
設定ボタンを押下するとForm2を呼び出します。
設定ダイアログ2 Form1から呼び出されて表示します。OK・キャンセルボタンで終了します。