Delphi の TFrame で 継承した Destroty のイベント発生タイミング

Delphi の TFrame 上のリストに埋め込んだオブジェクトをFrame開放時にFreeしてやろうとしてハマったメモ

TFrame にはコンストラクタとデストラクタ イベントが無いので、継承して追加するも、Destroy イベントが発生したときには、リストのカウンタが既に 0 で埋め込んだオブジェクトへアクセスする手段が無くなっていました

ここによるとTFrameのDestroyが実行されたときには、親フォームからの破棄が行われたあとなんだとか → WM_DESTROY を追加してそこへ処理を記述
    private
        procedure WMDestroy(var Msg: TWMDestroy); message WM_DESTROY;
    //

procedure TFrame1.WMDestroy(var Msg: TWMDestroy);
begin
    if (csDestroying in ComponentState) then begin
        // ココに Destroy 処理
    end;
    inherited;
end;

コメント