![]() |
[FMX, iOS] TAlphaColor Farbvergleiche falsch (nur iOS)
Hallo zusammen,
was stimmt mit diesem Code nicht ? Vergleiche eigentlich nur auf Standard-Farben von TAlphaColorRec, mit dem aktuellen Wert, in diese Funktion.
Delphi-Quellcode:
War getestet auf allen Platformen, jetzt noch iOS ...
case LCol of
TAlphaColorRec.Red : Result := TAlphaColorRec.Fuchsia; TAlphaColorRec.Fuchsia : Result := TAlphaColorRec.Blue; Plötzlich kommt kein Vergleich mehr durch :shock: Es landet Alles im else Zweig. Habe es dann erweitert, und mit if Vergleich versucht -> dasselbe Ergebnis Die Werte im Debugger links und rechts sind gleich, trotzdem geht er nicht ins if. (z.B. if LCol = LCmp FFFF0000 = FFFF0000) Habe dann versucht die Bytes einzeln anzufassen s.u., und siehe da, die R Werte sind plötzlich verschieden.
Delphi-Quellcode:
Wie kann das sein, wahrscheinlich bin ich schon überarbeitet und brauche jetzt mal eine Pause :stupid:
function TS4Color.Swatch_Next : TAlphaColor;
var LCol, LCmp : TAlphaColor; LC1, LC2 : System.Byte; begin LCol := Self; LCmp := TAlphaColorRec.Red; LC1 := TAlphaColorRec(LCol).R; // hier kommt 144 an LC2 := TAlphaColorRec(LCmp).R; // und hier 255 bei gleichem LCmp im Debugger, s.o. if LC1 = LC2 then begin if TAlphaColorRec(LCol).G = TAlphaColorRec(LCmp).G then begin if TAlphaColorRec(LCol).B = TAlphaColorRec(LCmp).B then begin LCmp := 0; end; end; end; case LCol of TAlphaColorRec.Red : Result := TAlphaColorRec.Fuchsia; TAlphaColorRec.Fuchsia : Result := TAlphaColorRec.Blue; TAlphaColorRec.Blue : Result := TAlphaColorRec.Darkblue; TAlphaColorRec.Darkblue : Result := TAlphaColorRec.Lightblue; TAlphaColorRec.Lightblue : Result := TAlphaColorRec.Green; TAlphaColorRec.Green : Result := TAlphaColorRec.Darkgreen; TAlphaColorRec.Darkgreen : Result := TAlphaColorRec.Lightgreen; TAlphaColorRec.Lightgreen : Result := TAlphaColorRec.Cyan; TAlphaColorRec.Cyan : Result := TAlphaColorRec.Purple; TAlphaColorRec.Purple : Result := TAlphaColorRec.Orangered; TAlphaColorRec.Orangered : Result := TAlphaColorRec.Red; else Result := TAlphaColorRec.Red; end; Self := Result; // Make myself also different end; |
AW: [FMX, iOS] TAlphaColor Farbvergleiche falsch (nur iOS)
Liste der Anhänge anzeigen (Anzahl: 1)
Nochmal weiter analysiert:
Laut ![]() ![]() Zitat:
Es scheint so als würden Vergleiche per "case of" unter iOS nicht zu funktionieren
Delphi-Quellcode:
Vergleiche mit "if then" funktionieren unter iOS schon
case LCol of
TAlphaColorRec.Red : Result := TAlphaColorRec.Fuchsia; TAlphaColorRec.Fuchsia : Result := TAlphaColorRec.Blue; TAlphaColorRec.Blue : Result := TAlphaColorRec.Darkblue; TAlphaColorRec.Darkblue : Result := TAlphaColorRec.Lightblue; TAlphaColorRec.Lightblue : Result := TAlphaColorRec.Green; TAlphaColorRec.Green : Result := TAlphaColorRec.Darkgreen; TAlphaColorRec.Darkgreen : Result := TAlphaColorRec.Lightgreen; TAlphaColorRec.Lightgreen : Result := TAlphaColorRec.Cyan; TAlphaColorRec.Cyan : Result := TAlphaColorRec.Purple; TAlphaColorRec.Purple : Result := TAlphaColorRec.Orangered; TAlphaColorRec.Orangered : Result := TAlphaColorRec.Red; else Result := TAlphaColorRec.Red; // <- landet immer hier end;
Delphi-Quellcode:
Im Anhang noch ein kleines Testprogramm, wo ich versucht habe das Problem etwas zu separieren.
if TAlphaColorRec.Red = LCol then
Result := TAlphaColorRec.Fuchsia else if TAlphaColorRec.Fuchsia = LCol then Result := TAlphaColorRec.Blue else if TAlphaColorRec.Blue = LCol then Result := TAlphaColorRec.DarkBlue else if TAlphaColorRec.DarkBlue = LCol then Result := TAlphaColorRec.LightBlue else if TAlphaColorRec.LightBlue = LCol then Result := TAlphaColorRec.Green else if TAlphaColorRec.Green = LCol then Result := TAlphaColorRec.DarkGreen else if TAlphaColorRec.DarkGreen = LCol then Result := TAlphaColorRec.LightGreen else if TAlphaColorRec.LightGreen = LCol then Result := TAlphaColorRec.Cyan else if TAlphaColorRec.Cyan = LCol then Result := TAlphaColorRec.Purple else if TAlphaColorRec.Purple = LCol then Result := TAlphaColorRec.Orangered else Result := TAlphaColorRec.Red; Es liegt wohl nicht daran das TAlphaColor > 32-Bit ist, und auch nicht daran das die Umrechnung von PixelFormaten falsch läuft. Es scheint wirklich am "case of" zu liegen, wobei alle anderen Platformen sich korrekt verhalten. Also werde ich mal mit "if then" weiterarbeiten müssen. Rollo |
AW: [FMX, iOS] TAlphaColor Farbvergleiche falsch (nur iOS)
Ich denke mal nicht dass es etwas mit Farben an sich sondern dem Konzept der
![]() Kannst du das mit einem Mini-Projekt nachstellen? iOS 32 oder 64 Bit oder beide? |
AW: [FMX, iOS] TAlphaColor Farbvergleiche falsch (nur iOS)
Dankesehr für den Hinweis, könnte damit zusammenhängen.
Ich habe aber leider keine Zeit mehr weiter zu Testen, habe damit schon wieder 1 Tag verloren, und muss ein paar Projekttermine einhalten. Aber sind enums überhaupt variante record-Typen ? Ich dachte immer die werden nur auf Cardinal projeziert. Getestet habe ich nur unter iOS-64, ich weiss gar nicht wie ich nur unter iOS-32 Testen sollte, womöglich geht das nur mit alter Hardware. Oder starten die neueren iPhones noch reinen 32-Bit Code im Debug Modus ? Rollo |
AW: [FMX, iOS] TAlphaColor Farbvergleiche falsch (nur iOS)
Enums haben hier doch nichts mit zu tun oder habe ich etwas verpasst?
Zitat:
|
AW: [FMX, iOS] TAlphaColor Farbvergleiche falsch (nur iOS)
Delphi-Quellcode:
Doch das könnte ja was damit zu tun haben, TAlphaColorRec.Red ist ein enum,
case LCol of
TAlphaColorRec.Red : Result := TAlphaColorRec.Fuchsia; genau da funktioniert der Case nicht richtig. Oder was meinst du genau mit den Records ? |
AW: [FMX, iOS] TAlphaColor Farbvergleiche falsch (nur iOS)
Zitat:
|
AW: [FMX, iOS] TAlphaColor Farbvergleiche falsch (nur iOS)
Ja, stimmt, da hast du auch wieder Recht :oops:
Ich sag ja, ich kann mir das auch nicht erklären. Vieleicht hat es was mit dem
Delphi-Quellcode:
zu tun.
Azure = Alpha or TAlphaColor($F0FFFF);
Hatte ja das PixelFormat in Verdacht, aber die Konvertierungsprobleme treten auch bei einer einfachen TAlphaColor Variablen auf. Wie auch immer, bei iOS(64) lande ich IMMEr im else Zweig, bei allen anderen OS holt er sich wie gewünscht das nächste Farbfeld. Hast du das Demo mal getestet, oder verhält sich das bei dir etwa korrekt ? Man muss natürlich den Fehlerfall ent-kommentieren ...
Delphi-Quellcode:
Rollo
LCol := Color_Swatch_Next_ByCase( LCol ); // TAlphaColor compare FAILURE
// LCol := Color_Swatch_Next_ByIfthen( LCol ); // TAlphaColor compare OK |
AW: [FMX, iOS] TAlphaColor Farbvergleiche falsch (nur iOS)
Zitat:
iOS müsste jemand anderes testen. |
AW: [FMX, iOS] TAlphaColor Farbvergleiche falsch (nur iOS)
irgendwas mit den datentypen macht ios da jedenfalls anders.
ich habe mal ganz ketzerisch den farbwert in einen integer geschrieben und siehe da, die case-anweisung funzt damit mit ios
Delphi-Quellcode:
...
var farbwert:integer; ... farbwert:=Acol; case farbwert of TAlphaColorRec.Red : Result := TAlphaColorRec.Fuchsia; TAlphaColorRec.Fuchsia : Result := TAlphaColorRec.Blue; TAlphaColorRec.Blue : Result := TAlphaColorRec.Darkblue; TAlphaColorRec.Darkblue : Result := TAlphaColorRec.Lightblue; TAlphaColorRec.Lightblue : Result := TAlphaColorRec.Green; TAlphaColorRec.Green : Result := TAlphaColorRec.Darkgreen; TAlphaColorRec.Darkgreen : Result := TAlphaColorRec.Lightgreen; TAlphaColorRec.Lightgreen : Result := TAlphaColorRec.Cyan; TAlphaColorRec.Cyan : Result := TAlphaColorRec.Purple; TAlphaColorRec.Purple : Result := TAlphaColorRec.Orangered; TAlphaColorRec.Orangered : Result := TAlphaColorRec.Red; else Result := TAlphaColorRec.Red; end; |
AW: [FMX, iOS] TAlphaColor Farbvergleiche falsch (nur iOS)
TAlphaColor ist ein Cardinal :warn:
![]() Im Quelltext sind sie ja nicht typisiert, ich gehe mal davon aus dass z.B.
Delphi-Quellcode:
auch als Cardinal erweitert wird? Sein Wert ist ja
TAlphaColorRec.Red
Delphi-Quellcode:
, vielleicht macht der iOS64 Compiler hier einen anderen Typen draus?
Alpha or TAlphaColor($FF0000);
![]() |
AW: [FMX, iOS] TAlphaColor Farbvergleiche falsch (nur iOS)
Ja, ich dachte mir das auch in die Richtung,
aber wegen Alpha = TAlphaColor($FF000000); sollte doch immer ein 32-Bit wert herauskommen, der nicht z.B. in 16.Bit passt. |
AW: [FMX, iOS] TAlphaColor Farbvergleiche falsch (nur iOS)
der unterschied zwischen cardinal (4 bytes unsigned) und integer (4 bytes signed) ist doch nur die vorzeichenunterstützung. integer ist signed, cardinal unsigned. möglicherweise liegt da auch der hund begraben. egal, runtergebrochen ist ein bit immer ein bit und fertig. 4 bytes lassen sich immer auch mit 4 bytes füttern. alles andere ist nur darstellerei :)
im debugger ist mir beim ios debuggen schon öfter aufgefallen, dass datentypen mit 64 bit statt den erwarteten 32 geführt werden. eigentlich schließt der code das in diesem fall ja schon aus und leider will mein debugger die cardinal-werte mit ios auch nicht als hex anzeigen (an anderer stelle war es auch schonmal andersherum, dass nur hex angezeigt wurde). aber vielleicht gibt die längenberechnung ja auch einen "gepatchten" wert zurück, damit ... was weiß ich wozu :) aber was solls. der int-wert funzt mindestens schonmal unter ios und windows. android hab ich nicht getestet. |
AW: [FMX, iOS] TAlphaColor Farbvergleiche falsch (nur iOS)
Mit Little/Big Endian und damit BGRA vs. RGBA vs. ARGB hat das aber nichts zu tun? :?:
EDIT: Vergleiche am Ende von TAlphaColorRec:
Delphi-Quellcode:
PAlphaColorRec = ^TAlphaColorRec;
TAlphaColorRec = record const Alpha = TAlphaColor($FF000000); Aliceblue = Alpha or TAlphaColor($F0F8FF); //... Null = TAlphaColor($00000000); constructor Create(const Color: TAlphaColor); class var ColorToRGB: function (Color: TAlphaColor): Longint; case Cardinal 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; |
AW: [FMX, iOS] TAlphaColor Farbvergleiche falsch (nur iOS)
Ja das dachte ich zuerst auch.
Aber im Beispiel passiert das auch ohne das die Farbe mit PixelFormat im Canvas verwurstet wird. Ich hatte es getestet indem ich z.B. Rectangle.Fill.Collor hole, lokal ändere und und schreibe, aber im Demo arbeite ich bereits mit einer Schattenvariablen vom Typ TAlphaColor. Das hat dann gar nichts mehr mit der Farbe und Canvas an sich zu tun. Das kann es also eigentlich nicht sein, weil das Pixelformat bei TAlphaColor keine Rolle spielt (nur wenn man es explizit konvertieren will), es wird ja nur als Cardinal 32-Bit Speicher für die Farbkonstante benutzt. Interessant war aber das im Debugger die Cardinal-Werte korrekt angezeigt wurden, wenn ich einzelne Bytes heraushole, dann kann man aber Unterschiede sehen. Leider funktioniert der iOS Debugger nur spärlich, deshalb kann ich mir da keinen Reim drauf machen. Rollo |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz