2012-12-25 9 views
6

Ich weiß, dass es möglich ist, benutzerdefinierte Stile für Komponenten zu deaktivieren, aber wie kann ich Stile für nur eine Komponente Klasse aktivieren? Lassen Sie zum Beispiel das gesamte Formular und alle darin enthaltenen Komponenten ohne Häute und task nur TButton. Wie auf diesem Bild.Anreden nur einer VCL-Komponente in Delphi

enter image description here

+3

wenn Sie nur gestylt Schaltfläche müssen - versuchen gestylt zu finden Button - 'TButton' Nachkomme Komponente, die nicht wie üblich aussieht' TButton'. Das Hinzufügen von VCL-Styles-Funktionen zum Projekt und das anschließende Deaktivieren für ein ganzes Projekt, mit Ausnahme von TButton, ist keine gute Möglichkeit, nur eine Schaltfläche im Projekt zu überdecken. – teran

+0

Es sieht einfach komisch aus, in Delphi Styling-Funktionalität zu haben und nicht in der Lage zu sein, es ohne Anwendung für die ganze Anwendung zu verwenden. – Zelenov

+0

@Zelenov Ich finde es nicht seltsam - es wurde für diesen Zweck entwickelt. Solange Sie ein Design anwenden, wird davon ausgegangen, dass Sie die gesamte Anwendung häuten. Persönlich finde ich es seltsam, diese Stile zu verwenden, um nur bestimmte Steuerelemente zu skinsieren - angesichts des Mechanismus, wie es funktioniert. Für Ihren Zweck würde ich meine eigene benutzerdefinierte Schaltflächensteuerung erstellen, die eher trivial ist. –

Antwort

13

Die meisten der VCL intern steuert verwendet die StyleServices globale Funktion die Methoden zu erhalten, die Kontrolle zu zeichnen. Wenn Sie also die Vcl-Styles nicht verwenden, gibt StyleServices eine Instanz an die Windows-API-Funktionen zurück, um thematische Steuerelemente (UxTheme-APIs) zu zeichnen. weil es keine Möglichkeit gibt, die Vcl-Stile zu skins (nur für ein einzelnes Klassensteuerelement) (zumindest das, was Sie das Steuerelement selbst zeichnen).

Also die einzige Alternative ist eine Vcl Styles anwenden und dann für alle Steuerelemente deaktivieren mit Ausnahme der einen Art, die Sie suchen.

Sie können so etwas wie dieses

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; 

Überprüfen Sie dieses Formular mit einem Vcl Stil

enter image description here

Und jetzt, nachdem der Aufruf der obigen Methode verwenden

DisableVclStyles(Self,'TButton'); 

enter image description here

Hinweis: Um die StyleElements Eigenschaft mit o Deaktivieren Sie die vcl Arten zu ermöglichen, nicht mit einigen Komponenten wie (TStringGrid, TBitBtn, TSpeedButton usw.) arbeiten

+0

Ich versuche dies in XE2 und 'TControl' hat keine Eigenschaft' StyleElements' –

+0

Nevermind Ich habe gerade eine andere Antwort von Ihnen gefunden: http://stackoverflow.com/questions/16538890/how-to-color-the -background-of-tcombobox-mit-vcl-styles-enabled –

+0

Was passiert, wenn meine Komponente in einem DataModule erstellt wird? , wenn ich "DisableVclStyles (Self, 'TButton');" im DataModule die IDE gibt mir diesen Fehler zurück: Inkompatible Typen: 'TControl' und 'TDMRotinas' –