Как я могу смоделировать событие OnDestroy
для TFrame
в Delphi?
я с легкостью добавил constructor
и destructor
в свой кадр, думая, что это то, что TForm
делает:
TframeEditCustomer = class(TFrame)
...
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
...
end;
constructor TframeEditCustomer.Create(AOwner: TComponent)
begin
inherited Create(AOwner);
//allocate stuff
end;
destructor TframeEditCustomer.Destroy;
begin
//cleanup stuff
inherited Destroy;
end;
Проблема в том, что к тому времени, когда мой деструктор запускается, элементы управления на фрейме уже уничтожены и больше не действительны.
Причина этого кроется вдеструктор содержащей формы, который он использует для запуска события OnDestroy
:
destructor TCustomForm.Destroy;
begin
...
if OldCreateOrder then DoDestroy; //-->fires Form's OnDestroy event; while controls are still valid
...
if HandleAllocated then DestroyWindowHandle; //-->destroys all controls on the form, and child frames
...
inherited Destroy; //--> calls destructor of my frame
...
end;
Деструктор моего объекта фрейма вызывается при запуске деструктора формы.Проблема в том, что уже слишком поздно.Форма вызывает DestroyWindowHandle
, которая просит Windows уничтожить дескриптор окна формы.Это рекурсивно уничтожает все дочерние окна, включая те, что находятся на моем фрейме.
Поэтому, когда мой фрейм destructor
запускается, я пытаюсь получить доступ к элементам управления, которые больше не находятся в допустимом состоянии.
Как я могу имитировать событие OnDestroy
для TFrame
в Delphi?
См. Также