Posts Tagged ‘TPanel’

Hintergrundfarbe eines TPanels ändern

Sonntag, Januar 8th, 2012

Das 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.