如何检测组件已被释放?

时间:2012-09-19 17:18:15

标签: delphi

我有一个我创建的组件,然后在我的主窗体上传递一个面板。

这是一个非常简单的例子:

procedure TMy_Socket.StatusPanel_Add(AStatusPanel: TPanel);

然后,该组件将在需要时更新面板标题。

在我的主程序中,如果我FreeAndNil面板,下次组件尝试更新面板时,我会得到一个AV。我理解为什么:组件对面板的引用现在指向一个未定义的位置。

如何在组件内检测到面板是否已被释放,以便我知道我无法引用它?

我尝试了if (AStatusPanel = nil),但它不是nil,它仍有地址。

2 个答案:

答案 0 :(得分:6)

您必须调用Panel的FreeNotification()方法,然后让您的TMy_Socket组件覆盖虚拟Notification()方法,例如(根据您的命名方案,我假设您可以添加多个{ {1}}控件到您的组件):

TPanel

如果您一次只跟踪一个type TMy_Socket = class(TWhatever) ... protected procedure Notification(AComponent: TComponent; Operation: TOperation); override; ... public procedure StatusPanel_Add(AStatusPanel: TPanel); procedure StatusPanel_Remove(AStatusPanel: TPanel); ... end; procedure TMy_Socket.StatusPanel_Add(AStatusPanel: TPanel); begin // store AStatusPanel as needed... AStatusPanel.FreeNotification(Self); end; procedure TMy_Socket.StatusPanel_Remove(AStatusPanel: TPanel); begin // remove AStatusPanel as needed... AStatusPanel.RemoveFreeNotification(Self); end; procedure TMy_Socket.Notification(AComponent: TComponent; Operation: TOperation); begin inherited; if (AComponent is TPanel) and (Operation = opRemove) then begin // remove TPanel(AComponent) as needed... end; end;

TPanel

答案 1 :(得分:3)

如果在释放其他组件时需要通知您的组件,请查看TComponent.FreeNotification。它应该是你需要的。