Как исключить нечитаемые и слишком крупные шрифты из списка TComboBox в Delphi 10.1.2
При работе с компонентом TComboBox в приложениях VCL для Delphi 10.1.2, разработчики часто сталкиваются с проблемой отображения шрифтов, которые не предназначены для чтения или имеют слишком большой размер. В данной статье мы рассмотрим, как можно отфильтровать такие шрифты, чтобы пользовательский интерфейс был удобным и функциональным.
Проблема отображения шрифтов
Пример кода, который заполняет TComboBox списком шрифтов, выглядит следующим образом:
procedure TForm2.FormCreate(Sender: TObject);
begin
AddFontsToComboList;
end;
procedure TForm2.AddFontsToComboList;
var
i: Integer;
begin
ComboBox1.Items.BeginUpdate;
try
for i := 0 to Screen.Fonts.Count - 1 do
begin
ComboBox1.Items.Add(Screen.Fonts[i]);
end;
finally
ComboBox1.Items.EndUpdate;
end;
end;
procedure TForm2.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
// Код для отображения шрифтов в стиле owner draw
end;
Однако, в результате работы такого кода, в списке могут отображаться шрифты, которые не предназначены для чтения, например, Cambria Math, или имеют слишком большой размер, что делает их неудобными для использования в TComboBox.
Решение проблемы
Чтобы отфильтровать шрифты, необходимо использовать функцию GetTextMetrics(), которая позволяет измерить метрики шрифта и определить, подходит ли он для отображения в TComboBox. Код для измерения метрик шрифта может выглядеть следующим образом:
uses
Winapi.Windows;
function IsFontReadable(const FontName: string; Height: Integer): Boolean;
var
HDC: HDC;
FontMetrics: TFontMetrics;
begin
HDC := GetDC(0);
FontMetrics := TDC.FontMetrics;
try
FontMetrics.FontSize := Height;
if not CreateScalableFontResource(HDC, PChar(FontName), 0, TRANSFORM, FontMetrics) then
Exit(False);
Result := FontMetrics.tmHeight > 0;
finally
ReleaseDC(0, HDC);
end;
end;
procedure TForm2.AddFontsToComboList;
var
i: Integer;
begin
ComboBox1.Items.BeginUpdate;
try
for i := 0 to Screen.Fonts.Count - 1 do
begin
if IsFontReadable(Screen.Fonts[i], ComboBox1.ItemHeight) then
ComboBox1.Items.Add(Screen.Fonts[i]);
end;
finally
ComboBox1.Items.EndUpdate;
end;
end;
В данном примере кода, перед добавлением шрифта в TComboBox, проверяется, что его высота не превышает высоту элемента списка. Это позволяет исключить слишком крупные шрифты из отображения.
Подтвержденный ответ
Используя функцию IsFontReadable, разработчики могут фильтровать шрифты по метрикам и исключать те, которые не подходят для чтения или имеют слишком большой размер. Это обеспечит удобство и функциональность отображения списка шрифтов в TComboBox.
Альтернативный ответ и дополнительные замечания
Разработчики также обсуждали возможность ручного обрезки текста и использования переменного размера элементов списка, но это может привести к неожиданному поведению компонента, например, к изменению его размера при выборе определенного шрифта.
Заключение
В данной статье мы рассмотрели, как исключить нечитаемые и слишком крупные шрифты из списка TComboBox в Delphi 10.1.2. Использование функции GetTextMetrics() и создания вспомогательной функции IsFontReadable позволяет эффективно отфильтровать шрифты перед их добавлением в список, что улучшает пользовательский опыт и облегчает разработку.
Ответ содержит инструкции по исключению из списка компонента TComboBox в Delphi 10.1.2 нечитаемых и слишком крупных шрифтов, используя функцию проверки метрик шрифтов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.