【问题标题】:Free an object in OnClose event of TForm在 TForm 的 OnClose 事件中释放一个对象
【发布时间】:2017-10-27 10:36:00
【问题描述】:

我是 Delphi 新手,我的问题可能非常基础。

我在 Delphi 程序中创建了一个表单。到目前为止,我一直在使用ShowModal(),然后在关闭表单后释放所有我想避免泄漏的对象。

现在,我想显示无模式的表单,但我不知道如何释放 OnClose 事件中的对象。

有人知道解决办法吗?

【问题讨论】:

  • 通常,如果您有与表单具有相同生命周期的对象,您可以使用OnCreate/OnDestroy 事件。
  • 谢谢@whosrdaddy。但它在这里不起作用,因为对象是在表单之前创建的。
  • 那么表单不应该管理这些对象的生命周期。如果你想这样做,你有一种代码味道......
  • 我有一张图片,想在表单中显示。图像是在表单之前创建的,但基本上当表单关闭时,图像也应该被释放
  • 然后让表单创建图像?

标签: delphi tform


【解决方案1】:

你也可以 对于每个动态创建的对象做

Object.Free;

当前 Delphi 版本(自 Xe)文档建议使用新方法

Object.DisposeOf;

这种新方法在多设备应用程序(不同操作系统)中进行了优化

【讨论】:

  • 对于“桌面”(DCC32、DCC64、DCCOSX)系统,这与 Free 相同。
【解决方案2】:

只需将Action参数设置为caFree:

procedure TMyForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

根据documentation:

Action 参数的值决定表单是否真正关闭。这些是 Action 的可能值:

没有
表单不允许关闭,因此没有任何反应。

隐藏
表单不是关闭的,而是隐藏的。您的应用程序仍然可以访问隐藏的表单。

caFree
窗体已关闭,并且为窗体分配的所有内存都被释放
。

最小化
表单被最小化,而不是关闭。这是 MDI 子窗体的默认操作。

将Action 设置为caFree 将导致表单在OnClose 处理程序退出后自行调用Release():

销毁表单并释放其关联的内存。

使用 Release 销毁表单并释放其关联的内存。

在表单的所有事件处理程序和表单上组件的事件处理程序执行完毕之前,Release 不会销毁表单。 Release 还保证表单事件队列中的所有消息都在表单被释放之前得到处理。表单或其子项的任何事件处理程序都应使用 Release 而不是 Free (Delphi) 或 delete (C++)。否则会导致内存访问错误。

注意:Release 立即返回给调用者。它不会在返回之前等待表单被释放。

Release() 将延迟的CM_RELEASE 消息发布到表单窗口。一旦执行流程返回到主消息循环并分派消息,Form 就会从内存中释放自己。

如果您的TForm 对象拥有其他对象,则当TForm 被释放时,它们将被自动释放。

【讨论】:

  • 警告:caFree 在当前 (Sydney 10.4) 实施中存在缺陷。皮肤激活时可以观察到该错误!使用 caFree 关闭表单有时会关闭整个应用程序。
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多