ウィザードを使用せずに VCL フォーム MDI アプリケーションを構築する
子ウィンドウを持つ MDI アプリケーションを、ウィザードを使用しないで新規作成する基本手順
- メイン ウィンドウ フォーム(MDI 親ウィンドウ)を作成します。
- 子ウィンドウ フォームを作成します。
- ユーザーの制御の下で、メイン ウィンドウに子ウィンドウを作成させます。
- 子ウィンドウを閉じるためのイベント ハンドラ コードを記述します。
- メイン メニューとコマンドを作成します。
- コマンドのイベント ハンドラを追加します。
- アプリケーションをコンパイルして実行します。
目次
メイン ウィンドウ フォームを作成する
- [ファイル|新規作成|その他...]の[Delphi プロジェクト]または[C++Builder プロジェクト]を選択し、[VCL フォーム アプリケーション]アイコンをダブルクリックします。VCL フォーム デザイナが表示されます。
- [オブジェクト インスペクタ]で、FormStyle プロパティを fsMDIForm に設定します。
- 「frMain」などのわかりやすい名前を Name プロパティに入力します。
- uMain.pas(Delphi)や uMain.cpp(C++)など、わかりやすい名前でユニット ファイルを保存します。
子ウィンドウを作成する
- [ファイル|新規作成|VCL フォーム] を選択します。
- [オブジェクト インスペクタ]で、FormStyle プロパティを fsMDIChild に設定します。
- 「frChild」などのわかりやすい名前を Name プロパティに入力します。
- uChild.pas(Delphi)や uChild.cpp(C++)などの名前でユニット ファイルを保存します。
メイン ウィンドウに子ウィンドウを作成させる
- [プロジェクト|オプション...] を選択します。[<プロジェクト名> のプロジェクト オプション]ダイアログ ボックスが開くので、[フォーム]ページを選択します。
- [自動生成フォーム]のリストで frChild を選択し、[>]をクリックして[使用可能フォーム]のリストに移動し、[OK]をクリックします。
- frMain フォームを選択してアクティブにし、[コード]ビューに切り替えます。
- Delphi の場合は、スクロールして uses セクションに移動し、リストに uChild を追加します。C++ の場合は、uMain.h に #include "Child.h" を追加します。
- Delphi の場合は、スクロールして private 宣言セクションに移動し、次の手続き宣言を入力します。
procedure CreateChildForm(const childName: string);
- C++ の場合は、TfrMain の private: 宣言に次の関数宣言を追加します。
void __fastcall CreateChildForm( const AnsiString childName );
- Delphi の場合は、スクロールして implementation セクションに移動し、次のコードを入力します。
procedure TfrMain.CreateChildForm (const childName: string);
var Child: TfrChild;
begin
Child := TfrChild.Create(Application);
Child.Caption := childName;
end;
- C++ の場合は、uMain.cpp に次の関数定義を追加します。
void __fastcall TfrMain::CreateChildForm( const AnsiString childName )
{
TfrChild *Child = new TfrChild( Application );
Child->Caption = childName;
}
子ウィンドウを閉じるためのイベント ハンドラ コードを記述する
- 必要であれば frMain フォームをアクティブにし、それから[オブジェクト インスペクタ]の[イベント]タブを選択します。
- OnClose イベントをダブルクリックします。コード エディタが開き、TfrMain.FormClose(Delphi)または TfrMain::FormClose(C++)のイベント ハンドラ ブロックにカーソルが置かれます。
- Delphi の場合は、次のコードを入力します。
Action := caFree;
C++ の場合は、次のコードを入力します:
Action = caFree;
メイン メニューとコマンドを作成する
- [ツール パレット]の[Standard]ページから、[TMainMenu]コンポーネントをメイン フォームに配置します。
- TMainMenu コンポーネントをダブルクリックします。メニュー デザイナ(frMain.MainMenu1)が開きます。このとき、最初の空のメニュー項目が強調表示されています。
- [オブジェクト インスペクタ]の[プロパティ]タブで、Name プロパティに「mnFile」、Caption プロパティに「ファイル (&F)」と入力し、Enter キーを押します。メニュー デザイナの最初のメニュー項目の名前が[ファイル]と表示されます。
- メニュー デザイナで[ファイル]を選択します。空のコマンド フィールドが[ファイル]グループに表示されます。空のコマンドを選択します。
- [オブジェクト インスペクタ]で、Name プロパティに「mnNewChild」、Caption プロパティに「子の新規作成 (&N)」と入力し、Enter キーを押します。メニュー デザイナの最初の[ファイル]コマンドの名前が[子の新規作成]と表示され、[子の新規作成]のすぐ下に空のコマンド フィールドが表示されます。
- 空のコマンドを選択します。
- [オブジェクト インスペクタ]で、Name プロパティに「mnCloseAll」、Caption プロパティに「すべて閉じる (&C)」と入力し、Enter キーを押します。メニュー デザイナの 2 番目のファイル コマンドの名前が[すべて閉じる]と表示されます。
[子の新規作成]コマンドおよび[すべて閉じる]コマンドのイベント ハンドラを追加する
- 必要であればメニュー デザイナを開き、[子の新規作成]を選択します。
- [オブジェクト インスペクタ]で、[イベント]タブの OnClick イベントをダブルクリックします。コード エディタが開き、TfrMain.mnNewChildClick(Delphi)または TfrMain::mnNewChildClick(C++)のイベント ハンドラ ブロックにカーソルが置かれます。
- Delphi の場合は、次のコードを入力します。
CreateChildForm('Child '+IntToStr(MDIChildCount+1));
C++ の場合は、次のコードを入力します:
CreateChildForm( "Child " + IntToStr( MDIChildCount + 1 ) );
- メニュー デザイナで[すべて閉じる]を選択します。
- [オブジェクト インスペクタ]で、[イベント]タブの OnClick イベントをダブルクリックします。コード エディタが開き、TfrMain.mnCloseAllClick(Delphi)または TfrMain::mnCloseAllClick(C++)のイベント ハンドラ ブロックにカーソルが置かれます。
- Delphi の場合は、次のコードを入力します。
for i:=0 to MDIChildCount - 1 do
MDIChildren[i].Close;
- C++ の場合は、次のコードを入力します。
for( int i = 0; i < MDIChildCount; i++ ) {
MDIChildren[i]->Close();
}
- Delphi の場合は、ローカル変数 i を宣言します。それが終わったら、イベント ハンドラ コードの最初の 2 行は次のようになっているはずです。
procedure TfrMain.mnCloseAllClick(Sender: TObject);
var i: integer;
メモ: このイベント ハンドラでは、メイン ウィンドウ内の子ウィンドウを最小化します。子ウィンドウを閉じるには、子フォームに OnClose 手続きを追加する必要があります(この次に説明します)。
子ウィンドウを閉じる
- 子フォームをアクティブにします。
- [オブジェクト インスペクタ]で、[イベント]タブの OnClose イベントをダブルクリックします。コード エディタが開き、TfrChild.FormClose(Delphi)または TfrChild::FormClose(C++)のイベント ハンドラ ブロックにカーソルが置かれます。
- Delphi の場合は、次の文を入力します。
Action := caFree;
- C++ の場合は、次の文を入力します。
Action = caFree;
MDI アプリケーションをコンパイルして実行する
- [実行|実行] を選択します。
- アプリケーションが実行され、[ファイル]コマンドが表示されます。
- [ファイル|子の新規作成] を何度か選択します。[子の新規作成]コマンドを選択するたびに、子ウィンドウが 1 つ表示されます。
- [ファイル|すべて閉じる] を選択します。子ウィンドウが閉じます。