デフォルトでは (つまり、すべてのデフォルトの IDE 構成設定で)、新しく設計されたフォームが自動的に作成されます。メイン フォームのみが表示され、セカンダリ フォームは次のように表示できます。
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Show;
Form3.ShowModal;
end;
この自動作成オプションを無効にすることは、一般的な方法です。[ツール] > [(環境) オプション] > [(VCL) デザイナー] > [モジュール作成オプション] に移動し、 [フォームとデータ モジュールの自動作成] オプションを無効/チェック解除します。
代わりに、必要な場合にのみ (設計済みの) フォームを作成します。
procedure TForm1.Button1Click(Sender: TObject);
var
Form: TForm2;
begin
Form := TForm2.Create(Self);
Form.Show;
end;
これは、二次フォームのグローバル変数が不要であることも示しており、間違った使用を防ぐために、できるだけ早くそれらを削除することをお勧めします:
type
TForm2 = class(TForm)
end;
//var
// Form2: TForm2; << Always delete these global variable
implementation
フォーム デザイナでこのようなセカンダリ フォームを設定したくない場合は、実行時にすべてのコントロールをコードで作成する必要があります。次のように:
unit Unit2;
interface
uses
Classes, Forms, StdCtrls;
type
TForm2 = class(TForm)
private
FButton: TButton;
public
constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); override;
end;
implementation
{ TForm2 }
constructor TForm2.CreateNew(AOwner: TComponent; Dummy: Integer = 0);
begin
inherited CreateNew(AOwner);
FButton := TButton.Create(Self);
FButton.SetBounds(10, 10, 60, 24);
FButton.Caption := 'OK';
FButton.Parent := Self;
end;
end.
ご覧のとおり、CreateNew
コンストラクターを使用しました。これは派生物に必要です。T(Custom)Form
関連する .DFM ファイルを使用せずにフォームを作成して初期化するには、CreateNew
代わりに使用します。子孫がオブジェクトまたは の子孫でない場合は、Create
常に使用します。CreateNew
TCustomForm
TForm
TForm
他のすべてのコンテナー コントロール ( 、 など) についてTPanel
はTFrame
、既定のコンストラクターをオーバーライドできますCreate
。
このフォームを次のように呼び出します。
procedure TForm1.Button1Click(Sender: TObject);
var
Form: TForm2;
begin
Form := TForm2.Create(nil);
try
Form.ShowModal;
finally
Form.Free;
end;
end;
または:
procedure TForm1.Button1Click(Sender: TObject);
begin
FForm := TForm2.CreateNew(Application);
FForm.Show;
end;
この最後のケースでは、フォームは解放されませんが、フォームを閉じると非表示になるため、その参照をプライベート フィールド ( FForm
) に保存し、後で解放する必要があります。または、自動的に実行できます。
unit Unit2;
interface
uses
Classes, Forms, StdCtrls;
type
TForm2 = class(TForm)
private
FButton: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
public
constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); override;
end;
implementation
{ TForm2 }
constructor TForm2.CreateNew(AOwner: TComponent; Dummy: Integer = 0);
begin
inherited CreateNew(AOwner);
OnClose := FormClose;
FButton := TButton.Create(Self);
FButton.SetBounds(10, 10, 60, 24);
FButton.Caption := 'OK';
FButton.Parent := Self;
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
end.
これで、参照を保存せずに呼び出すことができます。
procedure TForm1.Button1Click(Sender: TObject);
begin
TForm2.CreateNew(Self).Show;
end;
渡すか、新しいフォームの所有者として渡すかはSelf
、手動またはイベントを介して解放しない場合に、いつ自動的に破棄するかによって異なります。使用するApplication
nil
OnClose
Self
: 呼び出し元のフォームが破棄されると、新しいフォームが破棄されます。これは、呼び出し元のフォームがメイン フォームでない場合に特に便利です。
Application
: アプリケーションの終了時に新しいフォームを破棄します。これは私の好みの選択です。
nil
: 新しいフォームを破棄せず、アプリケーションの終了時にメモリ リークが発生します。ただし、Windows がプロセスを強制終了すると、メモリは最終的に解放されます。