Подтвердить что ты не робот

Согласованность шрифтов по всему проекту?

Есть ли быстрый и эффективный способ применения глобального шрифта, который будет использоваться в проекте?

Под этим я подразумеваю, что хотел бы установить определенное имя шрифта, которое будут использоваться всеми элементами управления в моем проекте, такими как 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) и поиск и замена шрифта таким образом.


В основном я собираюсь выполнить последовательность в моем приложении, и использование одного Font во всем - это то, что я хотел достичь.

Я пропустил что-то совершенно очевидное здесь, это то, что я пытаюсь сделать слишком много для такой задачи?

4b9b3361

Ответ 1

Как указано в комментариях, ключ к этому - это свойство ParentFont. Это свойство определяется в разных точках иерархии VCL. Если для всех компонентов в цепочке вы установите ParentFont как True, то вы можете изменить шрифты для всего приложения, просто изменив

Application.DefaultFont

По умолчанию большинство компонентов устанавливают ParentFont в True, и вам нечего делать. Нечетный, хотя есть TForm. Новая форма по умолчанию ParentFont установлена ​​на False. Это несколько разочаровывает, но я подозреваю, что тот факт, что оригинальные дизайнеры VCL не ожидали этого и что ParentFont был привит относительно поздно в разработке VCL.

Независимо от того, в идеальном мире все формы в вашем приложении должны быть получены из общего базового класса, который вы контролируете. Если это так, вы можете просто внести изменения там, установите ParentFont как True, убедитесь, что для любых компонентов в ваших формах не применяются явные настройки шрифта, а вы - золотые. Управляйте всеми шрифтами приложения через одно свойство. Если у вас нет общего базового класса для ваших форм, здесь идеальное время для его добавления. Если вы не хотите этого делать, вам нужно установить ParentFont для каждой формы.

Другие связанные свойства Screen.MessageFont и Screen.MenuFont. Они обеспечивают глобальный контроль над шрифтами, используемыми в ящиках сообщений и меню. Тем не менее, последние версии Delphi вернули Windows контроль над изображением ящиков сообщений и меню, и поэтому эти свойства не влияют.

Ответ 2

Настоящий ключ, как уже упоминалось, заключается в том, чтобы все ваши формы сходили с вашей собственной базовой формы приложения.

Затем вы можете просмотреть каждую форму и кнопку и т.д. и просмотреть свойства, где любое измененное свойство шрифта должно отображаться жирным шрифтом и легко идентифицироваться. У большинства свойств есть выбор "Возврат к унаследованному". Это должно по существу отменить любой предыдущий выбор, без необходимости идти в текстовую версию для редактирования. (Хотя он, вероятно, делает именно это, удаляя любую текстовую запись, полученную в результате предыдущей настройки шрифта).

Я определенно хотел бы исправить каждую форму один раз, а не оставить ее неправильно и добавить больше кода, чтобы исправить ее во время выполнения. Это изменение оставит вас с худшей проблемой, если позже вы решите сделать что-то другое.

Ответ 3

Если вы хотите выполнить эту рабочую среду, как описано в Idea 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 или другие элементы управления контейнером.

Однако я согласен с вами в том, что это всего лишь беспорядочный способ сделать это.