如何在使用ScaleBy()后将Delphi TForm重置为原始外观

lc8prwob  于 2022-09-21  发布在  其他
关注(0)|答案(4)|浏览(286)

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

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

ulydmbyx

ulydmbyx1#

尝试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.
tgabmvqs

tgabmvqs2#

一种解决方案是在窗体的所有子控件上使用窗体的Components属性,并将它们重置回其原始值。

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

这是为了稍有不同的目的,但根据您的需要修改代码应该不会太难。

z31licg0

z31licg03#

首先,将比例调整为原始比例,然后将比例调整为新比例。例如,要在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;
332nm8kg

332nm8kg4#

这对我来说很好。为了解决舍入问题,我从基值100000开始;使用TSpinEDIT,其默认为‘100’,步长为10(%):

OnShow: OldScaleValue := 100000;

procedure TLogForm.SpinEdit1Change(Sender: TObject);
begin
  DisableAlign;
  try
    Log('Org Width='+Width.ToString);
    Scaleby(100000, OldScaleValue);
    OldScaleValue := SpinEdit1.Value*1000;
    Scaleby(OldScaleValue, 100000);
    Log('NEW Width='+Width.ToString);
  finally
    EnableAlign;
  end;
end;

这以10%的增加/减少前进和后退,没有舍入问题。

相关问题