2012-01-05 1 views
8

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

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

+1

Вы хотите, чтобы пользователь имел возможность масштабировать форму «на лету», неоднократно? Лично я просто воссоздал. –

+0

@David: Я просто хочу, чтобы они могли перетащить ползунок (скажем), пока он не посмотрит вправо, а затем оставьте его, поэтому нет влияния на производительность. –

ответ

7

Пробег: EasySize (TFormResizer) Компонент.
Компонент TFormResizer изменяет размеры всех элементов управления на форме (или панели) при изменении размера формы.
Я использовал его успешно много лет назад - работает с 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. 
+0

Ницца - я посмотрю. Благодарю. –

+1

Easysize работает с удовольствием, и пока и пока не появится собственное решение, я приму ваш ответ. Благодарю. –

2

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

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

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

+0

Действительно ли это требует сохранения копии в начале? Почему нет способа перерисовать их, но по умолчанию? –

1

Во-первых, изменить масштаб к исходному масштабу, затем масштабировать до нового масштаба. Например, чтобы масштабировать форму в событии 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; 
+0

Это аккуратное решение. Благодарю. –

 Смежные вопросы

  • Нет связанных вопросов^_^