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