![]() |
TColor <-> String
wir hatten die Funktion HEXStr2Color() zur Umwandlung eines Strings in einen TColor Wert in Verwendung uznter VCL.
Unter FMX hat diese Funktion nicht mehr gespielt, ich bin aktuell bei dieser neuen Implementierung gelandet. Warum hat meine VCL Variante nicht mehr unter FMX gespielt ?
Delphi-Quellcode:
function HEXStr2Color(value: String): TColor; var rec: TAlphaColorRec; begin if length(value) <> 7 then value := '$FF0000'; /// VCL result := StrToInt('$' + value[2] + value[3]) + StrToInt('$' + value[4] + value[5]) shl 8 + StrToInt('$' + value[6] + value[7]) shl 16; /// FMX with rec do begin A := StrToInt('$01'); R := StrToInt('$' + value[2] + value[3]); G := StrToInt('$' + value[4] + value[5]); B :=StrToInt('$' + value[6] + value[7]) end; Result := rec.Color; end; |
AW: TColor <-> String
Delphi-Quellcode:
1. Problem: Ergibt ja bei deinem Vorgabewert 255 als Ergebnis (Result).
/// VCL
result := StrToInt('$' + value[2] + value[3]) + StrToInt('$' + value[4] + value[5]) shl 8 + StrToInt('$' + value[6] + value[7]) shl 16; Wenn du nun nicht $FF0000 nimmst (255 für Rot), sondern $00FF00 kommt 65280 raus (eigentlich ja 255 für Grün). Du musst da dein shl weg lassen, dann passt dies wieder. 2. Problem: Lässt du nun die shl weg, sieht man das er deine Werte addiert, ich denke aber du willst bei $FFFF00 nicht 510 als Ergebnis (sagt nichts aus), sondern 2552550. Dafür musst du die einzelnen Teile in inttostr() Klammern. 3. Problem: Diese Ausgabe ist dann, dadurch das das Ergebnis jeweils 1, 2 oder 3 Stellen (Z.B.: $00FF00 = 02550) haben kann nicht gut zum Auswerten. Daher empfehle ich dir eine Ausgabe als Array oder Record, wie du es bei FMX getan hast oder du sagst mal was du damit überhaupt bezweckst. |
AW: TColor <-> String
Kann es am 0-based und 1-based String liegen ?
Versuch mal
Delphi-Quellcode:
Aber gefühlt würde ich sagen es geht doch einfacher als Ganzes Integer
value[Low(value)+6] statt value[7]
![]()
Delphi-Quellcode:
Oder sind ARGB und RGBA zu vertauschen ?
LInt := StrToInt('$' + value );
Color := TAlphaColor( LInt ); |
AW: TColor <-> String
Kann es sein, das dies mit deinem anderen Beitrag zusammenhängt (randomcolor)?
Dann kannst du deine Farbe auch einfach zuweisen
Delphi-Quellcode:
Siehe dazu (dank Rollo gefunden :) ):
randomcolor := '$' + inttostr(randomnumber) //randomnumber ist nur ein Platzhalter für eine 8-Stellige Zahl ARGB FF000000
Brush.Color := randomcolor; ![]() Zitat:
|
AW: TColor <-> String
Du kannst keinen String einer Farbe zuweisen, da die beiden Typen nicht zuweisungskompatibel sind.
Das
Delphi-Quellcode:
ist nicht gleich diesem
Color := $FF008000;
Delphi-Quellcode:
!
Color := '$FF008000';
Im ersten Fall wandelt der Compiler die hexadezimale Darstellung einer Zahl in den passenden Wert um. Im zweiten Fall müsste man dazu StrToInt bemühen:
Delphi-Quellcode:
Color := StrToInt('$FF008000');
|
AW: TColor <-> String
Jopp, hast du Recht.
Ich habe einfach mal die '' mit rein interpretiert -.- Aber folgendes müsste doch gehen (ich habe aktuell leider selber kein Delphi zum gegentesten, in Lazarus gibt es diese Funktion leider nicht): Quelle: ![]()
Delphi-Quellcode:
Das entspricht ja auch fast dem, was Rollo geschrieben hat :)
Color := '$' + inttostr(randomnumber) //randomnumber ist nur ein Platzhalter für eine 8-Stellige ARGB Zahl z.B. FF000000
Brush.Color := StringToAlphaColor(Color); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:49 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