【发布时间】:2012-05-22 06:02:54
【问题描述】:
是否有一种快速有效的方法可以在项目中应用全局字体?
我的意思是我想设置一个特定的字体名称,我项目中的所有控件都将使用它,例如TButton、TEdit、TLabel 等。
通常为表单设置字体而不是特定控件会将该表单上的所有控件更改为指定的字体。
不过,这有一个小问题,如果您手动更改了特定控件上的字体,那么通过表单设置字体将不再更新以前手动更改的那些控件。
想法 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属性设置为False;将其设置为True以返回默认(父)字体 -
偷偷摸摸,我没有意识到这个属性已经被改变了!
-
在创建任何表单之前,请设置
Application.DefaultFont.Name := 'MS Sans Serif';,正如 Serg 指出的那样,在表单中将 ParentFont 设置为 true。要在消息对话框中设置字体,请设置Screen.MessageFont.Nameproperty。 -
如果您需要在运行时执行此操作,您可以像上面那样迭代表单组件并检查哪些组件具有使用 IsPublishedProp(Components[i], 'Font' 发布的 Font 属性) 来自 TypInfo 单元的方法。然后,您可以破解 TControl 来设置组件的 Font 属性,即,
-
如果您从 .dfm 文件中去除所有 Font 和 ParentFont 属性,那么 ParentFont 默认为 True,这一切都很好。