Как я могу смоделировать событие 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?