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

"Управление стилями VCL: Переключение между светлым и темным режимом в Delphi"

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

Управление стилями VCL: Переключение между светлым и темным режимом в Delphi

В современных приложениях пользователи часто хотят иметь возможность переключаться между светлым и темным режимом интерфейса. В Delphi это можно реализовать с помощью стилей VCL. В данной статье мы рассмотрим, как переключаться между светлым и темным режимом в вашем приложении, а также обсудим проблему, с которой столкнулся пользователь под ником corneliusdavid, и предложим решение.

Базовый подход

Для переключения между светлым и темным режимом можно использовать стили VCL. Стиль определяется файлом с расширением .vsf, который содержит информацию о цветах, шрифтах и других параметрах визуального оформления приложения. Чтобы переключиться между стилями, достаточно вызвать процедуру TStyleManager.SetStyle и передать ей имя стиля в виде строки.

Пример переключения на темный режим:

TStyleManager.SetStyle('DarkMode');

Пример переключения на светлый режим (по умолчанию):

TStyleManager.SetStyle('Windows');

Проблема корнелиусадавида

Пользователь corneliusdavid столкнулся с проблемой, когда после переключения на темный режим и последующего возврата к светлому режиму, переключение обратно на темный режим переставало работать. Он обнаружил, что если вызывать TStyleManager.SetStyle с именем стиля в виде строки, все работает нормально, но если использовать метод TStyleManager.LoadFromFile для загрузки стиля из файла и затем вызывать TStyleManager.SetStyle с полученным handlerservice, переключение на темный режим перестает работать после возврата к светлому режиму.

Решение проблемы

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

Вот пример решения, основанного на коде корнелиусадавида:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Styles;

type
  TForm1 = class(TForm)
    btnDarkMode: TButton;
    btnLightMode: TButton;
    procedure btnDarkModeClick(Sender: TObject);
    procedure btnLightModeClick(Sender: TObject);
  private
    { Private declarations }
    FDarkStyleName: string;
    procedure LoadThemeFiles;
    procedure SetDarkTheme;
    procedure ClearTheme;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.LoadThemeFiles;
var
  StyNames: TArray<string>;
begin
  TStyleManager.LoadFromFile(TPath.Combine(ThemePath, 'DarkMode.vsf'));
  StyNames := TStyleManager.StyleNames;

  if Length(StyNames) > 2 then
    raise EProgrammerNotFound.Create('Styles should not be defined in the project!');

  for var sn in StyNames do
  begin
    if not SameText(sn, 'Windows') then
    begin
      FDarkStyleName := sn;
      Break;
    end;
  end;
end;

procedure TForm1.SetDarkTheme;
begin
  TStyleManager.SetStyle(FDarkStyleName);
end;

procedure TForm1.ClearTheme;
begin
  TStyleManager.SetStyle('Windows');
end;

procedure TForm1.btnDarkModeClick(Sender: TObject);
begin
  SetDarkTheme;
end;

procedure TForm1.btnLightModeClick(Sender: TObject);
begin
  ClearTheme;
end;

end.

В данном примере мы сохраняем имя темного стиля в переменную FDarkStyleName после загрузки стиля из файла в процедуре LoadThemeFiles. Затем мы используем это имя для переключения на темный режим в процедуре SetDarkTheme. Процедура ClearTheme просто устанавливает стиль по умолчанию, как и в исходном коде корнелиусадавида.

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

Если вы не хотите сохранять имя стиля, альтернативным решением может быть хранение handlerservice стиля в переменной и использование его для переключения между режимами. Для этого можно добавить еще один метод в класс TStyleManager, который позволит сохранить handlerservice стиля после загрузки из файла. Например:

procedure TStyleManager.SaveStyleHandle(const AStyleName: string; out AStyleHandle: TStyleServicesHandle);
begin
  AStyleHandle := LoadFromFile(TPath.Combine(ThemePath, AStyleName + '.vsf'));
end;

Затем, в коде приложения, после загрузки стиля из файла, можно сохранить handlerservice стиля и использовать его для переключения между режимами:

procedure TForm1.LoadThemeFiles;
begin
  TStyleManager.SaveStyleHandle('DarkMode', FDarkStyleHandle);
end;

procedure TForm1.SetDarkTheme;
begin
  TStyleManager.SetStyle(FDarkStyleHandle);
end;

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

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

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


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

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




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


:: Главная :: Формы ::


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-10-18 06:24:52/0.010715961456299/0