0

我以前从未在我的程序中注意到它,但是对于我的一个 TForm,我有一个销毁事件,它释放一个对象,被多次调用或触发。我不明白为什么。

procedure THTrendFrm.FormDestroy(Sender: TObject);
begin
  LogAlarm.Free;  <---Invalid Pointer Operation exception is raised
end;

提前致谢,

更新:这是我的程序关闭后的 FastMM 消息窗口。TAlarmMsg 是从中创建 LogAlarm 的类。 在此处输入图像描述 在此处输入图像描述

4

3 回答 3

2

TForm.OnDestroy事件不会被多次调用,因此您必须在触发事件LogAlarm之前在代码中的其他位置释放该对象。OnDestroy

于 2012-04-12T20:09:26.813 回答
1

感谢大卫赫弗南和其他人。我发现了我的问题并修复了它。有问题的 TForm 像这样在我的项目文件中创建了两次。

Application.CreateForm(HTrendFrm, HTrend);

这就解释了为什么 destroy 被调用了两次。

一旦我删除了重复的行,它就可以正常关闭了。

于 2012-04-13T13:42:03.213 回答
0

这取决于您如何创建 LogAlarm。

如果 LogAlarm 是 TComponent 的后代,并且您以表单的所有者身份创建了它,则不应在其上调用 Free,因为一旦表单被销毁,该组件将自动被清理。

或者,如果您坚持自己清理它,请在创建期间将 owner 保留为 nil。

于 2012-04-12T22:00:00.437 回答