Отключить изменение размера формы в Delphi - PullRequest
19 голосов
/ 29 марта 2010

Есть ли способ остановить изменение размера формы пользователем?

В настоящее время я использую:

Когда размер формы изменился ....

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

Но это выглядит ужасно, поскольку мерцает, когда пользователь пытается изменить размер формы.

Ответы [ 3 ]

39 голосов
/ 29 марта 2010

Исправить размер легко, у вас есть два варианта:

  1. Формы Delphi имеют свойство BorderStyle и свойство BorderIcons. Если вы установите BorderStyle на bsDialog и BorderIcons на biSystemMenu, пользователь не сможет изменить размер формы.

  2. Вы можете указать значение для свойства Constraints. Если вы напишите одно и то же число в MinWidth и MaxWidth, ширина будет фиксированной.

Предотвращение хода более сложно. Теперь я могу предложить только эти решения:

  1. Установите BorderStyle на bsNone. При необходимости вам нужно будет самостоятельно нарисовать заголовок формы.

  2. Записать обработчик сообщения в WM_NCHITTEST, сначала вызвать унаследованный вызов, затем проверить Message.Result для HTCAPTION Если это HTCAPTION, установите вместо него HTCLIENT. Таким образом, вы обманываете Windows, полагая, что пользователь не нажал на заголовок, поэтому он не сможет перетащить. Пожалуйста, попробуйте, если пользователь все еще может переместить окно, открыв системное меню и выбрав Переместить. Если это так, вам также нужно скрыть системное меню (BorderIcons).

Ответ найден здесь .

9 голосов
/ 29 марта 2010

Если вы хотите, чтобы ваша форма вообще не меняла размер, тогда установка стиля границы формы на 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;
1 голос
/ 10 января 2018

Вы можете добавить код на События "OnCanResize":

Resize := False;

Пример:

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