Динамическое изменение размера формы в соответствии с размером фрейма в Delphi - PullRequest
1 голос
/ 15 июля 2011

У меня есть приложение, которое имеет 5 кадров разных размеров. Я хотел бы динамически изменить размер главной формы, чтобы она соответствовала кадру при переходе от одного кадра к другому.

Я могу использовать свойства MinHeight/MinWidth рамки, чтобы заставить основную форму соответствовать рамке, но затем при перемещении в меньшую рамку основная форма не регулирует свой размер.

Есть идеи?

- Edit

...
TFormMain = Class(TForm)
...
public
  FrameImportPackage: TFrameImportPackage;
...

procedure TFormMain.MenuPackagesImportClick(Sender: TObject);
begin
  if not (Assigned(FrameImportPackage)) then
    begin
      FrameImportPackage := TFrameImportPackage.Create(Self);
      FrameImportPackage.LabelFrameCaption.Caption := 'Import or Edit a Package';
    end
  else
    begin
      FrameImportPackage.BringToFront;
    end;

  FrameImportPackage.Parent := Self;
end;

- Edit

С уважением, Питер

Ответы [ 2 ]

4 голосов
/ 15 июля 2011

Если я правильно понимаю ваш вопрос, у вас есть кадры, которые не меняют размер, вы хотите, чтобы форма обновляла размер в соответствии с вашими кадрами.Пусть Delphi справится с этим для вас, используя свойство AutoSize.

Установите AutoSize = True для вашей формы.


Я протестировал AutoSize с помощью следующего кода, используяDelphi 2010:

  • Создайте новое приложение VCL.На пустую форму поместите одну панель, пусть она сохранит свое имя (Panel1).Убедитесь, что панель не слишком мала, потому что мы напишем код, чтобы уменьшить ее размер во время выполнения.
  • Установите для свойства AutoSize формы значение True.
  • Отпустите две кнопкипанель, Button1 и Button2.
  • Дважды щелкните кнопки и скопируйте и вставьте следующие обработчики событий:

Код:

procedure TForm31.Button1Click(Sender: TObject);
var NewR: TRect;
begin
  NewR := Panel1.BoundsRect;
  Dec(NewR.Right, 32);
  Dec(NewR.Bottom, 32);

  Button1.Parent := Self;
  Button2.Parent := Self;

  Panel1.Free;
  Panel1 := TPanel.Create(Self);
  Panel1.BoundsRect := NewR;
  Panel1.Parent := Self;

  Button1.Parent := Panel1;
  Button2.Parent := Panel1;
end;

procedure TForm31.Button2Click(Sender: TObject);
begin
  Panel1.Height := Panel1.Height - 32;
  Panel1.Width := Panel1.Width - 32;
end;

По сути, это дает вам два способа уменьшить размер панели, чтобы справиться с двумя возможными сценариями: Button1 освобождает старую панель и создает новую меньшую панель.Button2 напрямую изменить размер существующей панели.Оба работают как положено!

0 голосов
/ 23 марта 2017

По крайней мере, в Delphi 2006 существует действительно неприятная ошибка с формой AutoSize.

Вы помещаете TStringGrid в форму (Left и Top равны нулю, выравнивание равно None, Top, CLient не имеет значения), когда вы изменяете его ClientWidth и ClientHeightt, форма не всегда корректирует свой размер для элемента управления.

Обычно при сбое происходит уменьшение размера элемента управления, размер формы не уменьшается.

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

Сказано: форма AutoSize не всегда работает хорошо! Это ошибка на VCL.

...