【问题标题】:Is there any way to know if a object is being created or destroyed inside a class helper?有什么方法可以知道一个对象是在类助手中创建还是销毁?
【发布时间】:2012-07-30 17:15:24
【问题描述】:

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

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

【问题讨论】:

    标签: delphi lifecycle class-helpers


    【解决方案1】:

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

    【讨论】:

    • 嗨 Mason,它适用于组件,但我想要更通用的东西来与 TObjects 一起使用。
    • @Cesar:那你就不走运了。没有办法判断“一个对象是在类助手中创建还是销毁”,您的代码不必知道这一点。它确实需要知道谁拥有对什么的引用,因此它可以正确清理事物。如果你不能使用 TComponent 通知系统,你必须自己实现类似的东西。
    • 你可以挂钩 TObject.FreeInstance 使其适用于任何对象。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 但是TDictionary 不是一个组件。
    • 嗨,Ken,看看我对 Mason 的评论,我希望它适用于 TObject。
    • @TLama,它不需要。当然,这会使事情变得稍微容易一些,但不是必需的。它只需要一个与他的 TDictionary 齐头并进的 TComponent 实例来管理 FreeNotifications,就像 TComponentList 类的工作方式一样。
    • @Ken,我知道,但你忘了在帖子中提到,OP 需要将他的字典包装到一个组件中。
    • @Cesar,如果你想要的一切都是可能的,那将是“丑陋的黑客之路”,相信我,你不想去那里。如果用 TObject 有一种优雅的方式来做到这一点,我怀疑他们会在 TComponent 中重新实现它。 (虽然一切皆有可能)
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 2011-04-13
      • 2015-06-06
      相关资源
      最近更新 更多