Перейти к содержанию
Fire Monkey от А до Я
  • 0

Можно ли задать минимальные размеры для формы?


Виктор

Вопрос

Вопрос конечно не шибко умный, что то в пятницу вечером не могу сообразить. Как выставить минимальные размеры формы? Что бы меньше было нельзя никак уменьшить

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
procedure TForm16.FormResize(Sender: TObject);
const
  C_FORM_MIN_H = 100; // минимальная высота
  C_FORM_MIN_W = 100; // минимальная ширина
begin
  if Self.Height < C_FORM_MIN_H then
    Self.Height := C_FORM_MIN_H;

  if Self.Width < C_FORM_MIN_W then
    Self.Width := C_FORM_MIN_W;
end;
Ссылка на комментарий
  • 0

Resize дает плохой результат. При уменьшении размеров форма в начале уменьшается, а потом увеличивается, в результате мерцание. Раньше вроде было событие onCanResize которое срабатывало перед изменениями размеров, но счас такого не нашел.

Ссылка на комментарий
  • 0
  • Администраторы

В FireMonkey нету поддержки ограничений размеров, как это есть в VCL. Поэтому на текущий момент, вы можете сделать:

  1. Либо общими средствами FM, через OnResize. Но он вас не устраивает.
  2. Второй напрямую использовать WinApi WM_GETMINMAXINFO. Но для этого придется протянуть из FMX.Platform.Win.pas наружу обработку этого сообщения.  
Ссылка на комментарий
  • 0
  • Администраторы

Для OSX:

uses
  FMX.Platform.Mac, Macapi.CoreGraphics;

procedure SetFormMinSize(const AForm: TForm; const AMinSize: TSize);
var
  MacHandle: TMacWindowHandle;
begin
  MacHandle := WindowHandleToPlatform(AForm.Handle);
  MacHandle.Wnd.setMinSize(CGSizeMake(AMinSize.Width, AMinSize.Height));
end;

procedure SetFormMaxSize(const AForm: TForm; const AMaxSize: TSize);
var
  MacHandle: TMacWindowHandle;
begin
  MacHandle := WindowHandleToPlatform(AForm.Handle);
  MacHandle.Wnd.setMaxSize(CGSizeMake(AMaxSize.Width, AMaxSize.Height));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetFormMinSize(Self, TSize.Create(300, 100));
end;
Ссылка на комментарий
  • 0

Я думаю со мной согласится абсолютное большинство, что ограничение размеров формы - это проблема!

Причем проблема с "большой буквы".

Как это сделать в VCL - все в курсе.
Предвидя ответ, что это можно сделать самому "ручками", спрошу - почему все должны лезть в исходники Firemonkey и править "родные" модули, дабы достичь нужного результата?
Вроде это самые элементарные свойства (предопределение минимальных/максимальных размеров формы).

Поэтому очень хотелось бы вынести это "обсуждение"/проблему на рассмотрение Embarcadero. И, конечно, хотелось бы чтобы они эту проблему решили и решили в срочном порядке.

 

Согласитесь (думаю и наши уважаемые гуру согласятся), что этот вопрос относится к элементарным и основным проблемам.

Представьте себе любого начинающего FMX-прогера, который в первом же своем FMX-проекте столкнется с данной проблемой...

 

P.S. Как крайний вариант - рассматриваю коллективное обсуждение и решение этой задачи с публикацией кода.

Ссылка на комментарий
  • 0

Для формы (каждой) пишем

TfmMain = class(TForm)
  ...
  procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  ...
  protected
  private
  public
  ....
end;
procedure TfmMain.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
  // тут, конечно, ваши значения
  if AWidth < 740 then
    AWidth:= 740;
  if AHeight < 530 then
    AHeight:= 530;
  inherited SetBounds(ALeft, ATop, AWidth, AHeight);
end;
Ссылка на комментарий
  • 0

Так....

Ну попробуйте вот что:

в protected формы запишите:

  protected
    procedure CreateHandle; override;

А затем

procedure TfmMain.CreateHandle;
begin
  inherited CreateHandle;
  {$IFDEF MSWINDOWS}
  SetWindowLong(WindowHandleToPlatform(Handle).Wnd, GWL_EXSTYLE,
    GetWindowLong(WindowHandleToPlatform(Handle).Wnd, GWL_EXSTYLE) or WS_EX_APPWINDOW);
  {$ENDIF}
end;
Ссылка на комментарий
  • 0

 

Так....

Ну попробуйте вот что:

в protected формы запишите:

  protected
    procedure CreateHandle; override;

А затем

procedure TfmMain.CreateHandle;
begin
  inherited CreateHandle;
  {$IFDEF MSWINDOWS}
  SetWindowLong(WindowHandleToPlatform(Handle).Wnd, GWL_EXSTYLE,
    GetWindowLong(WindowHandleToPlatform(Handle).Wnd, GWL_EXSTYLE) or WS_EX_APPWINDOW);
  {$ENDIF}
end;

Я не пойму а где здесь конкретные значения длинны и ширины? Или я не правильно понял. Как она работает?

 

 

---

 

Да и что CreateHandle есть, что его нет. Возможно я не понял как его применять.........

Изменено пользователем sviat
Ссылка на комментарий
  • 0

То что мне нужно не получилось, а получились довольно таки странные вещи: 

  • При запуске приложения создается два екземпляра формы.
  • При изменении размеров формы, элементы в форме маштабируются под размер формы, если форма меньше заданного размера (прилагаю скрины).

post-1145-0-19569600-1430404932.png

post-1145-0-36270000-1430404951_thumb.pn

post-1145-0-78246900-1430404979_thumb.pn

post-1145-0-98494900-1430405004_thumb.pn

Ссылка на комментарий
  • 1

Вот модуль который решает проблему минимального размера:

FMX.FormHelper.zip

 

Просто подключите модуль к своему проекту и объявите его в uses. Пользоваться вот так:

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetMinSize(640, 480);
end;

Все. Теперь размер формы будет ограничен 640х480. 

Ссылка на комментарий
  • 0

Вот модуль который решает проблему минимального размера:

attachicon.gifFMX.FormHelper.zip

 

Просто подключите модуль к своему проекту и объявите его в uses. Пользоваться вот так:

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetMinSize(640, 480);
end;

Все. Теперь размер формы будет ограничен 640х480. 

И куда его положить? В папке с проектом он толку не дает.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...