delphi - 将 MDI 表单显示为模式

标签 delphi mdi

这听起来违背了 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/

相关文章:

.net - 在 .NET 中创建新的最大化 MDI 子窗体的图标问题

delphi - 动态加载BPL的共享代码/传递对象

vb.net - 通过类名调用 Windows 窗体

java - 在 Swing MDI 中管理 JInternalFrames

Delphi MDI - 处理打开/关闭/激活子窗体

c# - 设置窗体的 MdiParent 属性会中断/阻止触发其 Shown 事件

delphi - 无法从 Indy TIdCookieManager 获取 cookie

sql - 将数据插入数据库[Delphi]

delphi - 如何确定 IInterface 后代是否具有属性?

delphi - 当我在Delphi中打开ComboBox的列表时,如何使SearchBox可见