2012-12-25 14 views
6

Wiem, że można wyłączyć niestandardową stylizację komponentów, ale jak włączyć style tylko dla jednej klasy komponentów? Na przykład pozostaw całą formę i wszystkie elementy na niej nieskrywane, a skórę tylko TButton. Podobnie jak na tym obrazie.Stylizowanie tylko jednego komponentu VCL w Delphi

enter image description here

+3

jeśli potrzebna jest tylko przycisk stylizowany - spróbuj znaleźć stylizujące button - komponent potomny 'TButton', który nie wygląda jak zwykły' TButton'. Dodanie funkcjonalności VCL Styles do projektu, a następnie wyłączenie go dla całego projektu, z wyłączeniem 'TButton', nie jest dobrym sposobem na skórowanie tylko jednego przycisku w projekcie. – teran

+0

Wygląda dziwnie na to, że w Delphi zastosowano styling funtionality i nie można go używać bez stosowania do całej aplikacji. – Zelenov

+0

@Zelenov Nie wydaje mi się dziwny - został zaprojektowany do tego celu. Dopóki stosujesz motyw, zakłada się, że używa on całej aplikacji. Osobiście uważam za dziwne używanie tych stylów do skorygowania tylko niektórych kontrolek - biorąc pod uwagę mechanizm działania. W tym celu utworzyłbym własny, niestandardowy przycisk, który jest dość trywialny. –

Odpowiedz

13

Większość VCL steruje wewnętrznie wykorzystuje globalną funkcję StyleServices aby uzyskać metody zwrócić kontrolę. Więc jeśli nie używasz stylów Vcl, StyleServices zwraca instancję do funkcji API Windows, aby narysować tematyczne elementy sterujące (interfejsy UxTheme API). ponieważ to nie jest droga do skóry (zastosowanie stylów Vcl) tylko do pojedynczej kontroli klasy (przynajmniej którą sam narysujesz kontrolę).

Zatem jedyną alternatywą jest zastosowanie stylów Vcl, a następnie wyłączenie dla wszystkich elementów sterujących z wyjątkiem jednego typu, którego szukasz.

można użyć coś jak ten

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; 

sprawdzić ten formularz z VCL Style

enter image description here

A teraz po wołania powyższego sposobu

DisableVclStyles(Self,'TButton'); 

enter image description here

Uwaga: za pomocą właściwości StyleElements umożliwienie o wyłączenie style VCL nie działa z jakiegoś komponentu podobnego (TStringGrid, TBitBtn, TSpeedButton i tak dalej)

+0

Próbuję tego w XE2 i 'TControl' nie ma właściwości' StyleElements' –

+0

Nieważne Właśnie znalazłem inną odpowiedź: http://stackoverflow.com/questions/16538890/how-to-color-the -background-of-tcombobox-z-vcl-style-enabled –

+0

co, jeśli mój komponent zostanie utworzony w DataModule? po umieszczeniu "DisableVclStyles (Self, 'TButton');" w module danych IDE zwraca mi ten błąd: Typy niezgodne: 'TControl' i 'TDMRotinas' –

Powiązane problemy