【问题标题】:Delphi Firemonkey TButton freeDelphi Firemonkey TButton 免费
【发布时间】: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 的系统上根本不起作用。该按钮的OwnerParent 有多个引用。调用 Free 将简单地将 nil 分配给 TForm1 对象的 Button1 成员,但按钮本身仍然是活动的和可见的。
  • 如果你想让按钮消失,你可以将 Visible 属性设置为 false 而不是释放它
  • 我提出了我的解决方案 - 不是 .Free,而是使用对象父级的 RemoveObject。

标签: delphi firemonkey delphi-10.1-berlin


【解决方案1】:

解决方法是:

procedure TForm1.Button1Click(Sender: TObject);
begin
  RemoveObject(Button1);
end;

在 VCL 中使用 .Free,但 FMX 以某种不同的方式工作。

【讨论】:

    【解决方案2】:

    这是因为在delphi下制作的方式(可怕的方式)弧。在 arc Free 下什么也不做。这完全是愚蠢的,但是 embarcadero seam 的人喜欢它,在我看到像你这样不明白为什么他们的代码不起作用的人之后......

    所以不是做 button1.free,你需要做 button1.disposeOF ... 用 disposeOF 替换你所有的 free,你的代码在 ARC 下的错误会更少,感谢 emb

    【讨论】:

    • 但是如果你不使用任何 Free 或类似的方法,就会出现内存泄漏。所以 Free 做了一些事情......当然感谢 emb :) 他们让我成为更有创造力的程序员来“解决”问题;)
    猜你喜欢
    • 2011-12-09
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多