Delphi フォームのサイズ変更・最小化・最大・閉じるボタンの制御方法

Delphi でフォームのタイトルバーボタン(最大化、最小化、還元、閉じる)の表示・動作を制御する場合、主に以下のプロパティやAPIを活用します。

1. 初期状態の指定:WindowState プロパティ

フォーム起動時の表示状態は WindowState プロパティで設定できます。たとえば、開始時に最大化するには:

procedure TForm1.FormCreate(Sender: TObject);
begin
  WindowState := wsMaximized;
end;

wsNormal(通常サイズ)、wsMinimized(最小化)の指定も同様に可能です。

2. タイトルバー上の操作ボタンの制御:BorderIcons プロパティ

BorderIcons プロパティを用いると、最大化・最小化ボタンの表示・非表示を個別に切り替えられます:

procedure TForm1.FormCreate(Sender: TObject);
begin
  // 最小化・最大化ボタンを非表示
  BorderIcons := BorderIcons - [biMinimize, biMaximize];

  // 他の例:閉じるボタンだけを表示
  BorderIcons := [biSystemMenu];  // biSystemMenu は閉じるボタンに対応

  // 最小化・閉じるのみ表示(最大化ボタンを隠す)
  BorderIcons := [biMinimize, biSystemMenu];
end;

3. ユーザー操作用のカスタムボタンによる制御

独自のボタンやメニューアイテムを配置し、実行時に状態を切り替えることも可能です:

procedure TForm1.ctrlMaximizeClick(Sender: TObject);
begin
  if WindowState <> wsMaximized then
    WindowState := wsMaximized;
end;

procedure TForm1.ctrlRestoreClick(Sender: TObject);
begin
  if WindowState = wsMaximized then
    WindowState := wsNormal
  else if WindowState = wsMinimized then
    WindowState := wsNormal;
end;

procedure TForm1.ctrlMinimizeClick(Sender: TObject);
begin
  WindowState := wsMinimized;
end;

このように独自のコントロールを実装することで、UI の一貫性や特別な操作フローに対応できます。

4. システムメニューコマンドのカスタマイズ(注意が必要)

システムメニューやその構成を直接変更することも技術的には可能ですが、OS の標準動作を乱す可能性があるため、.ColumnName を避けるべきです。

必要minimalなケースのみ、以下のように実装します(使用は推奨しません):

procedure TForm1.FormCreate(Sender: TObject);
var
  sysMenu: HMENU;
begin
  sysMenu := GetSystemMenu(Handle, False);
  if sysMenu <> 0 then
  begin
    DeleteMenu(sysMenu, SC_CLOSE, MF_BYCOMMAND);     // 閉じるを削除
    DeleteMenu(sysMenu, SC_MINIMIZE, MF_BYCOMMAND);  // 最小化を削除
    DeleteMenu(sysMenu, SC_MAXIMIZE, MF_BYCOMMAND);  // 最大化を削除
    DrawMenuBar(Handle);
  end;
end;

この手法では、キーボードショートカット(Alt+F4 など)やアクセシビリティツールとの連携に悪影響を及ぼす可能性があります。

補足:最大化/還元ボタンの切り替え論理

最大化と還元(復元)は同一のボタンがを使い分ける仕様のため、実装上は状態判定を行い動作を切り替える必要があります:

procedure TForm1.toggleMaximizeRestoreClick(Sender: TObject);
begin
  case WindowState of
    wsNormal:   WindowState := wsMaximized;
    wsMaximized: WindowState := wsNormal;
  end;
end;

タグ: Delphi VCL TForm BorderIcons WindowState

7月1日 16:30 投稿