Как вернуть delphi TForm к первоначальному виду после использования ScaleBy () - PullRequest
8 голосов
/ 05 января 2012

Я хочу разрешить пользователю определять размер формы с пропорционально измененным размером элементов управления. ScaleBy (N, M) прекрасно работает для меня, но, конечно, при повторении повторяются ошибки с округлением. Чтобы противостоять этому, я просто хочу предшествовать ScaleBy () вызовом для воссоздания формы с ее внешним видом и размером по умолчанию, а затем вызывать ScaleBy с различными значениями. Я знаю, что могу сделать это, разместив мою форму на панели (и утилизировав / воссоздав ее), но есть ли вызов, который сбросит форму после использования ScaleBy ()?

Редактировать - я использую Delphi XE2 и также заинтересован в том, чтобы кто-нибудь успешно использовал компонент или другой код (платный или бесплатный) для аккуратного масштабирования формы - мои собственные загрузки не дали работающего решения.

Ответы [ 3 ]

7 голосов
/ 05 января 2012

Попробуйте EasySize (TFormResizer).
Компонент TFormResizer изменяет размеры всех элементов управления на форме (или панели) при изменении размера формы.
Iуспешно использовал его много лет назад - работает с D5 / 7.Возможно, вам придется внести небольшие корректировки в XE2 (у меня нет XE2, поэтому я не могу его протестировать).

Использование:

uses
  ..., Easysize;

type
  TForm1 = class(TForm)
    ...        
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    FR: TFormResizer;
  end;

...

procedure TForm1.FormCreate(Sender: TObject);
begin
  FR := TFormResizer.Create(Self);
  FR.ResizeFonts := True;
  FR.InitializeForm;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  FR.ResizeAll;
end;

end.
2 голосов
/ 05 января 2012

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

В следующей статье приведен пример кода: http://delphi.about.com/od/adptips2005/qt/storecontrolpos.htm

Это сделано для несколько иной цели, но не должно быть сложно изменить код для ваших нужд.

1 голос
/ 05 января 2012

Сначала настройте масштаб на исходный масштаб, затем масштабируйте на новый масштаб. Например, чтобы масштабировать форму в событии OnResize:

...
  private
    FDesignHeight: Integer;
    FDesignWidth: Integer;
    FPrevWidth: Integer;
  end;

...

procedure TForm1.FormShow(Sender: TObject);
begin
  FDesignHeight := Height;
  FDesignWidth := Width;
  FPrevWidth := Width;
  Scaled := True;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  if Scaled then
  begin
    DisableAlign;
    ScaleBy(FDesignWidth, FPrevWidth);
    ScaleBy(Width, FDesignWidth);
    EnableAlign;
  end;
  FPrevWidth := Width;
end;

procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
  NewHeight := Round(NewWidth * FDesignHeight / FDesignWidth);
end;
...