Отменить изменение формы в 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;