ここでは、メインのフォームから別のフォーム(例えば、設定ダイアログなど)を表示させる方法を紹介します。
まず表示したいフォームがまだプロジェクトに追加されていなければ、メニューの「プロジェクト」-「Windowsフォームの追加」などにより、フォームをプロジェクトに追加します。なおここでは"Form2"を追加したとします。
フォームの表示方法には、「モーダル」と「モードレス」の2種類があります。
モーダルフォームとして表示したときは、そのフォームが閉じられない限り、他のフォームの操作ができなくなります。多くのアプリケーションでは、設定を変更するダイアログを表示するとメインのウィンドウズは操作できなくなります(例えば、Visual Studioのメニューの「ツール」-「オプション」で、オプションダイアログを表示して確認してみてください)。これは、設定ダイアログがモーダルで表示されているからです。
一方、モードレスフォームとして表示したときは、そのフォームを閉じなくても他のフォームの操作ができます。例えばペイントソフトでは、キャンバスとなるメインのウィンドウの他に、筆や消しゴムなどのツールを選ぶウィンドウや、色を選ぶパレットとなるウィンドウが別のウィンドウとして表示されていることがあります。これらのウィンドウは、モードレスとして表示します。
新しいフォームを表示するとき、通常はモーダルフォームとして表示します。モードレスフォームとすべきなのは、ウィンドウが2枚以上あるアプリケーションを作成するときや、検索機能のように、メインフォームも操作できるようにしておく必要がある場合などに限られます。
補足:Visual Studioの検索ダイアログもそうですが、検索ダイアログはモードレスフォームでありながら、メインウィンドウの下に隠れることがありません。このように、モードレスフォームを別のフォームの背後に隠れないようにする方法は、「モードレスのフォームが、あるフォームの背後に隠れないようにする」で説明しています。
次の例はForm2をモーダルフォームとして表示したときの例です。
'Form2クラスのインスタンスを作成する Dim f As New Form2() 'Form2を表示する 'ここではモーダルダイアログボックスとして表示する 'オーナーウィンドウにMeを指定する f.ShowDialog(Me) 'フォームが必要なくなったところで、Disposeを呼び出す f.Dispose()
//Form2クラスのインスタンスを作成する Form2 f = new Form2(); //Form2を表示する //ここではモーダルダイアログボックスとして表示する //オーナーウィンドウにthisを指定する f.ShowDialog(this); //フォームが必要なくなったところで、Disposeを呼び出す f.Dispose();
次の例はForm2をモードレスフォームとして表示したときの例です。
'Form2クラスのインスタンスを作成する Dim f As New Form2() 'Form2を表示する 'ここではモードレスフォームとして表示する f.Show()
//Form2クラスのインスタンスを作成する Form2 f = new Form2(); //Form2を表示する //ここではモードレスフォームとして表示する f.Show();
ShowDialogメソッドによりモーダルフォームとして表示した場合は、そのフォームが不要になった時にDisposeメソッドを呼び出し、リソースを解放しなければならない点に注意してください。しかし、Showメソッドによりモードレスフォームとして表示した場合には、その必要がありません。
ShowDialogメソッドによりフォームがモーダルで表示された場合は、そのフォームが閉じられるまでShowDialogメソッド以降のコードが実行されません。しかし、Showメソッドによりフォームがモードレスで表示された場合は、フォームが表示されるとすぐにShowメソッド以降のコードが実行されます。
モードレスフォームを表示したときは、通常メインフォームを閉じるとアプリケーションが終了します。なお、メインフォームを閉じてもアプリケーションを終了させないようにするには、メインフォームを閉じずにHideメソッドで隠すか、「フォームを連続して表示する」で説明している方法をご使用ください。
補足:モーダルフォームを表示したときは、「OK」と「キャンセル」ボタンの付いたダイアログを表示させるケースが多いでしょう。このようなダイアログを表示方法は「フォームにOKボタン、キャンセルボタンを付ける」で説明します。
補足:上のコードでは、Form2を表示させるフォームと、Form2とが同じ名前空間にあることが前提となっています。別の名前空間にあるときは、Form2を名前空間も指定して表記する必要があります。