8

我想允许用户调整表单的大小,并按比例调整其控件的大小。ScaleBy( N,M ) 对我来说效果很好,但如果重复的话,当然会有累积的舍入误差。为了解决这个问题,我只想在 ScaleBy() 之前调用以默认外观和大小重新创建表单,然后使用各种值调用 ScaleBy。我知道我可以通过在面板中托管我的表单(并处理/重新创建它)来做到这一点,但是是否有一个调用会在使用 ScaleBy() 后重置表单?

编辑 - 我正在使用 Delphi XE2,并且对任何人成功使用组件或其他代码(付费或免费)来整齐地缩放表单感兴趣 - 我自己的下载没有产生有效的解决方案。

4

3 回答 3

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.
于 2012-01-05T15:36:45.327 回答
2

一种解决方案是使用表单的 Components 属性对表单的所有子控件进行交互,并将它们重置为原始值。

以下文章有示例代码:http ://delphi.about.com/od/adptips2005/qt/storecontrolpos.htm

这是出于稍微不同的目的,但根据您的需要修改代码应该不难。

于 2012-01-05T15:14:10.273 回答
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;
于 2012-01-05T17:02:16.767 回答