Delphi 10.3在另一个FMX表单关闭错误中创建FMX表单

问题描述 投票:0回答:1

我已经遵循了: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进行调整。

我觉得我的方法不正确:'(,有解决方案吗?我只是想在主窗体的指定区域内动态创建子窗体的组件,并有一种安全的方式来清除这些组件之后不再需要该子窗体

delphi dynamic runtime firemonkey
1个回答
0
投票

我亲自制作了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仍是组件的所有者。

© www.soinside.com 2019 - 2024. All rights reserved.