最初の問題の場合:次のように、CreateAsMDIなどの別のコンストラクターを追加します。
constructor TModalAndMDIForm.CreateAsMDI(AOwner: TComponent);
begin
f_blChild := true;
GlobalNameSpace.BeginWrite;
try
inherited CreateNew(AOwner);
if(not(csDesigning in ComponentState)) then begin
Include(FFormState, fsCreating);
try
FormStyle := fsMDIChild;
if(not(InitInheritedComponent(self, TForm))) then
raise Exception.CreateFmt('Can't create %s as MDI child', [ClassName]);
finally
Exclude(FFormState, fsCreating);
end;
end;
finally
GlobalNameSpace.EndWrite;
end;
end;
通常のコンストラクターでは、変数f_blChildをfalseに設定し、継承されたcreateを呼び出します。
自明ではなく、さらに2つのことが必要です。
procedure TModalAndMDIForm.Loaded;
begin
inherited;
if(f_blChild) then
Position := poDefault
else begin
Position := poOwnerFormCenter;
BorderStyle := bsDialog;
end;
end;
//-----------------------------------------------------------------------------
procedure TModalAndMDIForm.DoClose(var Action: TCloseAction);
begin
if(f_blChild) then
Action := caFree;
inherited DoClose(Action);
end;
これで、標準コンストラクターで作成された場合はフォームモーダルを呼び出し、CreateAsMDIで作成された場合はMDI子としてフォームを呼び出すことができます。
これをフォームの宣言に含める場合
property IsChild: boolean read f_blChild;
フォームがMDIの子であるかどうかに応じて、isChildプロパティに問い合わせるだけで処理を実行することもできます。
2番目の問題については、Application.CreateFormを使用せずに、自分でフォームを作成してください。
ここに、モーダルとMDIの2つの作成があります。
//Modal
frmDialog := TMyForm.Create(self);
// Your Code
frmDialog.ShowModal;
frmDialog.Release;
//MDI-Child
frmDialog := TMyForm.CreateChild(self);
// Your code
frmDialog.Show;
私はこの回答をDelphiPraxisサイトの記事から翻訳しました。