24

プロジェクトで使用するグローバル フォントをすばやく効果的に適用する方法はありますか?

TButtonこれは、プロジェクト内のすべてのコントロールが使用する特定のフォント名を設定したいということTEditですTLabel

通常、特定のコントロールではなくフォームのフォントを設定すると、そのフォームのすべてのコントロールが指定されたフォントに変更されます。

ただし、これには若干の問題があります。特定のコントロールのフォントを手動で変更した場合、フォームでフォントを設定しても、以前に手動で変更されたコントロールは更新されなくなります。

アイデア1

For ループを使用して、フォームの各コンポーネントを反復処理し、次のように 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;

しかし、これを行うと非常に面倒に思えます。また、単純なタスクの場合、かなりの量のコードになります。

アイデア2

デザイン時に各コントロールのフォントを 1 つずつ手動で変更できることはわかっていますが、複数のフォームを通過するには時間がかかり、それでもコントロールを見逃す可能性があります。

アイデア3

アイデア 2 と同様に、別の方法として、フォームをテキスト (DFM) として表示し、その方法でフォントを検索して置換することもできます。


基本的に、私は自分のアプリケーション内で一貫性を保つつもりであり、全体で 1 つのフォントを使用することが、私が達成しようとしていたものです。

ここで完全に明らかな何かが欠けていますか?そのようなタスクのためにやり過ぎようとしていることはありますか?

4

3 に答える 3

26

As discussed in the comments, the key to this is the ParentFont property. This property is defined at various points in the VCL hierarchy. If you set ParentFont to be True for all components in the chain, then you can change the fonts for the entire application simply by modifying

Application.DefaultFont

By default most components set ParentFont to True and so you have nothing to do. The odd one out though is TForm. A brand new default form has ParentFont set to False. This is somewhat disappointing but I suspect reflects the fact that the original designers of the VCL did not anticipate this and that ParentFont was grafted on relatively late in the development of the VCL.

No matter, in an ideal world, all forms in your application should be derived from a common base class that you control. If that is so then you can simply make the change there, set ParentFont to be True, make sure no explicit font settings are applied to any components on you forms, and you are golden. Control the entire application's fonts through a single property. If you don't have a common base class for your forms, here's an ideal time to add it. If you don't want to do that then you need to set ParentFont for each form.

Other related properties are Screen.MessageFont and Screen.MenuFont. These provide global control over the fonts used in message boxes and menus. However, recent versions of Delphi have handed back to Windows control over the painting of message boxes and menus and so these properties have no effect.

于 2012-05-14T19:48:04.157 に答える
2

前述のように、真の鍵は、すべてのフォームが独自のアプリケーション ベース フォームから派生していることを確認することです。

次に、各フォームやボタンなどを表示してプロパティを確認できます。変更されたフォント プロパティは太字で表示され、簡単に識別できます。ほとんどのプロパティには、[継承に戻す] メニューの選択肢があります。これにより、編集のためにテキスト バージョンに移動する必要なく、以前の選択が元に戻されるはずです。(おそらく正確にそれを行いますが、以前のフォント設定に起因するテキストエントリを削除します)。

間違って定義されたままにして、実行時に修正するためのコードを追加するのではなく、各フォームを一度修正することをお勧めします。その変更は、後で別のことを行うことにした場合、さらに悪い問題を残すことになります。

于 2012-05-17T15:46:01.307 に答える
1

アイデア1で説明したように、このランタイムを実行する場合は、次のように再帰関数にすることを検討する必要があります。

procedure SetFontProperties(Control: TControl; Name: TFontName; Size: Integer; Styles: TFontStyles);
// Set font properties
var
  Index: Integer;
  Font: TFont;
  AnObject: TObject;
  ChildControl: TControl;
begin
  // Set font properties
  AnObject := GetObjectProp(Control, 'Font', nil);
  if AnObject is TFont then
  begin
    // Set properties
    Font := TFont(AnObject);
    Font.Name  := Name;
    Font.Size  := Size;
    Font.Style := Styles;
  end;

  // Set child font properties
  if Control is TWinControl then
  begin
    // Set
    for Index := 0 to TWinControl(Control).ControlCount - 1 do
    begin
      // Child control
      ChildControl := TWinControl(Control).Controls[Index];

      // Set font properties
      SetFontProperties(ChildControl, Name, Size, Styles);
    end;
  end;
end;

次に、次のように使用して、フォーム内のすべてのコントロールのフォントを切り替えることができます。

SetFontProperties(Self, 'Courier', 14, []);

次に、この関数は、フォームのフォントプロパティ、およびTPanels内にネストされたコントロールやその他のコンテナコントロールを含む、フォーム上のすべての子コントロールのフォントプロパティを設定します。

しかし、私はあなたに同意します、それはそれをするための半分厄介な方法のようなものです。

于 2012-05-14T20:02:33.517 に答える