在表单编辑器中调整字体大小后,调整 Delphi 表单的大小

4
我正在开发一个旧版Delphi 6应用程序,我想增加其中一个窗体的字体大小。所有其他窗体都是“Microsoft Sans Serif 8pt”,但这个窗体设置为“Microsoft Sans Serif 7pt”。所有控件都使用了“ParentFont = True”,因此我可以简单地将窗体的字体大小设置为“8pt”。问题是窗体及其控件不会自动调整大小,标签文本会重叠。是否有一种简单的方法,在调整字体大小后调整窗体的大小,而无需在窗体编辑器中手动调整其控件大小?
1个回答

5

在设计时,您可以通过手动编辑 .dfm 文件来进行更改。确保将表单保存并设置为 Scaled 属性为 True

然后,在 Delphi 中关闭项目或关闭 Delphi。接下来,在文本编辑器中打开 .dfm 文件并调整表单的 TextHeight 属性。例如,如果您想将比例从 7pt 缩放到 8pt,并且 TextHeight 设置为 13,那么您应将其更改为 11。然后重新加载项目并在设计器中打开表单,您的表单将被缩放。这不会完全精确缩放,因为您不能使用浮点值来设置 TextHeight。但它可能已经足够好了。


在运行时,您可以调用 ChangeScale

ChangeScale(NewFont.Size, OldFont.Size);

请注意,ChangeScale 是一个受保护成员。因此,根据您调用的位置,您可能需要使用受保护成员hack。
那么一种选择是在运行时调用表单持久性框架来生成缩放版本的 .dfm 文件。这将允许您比使用 TextHeight 更精确地控制。
例如,您可以将以下内容附加到您的表单的 OnShow 事件上:
procedure TMyForm.FormShow(Sender: TObject);
var
  BinaryStream, TextStream: TStream;
begin
  BinaryStream := TMemoryStream.Create;
  Try
    BinaryStream.WriteComponent(Self);
    BinaryStream.Position := 0;
    TextStream := TFileStream.Create('MyForm.dfm', fmCreate);
    Try
      ObjectBinaryToText(BinaryStream, TextStream);
    Finally
      TextStream.Free;
    End;
  Finally
    BinaryStream.Free;
  End;
end;

这将生成一个基于运行时状态的新.dfm文件。然后,您可以将其与您的版本控制系统中的.dfm文件版本进行比较。有一些更改是您不想接受的,但大多数更改都是您想要的位置和大小更改。

谢谢你,David,但我想在“开发时间”而不是“运行时”调整窗体大小。 - kol
@kol 个人感觉,使用 ChangeScale 的运行时选项仍然是最好的选择。这将为您提供最准确的缩放。 - David Heffernan
非常感谢!我用了第一种方法,它完美地解决了我的问题。有趣的是,在 TForm 的帮助文件中找不到 TextHeight 属性的任何信息。你能告诉我它是如何工作的吗? - kol
@kol 我也不太确定。我原本以为是 PixelsPerInch。我认为这些都是神奇的属性,用于存储上一次设计该表单的机器的度量标准。如果您在具有不同字体缩放比例的机器上打开表单,则会调用 ChangeScale 并缩放表单。但我不记得细节了。我上次看这个已经很久了。 - David Heffernan
@kol 你可以在设计时创建一个专家,它会调用ChangeScale。 - Torbins
3
@Torbins 这将是一种非常巧妙的方法。是否适用于一次性流程还有待商榷。我个人认为CnPack/GExperts应该会提供这种功能,但我在他们的网站上找不到它。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接