フォームの動的作成
フォームがメモリ内に存在する間の制御 への移動
アプリケーションのすべてのフォームを常にメモリに格納しておく必要はありません。読み込み時に必要なメモリ量を減らすには、一部のフォームを必要時にのみ作成するようにします。たとえば、ダイアログ ボックスは、ユーザーとのやり取りが行われている間だけメモリに存在していればよいのです。
IDE を使って実行中のさまざまな段階でフォームを作成するには:
- メイン メニューから [ファイル|新規作成|フォーム] を選択して、新規フォームを表示します。
- そのフォームを[プロジェクト|オプション...|フォーム]ページの[自動生成フォーム]リストから削除します。これにより、起動時にこのフォームが呼び出されなくなります。別の方法としては、プログラムのメイン エントリ ポイントから次の行を手動で削除することもできます。
Application.CreateForm(TResultsForm, ResultsForm);
Application->CreateForm(__classid(TResultsForm), &ResultsForm);
- モードレス フォームの場合は、フォームの Show メソッドを使用して、必要時にフォームを呼び出します。モーダル フォームの場合は、ShowModal メソッドを使用します。
フォームを動的に作成する場合は、メイン フォームのイベント ハンドラで結果のフォームのインスタンスを生成し破棄する必要があります。結果のフォームを呼び出す方法の 1 つは、次のようにグローバル変数を使用することです。ResultsForm がモーダル フォームであるため、ハンドラでは ShowModal メソッドを使用していることに注意してください。
procedure TMainForm.Button1Click(Sender: TObject);
begin
ResultsForm := TResultForm.Create(self);
try
ResultsForm.ShowModal;
finally
ResultsForm.Free;
end;
end;
void __fastcall TMainMForm::FirstButtonClick(TObject *Sender)
{
ResultsForm = new TResultsForm(this);
ResultsForm->ShowModal();
delete ResultsForm;
}
上記の例では try..finally を使用していることに注意してください。finally 節に ResultsForm.Free; という行を挿入することにより、たとえフォームで例外が発生しても、フォームのメモリが確実に解放されます。
上記の例のイベント ハンドラではフォームが閉じた後にフォームを削除しているので、アプリケーションの他の場所で ResultsForm が必要になった場合には、フォームを再度作成する必要があります。Show を使ってフォームが表示された場合は、フォームがまだ開いている間に Show から制御が戻るので、イベント ハンドラ内ではフォームを削除できません。
メモ: コンストラクタを使ってフォームを作成する場合は、そのフォームが [プロジェクト|オプション...|フォーム] ページの[自動生成フォーム]リストに含まれていないことを必ず確認してください。特に、このリストにある同じ名前のフォームを削除せずに新規フォームを作成した場合は、リストにあるフォームがアプリケーションの起動時に自動的に生成されます。一方、コンストラクタを使って生成されるフォームの新しいインスタンスが上記のイベント ハンドラで生成され、自動生成されたインスタンスへの参照を上書きします。自動生成されたインスタンスは引き続き存在しますが、アプリケーションからそのインスタンスにアクセスすることはもうできません。イベント ハンドラの実行が終了したとき、グローバル変数が指しているフォームは有効なものではありません。ここでこのグローバル変数を使用しようとすると、アプリケーションはおそらくクラッシュします。