2019/09/06

Delphi 最大化MDI子フォームを切り替えると呼び出される OnResizeイベント

Delphi の古いソースコードの修正中に気づいた(最新では変わっているかも)
MDI子フォームを最大化した状態で、子フォームを切り替えると OnResizeイベントが2回呼び出される

最大化したMDI子フォームをAからBへ切り替えると
  1. フォームAが wsMaximized から wsNormal へ切り替わり OnResizeイベント発生
  2. フォームBが wsNormal から wsMaximized へ切り替わり OnResizeイベント発生
と2回呼び出される
つまり、背後に回ったフォームは、ノーマルサイズへ戻されているという事になる

今回、背後に回ったフォームのリサイズイベントは無視したいという条件があったので
MDIに wsMaximized が存在するかをチェックして、1. のイベントをスキップさせるという方法で対応

procedure TMdiChildForm.FormResize(Sender: TObject);
var I: Integer;
    MaxFormExists: Boolean;
begin
    // MDI Form に MAXが存在するかどうかを確認
    MaxFormExists := False;
    for I := MdiMainForm.MDIChildCount - 1 downto 0 do begin
        MaxFormExists := MaxFormExists or (MdiMainForm.MDIChildren[I].WindowState = wsMaximized);
    end;

    if (not MaxFormExists) or (WindowState = wsMaximized) then begin
        // resize func;
    end;
end;
上記の場合、最大化を解除した時のリサイズイベントがアクティブな子フォーム以外発生しないので注意が必要となる(アクティブな子フォーム以外は、すでに最大化ではないため)

0 件のコメント: