Einzelnen Beitrag anzeigen

taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#11

Re: ColorToString nicht für Systemfarben???

  Alt 31. Mai 2008, 21:19
Moin, Moin.
Da ich gestern zu später Stunde so nette Unterstützung gefunden habe, musste ich die Aufgabenstellung dann heute Abend doch abschliessend behandeln. Anfangs funktionierte es nicht, himitsu hatte auf die Schnelle die Aufrufkonventionen von GetSysColor() wohl nicht im Kopf: Die OR-Verknüfung des Schleifenzählers mit clSystemColor ($FF000000) ist an dieser Stelle nicht richtig - es muss einfach nur der Schleifenzähler (0..31)übergeben werden.

Für alle, die es mal gebrauchen können, hier meine "Komplettlösung" als Ausschnit einer Klasse TColorPicker:

Delphi-Quellcode:
type tSysColorRec = record
                        Value : Integer;
                        Name : String;
                        end;

var SysColorArray : Array [0..31] of tSysColorRec =
                       ((Value:0; Name:'clActiveBorder'),
                        (Value:0; Name:'clActiveCaption'),
                        (Value:0; Name:'clAppWorkSpace'),
                        (Value:0; Name:'clBackground'),
                        (Value:0; Name:'clBtnFace'),
                        (Value:0; Name:'clBtnHighlight'),
                        (Value:0; Name:'clBtnShadow'),
                        (Value:0; Name:'clBtnText'),
                        (Value:0; Name:'clCaptionText'),
                        (Value:0; Name:'clDefault'),
                        (Value:0; Name:'clGradientActiveCaption'),
                        (Value:0; Name:'clGradientInactiveCaption'),
                        (Value:0; Name:'clGrayText'),
                        (Value:0; Name:'clHighlight'),
                        (Value:0; Name:'clHighlightText'),
                        (Value:0; Name:'clHotLight'),
                        (Value:0; Name:'clInactiveBorder'),
                        (Value:0; Name:'clInactiveCaption'),
                        (Value:0; Name:'clInactiveCaptionText'),
                        (Value:0; Name:'clInfoBk'),
                        (Value:0; Name:'clInfoText'),
                        (Value:0; Name:'clMenu'),
                        (Value:0; Name:'clMenuBar'),
                        (Value:0; Name:'clMenuHighlight'),
                        (Value:0; Name:'clMenuText'),
                        (Value:0; Name:'clNone'),
                        (Value:0; Name:'clScrollBar'),
                        (Value:0; Name:'cl3DDkShadow'),
                        (Value:0; Name:'cl3DLight'),
                        (Value:0; Name:'clWindow'),
                        (Value:0; Name:'clWindowFrame'),
                        (Value:0; Name:'clWindowText'));

procedure TColorPicker.LoadSystemColors;
var i : Integer;
begin
  for i:= 0 to 31 do SysColorArray[i].Value:=GetSysColor(i)
end;

function TColorPicker.Color2ConstName(Color:TColor):String;

  function GetSysColorString(Color:Integer):String;
  var i : Integer;
  begin
    Result:='';
    for i:=0 to 31 do
      if Color=SysColorArray[i].Value then begin
      Result:=Result+#13+SysColorArray[i].Name;
      end;
    delete(Result,1,1);
    if Result='then Result:='not avail'
  end;

begin
  if not(ColorToIdent(Color,Result)) then Result:=GetSysColorString(Color)
end;
Verwendung:

An passender Stelle die aktuellen Farbwerte mit LoadSystemColors einlesen, z.B. im Konstruktor der Klasse. Mit Color2ConstName() können danach TColor-Werte in den Namen der symbolischen Farbkonstante umgewandelt werden. Für die ersten 20 Namen wird ColorToIdent() der VCL genutzt, wird hier kein Eintrag gefunden, erfolgt die Suche im SysColorArray.

Wie Muetze1 bereits bemerkte, handelt es sich in vielen Fällen um eine 1:n Beziehung. Die Funktion liefert für diese Werte alle dieser Farbe zugeordneten Konstantennamen (getrennt durch #13) zurück.

Mal schauen, ob das ganze einen praktischen Nutzen hat...
Ralph
  Mit Zitat antworten Zitat