При создании приложений в Delphi с использованием FireMonkey (FMX) разработчики часто сталкиваются с проблемой: некоторые элементы управления, такие как TRectangle, TLine и TskSVG, не поддерживают автоматическое применение стилей темы. В этой статье мы рассмотрим способы определения текущих цветов темы и их применения к таким элементам.
Проблема тематизации элементов в FMX
Стандартные элементы FMX, такие как TButton и TLabel, автоматически получают цвета из текущей темы приложения. Однако для некоторых компонентов, особенно графических, это не работает. Рассмотрим решение этой проблемы.
Основной способ: получение цветов из стилей
Как показано в обсуждении, можно получить доступ к цветам темы через стили элементов:
var
sb: TFMXObject;
aFMXObj: TFMXObject;
begin
if Assigned(Scene) then
begin
if not Assigned(Scene.StyleBook) then
sb := TStyleManager.ActiveStyleForScene(Scene)
else
sb := Scene.StyleBook.Style;
if Assigned(sb) then
begin
// Получаем цвет текста из стиля Label
aFMXObj := TStyleContainer(sb).FindStyleResource('labelstyle');
if Assigned(aFMXObj) then
aFMXObj := TLayout(aFMXObj).FindStyleResource('Text');
if Assigned(aFMXObj) then
LabelTextColor := TText(aFMXObj).TextSettings.FontColor;
end;
end;
end;
Практическое применение цветов темы
Полученные цвета можно использовать для настройки не тематизированных элементов:
procedure TForm1.ApplyThemeColors;
var
TextObj: TText;
i: Integer;
Comp: TComponent;
begin
// Получаем цвет текста из стилизованного Label
TextObj := TText(StyledLabel.FindStyleResource('text'));
if Assigned(TextObj) then
begin
for i := 0 to ComponentCount - 1 do
begin
Comp := Components[i];
if Comp is TRectangle then
TRectangle(Comp).Stroke.Color := TextObj.TextSettings.FontColor
else if Comp is TLine then
TLine(Comp).Stroke.Color := TextObj.TextSettings.FontColor
else if Comp is TskSVG then
TskSVG(Comp).SVG.OverrideColor := TextObj.TextSettings.FontColor;
end;
end;
end;
Альтернативное решение: скриншот элемента
Patrick Premartin предложил альтернативный метод - использование скриншота элемента для определения его цвета:
function GetControlColor(AControl: TControl): TAlphaColor;
var
Bitmap: TBitmap;
begin
Bitmap := AControl.MakeScreenshot;
try
Result := Bitmap.Pixels[0, 0]; // Получаем цвет первого пикселя
finally
Bitmap.Free;
end;
end;
Этот метод может быть полезен, когда стандартные способы получения цвета не работают, но он менее эффективен и может давать неточные результаты.
Работа с вложенными фреймами
Как отметил Fudley, стандартный подход не работает для элементов внутри фреймов. Вот решение для таких случаев:
procedure TForm1.ColorMyFramesWorld(AFrame: TFrame);
var
i: Integer;
Comp: TComponent;
TextObj: TText;
begin
TextObj := TText(StyledLabel.FindStyleResource('text'));
if Assigned(TextObj) then
begin
for i := 0 to AFrame.ComponentCount - 1 do
begin
Comp := AFrame.Components[i];
if Comp is TRectangle then
TRectangle(Comp).Stroke.Color := TextObj.TextSettings.FontColor
// Добавьте другие проверки типов по необходимости
end;
end;
end;
Советы по работе со стилями
Изучите файлы .style в вашем проекте - они помогут понять структуру стилей
Для сложных элементов (например, кнопок) проверяйте тип фонового объекта (TRectangle или StyleObject)
Учитывайте, что некоторые свойства могут быть градиентами, а не простыми цветами
Заключение
Определение и применение цветов темы к не тематизированным элементам в Delphi требует дополнительных усилий, но это вполне решаемая задача. Представленные методы позволяют создавать согласованные интерфейсы, где все элементы выглядят единообразно, независимо от их поддержки тем по умолчанию.
Для более глубокого изучения темы рекомендуется исследовать исходные файлы стилей Delphi и экспериментировать с различными подходами к извлечению и применению цветовых параметров.
Контекст описывает методы определения и применения текущих цветов темы к не тематизированным элементам в Delphi для создания единообразного интерфейса.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.