DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

DOBON.NET

新しいフォームを表示する

ここでは、メインのフォームから別のフォーム(例えば、設定ダイアログなど)を表示させる方法を紹介します。

まず表示したいフォームがまだプロジェクトに追加されていなければ、メニューの「プロジェクト」-「Windowsフォームの追加」などにより、フォームをプロジェクトに追加します。なおここでは"Form2"を追加したとします。

フォームの表示方法には、「モーダル」と「モードレス」の2種類があります。

モーダルフォームとして表示したときは、そのフォームが閉じられない限り、他のフォームの操作ができなくなります。例えば、メモ帳で「ページ設定」ダイアログを表示するとメインのウィンドウが操作できなくなりますが、これは「ページ設定」ダイアログがモーダルで表示されているからです。

一方、モードレスフォームとして表示したときは、そのフォームを閉じなくても他のフォームの操作ができます。例えば、メモ帳で検索を行うと「検索」ダイアログが表示されますが、「検索」ダイアログが表示されていてもメインウィンドウは操作ができます。これは「検索」ダイアログがモードレスで表示されているからです。

ただし、この「検索」ダイアログはちょっと特殊で、メインウィンドウをアクティブにしても「検索」ダイアログがメインウィンドウの下に隠れることはありませんが、通常のモードレスフォームは隠れてしまいます。「検索」ダイアログのように、モードレスフォームを別のフォームの背後に隠れないようにする方法は「モードレスのフォームが、あるフォームの背後に隠れないようにする」で紹介しています。

新しいフォームを表示するとき、通常はモーダルフォームです。モードレスフォームとすべきなのは、ウィンドウが2枚以上あるアプリケーションを作成するときや、検索機能のように、メインフォームも操作できるようにしておく必要がある場合などに限られます。

次の例はForm2をモーダルフォームとして表示したときの例です。

[VB.NET]
'Form2クラスのインスタンスを作成する
Dim f As New Form2()
'Form2を表示する
'ここではモーダルダイアログボックスとして表示する
'オーナーウィンドウにMeを指定する
f.ShowDialog(Me)
'フォームが必要なくなったところで、Disposeを呼び出す
f.Dispose()
[C#]
//Form2クラスのインスタンスを作成する
Form2 f = new Form2();
//Form2を表示する
//ここではモーダルダイアログボックスとして表示する
//オーナーウィンドウにthisを指定する
f.ShowDialog(this);
//フォームが必要なくなったところで、Disposeを呼び出す
f.Dispose();

次の例はForm2をモードレスフォームとして表示したときの例です。

[VB.NET]
'Form2クラスのインスタンスを作成する
Dim f As New Form2()
'Form2を表示する
'ここではモードレスフォームとして表示する
f.Show()
[C#]
//Form2クラスのインスタンスを作成する
Form2 f = new Form2();
//Form2を表示する
//ここではモードレスフォームとして表示する
f.Show();

注意:ShowDialogメソッドによりモーダルフォームとして表示した場合、そのフォームが不要になった時には、Disposeメソッドを呼び出し、リソースを解放します。Showメソッドによりモードレスフォームとして表示した場合には、その必要はありません。

補足:上記の例は、Form2を表示させるフォームと、Form2とが同じ名前空間にあることが前提となっています。別の名前空間にあるときは、Form2を名前空間も指定して表記する必要があります。

ShowDialogメソッドによりフォームがモーダルで表示された場合は、そのフォームが閉じられるまでShowDialogメソッド以降のコードが実行されません。しかし、Showメソッドによりフォームがモードレスで表示された場合は、フォームが表示されるとすぐにShowメソッド以降のコードが実行されます。詳しくは、MSDNの「Windows フォームのモーダルおよびモードレスでの表示」をご覧ください。

モーダルフォームを表示したときは、OKとキャンセルボタンの付いたダイアログを表示させるケースが多いでしょう。このようなダイアログを表示方法は「フォームにOKボタン、キャンセルボタンを付ける」で説明しています。

モードレスフォームを表示していても、メインフォームを閉じてしまうと通常はアプリケーションが終了してしまいます。メインフォームを閉じてもアプリケーションを終了させないようにするには、メインフォームを閉じずにHideメソッドで隠すようにするか、「フォームを連続して表示する」で説明している方法を参考にしてください。

補足:デフォルトでは、サイズ変更できる境界線をもつフォーム(FormBorderStyleプロパティがSizableもしくはSizableToolWindow)をモーダルフォームとして表示させると、フォームの右下にサイズグリップが表示されます。これを消すためには、フォームのSizeGripStyleプロパティをHideにします。

  • 履歴:
  • 2008/9/16 説明を多少書き直す。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。