ウィザードを使用せずに Windows VCL MDI アプリケーションを構築する
Windows VCL アプリケーションの作成方法 への移動
子ウィンドウを持つ MDI アプリケーションを、ウィザードを使用しないで新規作成する基本手順
- メイン ウィンドウ フォーム(MDI 親ウィンドウ)を作成します。
- 子ウィンドウ フォームを作成します。
- ユーザーの制御の下で、メイン ウィンドウに子ウィンドウを作成させます。
- 子ウィンドウを閉じるためのイベント ハンドラ コードを記述します。
- メイン メニューとコマンドを作成します。
- コマンドのイベント ハンドラを追加します。
- アプリケーションをコンパイルして実行します。
目次
メイン ウィンドウ フォームを作成する
- [ファイル|新規作成|Windows VCL アプリケーション - Delphi] または [ファイル|新規作成|Windows VCL アプリケーション - <CBuilder>] に移動します。
- オブジェクト インスペクタで、FormStyle プロパティを fsMDIForm に設定します。
- frMain などのわかりやすい名前を Name プロパティに入力します。
- uMain.pas(Delphi)やuMain.cpp(C++)などのわかりやすい名前を Name プロパティに入力します。
子ウィンドウを作成する
- [ファイル|新規作成|フォーム] を選択します。
- オブジェクト インスペクタで、FormStyle プロパティを fsMDIChild に設定します。
- 「frChild」などのわかりやすい名前を Name プロパティに入力します。
- ユニット ファイルを、uChild.pas(Delphi)または uChild.cpp(C++)などの名前で保存します。
メイン ウィンドウに子ウィンドウを作成させる
- [プロジェクト|オプション...|フォーム]を選択します。[<プロジェクト名> のプロジェクト オプション]ダイアログ ボックスが表示されます。
- frChild を [自動生成フォーム] リストから選択し、[>] をクリックして[使用可能フォーム]リストに移動し、[OK]をクリックします。
- frMain フォームを選択してアクティブにし、[コード]ビューに切り替えます。
- Delphi の場合、uses セクションにスクロールし、uChild をリストに追加します。 C++ の場合、#include "Child.h" を uMain.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;
メイン メニューとコマンドを作成する
- [ツール パレット]の[標準]ページから、[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 つ表示されます。
- [ファイル|すべて閉じる] を選択します。 子ウィンドウが閉じます。