Page2Windowsフォーム・アプリケーションを作成するときに、単一のフォームですべての機能が実装できるとは限らない。使いやすいデザインを目指した結果、メイン・フォームのほかに、設定フォームなどのサブフォームが必要になる場合も多いだろう。複数のフォームを使った場合、フォーム間のデザイン上の関連性の考慮も必要だし、フォーム間でどのように情報を共有するかの考慮も必要だ。ガイドライン」の「ガイドライン」−「ウィンドウ」−「ウィンドウの管理」に記述がある。複数フォームを使うときにポイントになる内容を、何点かピックアップしてみよう。●ウィンドウの初期表示位置Windowsフォームの初期表示位置は、一般的に、スクリーンの左上を起点としてだんだんと右下にずらしていく。マルチディスプレイの場合は、使用中のアプリケーション(=アクティブ・アプリケーション)の初期表示位置はアクティブ・スクリーンに、それ以外のアプリケーションはそれぞれが位置するディスプレイに表示するのが一般的だ。ウィンドウの初期表示位置.NETでFormクラス(System.Windows.Forms名前空間)のShowメソッドを使ってWindowsフォームを表示する場合、StartPositionプロパティを「WindowsDefaultLocaltion」にしておけば、図1のようにウィンドウの初期表示位置を左上から右下にずらしながら表示してくれる。フォームなど、現在のフォームに関連した補助画面(子フォーム)を表示するときには、親フォームの中央に表示する。このガイドラインを守るためには、呼び出し元のフォーム(=親フォーム)でShowメソッドやShowDialogメソッド使うときに、それらのメソッドのパラメータに自フォームを指定する。これによって、親子関係を明確にする。呼び出される子フォームのStartPositionプロパティには、「CenterParent」を指定する。●ウィンドウのZ順序(Z-order)ガイドラインによれば、「親フォームよりも前面に子フォームを表示する」とある。FormクラスのShowメソッドやShowDialogメソッドを使えば、親フォームよりも前面に子フォームが表示される。■Windowsフォーム表示の基本Windowsフォームの表示方法には「モーダル表示」と「モードレス表示」がある。モーダル表示は、表示したフォームを閉じるまでは表示元の処理は進まないUI(ユーザー・インターフェイス)となる。モードレス表示は、表示元の処理も進むため、1つのアプリの中で複数のフォームを並行して使用するようなUIとなる。●モーダル表示Windowsフォームをモーダル表示するには、New演算子を使って、表示したいフォームのクラス(下記のコードでは「Sub_Form」)からオブジェクトを生成して、そのShowDialogメソッドを実行する。モーダル表示するコード例(上:VB、下:C#)モーダル表示は、現在使用しているフォームに必要な副次的な情報を入力したり、操作に伴う処理内容を確認してから処理を継続したいときの確認メッセージを表示したりするときに使用する。ShowDialogメソッドを実行すれば子フォームに制御が移り、閉じればShowDialogメソッドの次の行に制御が戻ってくる。サブルーチン的な動きになるため、プログラムの動きも理解しやすい。●モードレス表示Windowsフォームをモードレス表示するには、表示したいフォームのクラスからオブジェクトを生成して、そのShowメソッドを実行する。これは、先ほどのShowDialogメソッドの実行と同じ手順である。リスト2に示すように、リスト1のShowDialogメソッドをShowメソッドに変えただけでは、Showメソッドでフォームを表示した直後にUsingブロックが終了しているので、_form変数に設定したフォーム・オブジェクトが破棄され、表示したフォームが自動的に終了してしまう。モードレス表示の失敗コード例(上:VB、下:C#)このような事態を回避するためには、リスト3のように、フォーム・オブジェクト変数を工夫する。Showメソッドで表示したフォームを閉じるには、そのフォーム・オブジェクトのCloseメソッドを呼び出せばよい。モードレス表示するコード例(上:VB、下:C#)リスト3の特徴は、モードレス表示したフォーム・オブジェクトをListジェネリック・クラス(「SubFormList」変数)で管理しているところだ。リスト4で示すように、Listジェネリック・クラスでフォーム・オブジェクトを管理せず、オブジェクト変数で管理したらどうなるだろうか。ダングリング・ポインタが発生する問題コード(上:VB、下:C#)Dangling_Button_Clickメソッドが実行されると、SubForm変数にSub_Formクラスのオブジェクトが設定され、そのShowメソッドによりモードレス表示される。再度、Dangling_Button_Clickメソッドが実行されると、SubForm変数が新しいオブジェクトへ書き換えられて、2つ目のフォームがモードレス表示される。この状態でSubFormオブジェクトのCloseメソッドを実行しても、2つ目のフォームしか閉じることができない。このとき1つ目に表示したフォームのオブジェクト変数値はどこに行ってしまうのだろうか。SubForm変数が書き換えられたとしても1つ目のフォームが閉じたりはしないので、メモリ上のどこかにオブジェクトは存在しているが、そのオブジェクトに対して親フォームからの操作手段はなくなっている。このような中ぶらりんの状態を「ダンブリング」といい、品質上問題がある状態の1つだと考えられている。以上がWindowsフォームの基本的な表示方法だ。次のページでは、親フォームと子フォームの間で、値を受け渡す方法について説明する。7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。TranslatorはPowerPoint用のアドイン。