Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как определить моноширинные шрифты в среде Delphi

Delphi , Синтаксис , Справочник по API-функциям

Как определить моноширинные шрифты в среде Delphi

При работе с графическим интерфейсом в среде разработки Delphi может возникнуть необходимость определения, является ли текущий шрифт моноширинным. Моноширинные шрифты имеют одинаковую ширину символов, что делает их удобными для отображения кода и текста, где важно соблюдение равномерности. В Delphi для работы со шрифтами используется класс TFont, который предоставляет различные свойства, в том числе Pitch, указывающее на тип шрифта — моноширинный или пропорциональный.

Проблема определения моноширинных шрифтов

Разработчики часто сталкиваются с проблемой, когда свойство Pitch класса TFont не корректно определяет моноширинные шрифты. Согласно документации, свойство Pitch должно возвращать значение fpFixed для моноширинных шрифтов. Однако в некоторых версиях Delphi (например, в XE4) это значение не соответствует ожидаемому, и вместо fpFixed возвращается DEFAULT_PITCH, который не позволяет корректно определить моноширинные шрифты.

Пример кода с проблемой

var
  Font: TFont;
begin
  Font := TFont.Create;
  Font.Name := 'Courier New';
  if Font.Pitch = fpFixed then
    ShowMessage('Monospace Font!');
  // ...
end;

В этом примере, несмотря на то что используется моноширинный шрифт 'Courier New', условие проверки Font.Pitch = fpFixed не выполняется, так как возвращается значение DEFAULT_PITCH.

Альтернативное решение

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

function EnumFontsProc(var elf: TEnumLogFont; var tm: TNewTextMetric; FontType: Integer; Data: LPARAM): Integer; stdcall;
begin
  Result := Integer(FIXED_PITCH = (elf.elfLogFont.lfPitchAndFamily and FIXED_PITCH));
end;

И пример использования этой функции в обработчике нажатия кнопки:

procedure TForm1.Button13Click(Sender: TObject);
begin
  if EnumFontFamilies(Canvas.Handle, PChar('Courier New'), @EnumFontsProc, 0) <> 0 then
    Caption := 'Fixed'
  else
    Caption := 'Variable';
end;

В новейших версиях Delphi функция EnumFontFamilies возвращает целочисленный результат, поэтому в условии следует использовать оператор сравнения не с нулем, а с ненулевым значением, что указывает на успешное выполнение функции.

Обновление для новых версий Delphi

В новых версиях Delphi описание функции EnumFontFamilies указывает на возвращение целочисленного результата, что отличается от предыдущего описания как BOOL. Поэтому в новых проектах следует использовать соответствующий синтаксис:

if EnumFontFamilies(Canvas.Handle, PChar('Courier New'), @EnumFontsProc, 0) <> 0 then
  Caption := 'Fixed'
else
  Caption := 'Variable';

Заключение

Использование функции EnumFontFamilies позволяет корректно определить моноширинные шрифты в среде Delphi. Важно учитывать версию используемой среды разработки и соответствующим образом адаптировать код.

Создано по материалам из источника по ссылке.

Описание: Вопрос касается проблемы корректного определения моноширинных шрифтов в среде разработки Delphi, когда стандартный метод с использованием свойства `Pitch` класса `TFont` не работает, и предложено альтернативное решение с использованием функции


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по API-функциям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 14:29:29/0.0033628940582275/0