Есть ли способ узнать, создается ли объект или уничтожается внутри помощника класса?

У меня есть несколько помощников классов для компонентов для создания подкомпонентов, таких как всплывающие меню, для доступа к этим подкомпонентам во время выполнения, я создаю 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 ответа

Решение

Вместо TDictionaryсделай кастом TComponent потомок, который содержит TDictionary, Тогда посмотри, как TComponent.FreeNotification работает, и решение должно стать очевидным.:)

Нет, ты не можешь. Delphi не отслеживает, независимо от того, создано или уничтожено что-то помощником класса.

Если вы хотите знать, уничтожается ли компонент, вы должны использовать

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

Если вы хотите получать уведомления о его уничтожении, используйте FreeNotification.

Чтобы узнать больше о FreeNotification, вы можете проверить этот пост.

Другие вопросы по тегам