2

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

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

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

有人知道它的解决方案吗?

4

2 回答 2

3

只需将Action参数设置为caFree

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

根据文档

Action 参数的值确定窗体是否实际关闭。这些是 Action 的可能值:

caNone
表单不允许关闭,所以什么也没有发生。

caHide
表单没有关闭,只是隐藏了。您的应用程序仍然可以访问隐藏的表单。

caFree
关闭窗体并释放为窗体分配的所有内存

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

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

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

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

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

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

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

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

于 2017-05-26T21:33:06.170 回答
-2

您还可以为每个动态创建的对象做

Object.Free;

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

Object.DisposeOf;

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

于 2017-05-27T02:33:36.043 回答