TColor Funktionen .ToString etc.

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
stefanE
Beiträge: 7
Registriert: Mi 2. Feb 2022, 08:20

TColor Funktionen .ToString etc.

Beitrag von stefanE »

Hallo zusammen,

kann mir vielleicht jemand sagen warum der Programm Schnipsel nicht funktioniert

Code: Alles auswählen

var
   img: TPortableNetworkGraphic;
   destRect : TRect;
   aPixel : TColor;
   aString : string;
   aExtended : extended;
begin
....
....
   img := TPortableNetworkGraphic.Create;
   img.LoadFromFile(sFileName);

   destRect.Top :=0;
   destRect.left :=0;
   destRect.Height:=PaintBox1.Height;
   destRect.Width := PaintBox1.Width;
   PaintBox1.Canvas.StretchDraw(destRect, img);
   aPixel := img.Canvas.Pixels[30,30];
   aString := aPixel.ToHexString(6);
   aExtended :=  aPixel.ToExtended;

end;    
es kommt immer der Fehler: "unit.pas(100,23) Error: Illegal qualifier" bei aString := aPixel.ToHexString(6); und wenn ich das auskommentiere kommt er halt bei aExtended := aPixel.ToExtended;

Habe schon Google bemüht, aber da finde ich nix :-(

Habe hier Lazarus 2.2.6 auf einem Win10 Rechner.

Gruß
Stefan

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TColor Funktionen .ToString etc.

Beitrag von theo »

Da musst du wahrscheinlich auf einen Integer casten, wenn du das so machen willst.

Code: Alles auswählen

AStr:=Integer(AColor).ToHexString(6); 
Besser so:

Code: Alles auswählen

AStr:=IntToHex(AColor,6);   
Es gibt auch noch ColorToString.

stefanE
Beiträge: 7
Registriert: Mi 2. Feb 2022, 08:20

Re: TColor Funktionen .ToString etc.

Beitrag von stefanE »

Hi Theo,

ja so funktioniert es. Und auch die ganzen andren .To- Funktionen von TColor funktionieren so

Code: Alles auswählen

    aString := integer(aPixel).ToHexString(6);
    aSingle := integer(aPixel).ToSingle;
    aExtended := integer(aPixel).ToExtended; 
es ist mir trotzdem ein Rätsel warum ich für eine Funktion von TColor nach Integer casten muss, das bin ich von andren Klassen nicht gewohnt.

Gruß
Stefan

Kennt jemand den Grund dass das bei TColor so ist?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TColor Funktionen .ToString etc.

Beitrag von af0815 »

es ist mir trotzdem ein Rätsel warum ich für eine Funktion von TColor nach Integer casten muss, das bin ich von andren Klassen nicht gewohnt.
Schau dir mal die definition von TColor und den Vorläufern an. Das ist keine Typ integer, sondern ein definierter Bereich, der in einen Integer passt.

Code: Alles auswählen

 TColor = TGraphicsColor;
...
  TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TColor Funktionen .ToString etc.

Beitrag von theo »

stefanE hat geschrieben:
Di 23. Mai 2023, 11:21
es ist mir trotzdem ein Rätsel warum ich für eine Funktion von TColor nach Integer casten muss, das bin ich von andren Klassen nicht gewohnt.
Kennt jemand den Grund dass das bei TColor so ist?
TColor ist keine Klasse sondern ein einfacher Datentyp! Das ist nur eine Art Integer/Longint aber eben auch nicht wirklich:

Code: Alles auswählen

Type  
    TColor      = -$7FFFFFFF-1..$7FFFFFFF;  
Diese Irgendwas.ToIrgendwas Type Helper Funktionen sind relativ neue Erweiterungen.
Für TColor direkt gibt es die offenbar nicht. D.h. Der Compiler weiss nicht, was er da nehmen soll, wenn man es ihm nicht sagt (Type Casting).
Der Fehler liegt mMn darin, dass die IDE das in Code Insight als Option anzeigt, obwohl der Compiler es gar nicht schluckt.

https://www.freepascal.org/docs-html/rt ... elper.html

Mit den normalen Funktionen bist du auf der sicheren Seite:

Code: Alles auswählen

AStr:=IntToHex(AColor,6);   

P.S. Man kann die Funktionalität natürlich auch selber nachrüsten, falls es die nicht schon irgendwo gibt.
So würde dann dein ursprünglicher "Plan" mit "aPixel.ToHexString(6)" funktionieren:

Code: Alles auswählen

{$modeswitch typehelpers}
...
type

  { TColorHelper }

  TColorHelper = type helper for TColor
  public
    function ToHexString(const aMinDigits: integer): string; overload; inline;
  end;    
...
implementation
...

{ TColorHelper }

function TColorHelper.ToHexString(const aMinDigits: integer): string;
begin
  Result := integer(Self).ToHexString(aMinDigits);
end;    

Antworten