Thema: Delphi RGB -> TColor -> RGB

Einzelnen Beitrag anzeigen

CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: RGB -> TColor -> RGB

  Alt 27. Aug 2006, 10:31
himitsu hat noch folgende Ergänzungen:

ColorToRGB ist zwar in Delphi enthalten, allerdings wurde es dort so definiert, was IMHO nicht korreckt ist,
Delphi-Quellcode:
function ColorToRGB(Color: TColor): Longint;
begin
  if Color < 0 then
    Result := GetSysColor(Color and $000000FF) else
    Result := Color;
end;
Mögliche Farbpaletten:
Delphi-Quellcode:
const
  cpSystemPalette = $00;
  cpActingPalette = $01;
  cpLogicalPalette = $02;
  cpNoColor = $1F;
  cpDefaultColor = $20;
  cpSystemColor = $FF;
Dieses if Color < 0 then würde zwar auf cpSystemColor ansprechen, aber vorallem bei cpNoColor und cpDefaultColor würde es falsche Werte liefen, denn dieses sind erstens keine Farbwerte und zweitens sind dort zwar die RGB-Bytes vordefiniert, werden aber nicht als Farbe interpretiert.
Ebenso werden "falsche" Farbpaletten nicht ausgewertet.

Als Beispiel die entsprechenden Farbkonstanten:
Delphi-Quellcode:
const
  clNone = TColor(cpNoColor shl 24 or $FFFFFF);
  clDefault = TColor(cpDefaultColor shl 24 or $000000);
Weißt einfach mal clNone irgendwo zu ... laut ColorToRGB und sakuras TColor2RGB müßte da Weiß zu sehen sein, ist es aber bestimmt nicht.

Demnach sähe es laut Definition dann in etwa so aus:
Delphi-Quellcode:
function ColorToRGB(Color: TColor): TColor;
begin
  if Color shr 24 = $FF then Result := GetSysColor(Color and $FF) and $FFFFFF
  else if Color shr 24 in [$00..$02] then Result := Color and $FFFFFF
  else Result := $000000;
end;

Welches man dann auch noch etwa so zusammenfassen könnte:
Delphi-Quellcode:
function RGB2TColor(R, G, B: Byte): Integer;
begin
  // convert hexa-decimal values to RGB
  Result := R or (G shl 8) or (B shl 16); // ich mochte das OR halt viel lieber
end;

procedure TColor2RGB(Color: TColor; var R, G, B: Byte);
begin
  // convert hexa-decimal values to RGB
  if Color shr 24 = $FF then
    Color := GetSysColor(Color and $FF)
  else if Color shr 24 > $02 then
    Color := 0;
  R := Color;
  G := (Color shr 8);
  B := (Color shr 16);
end;

{procedure TColor2RGB(Color: TColor; var R, G, B: Byte);
begin
  // convert hexa-decimal values to RGB
  if Color shr 24 = $FF then begin
    Color := GetSysColor(Color and $FF);
    R := Color;
    G := (Color shr 8);
    B := (Color shr 16);
  end else if Color shr 24 in [$00..$02] then begin
    R := Color;
    G := (Color shr 8);
    B := (Color shr 16);
  end else begin
    R := 0;
    G := 0;
    B := 0;
  end;
end;}
[edit=fkerber]Link gefixt. Mfg, fkerber[/edit]
  Mit Zitat antworten Zitat