【发布时间】:2017-08-05 12:11:51
【问题描述】:
我在 Delphi 10.1 Firemonkey 中发现了一些非常奇怪的东西。
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Free;
end;
之后 - 当我单击此按钮时,表单的系统图标无法正常工作!只有当按下另一个按钮或切换到另一个窗口并再次返回时,它才会恢复工作。 为什么? 我很困惑……
【问题讨论】:
-
见How to free an object inside its event handler?。您将不得不延迟对 GUI 的调用,从而释放组件。您不能在其事件处理程序中释放它,因为当事件准备好时组件仍在执行。
-
按钮归 TForm1 所有,后者会在需要时释放 TButton。你真的不应该手动释放它。如果您真的愿意,您可以创建一个按钮并将所有者设置为 nil。我也更喜欢 FreeAndNil 但实际上这取决于你想做什么。
-
还要注意,此代码在基于 ARC 的系统上根本不起作用。该按钮的
Owner和Parent有多个引用。调用Free将简单地将 nil 分配给TForm1对象的Button1成员,但按钮本身仍然是活动的和可见的。 -
如果你想让按钮消失,你可以将 Visible 属性设置为 false 而不是释放它
-
我提出了我的解决方案 - 不是 .Free,而是使用对象父级的 RemoveObject。
标签: delphi firemonkey delphi-10.1-berlin