为什么形成破坏事件不止一次被调用?

时间:2012-04-12 15:25:04

标签: delphi delphi-xe

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

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

提前致谢,

更新:这是我的程序关闭后的FastMM消息窗口。 TAlarmMsg是创建LogAlarm的类。 enter image description here enter image description here

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

感谢David Heffernan和其他人。我发现了我的问题并修复了它。有问题的TForm在我的项目文件中创建了两次,如此。

Application.CreateForm(HTrendFrm,HTrend);

这解释了为什么毁灭被召唤两次。

一旦我删除了重复的行,它就会关闭。

答案 2 :(得分:0)

这取决于您如何创建LogAlarm。

如果LogAlarm是TComponent后代,并且您已使用表单作为所有者创建它,则不应在其上调用Free,因为一旦表单被销毁,组件将自动清除。

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