有没有办法知道在类助手中是否正在创建或销毁对象?

时间:2012-08-01 18:42:31

标签: delphi lifecycle class-helpers

我很少有组件的助手来创建子组件,比如弹出菜单,以便在运行时访问这些子组件,我创建了一个Singleton TDictionary。

我的问题是如何知道所有者组件被销毁以从TDictionary中删除子组件?

如果它是一个专门的组件,我将它添加到析构函数中,但我不能在类助手中添加构造函数和/或析构函数。

修改 - 解决方案

我创建了一个接受TObject作为参数的基础对象,使用时,必须手动完成移除操作。

然后我从中继承了一个新类,重写方法只接受TComponent。这就是现在代码的相关部分:

type     
  TCustomLinkedComponents = class(TCustomLinkedObjects)
  strict private
    type
      TCollector = class(TComponent)
      protected
        procedure Notification(AComponent: TComponent; Operation: TOperation); override;
      end;
  strict private
    FCollector: TCollector;
[..]
  end;

procedure TCustomLinkedComponents.Add(Owner: TComponent; const LinkedName: string; LinkedComponent: TComponent);
begin
  inherited Add(Owner, LinkedName, LinkedComponent);
  FCollector.FreeNotification(LinkedComponent);
end;

procedure TCustomLinkedComponents.TCollector.Notification(AComponent: TComponent; Operation: TOperation);
begin
  inherited;
  if Operation = opRemove then
    LinkedObjects.Remove(TObject(AComponent));
end;

使用这种方法,我可以解决我的实际需要,然后打开后可以轻松扩展。

3 个答案:

答案 0 :(得分:5)

创建包含TDictionary的自定义TComponent后代,而不是TDictionary。然后看看TComponent.FreeNotification如何工作,解决方案应该变得明显。 :)

答案 1 :(得分:2)

如果您希望知道组件是否被销毁,则应使用

function IsBeingDestroyed(AComponent : TComponent) : Boolean;
begin
  Result := csDetroying in AComponent.ComponentState;
end;

如果您希望在销毁时得到通知,则可以使用FreeNotification。

有关FreeNotification的更多详细信息,您可以查看this post

答案 2 :(得分:2)

不,你不能。无论是否由类助手创建/销毁某些内容,Delphi都不会保持特殊的跟踪。