Оформяне само на един 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 вътрешно използват глобалната функция StyleServices, за да получат методите за изчертаване на контролата. Така че, ако не използвате стиловете Vcl, StyleServices връща екземпляр към функциите на API на Windows за изчертаване на тематични контроли (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 свойството за активиране o деактивиране на vcl стиловете не работи с някои компоненти като (TSringGrid, 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