gpt4 book ai didi

delphi - 整个项目的字体一致性?

转载 作者:行者123 更新时间:2023-12-03 14:34:08 26 4
gpt4 key购买 nike

是否有一种快速有效的方法来应用要在项目中使用的全局字体?

我的意思是我想设置一个特定的字体名称,我的项目中的所有控件都将使用它,例如 TButtonTEditTLabel等等

通常为表单而不是特定控件设置字体会将该表单上的所有控件更改为指定的字体。

但是,这有一个小问题,如果您手动更改了特定控件上的字体,则通过表单设置字体将不再更新以前手动更改的那些控件。

想法1

我正在考虑使用 For 循环并迭代表单上的每个组件并以这种方式设置字体,例如:

procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
with TForm(Self) do
begin
for i := 0 to ComponentCount - 1 do
begin
if Components[i] is TButton then
begin
TButton(Components[i]).Font.Name := 'MS Sans Serif';
TButton(Components[i]).Font.Size := 8;
TButton(Components[i]).Font.Style := [fsBold];
end;

if Components[i] is TLabel then
begin
TLabel(Components[i]).Font.Name := 'MS Sans Serif';
TLabel(Components[i]).Font.Size := 8;
TLabel(Components[i]).Font.Style := [fsBold];
end;
end;
end;
end;

但是这样做看起来很困惑,对于一个简单的任务来说,这也会是相当大量的代码。

想法2

我知道我可以在设计时手动为每个控件一一更改字体,但是要完成多个表单可能需要时间,即使这样我也可能会错过一个控件。

想法3

与想法 2 类似,另一种方法可能是将表单视为文本 (DFM),并以这种方式查找和替换字体。

<小时/>

基本上,我希望在我的应用程序中保持一致性,并且在整个过程中使用一种字体是我希望实现的目标。

我是否在这里遗漏了一些完全明显的东西,我正在尝试为这样的任务做过度的事情?

最佳答案

正如评论中所讨论的,关键是 ParentFont 属性。该属性在 VCL 层次结构中的各个点定义。如果您将链中所有组件的 ParentFont 设置为 True,则只需修改

即可更改整个应用程序的字体
Application.DefaultFont

默认情况下,大多数组件将 ParentFont 设置为 True,因此您无需执行任何操作。不过,奇怪的是 TForm。全新的默认表单将 ParentFont 设置为 False。这有点令人失望,但我怀疑反射(reflect)了这样一个事实:VCL 的原始设计者没有预料到这一点,并且 ParentFont 是在 VCL 开发相对较晚的时候移植的。

无论如何,在理想的世界中,应用程序中的所有表单都应该派生自您控制的公共(public)基类。如果是这样,那么您只需在那里进行更改,将 ParentFont 设置为 True,确保没有显式字体设置应用于表单上的任何组件,并且您是金色的。通过单个属性控制整个应用程序的字体。如果您的表单没有通用基类,那么现在是添加它的理想时机。如果您不想这样做,那么您需要为每个表单设置 ParentFont

其他相关属性有Screen.MessageFontScreen.MenuFont 。这些提供了对消息框和菜单中使用的字体的全局控制。然而,Delphi 的最新版本已将消息框和菜单绘制的控制权交还给 Windows,因此这些属性不起作用。

关于delphi - 整个项目的字体一致性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10588660/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com