Отменить изменение формы в delphi
Есть ли способ остановить изменение размера формы?
В настоящее время я использую:
Когда размер формы изменился....
MainForm.Height := 761;
MainForm.Width := 777;
Но это выглядит ужасно, поскольку он мерцает, когда пользователь пытается изменить размер формы.
Ответы
Ответ 1
Фиксировать размер легко, у вас есть два варианта:
-
Формы Delphi имеют свойство BorderStyle
и свойство BorderIcons
. Если вы установите только BorderStyle
на bsDialog
и BorderIcons
на biSystemMenu
, пользователь не может изменить размер формы.
-
Вы можете указать значение для свойства Constraints
. Если вы пишете то же число до MinWidth
и MaxWidth
, ширина будет фиксированной.
Предотвращение перемещения более сложно. Теперь я могу предложить только эти решения:
-
Установите BorderStyle
в bsNone
. Вам нужно будет нарисовать заголовок формы самостоятельно, если это необходимо.
-
Напишите обработчик сообщения WM_NCHITTEST
, сначала наследуйте вызов, затем проверьте Message.Result
на HTCAPTION
. Если это HTCAPTION
, установите вместо него HTCLIENT
. Таким образом, вы обманываете Windows, думая, что пользователь не нажимает на подпись, поэтому он не сможет перетащить. Попробуйте, если пользователь еще может переместить окно, открывающее системное меню, и выберите "Переместить". Если это так, вам нужно также скрыть системное меню (BorderIcons
).
Ответ найден здесь.
Ответ 2
Если вы хотите, чтобы ваша форма вообще не изменялась, установка стиля рамки формы 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;
Ответ 3
вы можете добавить код в Events "OnCanResize":
Resize := False;
Пример:
procedure TF_NameForm.FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
begin
Resize := False;
end;