这听起来违背了 MDI 的本质。有时我需要将 MDI 表单 (FormStyle=fsMdiChild) 显示为模式。我还需要访问另一个MDI表单的Application.CreateForm和OnShow事件之间的部分,即
Application.CreateForm(Form2,TForm2); // but don't set form2's visible property true.
Form2.caption:='not working example';
Form2.SomeMagicToSetVisibleTrue;
有什么想法吗?
最佳答案
对于第一个问题:添加另一个构造函数,例如 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 即可。
您还需要两件事,而不是 self 解释:
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 的两个创建:
//Modal
frmDialog := TMyForm.Create(self);
// Your Code
frmDialog.ShowModal;
frmDialog.Release;
//MDI-Child
frmDialog := TMyForm.CreateChild(self);
// Your code
frmDialog.Show;
我已经从网站上的一篇文章翻译了这个答案 DelphiPraxis .
关于delphi - 将 MDI 表单显示为模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1459070/