![]() |
Re: ColorToString nicht für Systemfarben???
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:
Verwendung:
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; 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... |
Re: ColorToString auch für Systemfarben
TColor statt Integer kommt wohl etwas besser :angel:
Code:
hmmm, stimmt, GetSysColor nimmt ja nur den Index entgegen und nicht (wie ich mir da wohl irgendwie dachte) die Farbkonstanten :oops:
type tSysColorRec = record
Value : [color=#ff0000]TColor[/color]; Name : String; end; wird bei dir immer ein TColor als RGB übergeben? wenn nicht, also falls auch mal z.B. Konstanten übergeben werden, wäre es noch gut erstmal den übergebenen Color-Wert in RGB umzuwndeln. ![]()
Delphi-Quellcode:
Function ColorToRGB(Color: TColor): TColor;
Var _Color: TColorRec Absolute Color; Begin If _Color.Palette = cpSystemColor Then Result := GetSysColor(Color and $FF) and $FFFFFF Else If _Color.Palette in [cpSystemPalette..cpLogicalPalette] Then Result := Color and $FFFFFF Else Result := $000000; End;
Delphi-Quellcode:
function TColorPicker.Color2ConstName(Color: TColor): String;
... begin if (Color and $ff000000 = $ff000000) then begin Result := SysColorArray[Color and $1f{$ff}].Name; end else begin //Color := ColorToRGB(Color); // Systemfarbkonstanten wurden schon abgefangen // die Restlichen Farbpaletten sollte nicht stören if not ColorToIdent(Color, Result) then Result := GetSysColorString(Color); end; end; |
Re: ColorToString auch für Systemfarben
Hallo himitsu,
TColor statt Integer? Na, ist das nicht eigentlich das gleiche? Der Wertebereich ist doch identisch. Zitat:
Delphi-Quellcode:
aus einem Image gewonnen. Deine Optimierung ist vorzuziehen, da allgemeingültig :thumb:
Color:=FParentImage.Canvas.Pixels[150,150];
|
Re: ColorToString auch für Systemfarben
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz