Умный поиск

Как получить список моноширинных шрифтов в Delphi

Программировать и работать с различного рода скриптами обычно удобнее, если использовать при этом специальные моноширинные шрифты. Основное отличие моноширинного шрифта от обычного состоит в том, что он имеет одинаковую для всех символов ширину:

Этот текст набран обычным шрифтом
|Этот текст набран моноширинным шрифтом|
|Этот текст также набран моноширинным ш|рифтом

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

В среде программирования Delphi получить список всех установленных в системе шрифтов можно следующей функцией:

var
  L: TStrings;
begin
  L := Screen.Fonts;
end;

При этом, список Fonts вернёт и обычные, и моноширинные шрифты. В случае, если необходимо получить список только моноширинных шрифтов, можно воспользоваться таким кодом:

function GetFixedWidthFonts(C: TCanvas): string;
var
  i: Integer;
  F: string;
  L: TStringList;
begin
  { возвращает список МОНОШИРИННЫХ шрифтов }
  L := TStringList.Create;
  for i := 0 to Screen.Fonts.Count - 1 do
    begin
      F := Screen.Fonts[i];
      C.Font.Name := F;
      { сравниваем ширину символов }
      if C.TextWidth('ABC') = C.TextWidth('IJK') then
        L.Add(F);
    end;
  Result := L.Text;
  L.Free;
end;

Функция вернёт строку, в которой будет размещён список моноширинных шрифтов, разделенных знаками переноса строки. В теле функции происходит обращение к каждому шрифту системы и вывод текста на некоторую канву C, которую необходимо передать функции в качестве аргумента. Канву имеют практически все визуальные компоненты среды Delphi; ее также можно создать программно, на время работы функции.

Далее происходит сравнение ширины двух строк заведомо разной ширины (если печатать их обычным шрифтом), но состоящих из равного количества символов. Таким образом, если шрифт является моноширинным, то и ширина текста в пикселях будет одинаковая. Если данное условие выполняется, то имя шрифта вносится во временный список методом L.Add(F).

Успешной работы!


Виталий Артемов — фото профиля

Виталий Артемов

Основатель, руководитель лаборатории Dystlab. Кандидат технических наук, разработчик САПР. Ведет онлайн-курсы по расчету конструкций, динамике, спецкурс для аспирантов, руководит стажировкой по расчету ЖБК


Блог | Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. | Community | FB | LinkedIn

Под статьей | Случайные статьи по инженерии