DelphiでのOnDestroy
イベントをシミュレートするにはどうすればよいですか?TFrame
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
実行されると、有効な状態ではなくなったコントロールにアクセスしようとします。
DelphiでのOnDestroy
イベントをシミュレートするにはどうすればよいですか?TFrame