AGB  ·  Datenschutz  ·  Impressum  







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

TColor <-> String

Ein Thema von bernhard_LA · begonnen am 15. Jan 2021 · letzter Beitrag vom 18. Jan 2021
Antwort Antwort
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.121 Beiträge
 
Delphi 11 Alexandria
 
#1

TColor <-> String

  Alt 15. Jan 2021, 14:04
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;
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#2

AW: TColor <-> String

  Alt 15. Jan 2021, 14:22
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.
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.

Geändert von Moombas (15. Jan 2021 um 14:36 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.901 Beiträge
 
Delphi 12 Athens
 
#3

AW: TColor <-> String

  Alt 15. Jan 2021, 14:31
Kann es am 0-based und 1-based String liegen ?
Versuch mal
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#4

AW: TColor <-> String

  Alt 15. Jan 2021, 14:41
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
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: TColor <-> String

  Alt 15. Jan 2021, 15:59
Du kannst keinen String einer Farbe zuweisen, da die beiden Typen nicht zuweisungskompatibel sind.

Das Color := $FF008000; ist nicht gleich diesem 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: Color := StrToInt('$FF008000');
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#6

AW: TColor <-> String

  Alt 18. Jan 2021, 07:20
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
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.

Geändert von Moombas (18. Jan 2021 um 07:31 Uhr)
  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 23:27 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