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

Как определить набор символов (скриптов) для каждого шрифта в Delphi 10.2.3

Delphi , Графика и Игры , Шрифты

Вопрос, поднятый в обсуждении, касается определения набора символов (скриптов) для каждого шрифта в среде разработки Delphi 10.2.3. Пользователи столкнулись с проблемой преобразования байтовых значений, возвращаемых функцией EnumFontFamiliesEx, в читаемые названия скриптов, которые отображаются в стандартном диалоге выбора шрифта (TFontDialog).

Проблема

Функция EnumFontFamiliesEx возвращает числовые значения, соответствующие кодировкам (например, ANSI_CHARSET, DEFAULT_CHARSET, SYMBOL_CHARSET), но не предоставляет удобных текстовых описаний, которые можно было бы отобразить в интерфейсе.

Решение

Для преобразования числовых значений в читаемые названия можно использовать таблицу соответствий, как предложено в обсуждении. Например:

const
  FontCharsetNames: array[0..12] of TIdentMapEntry = (
    (Value: 0;   Name: 'ANSI (Western)'),
    (Value: 1;   Name: 'Default'),
    (Value: 2;   Name: 'Symbol'),
    (Value: 77;  Name: 'Mac'),
    (Value: 128; Name: 'Shift-JIS (Japanese)'),
    (Value: 129; Name: 'Hangul (Korean)'),
    (Value: 130; Name: 'Johab (Korean)'),
    (Value: 134; Name: 'GB2312 (Chinese)'),
    (Value: 136; Name: 'Big5 (Chinese)'),
    (Value: 161; Name: 'Greek'),
    (Value: 162; Name: 'Turkish'),
    (Value: 177; Name: 'Hebrew'),
    (Value: 178; Name: 'Arabic')
  );

Пример кода для получения названия кодировки:

function GetCharsetName(Charset: Byte): string;
var
  I: Integer;
begin
  Result := 'Unknown';
  for I := Low(FontCharsetNames) to High(FontCharsetNames) do
    if FontCharsetNames[I].Value = Charset then
    begin
      Result := FontCharsetNames[I].Name;
      Break;
    end;
end;

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

Если требуется более точное определение поддерживаемых символов (например, для проверки поддержки кириллицы или азиатских языков), можно использовать GetFontUnicodeRanges из Windows API.

uses
  Windows, Graphics;

function CheckUnicodeSupport(Font: TFont; CodePage: Word): Boolean;
var
  DC: HDC;
  OldFont: HGDIOBJ;
  Ranges: PGlyphSet;
  Buffer: array[0..1023] of Byte;
  I: Integer;
begin
  DC := GetDC(0);
  try
    OldFont := SelectObject(DC, Font.Handle);
    Ranges := @Buffer;
    if GetFontUnicodeRanges(DC, Ranges) > 0 then
    begin
      // Проверяем поддержку нужного диапазона (например, кириллицы: U+0400–U+04FF)
      for I := 0 to Ranges.cRanges - 1 do
        if (Ranges.Ranges[I].wcLow <= $04FF) and 
           (Ranges.Ranges[I].wcLow + Ranges.Ranges[I].cGlyphs >= $0400) then
        begin
          Result := True;
          Exit;
        end;
    end;
    Result := False;
  finally
    ReleaseDC(0, DC);
  end;
end;

Вывод

  1. Для простого отображения названия кодировки подходит таблица соответствий.
  2. Для проверки поддержки конкретных символов лучше использовать GetFontUnicodeRanges.
  3. Универсального API для получения локализованных описаний нет — их нужно хранить вручную.

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

Пример вывода в TComboBox:

procedure FillCharsetList(ComboBox: TComboBox);
var
  I: Integer;
begin
  ComboBox.Clear;
  for I := Low(FontCharsetNames) to High(FontCharsetNames) do
    ComboBox.Items.Add(FontCharsetNames[I].Name);
end;

Таким образом, задача решается комбинацией статических таблиц и API-функций Windows.

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

Обсуждение посвящено проблеме преобразования числовых значений кодировок шрифтов, возвращаемых функцией EnumFontFamiliesEx в Delphi 10.2.3, в читаемые названия для отображения в интерфейсе, с предложением решения через таблицу соответствий и альтернативн


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

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




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


:: Главная :: Шрифты ::


реклама


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

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