Hintergrundfarbe eines TPanels ändern
Sonntag, Januar 8th, 2012Das ich bereits nach wenigen Tagen Entwicklung mit der neuen Umgebung an eine Grenze des machbaren stoße, hätte ich nicht erwartet. Und dabei geht es eigentlich um etwas total banales: Die Änderung der Hintergrundfarbe eines Panels.
Worin besteht das Problem?
Das Konzept von Embarcadero sieht vor, das bei aktivem VCL-Stil, das komplette Aussehen der Steuerelemente durch den VCL-Stil definiert wird. Will man trotzdem eine Eigenschaft ändern, die Auswirkungen auf die Optik hätte, so passiert einfach garnichts. Im speziellen: Die Hintergrundfarbe kann nicht geändert werden. Alle Panels sehen genauso aus, wie sie im VCL-Stil Editor eingestellt wurden.
Mein großes Problem dabei ist, das mein zweifarbiges Design mit den grauen und hellbraunen Panels mit dem VCL-Stil nicht umsetzbar ist. Ich brauche den VCL-Stil aber, damit die Windows-Defaults nicht die Farbgestaltung zunichte machen.
Wie kann man das Problem umgehen?
Da Embarcadero das Verhalten wohl nicht ändern will, habe ich mir einen Workaround für das Panel gesucht, da ich auf mein Wunschdesign nicht verzichten will. Der Workaround besteht darin, einfach auf dem Panel, welches eine andere Farbe erhalten soll, ein maximiertes TShape Element zu plazieren. Die Hintergrundfarbe kann dann über das TShape gesteuert werden, da das eigentliche Panel nicht mehr sichtbar ist.
Damit das TShape nicht bei jedem Panel manuell hinzugefügt werden muss, habe ich einfach fix ein TBVAShapePanel entwickelt, auf dem das TShape Element bereits vorhanden ist. Die Eigenschaft „Color“ des Panels hab ich einfach überschrieben, da sie ja eh nutzlos gewesen ist. Das TShapePanel sieht wie folgt aus:
unit claBVAShapePanel; interface uses controls, SysUtils, classes, ExtCtrls, graphics; type TBVAShapePanel = class(TPanel) private FShape : TShape; FColor : TColor; protected procedure SetColor(aValue:TColor); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property Color:TColor read FColor write SetColor; end; procedure Register; implementation procedure TBVAShapePanel.SetColor(aValue:TColor); begin FColor := aValue; FShape.Brush.Color := FColor; end; constructor TBVAShapePanel.Create(AOwner: TComponent); begin inherited Create(AOwner); BevelKind := bkNone; BevelOuter := bvNone;
FColor := clRed FShape := TShape.Create(Self); FShape.Parent := Self; FShape.Align := alClient; FShape.Brush.Color := FColor; FShape.Brush.Style := bsSolid; end; destructor TBVAShapePanel.Destroy; begin FShape.Free; inherited Destroy; end; (******************************************************************************) procedure Register; begin RegisterComponents('BVA',[TBVAShapePanel]); end; end.
Natürlich kann das TBVAShapePanel noch nach belieben um weitere Eigenschaften erweitert werden. Anbieten würde sich zum Beispiel, das man den Rand des TShape ebenfalls variabel gestaltet.
Auch wenn ich für die Hintergrundfarbe nun eine Lösung gefunden habe, würde ich begrüßen, wenn Embarcadero sein Konzept nochmal überdenken würde. Prinzipell ist es richtig, das die Optik aus dem Stil geladen wird. Aber wenn zum Beispiel durch farbige Edit-Felder dem Anwender signalisiert werden soll, wo er fehlerhafte Daten eingetragen hat, so ist dies aktuell nicht möglich. Auch mit dem Trick mit dem TShape kommt man da wohl nicht weiter.