Colors/de

From Free Pascal wiki
Jump to: navigation, search

Deutsch (de) English (en) español (es) français (fr) 日本語 (ja)



Überblick

Die Standardfarben sind in der LCL (Komponentenbibliothek) TColor festgelegt. Diese Standardfarben sind mit der VCL (Komponentenbibliothek) TColor von Delphi kompatibel. Der Typ TColor kann eine RGB Farbe (3x8bit), oder eine Systemfarbe wie clDefault anzeigen. Die Komponentenbibliothek arbeitet auch mit dem Typ TFPColor des fpImage Farbsystems zusammen. Der Typ TFPColor stellt die Farben nach RGBA (4x16bit) dar und nicht wie der Typ TColor nach RGB (3x8bit) dar.

Umwandlung der Werte zwischen TColor und RGB

Die Unit Graphics bietet folgende Funktionen:

function Blue(rgb: TColor): BYTE; // arbeitet nicht mit den vordefinierten Systemfarben zusammen
function Green(rgb: TColor): BYTE; // arbeitet nicht mit den vordefinierten Systemfarben zusammen
function Red(rgb: TColor): BYTE; // arbeitet nicht mit den vordefinierten Systemfarben zusammen
function RGBToColor(R, G, B: Byte): TColor;
procedure RedGreenBlue(rgb: TColor; out Red, Green, Blue: Byte); // arbeitet nicht mit den vordefinierten Systemfarben zusammen
function FPColorToTColor(const FPColor: TFPColor): TColor;
function TColorToFPColor(const c: TColor): TFPColor; // arbeitet nicht mit den vordefinierten Systemfarben zusammen
function IsSysColor(AColor: TColorRef): Boolean;


umwandeln des Typs TColor von/in den Typ String

Funktionen die Strings wie "25500 oder "$AA0088" oder "clNavy" nach TColor umwandeln:

  • StringToColor
  • StringToColorDef


Wandelt den Typ TColor in den Typ String um:

  • ColorToString


Tabelle der Standardfarben

Diese vordefinierten Farbkonstanten sind mit den Farbkonstanten in Delphi kompatibel:

Farbkonstante Farbe Hexadezimalwert für die Verwendung mit TColor Beispiel
clBlack Black TColor($000000);
clMaroon Maroon TColor($000080);
clGreen Green TColor($008000);
clOlive Olive Green TColor($008080);
clNavy Navy Blue TColor($800000);
clPurple Purple TColor($800080);
clTeal Teal TColor($808000);
clGray Grey TColor($808080);
clSilver Silver TColor($C0C0C0);
clRed Red TColor($0000FF);
clLime Lime Green TColor($00FF00);
clYellow Yellow TColor($00FFFF);
clBlue Blue TColor($FF0000);
clFuchsia Fuchsia TColor($FF00FF);
clAqua Aqua TColor($FFFF00);
clLtGray Light Grey TColor($C0C0C0); alias: clSilver
clDkGray Dark Grey TColor($808080); alias: clGray
clWhite White TColor($FFFFFF);
clCream Cream TColor($F0FBFF); Version: Lazarus 1.2 und höher
clMedGray Medium Grey TColor($A4A0A0); Version: Lazarus 1.2 und höher
clMoneyGreen Mint Green TColor($C0DCC0); Version: Lazarus 1.2 und höher
clSkyBlue Sky Blue TColor($F0CAA6); Version: Lazarus 1.2 und höher


Systemfarben

Beispiel: clInfoBk, clInfoText

Systemfarben sind Farbkonstanten mit einer besonderen Bedeutung. Ihr wirklicher Wert hängt vom Kontext und dem Windowsthema ab. Sie sind keine einfachen Farben.
clInfoBk zum Beispiel:

Form1.Canvas.Brush.Color:=clInfoBk;  // verwende den Standardhintergrund Pinsel für ein Hinweisfenster
Form1.Canvas.FillRect(10,10,50,50);


Ein Hinweisfenster unter MS-Windows könnte einen weißen Hintergrund haben. Unter Linux/GTK2 könnte das Hinweisfenster eine metallische Beschaffenheit haben. Wenn Sie nun einen Text in diese Fläche schreiben möchten, dann müssen Sie, wenn Sie den Text lesen möchten die Farbe auf einen Wert wie clInfoText ändern. Zum Beispiel:

Form1.Canvas.Brush.Color:=clInfoBk;  // verwende den Pinsel für die Standardhintergrundfarbe für ein Hinweisfenster
Form1.Canvas.FillRect(10,10,50,50);
Form1.Canvas.Font.Color:=clInfoText;  // verwende den Pinsel für die Standardtextfarbe für ein Hinweisfenster
Form1.Canvas.TextOut(10,10,'Hint');


Die Systemfarbe clInfoBk kann nicht für Pen.Color und nicht für Font.Color verwendet werden. Wenn Sie dies tun, dann ist das Ergebnis nicht definiert und hängt vom verwendeten widgetset (= Sammlung von Grafik Bibliotheken) und dem vom Benutzer gewählten Thema (= grafische Darstellung der Betriebssystemoberfläche) ab. Das gleiche gilt für clInfoText. Es kann nur als Font.Color verwendet werden. eine Verwendung mit Brush.Color wird nicht funktionieren. Im Moment erlauben alle widgetsets die Verwendung mit Pen.Color.

Ändern des Fensterthemas des Betriebssystems

Wenn z. B. der Benutzer das Thema (= grafische Darstellung der Betriebssystemoberfläche) wechselt dann kann das Betriebssystem seine Farben ändern. clInfoBk kann sich z. B. von weiß nach blau ändern oder von einer Farbe zu einer Textur. Das kann dem Programmierer Probleme bereiten. Das liegt daran, das sich der Farbwert der vordefinierten Systemfarben im eigenen Programm nicht automatisch anpasst. Der Programmierer muss dafür sorgen, das die Systemfarben den aktuellen Wert erhalten.
Dazu ist ein Zwischenschritt nötig.
Beispiel:

Form1.Canvas.Brush.Color:=clInfoBk; // der Pinsel erhält die aktuellen Systemfarben
Form1.Canvas.FillRect(10,10,50,50); // dies erstellt einen Pinsel mit dem Farbwert
                                    // des Hinweisfensters des aktiven Fensterthemas
...
// Wenn das Thema (= grafische Darstellung der Betriebssystemoberfläche) vom Anwender
// zwischenzeitlich geändert wird, dann hat der Pinsel noch die vorhergehenden Farbwerte
...
Form1.Canvas.FillRect(10,10,50,50); // mit dem Pinsel wird der Farbwert des vorhergehenden Themas gezeichnet
Form1.Canvas.Brush.Color:=clInfoBk; // durch eine erneute Zuweisung wird der
                                    // vorhergehenden Farbwert nicht aktualisiert
Form1.Canvas.FillRect(10,10,50,50); // mit dem Pinsel wird der Farbwert des alten Themas gezeichnet
Form1.Canvas.Brush.Color:=clRed;    // eine Zuweisung mit einem neuen Farbwert macht den
                                    // vorhergehenden Farbwert ungültig
Form1.Canvas.Brush.Color:=clInfoBk; // eine Zuweisung mit einem neuen Farbwert macht den
                                    // vorhergehenden Farbwert ungültig
Form1.Canvas.FillRect(10,10,50,50); // jetzt, wird der Farbwert des aktuellen Themas verwendet

Tabelle der Systemfarben

In der folgenden Tabelle werden die Systemfarben und ihre Bedeutung aufgelistet. Werden die Systemfarben ausserhalb des definierten Geltungsbereiches verwendet, dann ist das Ergebnis unvorhersehbar. Die Systemfarben sind immer vom aktuell verwendeten Widget-Set (eine Sammlung von grafischen Bedienelementen) und dem aktuell verwendeten Thema (grafische Darstellung der Betriebssystemoberfläche) abhängig.

Konstante LCL Definition Unterstützte Widgetsets
clNone Der Farbwert ist nicht definiert. D. h. er hat keine Auswirkungen bzw. er kann im Einzelfall einen weißen Farbwert haben. alle
clDefault Verwendet die vorgesehene Standardfarbe alle
clScrollBar Scrollbar Körper alle
clBackground  ? alle
clActiveCaption Titelleiste des aktiven Fensters kein
clInactiveCaption Titelleiste des inaktiven Fensters kein
clMenu Regular menu item background color kein
clWindow The normal background brush of unselected text. Defined for controls like TEdit, TComboBox, TMemo, TListBox, TTreeView. kein
clWindowFrame Farbe der Rahmen um das Fenster kein
clMenuText Die Schriftfarbe ist zusammen mit clMenu zu verwenden kein
clWindowText Die Schriftfarbe ist zusammen mit clWindow zu verwenden kein
clCaptionText Textfarbe das aktiven Fensters kein
clActiveBorder  ? kein
clInactiveBorder  ? kein
clAppWorkspace MDIMain form background kein
clHighlight Die Pinselfarbe des ausgewählten Elements kein
clHighlightText Schriftfarbe vom ausgewählten Text (zusammen mit clHighligh). kein
clBtnFace Button Hintergrund kein
clBtnShadow Farbe des Button Schattens wird verwendet, um 3D-Effekt zu erzielen kein
clGrayText Die Schriftfarbe von einem deaktiverten Element kein
clBtnText Button Schriftfarbe zu verwenden mit clBtnFace kein
clInactiveCaptionText Textfarbe der inaktiven Fenstertitelleiste kein
clBtnHighlight Button Farbhervorhebung wird verwendet, um 3D-Effekt zu erzielen kein
cl3DDkShadow  ? kein
cl3DLight  ? kein
clInfoText Schriftfarbe für Hinweise. Ist zu verwenden mit clInfoBk alle
clInfoBk Pinselfarbe für Hinweisse. Ist zu verwenden mit clInfoText alle
clHotLight  ? kein
clGradientActiveCaption Die zweit Farbe um die aktive Fenstertitelleiste mit verlaufenden Farben darzustellen kein
clGradientInactiveCaption Die zweit Farbe um die inaktive Fenstertitelleiste mit verlaufenden Farben darzustellen kein
clMenuHighlight Die Hintergrundfarbe des ausgewählten Menüpunkts kein
clMenuBar Die Hintergrundfarbe der Menüleiste kein
clForm  ? kein
clColorDesktop  ? kein
cl3DFace  ? kein
cl3DShadow  ? kein
cl3DHiLight  ? kein
clBtnHiLight Das Gleiche wie clBtnHighlight kein

Zeichnen von Elementen der Unit Themes auf Ihre benutzerdefinierte Steuerelemente

Die Unit Themes bietet Funktionen, um einzelne Elemente der Standard-Controls zu erweitern. Um zum Beispiel ein Contol wie ein TTreeView zu erweitern verwenden Sie folgenden Code:

uses Themes;
 
...
 
procedure TYourCustomControl.Paint;
const
  PlusMinusDetail: array[Boolean {Hot}, Boolean {Expanded}] of TThemedTreeview =
  (
    (ttGlyphClosed, ttGlyphOpened),
    (ttHotGlyphClosed, ttHotGlyphOpened)
  );
var
  Details: TThemedElementDetails;
  R: TRect;
  Collapse: boolean;
begin
  ...
  // zeichnet eine Erweiterung
  Details := ThemeServices.GetElementDetails(PlusMinusDetail[False, Collapse]);
  R := Rect(ALeft, ATop, ARight + 1, ABottom + 1);
  ThemeServices.DrawElement(Canvas.Handle, Details, R, nil);
  ...
end;

--Olaf 12:20, 6 August 2013 (CEST)