AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi ColorToString auch für Systemfarben
Thema durchsuchen
Ansicht
Themen-Optionen

ColorToString auch für Systemfarben

Ein Thema von taaktaak · begonnen am 30. Mai 2008 · letzter Beitrag vom 31. Mai 2008
Antwort Antwort
Seite 2 von 2     12   
taaktaak

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

Re: ColorToString nicht für Systemfarben???

  Alt 31. Mai 2008, 22: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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#12

Re: ColorToString auch für Systemfarben

  Alt 31. Mai 2008, 22:41
TColor statt Integer kommt wohl etwas besser
Code:
type tSysColorRec  = record
                         Value : [color=#ff0000]TColor[/color];
                         Name : String;
                       end;
hmmm, stimmt, GetSysColor nimmt ja nur den Index entgegen und nicht (wie ich mir da wohl irgendwie dachte) die Farbkonstanten



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.

Hier im Forum suchenColorToRGB ... z.B.:
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;
$2B or not $2B
  Mit Zitat antworten Zitat
taaktaak

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

Re: ColorToString auch für Systemfarben

  Alt 31. Mai 2008, 22:53
Hallo himitsu,

TColor statt Integer? Na, ist das nicht eigentlich das gleiche? Der Wertebereich ist doch identisch.


Zitat:
wird bei dir immer ein TColor als RGB übergeben?
In meinem speziellen Fall schon, der ColorWert wird mit...

Color:=FParentImage.Canvas.Pixels[150,150]; aus einem Image gewonnen. Deine Optimierung ist vorzuziehen, da allgemeingültig
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#14

Re: ColorToString auch für Systemfarben

  Alt 31. Mai 2008, 23:17
Zitat von taaktaak:
Na, ist das nicht eigentlich das gleiche? Der Wertebereich ist doch identisch.
Im Grunde ist es schon gleich, aber da Value ja eine Farbe enthält ...
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz