При работе с графическим интерфейсом в среде разработки 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.