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

Как определить текущий цвет темы для не тематизированных элементов управления в Delphi и Pascal?

Delphi , Программа и Интерфейс , Интерфейс

 

При создании приложений в 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;

Советы по работе со стилями

  1. Изучите файлы .style в вашем проекте - они помогут понять структуру стилей
  2. Для сложных элементов (например, кнопок) проверяйте тип фонового объекта (TRectangle или StyleObject)
  3. Учитывайте, что некоторые свойства могут быть градиентами, а не простыми цветами

Заключение

Определение и применение цветов темы к не тематизированным элементам в Delphi требует дополнительных усилий, но это вполне решаемая задача. Представленные методы позволяют создавать согласованные интерфейсы, где все элементы выглядят единообразно, независимо от их поддержки тем по умолчанию.

Для более глубокого изучения темы рекомендуется исследовать исходные файлы стилей Delphi и экспериментировать с различными подходами к извлечению и применению цветовых параметров.

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

Контекст описывает методы определения и применения текущих цветов темы к не тематизированным элементам в Delphi для создания единообразного интерфейса.


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

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




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


:: Главная :: Интерфейс ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-08-29 22:22:28/0.011477947235107/0