Стилизация только одного компонента VCL в Delphi

Я знаю, что можно отключить пользовательские стили для компонентов, но как я могу включить стили только для одного класса компонентов? Например, оставьте всю форму и все компоненты на ней без скина, а скините только TButton. Как на этом изображении.

введите здесь описание изображения


person Zelenov    schedule 25.12.2012    source источник
comment
если вам нужна просто стилизованная кнопка - попробуйте найти стилизованную кнопку - TButton компонент-потомок, который выглядит не так, как обычно TButton. Добавление в проект функциональных возможностей стилей VCL, а затем их отключение для всего проекта, за исключением TButton, — не лучший способ скрыть только одну кнопку в проекте.   -  person teran    schedule 25.12.2012
comment
Просто странно иметь функциональность стилей в Delphi и не иметь возможности использовать ее, не применяя ее ко всему приложению.   -  person Zelenov    schedule 25.12.2012
comment
@Zelenov Я не нахожу это странным - он был разработан для этой цели. Пока вы применяете тему, предполагается, что вы создаете скин для всего приложения. Лично мне кажется странным использовать эти стили для скинов только определенных элементов управления, учитывая механизм их работы. Для вашей цели я бы создал свой собственный элемент управления кнопкой, что довольно тривиально.   -  person Jerry Dodge    schedule 24.11.2013


Ответы (1)


В большинстве элементов управления VCL для получения методы рисования элемента управления. Поэтому, если вы не используете стили Vcl, StyleServices возвращает экземпляр функциям Windows API для рисования тематических элементов управления (API UxTheme). потому что нет способа скинировать (применить стили Vcl) только к одному элементу управления классом (по крайней мере, который вы рисуете сами).

Таким образом, единственная альтернатива - применить стили Vcl, а затем отключить все элементы управления, кроме одного типа, который вы ищете.

Вы можете использовать что-то вроде этого

procedure DisableVclStyles(Control : TControl;const ClassToIgnore:string);
var
  i : Integer;
begin
  if Control=nil then
    Exit;

  if not Control.ClassNameIs(ClassToIgnore) then
   Control.StyleElements:=[];

  if Control is TWinControl then
    for i := 0 to TWinControl(Control).ControlCount-1 do
      DisableVclStyles(TWinControl(Control).Controls[i], ClassToIgnore);
end;

Проверьте эту форму с помощью стиля Vcl

введите здесь описание изображения

И теперь после вызова вышеуказанного метода

DisableVclStyles(Self,'TButton');

введите здесь описание изображения

Примечание. Использование StyleElements свойство для включения или отключения стилей vcl не работает с некоторыми компонентами, такими как (TStringGrid, TBitBtn, TSpeedButton и т. д.)

person RRUZ    schedule 25.12.2012
comment
Я пробую это в XE2, и TControl не имеет свойства StyleElements - person Jerry Dodge; 24.11.2013
comment
Неважно, я только что нашел еще один ваш ответ: stackoverflow.com/questions/16538890/ - person Jerry Dodge; 24.11.2013
comment
что, если мой компонент будет создан в DataModule? когда я ставлю DisableVclStyles(Self,'TButton'); в DataModule IDE возвращает мне эту ошибку: Несовместимые типы: «TControl» и «TDMRotinas» - person Nickolas Deluca; 07.03.2017