web-dev-qa-db-ja.com

delphiでフォームのサイズ変更を無効にする

ユーザーがフォームのサイズを変更するのを止める方法はありますか?

現在使用しているもの:

フォームサイズが変更されたとき...

MainForm.Height := 761;
MainForm.Width := 777;

しかし、ユーザーがフォームサイズを変更しようとするとちらつくので、これはひどいように見えます。

19
chendriksen

サイズの修正は簡単です。2つのオプションがあります。

  1. Delphiフォームには、BorderStyleプロパティとBorderIconsプロパティがあります。 BorderStylebsDialogに設定し、BorderIconsbiSystemMenuのみに設定した場合、ユーザーはフォームのサイズを変更できません。

  2. Constraintsプロパティに値を指定できます。 MinWidthMaxWidthに同じ数字を書くと、幅が固定されます。

moveの防止はもっと注意が必要です。私は今これらの解決策だけを思いつくことができます:

  1. BorderStylebsNoneに設定します。必要に応じて、フォームのキャプションを自分で描画する必要があります。

  2. メッセージハンドラをWM_NCHITTESTに書き込み、最初に継承を呼び出してから、Message.ResultHTCAPTIONを確認します。 HTCAPTIONの場合は、代わりにHTCLIENTに設定します。このようにすると、Windowsをだまして、ユーザーがキャプションをクリックしなかったと思い込ませるため、ユーザーはドラッグできなくなります。それでもユーザーがウィンドウを移動できる場合は、システムメニューを開いて[移動]を選択してみてください。その場合は、システムメニューも非表示にする必要があります(BorderIcons)。

答えが見つかりました ここ

39
Paul Sasik

フォームのサイズをまったく変更しない場合は、フォームの境界線スタイルをbsSingleに設定するのが適切です。フォーム上を移動しても、マウスカーソルがサイズ変更カーソルの1つに変更されないためです。境界線があるため、このフォームのサイズを変更できないことはユーザーには明らかです。

フォームの最小サイズや最大サイズを設定する場合は、bsSizeableが正しい境界線スタイルであり、フォームのConstraintsを使用して制限を指定できます。ただし、Constraintsプロパティがフォームのサイズ変更を妨げないという問題があります。制限に違反しないように、事後にサイズが調整されるだけです。これには、フォームの左または上の境界線でサイズを変更するとフォームが移動するというマイナスの副作用があります。これを防ぐには、そもそもサイズ変更を防ぐ必要があります。 Windowsは WM_GETMINMAXINFO トップレベルウィンドウの最小および最大トラッキングサイズを取得するためのメッセージ。これを処理して正しい制約を返すと、フォームの移動の問題が修正されます。

type
  TForm1 = class(TForm)
  private
    procedure WMGetMinMaxInfo(var AMsg: TWMGetMinMaxInfo);
      message WM_GETMINMAXINFO;
  end;

// ...

procedure TForm1.WMGetMinMaxInfo(var AMsg: TWMGetMinMaxInfo);
begin
  inherited;
  with AMsg.MinMaxInfo^ do begin
    ptMinTrackSize := Point(Constraints.MinWidth, Constraints.MinHeight);
    ptMaxTrackSize := Point(Constraints.MaxWidth, Constraints.MaxHeight);
  end;
end;
9
mghie

イベント「OnCanResize」でコードを追加できます。

Resize := False;

例:

procedure TF_NameForm.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
  Resize := False;
end;