ユーザーがフォームのサイズを変更するのを止める方法はありますか?
現在使用しているもの:
フォームサイズが変更されたとき...
MainForm.Height := 761;
MainForm.Width := 777;
しかし、ユーザーがフォームサイズを変更しようとするとちらつくので、これはひどいように見えます。
サイズの修正は簡単です。2つのオプションがあります。
Delphiフォームには、BorderStyle
プロパティとBorderIcons
プロパティがあります。 BorderStyle
をbsDialog
に設定し、BorderIcons
をbiSystemMenu
のみに設定した場合、ユーザーはフォームのサイズを変更できません。
Constraints
プロパティに値を指定できます。 MinWidth
とMaxWidth
に同じ数字を書くと、幅が固定されます。
moveの防止はもっと注意が必要です。私は今これらの解決策だけを思いつくことができます:
BorderStyle
をbsNone
に設定します。必要に応じて、フォームのキャプションを自分で描画する必要があります。
メッセージハンドラをWM_NCHITTEST
に書き込み、最初に継承を呼び出してから、Message.Result
でHTCAPTION
を確認します。 HTCAPTION
の場合は、代わりにHTCLIENT
に設定します。このようにすると、Windowsをだまして、ユーザーがキャプションをクリックしなかったと思い込ませるため、ユーザーはドラッグできなくなります。それでもユーザーがウィンドウを移動できる場合は、システムメニューを開いて[移動]を選択してみてください。その場合は、システムメニューも非表示にする必要があります(BorderIcons
)。
答えが見つかりました ここ 。
フォームのサイズをまったく変更しない場合は、フォームの境界線スタイルを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;
イベント「OnCanResize」でコードを追加できます。
Resize := False;
例:
procedure TF_NameForm.FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
begin
Resize := False;
end;