Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   TColor <-> String (https://www.delphipraxis.net/206655-tcolor-string.html)

bernhard_LA 15. Jan 2021 14:04

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;

Moombas 15. Jan 2021 14:22

AW: TColor <-> String
 
Delphi-Quellcode:
/// VCL
    result := StrToInt('$' + value[2] + value[3]) + StrToInt('$' + value[4] + value[5]) shl 8 + StrToInt('$' + value[6] + value[7]) shl 16;
1. Problem: Ergibt ja bei deinem Vorgabewert 255 als Ergebnis (Result).
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.

Rollo62 15. Jan 2021 14:31

AW: TColor <-> String
 
Kann es am 0-based und 1-based String liegen ?
Versuch mal
Delphi-Quellcode:
value[Low(value)+6] statt value[7]
Aber gefühlt würde ich sagen es geht doch einfacher als Ganzes Integer
https://stackoverflow.com/questions/...ogrammatically
Delphi-Quellcode:
LInt := StrToInt('$' + value );
Color := TAlphaColor( LInt );
Oder sind ARGB und RGBA zu vertauschen ?

Moombas 15. Jan 2021 14:41

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:
randomcolor := '$' + inttostr(randomnumber) //randomnumber ist nur ein Platzhalter für eine 8-Stellige Zahl ARGB FF000000
Brush.Color := randomcolor;
Siehe dazu (dank Rollo gefunden :) ): http://docwiki.embarcadero.com/Libra...es.TAlphaColor
Zitat:

Using the 4-byte hexadecimal number representation:
Color := $FF008000; // Delphi

Uwe Raabe 15. Jan 2021 15:59

AW: TColor <-> String
 
Du kannst keinen String einer Farbe zuweisen, da die beiden Typen nicht zuweisungskompatibel sind.

Das
Delphi-Quellcode:
Color := $FF008000;
ist nicht gleich diesem
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');

Moombas 18. Jan 2021 07:20

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: https://stackoverflow.com/questions/...-a-talphacolor
Delphi-Quellcode:
Color := '$' + inttostr(randomnumber) //randomnumber ist nur ein Platzhalter für eine 8-Stellige ARGB Zahl z.B. FF000000
Brush.Color := StringToAlphaColor(Color);
Das entspricht ja auch fast dem, was Rollo geschrieben hat :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf