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]