我将自己的UDP接收器设为TComponent
后代。它有一个OnReceive
事件。此事件用于向TMemo
添加一行,该行存在于同一表单上。
问题是当父表单被销毁时TMemo
首先被销毁,UDP接收器继续解雇OnReceive
事件。当我尝试mmo1.Lines.Add(S)
到一个不存在的备忘录时,我得到一个例外。
如何在TComponent
中检测到父形式及其组件即将被销毁但尚未被销毁的时刻?我会做一个适当的接收器线程关闭。
答案 0 :(得分:4)
为什么在父表单被销毁时你甚至试图在组件中检测到?仅使用表单OnClose
或OnCloseQuery
事件阻止您的组件接收数据不是更好。
在表单甚至开始破坏自身及其拥有的组件之前调用这两个事件。在OnCloseQuery
事件中,如果某些工作尚未完成,您甚至可以阻止表单关闭。
答案 1 :(得分:2)
当您依赖组件的组件工作但无法控制其生命周期时,您可以使用TComponent的Notification在您感兴趣的组件被销毁时重新执行操作。
首先,您的UDP Receiver需要将自己添加到组件的通知列表中,例如
Form.FreeNotification(Self);
接收来自TForm的通知。然后,UDP接收器需要覆盖
procedure Notification(AComponent: TComponent; Operation: TOperation);
virtual;
在那里,您可以收听AComponent = Form
和Operation = opRemove
的通知,这些通知表明该表单正在删除。
编辑:再次阅读,这可能不是您感兴趣的内容。如果您在表单中实施了OnReceive事件,则可以检查表单ComponentState是否包含csDestroying。
或者,如果Memo
是在设计时创建的,或者您自己明确地创建Memo
并{0}},请检查是否Memo <> nil
。