Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   TColor in TAlphaColor unwandeln (https://www.delphipraxis.net/182406-tcolor-talphacolor-unwandeln.html)

Kostas 21. Okt 2014 22:36

TColor in TAlphaColor unwandeln
 
Hallo zusammen,

ich habe in einer Datenbank zu einem Datensatz auch eine Farbe (TColor) als Integer gespeichert.
In FireMonkey sind die Farben als TAlphaColor angelegt. Dabei ist Rot und Grün vertauscht wegen
BigEndian oder LittleEndian. Stellt Delphi eine Methode zur Verfügung um aus einem TColor in ein TAlphaColor zu konvertieren?

In diesem Zusammenhang funktioniert auch ColorToRGB nicht.
Delphi-Quellcode:
TAlphaColors.ColorToRGB($FF0000);
Egal welche Farbe ich übergebe, wird immer eine Exception gefeuert "Access Violation".

Das Ziel ist den Integer für die Farbe(TColor) zu konvertieren in TAlphaColor damit die
Android App die Farbein gleich anzeigt wie in der Win32 Anwendung.

Gruß Kostas

mkinzler 21. Okt 2014 22:50

AW: TColor in TAlphaColor unwandeln
 
Mit TAlphaColorRec kannst man auf die einzelnen Farbkomponenten direkt zugreifen.

Uwe Raabe 21. Okt 2014 23:02

AW: TColor in TAlphaColor unwandeln
 
In System.UIConsts.pas gibt es eine
Delphi-Quellcode:
function RGBtoBGR
, die ist aber nicht typsicher.

Alternativ schreibst du dir selber was:

Delphi-Quellcode:
function ColorToAlphaColor(Value: TColor): TAlphaColor;
var
  CRec: TColorRec;
  ARec: TAlphaColorRec;
begin
  CRec.Color := Value;
  ARec.A := CRec.A;
  ARec.B := CRec.B;
  ARec.G := CRec.G;
  ARec.R := CRec.R;
  Result := ARec.Color;
end;

himitsu 21. Okt 2014 23:22

AW: TColor in TAlphaColor unwandeln
 
BigEndian/LittleEndian hat hier erstmal garkeinen Einfluss.

Die Werte der Farben, als Integer/TColor sind immer gleich.
Nur die darunterliegendesn "Einzelbytes" sind in einer anderen Reihenfolge.

Delphi-Quellcode:
TColorRec = record
const
  ...
  Blue = TColor($FF0000); // bleibt immer gleich
  ...
  case LongWord of
    0: (Color: TColor);
    2: (HiWord, LoWord: Word); // :gruebel: Hmmm, müsste man das nicht eigentlich auch umdrehen?
    3: {$IFDEF BIGENDIAN} (A, B, G, R: System.Byte); {$ELSE} (R, G, B, A: System.Byte); {$ENDIF}
end;

TAlphaColorRec = record
const
  ...
  Alpha = TAlphaColor($FF000000);
  Blue = Alpha or TAlphaColor($0000FF);
  ...
  case LongWord of
    0: (Color: TAlphaColor);
    2: (HiWord, LoWord: Word);
    3: {$IFDEF BIGENDIAN} (A, R, G, B: System.Byte); {$ELSE} (B, G, R, A: System.Byte); {$ENDIF}
end;
Der Unterschied ist einfach ein anderes Farbsystem, also praktisch sowas wie auch CYMK oder HSV/HSB.
TAlphaColor hat z.B. die selbe RGB-Byte-Folge, wie im HTML/CSS.



Ich konnte nirgendwo die Definition von TAlphaColorRec.ColorToRGB finden.
Wenn wessen Integer-Rückgabe mit dem Ergebnis von TColorRec.ColorToRGB übereinstimmt, dann könnte man diese für die Konvertierung benutzen.
Ansonsten kann man natürlich ganz einfach TColorRec.B an TAlphaColorRec.B zuweisen usw., aber es wäre echt voll dämlich, wenn man hier keine Konvertierungsfunktion eingebaut hätte. (auch wenn ich noch keine gefunden hab :stupid:)


[edit]
Zitat:

RGBtoBGR
Ahh, da hat sich sowas versteckt, aber was um Himmels Willen macht diese Funktion in einer Unit Namens "Konstanten" ? :freak:
Und ja, vorher müsste man (zumindestens im Windows) noch ColorToRGB durchlaufen.

Delphi-Referenz durchsuchenCorrectColor (macht im Windows das Selbe wir RGBtoBGR und ansonsten macht es garnichts)

Kostas 22. Okt 2014 09:39

AW: TColor in TAlphaColor unwandeln
 
Danke für den Hinweis System.UIConsts

Nur die Methode RGBtoBGR stellt die Farben richtig dar auf ein Windows und auf Android OS.

Delphi-Quellcode:
  uses System.UIConsts;
  ...
  Rectangle1.Fill.Color := RGBtoBGR($FF000000 + 255); //FF;
  Rectangle2.Fill.Color := RGBtoBGR($FF000000 + 65280); //FF00;
  Rectangle3.Fill.Color := RGBtoBGR($FF000000 + 16711680); //FF0000;
Dankeschön nochmal.

Gruß Kostas

Uwe Raabe 22. Okt 2014 09:44

AW: TColor in TAlphaColor unwandeln
 
Zitat:

Zitat von himitsu (Beitrag 1276928)
Ich konnte nirgendwo die Definition von TAlphaColorRec.ColorToRGB finden.

Es gibt auch keine. Da es sich um eine Klassenvariable vom Typ einer Funktion handelt, müsste an irgendeiner Stelle eine Implementierung zugewiesen werden. Wird es aber nicht und deswegen kommt die Zugriffsverletzung.

Für TColorRec.ColorToRGB gibt es allerdings eine Implementation in VCL.Graphics.

himitsu 22. Okt 2014 09:53

AW: TColor in TAlphaColor unwandeln
 
Jupp.

Dachte schon ich hätte die ColorToRGB-Funktion für TAlphaColorRec übersehn. :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 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