Form の大きさを制限する
93 FormSizeLimit 動作確認 Delphi2007 更新日 2010/06/23(水)

FormのConstraintsプロパティは正しくFormのサイズを制限してはくれません。
ConstraintsのMinHeight/MinWidthを設定しても
ウィンドウの左上のドラッグしてリサイズすると
右下にスライドするような奇妙な動作をします。(D5/D6/D2005/D2007で確認済み)

自動コンポーネント配置処理によるものでしょうが
もっとまともにサイズを制限してほしいです。

まともにFormサイズ制限するためには
WM_GetMinMaxInfoメッセージを使って実装します。

────────────────────
type
  TForm1 = class(TForm)
  private
     procedure WM_GetMinMaxInfo(var Msg: TWMGetMinMaxInfo); message WM_GETMINMAXINFO;
  public

  end;


(*-------------------------------
//ハンドルからWindowStateを調べる
引数説明:   WndHandle: ハンドル
  -------------------------------*)
function GetWindowState(WndHandle: HWnd): TWindowState;
var
  pw : TWINDOWPLACEMENT;
begin
  pw.length := SizeOf(TWINDOWPLACEMENT);
  GetWindowPlacement(WndHandle, @pw);

  case pw.showCmd of
    SW_SHOWNORMAL:{=1}
      Result := wsNormal;
    SW_SHOWMINIMIZED: {=2}
      Result := wsMinimized;
    SW_MAXIMIZE: {=3}
      Result := wsMaximized;
  else
    raise Exception.Create('WindowStateのエラー'+IntToStr(pw.showCmd));
  end;
end;

procedure TForm1.WM_GetMinMaxInfo(var Msg: TWMGetMinMaxInfo);
begin
  with Msg.MinMaxInfo^ do
  begin
    ptMinTrackSize := Point(200, 200);      //マウス操作での最小サイズ
    if GetWindowState(Self.Handle) <> wsMaximized then
      ptMaxTrackSize := Point(300, 300);    //マウス操作での最大サイズ
    ptMaxSize      := Point(500, 500);      //最大化時サイズ
    ptMaxPosition  := Point(300, 300);      //最大化時のForm位置
  end;
  inherited;
end;
────────────────────
マウストラック時の最大サイズは ptMaxTrackSize で指定します。

この値はFormのWindowStateが最大化ではない時だけ使います。
そうしなければ、最大化ボタンを押すなどで最大化したときも
ptMaxSizeの値ではなく
ptMaxTrackSizeの値によって制限されてしまいます。


ptMaxSizeを指定した場合は
なぜか、最大化時にはFormが移動可能になり、
ptMaxPositionの指定値が意味をなさなくなるようです。


それぞれの値で x,y の一方だけ指定したい場合は
    ptMinTrackSize.x := 100;
などと指定してください。

例文では 

    with Msg.MinMaxInfo^ do
    begin
      ptMinTrackSize := ...

とやっていますが

    Msg.MinMaxInfo^.ptMinTrackSize := ...
    Msg.MinMaxInfo.ptMinTrackSize := ...

このような書き方も可能です。


参考────────────────────
[Delphi:47828] Re: フォームサイズ固定

DelphiAcidFloor
http://homepage2.nifty.com\boheme\delphi\tips\tec0700.htm

BorlandDelphiQ&A
フォームのサイズを変更する時の最大値と最小値を制御するには 
http://www.borland.co.jp/qanda/delphi/d0005105.html
現在のリンク先はこちら
    旧Delphi FAQ - VCL(3)
    http://support.embarcadero.com/article/37436
    フォームのサイズを変更する時の最大値と最小値を制御するには (98/10/05)

フォームのサイズを変更できないようにするにはどうしますか? 
http://www.borland.co.jp/qanda/delphi/d0002876.html
現在のリンク先はこちら
    旧Delphi FAQ - Windows API
    http://support.codegear.com/article/37295
    フォームのサイズを変更できないようにするにはどうしますか?