5

我几乎没有组件类帮助器来创建子组件,例如弹出菜单,以便在运行时访问这些子组件,我创建了一个单例 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;

使用这种方法,我可以解决我的实际需求,并让稍后轻松扩展。

4

3 回答 3

5

代替 a ,创建一个包含 aTDictionary的自定义后代。然后研究如何工作,解决方案应该变得显而易见。:)TComponentTDictionaryTComponent.FreeNotification

于 2012-08-01T18:53:58.193 回答
2

如果你想知道组件是否被销毁,你应该使用

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

如果你想在它被销毁时得到通知,使用 FreeNotification 是要走的路。

有关 FreeNotification 的更多详细信息,您可以查看这篇文章

于 2012-08-01T19:06:00.557 回答
2

不,你不能。Delphi 不会特别跟踪类助手是否创建/销毁了某些东西。

于 2012-08-01T19:54:05.790 回答