Как я могу активировать статус активной темы в моем компоненте? - PullRequest
2 голосов
/ 20 октября 2019

Я работаю с компонентом, поддерживающим тему, и при его создании я должен установить начальный статус с помощью IsThemeActive (из модуля UxTheme). Но если я использую эту функцию в компоненте constructor, я получу нарушение прав доступа. Использование его в любом другом месте работает нормально. Что происходит и как я могу установить начальный статус, если я не могу сделать это в OnCreate?

Мой компонентный блок:

unit TestUnit;

interface

uses Classes, Windows, Controls, ComCtrls, StdCtrls, CommCtrl, Messages, Forms,
     SysUtils, Graphics, UxTheme;

type
  TSuperList = class(TListView)
  private
    FThemeEnabled: Boolean;
  public
    constructor Create(AOwner: TComponent); override;
  end;

implementation

constructor TSuperList.Create(AOwner: TComponent);
begin
 inherited;
 FThemeEnabled:= IsThemeActive;
end;

end.

Использование его в приложении:

procedure TForm1.FormCreate(Sender: TObject);
begin
 List1:= TSuperList.Create(Form1);
 List1.Parent:= Form1;
end;

Ответы [ 2 ]

3 голосов
/ 20 октября 2019

Я нашел решение. Сначала мне нужно было инициализировать библиотеку тем:

unit TestUnit;

interface

uses Classes, Windows, Controls, ComCtrls, StdCtrls, CommCtrl, Messages, Forms,
     SysUtils, Graphics, UxTheme;

type
  TSuperList = class(TListView)
  private
    FThemeEnabled: Boolean;
  public
    constructor Create(AOwner: TComponent); override;
  end;

implementation

var IsThemeEnabled: Boolean;

constructor TSuperList.Create(AOwner: TComponent);
begin
 inherited;
 FThemeEnabled:= IsThemeEnabled;
end;

initialization

 InitThemeLibrary;
 IsThemeEnabled:= IsThemeActive;

end.
1 голос
/ 20 октября 2019

Я тестировал такую ​​ситуацию со своим собственным пользовательским компонентом, и AccessViolation не существует. Может быть, это из-за того, что я использую Delphi Tokyo 10.2.

1. Получить статус темы

Но одна мысль: вы можете переопределить CreateWnd процедуру для вызова функции IsThemeActive вместо того, чтобы делать это в разделе constructor.

Примерно так:

procedure TSuperList.CreateWnd;
begin
  Inherited CreateWnd;
  FThemeEnabled := UXTheme.IsThemeActive;
end;

Нет необходимости явно инициализировать библиотеку тем.

2. Правильная обработка соответствия тем

Также я хотел бы отметить, что важно проверить, применяет ли ваше приложение визуальный стиль (-ы), потому что ОС может использовать визуальный стиль на данный момент, а ваше приложение - нет. Таким образом, функция IsThemeActive возвращает True, пока в вашем приложении нет примененных тем. Это приведет к окрашиванию вашего компонента , тематического , в то время как другие компоненты будут окрашены без тематического . Вы можете использовать функцию IsAppThemed, чтобы проверить, использует ли приложение темы в текущий момент.

Важное примечание для IsAppThemed:

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

Вы можете быть удивлены: почему обе эти функции возвращают True, даже если мое приложение визуально не имеет тематической тематики и в ОС включены темы?

У меня нет ответа на это. Лишь одно обстоятельство, при котором функция IsThemeActive возвращает True, а функция IsAppThemed возвращает False - это когда внешний вид отключен специально для вашего приложения . На рисунке ниже показано, как этого добиться (немного по-русски):

enter image description here
Флажок над красной линией предназначен для «проверки», чтобы отключить тематику приложения во время ОСимеет активированные темы.

На рисунке ниже показано, как будет выглядеть TForm с отключенными визуальными темами для приложения (описанным выше способом, где IsAppThemed возвращает False) и с активной тематикой приложения (IsAppThemedвозвращает True). Примечание: на левой стороне находится стандартное приложение notepad.exe, которое не имеет фокуса и тематически в обоих случаях.

enter image description here

Так что играть с темами не так просто, как могло бы быть.

Источники:

...