我几乎没有组件类帮助器来创建子组件,例如弹出菜单,以便在运行时访问这些子组件,我创建了一个单例 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;
使用这种方法,我可以解决我的实际需求,并让稍后轻松扩展。