无法创建 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 可用的设计选择。
有一个主窗体 (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 可用的设计选择。