Я тестировал такую ситуацию со своим собственным пользовательским компонентом, и 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](https://i.stack.imgur.com/mdaK4.png)
Флажок над красной линией предназначен для «проверки», чтобы отключить тематику приложения во время ОСимеет активированные темы.
На рисунке ниже показано, как будет выглядеть TForm
с отключенными визуальными темами для приложения (описанным выше способом, где IsAppThemed
возвращает False
) и с активной тематикой приложения (IsAppThemed
возвращает True
). Примечание: на левой стороне находится стандартное приложение notepad.exe
, которое не имеет фокуса и тематически в обоих случаях.
Так что играть с темами не так просто, как могло бы быть.
Источники: