Вопрос, поднятый в обсуждении, касается определения набора символов (скриптов) для каждого шрифта в среде разработки Delphi 10.2.3. Пользователи столкнулись с проблемой преобразования байтовых значений, возвращаемых функцией EnumFontFamiliesEx, в читаемые названия скриптов, которые отображаются в стандартном диалоге выбора шрифта (TFontDialog).
Проблема
Функция EnumFontFamiliesEx возвращает числовые значения, соответствующие кодировкам (например, ANSI_CHARSET, DEFAULT_CHARSET, SYMBOL_CHARSET), но не предоставляет удобных текстовых описаний, которые можно было бы отобразить в интерфейсе.
Решение
Для преобразования числовых значений в читаемые названия можно использовать таблицу соответствий, как предложено в обсуждении. Например:
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;
Вывод
Для простого отображения названия кодировки подходит таблица соответствий.
Для проверки поддержки конкретных символов лучше использовать GetFontUnicodeRanges.
Универсального 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