对于您的第一个问题:添加另一个构造函数,例如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函数。
你还需要两个东西,相当容易理解:
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属性。
至于您的第二个问题:不要使用Application.CreateForm,而是自己创建表单:
这里是模态和MDI的两种创建方式:
frmDialog := TMyForm.Create(self);
frmDialog.ShowModal;
frmDialog.Release;
frmDialog := TMyForm.CreateChild(self);
frmDialog.Show;
我从
DelphiPraxis网站的一篇文章中翻译了这个答案。
OldCreateOrder
设置为True
的表单)则应在TModalAndMDIForm.CreateAsMDI
结尾处添加if OldCreateOrder then DoCreate
。 - yonojoy