Если вы хотите, чтобы ваша форма вообще не меняла размер, тогда установка стиля границы формы на bsSingle
является правильным решением, так как тогда курсор мыши не изменится на один из курсоров размеров при перемещении по форме. границы, поэтому для пользователя очевидно, что размер этой формы не может быть изменен.
Если вы хотите установить минимальный и / или максимальный размер для формы, тогда 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;