我有一个我创建的组件,然后在我的主窗体上传递一个面板。
这是一个非常简单的例子:
procedure TMy_Socket.StatusPanel_Add(AStatusPanel: TPanel);
然后,该组件将在需要时更新面板标题。
在我的主程序中,如果我FreeAndNil
面板,下次组件尝试更新面板时,我会得到一个AV。我理解为什么:组件对面板的引用现在指向一个未定义的位置。
如何在组件内检测到面板是否已被释放,以便我知道我无法引用它?
我尝试了if (AStatusPanel = nil)
,但它不是nil
,它仍有地址。
答案 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
。它应该是你需要的。