AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TColor in TAlphaColor unwandeln

Ein Thema von Kostas · begonnen am 21. Okt 2014 · letzter Beitrag vom 22. Okt 2014
Antwort Antwort
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

TColor in TAlphaColor unwandeln

  Alt 21. Okt 2014, 22:36
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.
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TColor in TAlphaColor unwandeln

  Alt 21. Okt 2014, 22:50
Mit TAlphaColorRec kannst man auf die einzelnen Farbkomponenten direkt zugreifen.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.004 Beiträge
 
Delphi 12 Athens
 
#3

AW: TColor in TAlphaColor unwandeln

  Alt 21. Okt 2014, 23:02
In System.UIConsts.pas gibt es eine 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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: TColor in TAlphaColor unwandeln

  Alt 21. Okt 2014, 23:22
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 )


[edit]
Zitat:
RGBtoBGR
Ahh, da hat sich sowas versteckt, aber was um Himmels Willen macht diese Funktion in einer Unit Namens "Konstanten" ?
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (21. Okt 2014 um 23:31 Uhr)
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: TColor in TAlphaColor unwandeln

  Alt 22. Okt 2014, 09:39
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.004 Beiträge
 
Delphi 12 Athens
 
#6

AW: TColor in TAlphaColor unwandeln

  Alt 22. Okt 2014, 09:44
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: TColor in TAlphaColor unwandeln

  Alt 22. Okt 2014, 09:53
Jupp.

Dachte schon ich hätte die ColorToRGB-Funktion für TAlphaColorRec übersehn.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:09 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