在TComponent后代中检测到父表单即将被销毁

时间:2017-07-31 12:38:54

标签: delphi

我将自己的UDP接收器设为TComponent后代。它有一个OnReceive事件。此事件用于向TMemo添加一行,该行存在于同一表单上。

问题是当父表单被销毁时TMemo首先被销毁,UDP接收器继续解雇OnReceive事件。当我尝试mmo1.Lines.Add(S)到一个不存在的备忘录时,我得到一个例外。

如何在TComponent中检测到父形式及其组件即将被销毁但尚未被销毁的时刻?我会做一个适当的接收器线程关闭。

2 个答案:

答案 0 :(得分:4)

为什么在父表单被销毁时你甚至试图在组件中检测到?仅使用表单OnCloseOnCloseQuery事件阻止您的组件接收数据不是更好。

在表单甚至开始破坏自身及其拥有的组件之前调用这两个事件。在OnCloseQuery事件中,如果某些工作尚未完成,您甚至可以阻止表单关闭。

答案 1 :(得分:2)

当您依赖组件的组件工作但无法控制其生命周期时,您可以使用TComponent的Notification在您感兴趣的组件被销毁时重新执行操作。

首先,您的UDP Receiver需要将自己添加到组件的通知列表中,例如

Form.FreeNotification(Self);

接收来自TForm的通知。然后,UDP接收器需要覆盖

procedure Notification(AComponent: TComponent; Operation: TOperation); virtual;

在那里,您可以收听AComponent = FormOperation = opRemove的通知,这些通知表明该表单正在删除。

编辑:再次阅读,这可能不是您感兴趣的内容。如果您在表单中实施了OnReceive事件,则可以检查表单ComponentState是否包含csDestroying

或者,如果Memo是在设计时创建的,或者您自己明确地创建Memo并{0}},请检查是否Memo <> nil