我已经遵循了:http://docwiki.embarcadero.com/CodeExamples/XE5/en/FMXEmbeddedForm_(Delphi)
和此:https://stackoverflow.com/a/2475810
和此:https://stackoverflow.com/a/26508888
我正在使用Delphi 10.3
我的最终结果是:我创建了一个带有TLayout的父表单,希望在其中显示子表单。接下来,我所有的子窗体都有一个TLayout,其中包含该窗体的所有其他组件。所有表单都是在运行时动态创建的,其内容也是如此。
出于测试目的,我在主窗体上的按钮内创建了子窗体:
procedure TForm1.Button1Click(Sender: TObject);
begin
Application.CreateForm(TfChild, fChild);
fChild.Layout1.Parent := self.Layout1;
end;
到目前为止,子窗体的所有组件都显示在父窗体上。问题是,之后如何“清除”它们。在子窗体上的按钮上发送self.Close
不会从主窗体中删除布局组件,但是会关闭子窗体。在子窗体的按钮上执行Layout1.Destroy
会清除布局,但是我对主窗体的窗口控制按钮(最大化,最小化,退出)不满意,唯一获得该访问权限的方法是重新创建子布局。我只想在Windows和MacOS OS上使用此嵌入式功能,对于android则不需要,所以我使用defs进行调整。
我觉得我的方法不正确:'(,有解决方案吗?我只是想在主窗体的指定区域内动态创建子窗体的组件,并有一种安全的方式来清除这些组件之后不再需要该子窗体
我亲自制作了MRE,因为您觉得不需要提供一个。以下是Form1
是主要形式,Form2
是子形式
当您关闭不是主要表单的表单(例如Form2.Close;
)时,不一定将其销毁。表单的默认关闭操作为caHide
,它仅设置其属性Visible = False
,将其保留在内存中,准备再次调用。
子窗体上的组件仍然是主窗体中TLayout
的父项,因此隐藏子窗体不会影响组件的可见性。要解决此问题,您可以将组件从主窗体移回子窗体:
procedure TForm2.Button1Click(Sender: TObject);
begin
Layout1.Parent := Self; // add this
Self.Close;
end;
或,您可以在其OnClose()
事件中销毁子表单:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := TCloseAction.caFree;
end;
此方法无需重设组件,因为即使父级为Form1,Form2仍是组件的所有者。