2012-05-14 9 views
20

プロジェクトで使用するグローバルフォントを迅速かつ効果的に適用する方法はありますか?これによりプロジェクト全体のフォント一貫性?

私は私のプロジェクト内のすべてのコントロールは、通常のフォームではなく、特定のフォントを設定するなどのTButton、TEDIT、TLabelとして

を使用することを具体的なフォント名を設定したいわけコントロールは、そのフォームのすべてのコントロールを指定されたFontに変更します。

ただし、特定のコントロールのフォントを手動で変更した場合、フォームでフォントを設定すると以前に手動で変更されたコントロールは更新されなくなります。

アイデア1

私のような、ループのために使用して、この方法を私のフォーム上の各コンポーネントを反復処理し、フォントの設定を考えていた:

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でフォントを変更することができます知っています。アイデア2と同様

アイデア3

、別の方法は、テキスト(DFM)としてフォームを表示し、その方法フォントを検索と置換することができました。


基本的に私は自分のアプリケーション内で一貫性のために行くと、全体を通して使用1つのフォントを持っていますが、私は達成するために探していたものです。

私はここで完全に明白な何かを見逃していますが、私はそのような仕事のために過度のことをしようとしていますか?

+6

コントロールのフォントを手動で変更した場合は、その「ParentFont」プロパティも「False」に設定します。 True(デフォルト)(Parent)フォントを返すように設定する – kludg

+1

卑劣なことに、私はこのプロパティが変更されていたことを認識していませんでした! –

+9

フォームを作成する前に、 'Application.DefaultFont.Name:= 'MS Sans Serif';' Sergが指摘するようにフォーム内でParentFontをtrueに設定します。メッセージダイアログでフォントを設定するには、 'Screen.MessageFont.Name'プロパティを設定します。 –

答えて

22

コメントで説明したように、これの鍵はParentFontプロパティです。このプロパティは、VCL階層のさまざまなポイントで定義されます。あなたがチェーン内のすべてのコンポーネントのTrueするParentFontを設定する場合は、単にデフォルトほとんどのコンポーネントでは

Application.DefaultFont 

を変更することで、アプリケーション全体のフォントを変更することができますTrueParentFontを設定するので、あなたは何の関係もありません。奇数はTFormです。新しいデフォルトフォームのParentFontFalseに設定されています。これはやや残念ですが、VCLのオリジナルデザイナーがこれを予期しておらず、VCLの開発の比較的遅い段階でParentFontがグラフトされたという事実を反映していると思われます。

理想的な世界では、アプリケーションのすべてのフォームは、自分が制御する共通の基底クラスから派生する必要があります。そうであれば、単に変更することができます。ParentFontTrueに設定し、フォーム上のコンポーネントに明示的なフォント設定が適用されていないことを確認してください。アプリケーションのフォント全体を単一のプロパティで制御します。フォームに共通の基本クラスがない場合は、追加するのが最適です。それをしたくない場合は、フォームごとにParentFontを設定する必要があります。

他の関連プロパティは、Screen.MessageFontおよびScreen.MenuFontです。これらは、メッセージボックスやメニューで使用されるフォントをグローバルに制御します。しかし、最近のバージョンのDelphiでは、メッセージボックスやメニューのペイントに対するWindowsのコントロールを引き渡しているため、これらのプロパティは効果がありません。

+0

あなたと他の人が既にコメントしたことに本当に追加するものは何もありません。しかし、プロジェクトオプションの中にフォントスタイルを設定してそれをプロジェクトに適用するオプションがあれば、それは素晴らしいことではないでしょうか?それは私のように私がこの組み込み関数を認識していないフォントをグローバルに変更するためのビジュアル設定があれば、はるかに簡単になります。とにかく、情報はよく書かれているので答えを受け取り、メッセージとメニューを強調表示するには+1します。 –

+10

VCLフォームはSwing(Java)やWPF(C#/ .net)のようにレイアウト管理されておらず、実行時にフォントを変更すると完璧なフォントクリッピングが発生し、UIが判読不能になります。がんばろう。アプリケーションのフォントを手動で、フォームごとに、見やすくするためにレビューすることなく、アプリケーションのフォントを変更する方法はありません。 –

+3

@ウォーレンそれは良い点だと私は私の答えでそれを言及するつもりだったが、忘れてしまった。私のアプリでは、XP用のTahoma 8またはVista +用のSegoe UI 9のいずれかにフォントを表示します。フォームレイアウトを変更するには、ChangeScaleを呼び出す必要があります。しかし、はい、両方のバリアントのフォームをチェックする必要があります。あなたのラベルを互いに強く詰め込んでいない限り、決して問題はありません。 ParentFontはこのすべての中で不思議に作用します。 –

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または他のコンテナコントロール内にネストコントロールを含むフォーム、上のすべての子コントロールのフォントプロパティを設定します。

しかし、私はあなたの意見に同意します。

+0

これは理想的なコーディングではありませんが、あなたの答えはそれほど有用ではありません:) –

+3

残念ながら、すべてのフォントプロパティの名前が「フォント」ではありません。 –

+0

@MarjanVenema他のフォントプロパティ名を展開する非VCLコンポーネントがある場合は、これらのプロパティ名で関数を拡張する必要があります。しかし、この議論の主なポイントは、上記のコメントの中でウォーレンPが指摘したポイントです:通常、アライメントを変更し、フォントクリッピングなどを導入するため、このようなフォントプロパティのランタイムを変更することはできません。 – Elling

2

上記のように、実際のキーは、すべてのフォームが独自のアプリケーションベースフォームから引き継がれるようにすることです。

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

間違って定義したままで、実行時に修正するコードを追加するのではなく、各フォームを一度修正する必要があります。後で何か違うことを決めると、その変更はあなたに悪い問題を残します。

+0

ヒントをありがとう。 –