我希望允许用户调整表单的大小,并按比例调整其控件的大小。 ScaleBy(N,M)对我来说很好,但如果重复,当然会出现累积舍入错误。为了解决这个问题,我只希望在ScaleBy()之前调用以默认外观和大小重新创建表单,然后使用各种值调用ScaleBy。我知道我可以通过在一个面板中托管我的表单(以及处理/重新创建它)来做到这一点但是有一个调用会在使用ScaleBy()之后重置表单吗?
编辑 - 我正在使用Delphi XE2,并且也会对任何人使用组件或其他代码(付费或免费)成功地扩展表单感兴趣 - 我自己的下载还没有产生可行的解决方案。
答案 0 :(得分: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.
答案 1 :(得分:2)
一种解决方案是在表单的所有子控件上使用表单interate的Components属性,并将它们重置回原始值。
以下文章包含示例代码:http://delphi.about.com/od/adptips2005/qt/storecontrolpos.htm
目的略有不同,但不应该根据需要修改代码。
答案 2 :(得分: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;