项目中的字体一致性?

23 delphi delphi-xe

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

我的意思是我想设置,在我的项目中的所有控件都将使用如特定的字体名称TButton,TEdit,TLabel等.

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

但是,如果您在特定控件上手动更改了字体,那么通过表单设置字体将不再更新先前已手动更改的控件.

想法1

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

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;
Run Code Online (Sandbox Code Playgroud)

但这样做看起来非常混乱,对于一个简单的任务来说,它也将是相当多的代码.

想法2

我知道我可以在设计时手动为每个控件逐个手动更改字体,但有几种形式要经过这可能需要时间,即使这样我也可能错过了一个控件.

想法3

与Idea 2类似,另一种方法可以是将表单视为文本(DFM)以及查找和替换该方式的字体.


基本上我要在我的应用程序中保持一致性,并且始终使用一个Font是我想要实现的.

我在这里错过了一些完全明显的东西,我正在尝试为这样的任务做些过分吗?

Dav*_*nan 25

正如评论中所讨论的,关键是ParentFont财产.此属性在VCL层次结构中的各个点定义.如果设置ParentFontTrue链中的所有组件,则只需修改即可更改整个应用程序的字体

Application.DefaultFont
Run Code Online (Sandbox Code Playgroud)

默认情况下,大多数组件都设置ParentFontTrue,因此您无需执行任何操作.奇怪的是,虽然是TForm.一个全新的默认表单已ParentFont设置为False.这有点令人失望但我怀疑这反映了这样一个事实,即VCL的原始设计师没有预料到这一点,并且ParentFont在VCL开发的相对较晚的时候嫁接了.

无论如何,在理想的世界中,应用程序中的所有表单都应该来自您控制的公共基类.如果是这样,那么你可以简单地在那里进行更改,设置ParentFontTrue,确保没有明确的字体设置应用于表单上的任何组件,并且你是金色的.通过单个属性控制整个应用程序的字体.如果您没有表单的公共基类,这是添加表单的理想时间.如果您不想这样做,则需要ParentFont为每个表单设置.

其他相关的属性是Screen.MessageFontScreen.MenuFont.它们提供对消息框和菜单中使用的字体的全局控制.但是,最新版本的Delphi已经回复了Windows对消息框和菜单绘制的控制,因此这些属性没有任何效果.

  • 请记住,VCL表单不像Swing(java)或WPF(C#/ .net)那样"布局管理",并且在运行时更改字体会导致完美的字体剪辑,并使您的UI变得难以理解.祝好运.没有实用的方法来更改应用程序字体,而不是手动,逐个表单地查看结果,以便于阅读. (11认同)
  • 我将自己尝试这个,并可能会在博客上发布结果. (4认同)
  • @Warren这是一个好点,我打算在我的回答中提到它,但忘记了.在我的应用程序中,我在Tahoma 8 for XP或Segoe UI 9 for Vista +中显示字体.这需要调用ChangeScale来更改表单布局.但是,您必须检查两种变体中的表格.只要你不把对方的标签拼凑起来,就不会有任何问题.ParentFont在所有这些中都有奇效. (3认同)
  • +1"应用程序中的所有表单都应该从您控制的公共基类派生". (3认同)