无法创建 MDIChild 窗体

MDIChild form cannot be created

有一个主窗体 (Form1),在执行时分别创建了一个 MDIForm (Form2) 和一个 MDIChild (Form3) 窗体。在我的测试中,MDIForm (Form2) 显示如预期,但当尝试显示 MDIChild (Form3) 时,我收到以下错误:

Cannot create form. No mdi forms are currently active

关于如何解决这个问题的一些想法?

program Project1;

uses
  Vcl.Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2},
  Unit3 in 'Unit3.pas' {Form3};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

表格:

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
  Unit2, Unit3;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(Self);
  Form2.Show;
  Form3 := TForm3.Create(Form2);
  Form3.Show;
end;

end.

VCL(不是 Win32 API)被硬编码为允许 Application.MainForm 设置为 fsMDIForm托管 fsMDIChild 表单。您的 MainForm 不是 fsMDIForm 父表单,这就是您收到错误的原因。

使用辅助表单作为 fsMDIForm 父级在技术上是可行的,但并非开箱即用。它需要一些手工工作来破解 VCL 的内部结构以使其工作,即使这样也存在漏洞和问题。看我的Multiple MDI Parent Forms in a single Application submission on CodeCentral for an example (I haven't updated it in over a decade, so it may need some tweaking for modern VCL versions). The old Quality Central (not Quality Portal!) ticket it refers to can be found on archive.org: #12006: Hosting MDI child forms in non-MainForm forms

话虽如此,MDI 是一项死技术,Microsoft 早就放弃了它,现代 Windows 版本对 MDI 的支持很差,尤其是在使用 Visual Styles 时。你最好不要在现代软件中使用 MDI,有 other/better UI 可用的设计选择。