Delphi Firemonkey t免费按钮

Delphi Firemonkey t免费按钮,delphi,firemonkey,delphi-10.1-berlin,Delphi,Firemonkey,Delphi 10.1 Berlin,我在Delphi10.1 Firemonkey中发现了一些非常奇怪的东西 procedure TForm1.Button1Click(Sender: TObject); begin Button1.Free; end; 之后-当我点击这个按钮时,表单的系统图标不工作!只有当按下另一个按钮或切换到另一个窗口并再次返回时,它才会恢复工作。 为什么? 我很困惑…解决方法是: procedure TForm1.Button1Click(Sender: TObject); begin Remov

我在Delphi10.1 Firemonkey中发现了一些非常奇怪的东西

procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.Free;
end;
之后-当我点击这个按钮时,表单的系统图标不工作!只有当按下另一个按钮或切换到另一个窗口并再次返回时,它才会恢复工作。 为什么?
我很困惑…

解决方法是:

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

在VCL中,与.Free一起工作,但FMX以不同的方式工作。

这是因为在delphi下生成arc的方式(可怕的方式)。在无弧状态下,什么也不做。这完全是愚蠢的,但EmbarcaderoSeam的家伙喜欢它,在我看到像你这样的人不明白为什么他们的代码不工作之后


所以你需要做的不是按钮1.释放,而是按钮1.处置。。。用disposeOF替换您所有的免费代码,您的代码在ARC下的bug就会减少,并说感谢emb

请参见。您必须延迟对GUI的调用,在GUI中释放组件。您不能在其事件处理程序中释放它,因为当事件准备就绪时组件仍在执行。按钮归TForm1所有,后者将在需要时释放TButton。你真的不应该手动释放它。如果你真的愿意,你可以创建一个按钮并将所有者设置为nil。另外,我更喜欢FreeAndNil,但实际上这取决于你想做什么。还要注意的是,这段代码在基于ARC的系统上根本不起作用。按钮有其
所有者
父项
的多个引用。调用
Free
只需将nil分配给
TForm1
对象的
Button1
成员,但按钮本身仍然是活动的和可见的。如果您希望按钮消失,可以将visible属性设置为false,而不是释放itI我的解决方案-no.Free,但是使用对象的父对象的RemoveObject。但是如果不使用任何空闲或类似的方法,则会出现内存泄漏。所以免费做点什么。。。当然,多亏了emb:)他们让我变得更有创造力,能够“解决”问题;)