Cohérence de la police tout au long du projet?

Existe-t-il un moyen rapide et efficace d'appliquer une police globale à utiliser dans un projet?

Par cela, je veux dire que je voudrais mettre un nom de Police spécifique que tous les contrôles dans mon projet va utiliser comme TButton, TEdit, TLabel etc.

En règle générale, la définition de la police pour le formulaire plutôt que d'un contrôle spécifique modifiera tous les contrôles sur ce formulaire pour la police spécifiée.

Il y a un léger problème avec ceci cependant, si vous avez modifié manuellement une police sur un spécifique contrôle, puis la définition de la police par le formulaire ne mettra plus à jour les contrôles qui ont déjà été modifiés manuellement.

Idée 1

Je pensais utiliser une boucle For et itérer à travers chaque composant sur mes formulaires et définir la police de cette façon, comme:

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;

Mais faire cela semble très désordonné, ce sera aussi une quantité considérable de code pour une tâche simple.

Idée 2

Je sais que je pourrais changer manuellement les polices au moment de la conception un par un pour chaque contrôle, mais avec plusieurs formes à traverser cela pourrait prendre du temps et même alors je pourrais manquer un contrôle.

Idée 3

Semblable à Idea 2, une autre façon pourrait être de voir le formulaire en tant que texte (DFM) et de trouver et de remplacer la police de cette façon.


Fondamentalement, je vais pour la cohérence dans mon Application, et avoir une police utilisée tout au long est ce que je cherchais à réaliser.

Est-ce que je manque quelque chose de complètement évident ici, est ce que je j'essaie de faire trop pour une telle tâche?

22
demandé sur Fabrizio 2012-05-14 22:03:55

3 réponses

Comme indiqué dans les commentaires, la clé de ceci est la propriété ParentFont. Cette propriété est définie à différents points de la hiérarchie VCL. Si vous définissez ParentFont sur True pour tous les composants de la chaîne, vous pouvez modifier les polices de l'application entière simplement en modifiant

Application.DefaultFont

Par défaut, la plupart des composants définissent ParentFont sur True et vous n'avez donc rien à faire. L'Impair est cependant TForm. Un tout nouveau formulaire par défaut a ParentFont défini sur False. C'est un peu décevant mais je suspect reflète le fait que les concepteurs originaux de la VCL n'ont pas anticipé cela et que ParentFont a été greffé sur relativement tard dans le développement de la VCL.

Peu importe, dans un monde idéal, toutes les formes de votre application doivent être dérivées d'une classe de base commune que vous contrôlez. Si tel est le cas, vous pouvez simplement y apporter la modification, définir ParentFont comme True, Assurez-vous qu'aucun paramètre de police explicite n'est appliqué aux composants de vos formulaires et que vous êtes en or. Le contrôle de l'ensemble de la les polices de l'application via une seule propriété. Si vous n'avez pas de classe de base commune pour vos formulaires, voici le moment idéal pour l'ajouter. Si vous ne voulez pas faire cela, vous devez définir ParentFont pour chaque formulaire.

Autres propriétés associées sont Screen.MessageFont et Screen.MenuFont. Ceux-ci fournissent un contrôle global sur les polices utilisées dans les boîtes de message et les menus. Cependant, les versions récentes de Delphi ont remis à Windows le contrôle sur la peinture des boîtes de message et des menus et donc ceux-ci propriétés n'ont aucun effet.

23
répondu David Heffernan 2012-05-14 19:53:20

La vraie clé, comme cela a été mentionné, est de s'assurer que tous vos formulaires descendent de votre propre formulaire de base d'application.

Ensuite, vous pouvez afficher chaque formulaire et chaque bouton, etc., et examiner les propriétés, où toute propriété de police modifiée doit être affichée en gras, et est facilement identifiée. La plupart des propriétés ont un choix de menu "revenir à hérité". Cela devrait essentiellement annuler toute sélection précédente, sans avoir à aller à la version texte pour l'édition. (Bien qu'il le fasse probablement exactement, suppression de toute entrée de texte résultant d'un réglage de police précédent).

Je voudrais certainement corriger chaque formulaire une fois plutôt que de le laisser défini incorrectement et d'ajouter plus de code pour le réparer à l'exécution. Ce changement vous laissera avec un problème pire si vous décidez plus tard de faire quelque chose de différent.

2
répondu Patrick Moloney 2012-05-17 15:46:01

Si vous voulez faire ce runtime, comme vous le décrivez dans Idea 1, vous devriez envisager d'en faire une fonction récursive, comme ceci:

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;

Vous pouvez ensuite changer de police pour tous les contrôles d'un formulaire en l'utilisant comme ceci:

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

La fonction définit ensuite les propriétés de police du formulaire et les propriétés de police de tous les contrôles enfants du formulaire, y compris les contrôles imbriqués dans TPanels ou d'autres contrôles de conteneur.

Cependant je suis d'accord avec vous que c'est une sorte de une façon à moitié désordonnée de le faire.

1
répondu Elling 2012-05-14 20:18:50