有一个主窗体(Form1
),在执行时分别创建了MDIForm(Form2
)和MDIChild(Form3
)窗体。在我的测试中,MDIForm(Form2
)的显示与预期的一样,但是当尝试显示MDIChild(Form3
)时,出现以下错误:
无法创建表单。当前没有任何MDI表单处于活动状态
关于如何解决这个问题的一些想法?
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.
Remy Lebeau.. 5
该VCL(未在Win32 API)是硬编码,允许只在Application.MainForm
设置为fsMDIForm
托管fsMDIChild
形式。您MainForm
不是fsMDIForm
父窗体,这就是您收到错误的原因。
从技术上讲,可以使用辅助表单作为fsMDIForm
父表单,但不是开箱即用的。它需要一些手动工作才能破解VCL的内部组件,以使其正常工作,即使如此,仍然存在漏洞和陷阱。请参见在CodeCentral上的单个应用程序提交中的“我的多个MDI父表单”(我十年来没有对其进行更新,因此对于现代VCL版本可能需要进行一些调整)。它引用的旧版Quality Central(不是Quality Portal!)票证可在archive.org上找到:#12006:以非MainForm形式托管MDI子表单。
话虽这么说,但MDI是一项过时的技术,微软很早以前就放弃了它,而现代Windows版本对MDI的支持很差,尤其是在使用Visual Styles时。您甚至不用担心现代软件中的MDI,还有其他/更好的UI设计选择。
该VCL(未在Win32 API)是硬编码,允许只在Application.MainForm
设置为fsMDIForm
托管fsMDIChild
形式。您MainForm
不是fsMDIForm
父窗体,这就是您收到错误的原因。
从技术上讲,可以使用辅助表单作为fsMDIForm
父表单,但不是开箱即用的。它需要一些手动工作才能破解VCL的内部组件,以使其正常工作,即使如此,仍然存在漏洞和陷阱。请参见在CodeCentral上的单个应用程序提交中的“我的多个MDI父表单”(我十年来没有对其进行更新,因此对于现代VCL版本可能需要进行一些调整)。它引用的旧版Quality Central(不是Quality Portal!)票证可在archive.org上找到:#12006:以非MainForm形式托管MDI子表单。
话虽这么说,但MDI是一项过时的技术,微软很早以前就放弃了它,而现代Windows版本对MDI的支持很差,尤其是在使用Visual Styles时。您甚至不用担心现代软件中的MDI,还有其他/更好的UI设计选择。