Name von Aufzähltypen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
braunbär
Beiträge: 463
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
CPU-Target: 64Bit
Wohnort: Wien

Name von Aufzähltypen

Beitrag von braunbär »

Wenn ich einen Aufzähltyp
var x: (blau, gelb, rot)
habe, kann ich mit dem write-Befehl den Namen des aktuellen Werts ausgeben. Ich habe aber nicht gefunden, wie ich sonst im Programm auf den String-Wert direkt zugreifen kann (und ChatGPT sagt mir, das geht nicht). Geht das wirklich nicht? Für das write müssen die Strings doch zu Laufzeit verfügbar sein.

braunbär
Beiträge: 463
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
CPU-Target: 64Bit
Wohnort: Wien

Re: Name von Aufzähltypen

Beitrag von braunbär »

...

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

Re: Name von Aufzähltypen

Beitrag von theo »

Code: Alles auswählen

var x: (blau, gelb, rot);
    S:String;
begin
WriteStr(S,gelb);
Caption:=S;
end;

PascalDragon
Beiträge: 963
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Name von Aufzähltypen

Beitrag von PascalDragon »

braunbär hat geschrieben: Do 23. Jan 2025, 17:08 Wenn ich einen Aufzähltyp
var x: (blau, gelb, rot)
habe, kann ich mit dem write-Befehl den Namen des aktuellen Werts ausgeben. Ich habe aber nicht gefunden, wie ich sonst im Programm auf den String-Wert direkt zugreifen kann (und ChatGPT sagt mir, das geht nicht). Geht das wirklich nicht? Für das write müssen die Strings doch zu Laufzeit verfügbar sein.
Hierfür ist das Str-Intrinsic da.

Code: Alles auswählen

var
  x: (blau, gelb, rot);
  s: String;
begin
  Str(gelb, s);
  Writeln(s);
end.
FPC Compiler Entwickler

braunbär
Beiträge: 463
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
CPU-Target: 64Bit
Wohnort: Wien

Re: Name von Aufzähltypen

Beitrag von braunbär »

Danke! Ich habe mir ja gedacht, dass ChatGPT da falsch liegt.
Man darf dem auch nicht alles glauben :D

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 596
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Name von Aufzähltypen

Beitrag von Niesi »

theo hat geschrieben: Do 23. Jan 2025, 17:25

Code: Alles auswählen

var x: (blau, gelb, rot);
    S:String;
begin
WriteStr(S,gelb);
Caption:=S;
end;
.

Mir ist unklar, wofür das gut ist - was kann ich damit machen?
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 385
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Name von Aufzähltypen

Beitrag von Jorg3000 »

Moin!
braunbär hat geschrieben: Do 23. Jan 2025, 17:08ChatGPT sagt mir, das geht nicht
Ich habe es gerade in der kostenlosen Version ausprobiert, da kriegt man tatsächlich keine Lösung angeboten.
Im Plus-Paket wird mir bei gleicher Fragestellung eine andere, ebenfalls funktionierende(!) Lösung ausgespuckt:

Code: Alles auswählen

  uses TypInfo;
  var x: (blau, gelb, rot);
  x := gelb;
  s := GetEnumName( TypeInfo(x), Ord(x) );
  ShowMessage(s); // Writeln(s);  
Ich kannte bisher keine der Lösungsmöglichkeiten, weder über GetEnumName() noch über Str() - also gut, dass es dieses Forum gibt. :)
Grüße, Jörg

braunbär
Beiträge: 463
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
CPU-Target: 64Bit
Wohnort: Wien

Re: Name von Aufzähltypen

Beitrag von braunbär »

...
Zuletzt geändert von braunbär am Fr 24. Jan 2025, 09:13, insgesamt 1-mal geändert.

braunbär
Beiträge: 463
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
CPU-Target: 64Bit
Wohnort: Wien

Re: Name von Aufzähltypen

Beitrag von braunbär »

braunbär hat geschrieben: Fr 24. Jan 2025, 08:57
Niesi hat geschrieben: Fr 24. Jan 2025, 06:28
theo hat geschrieben: Do 23. Jan 2025, 17:25

Code: Alles auswählen

var x: (blau, gelb, rot);
    S:String;
begin
WriteStr(S,gelb);
Caption:=S;
end;
Mir ist unklar, wofür das gut ist - was kann ich damit machen?
Es gibt verschiedene Situationen, in denen man den Namen braucht. Ein Beispiel ist ein mehrsprachiges Programm, in dem eine Ausgabe zur Laufzeit automatisch in die richtige Sprache übersetzt werden soll. Oder, wie in dem Beispiel, das du zitierst, die Caption einer graphischen Komponente zu setzen, die am Bildschirm ausgegeben wird (Form, Label, Dropdown Box, was auch immer). Ich brauche es, weil ich für meine Logging Routine lieber den Klartext des Aufzähltyps als eine nichtssagende Nummer verwenden möchte.
Jorg3000 hat geschrieben: Fr 24. Jan 2025, 07:21 Im Plus-Paket wird mir bei gleicher Fragestellung eine andere, ebenfalls funktionierende(!) Lösung ausgespuckt:
Oh! ich denke schon seit einiger Zeit daran, mir gelegentlich ein Abo zu besorgen. Vielleicht sollte ich das jetzt wirklich machen.
Jorg3000 hat geschrieben: Fr 24. Jan 2025, 07:21 gut, dass es dieses Forum gibt. :)
Dem kann ich mich nur anschließen

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Name von Aufzähltypen

Beitrag von m.fuchs »

braunbär hat geschrieben: Fr 24. Jan 2025, 02:02 Danke! Ich habe mir ja gedacht, dass ChatGPT da falsch liegt.
Man darf dem auch nicht alles glauben :D
Dann ist dir ja jetzt hoffentlich klar, warum das Ding keine Empfehlung für Anfänger ist.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
Zvoni
Beiträge: 401
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Name von Aufzähltypen

Beitrag von Zvoni »

braunbär hat geschrieben: Fr 24. Jan 2025, 08:57 Es gibt verschiedene Situationen, in denen man den Namen braucht. Ein Beispiel ist ein mehrsprachiges Programm, in dem eine Ausgabe zur Laufzeit automatisch in die richtige Sprache übersetzt werden soll. Oder, wie in dem Beispiel, das du zitierst, die Caption einer graphischen Komponente zu setzen, die am Bildschirm ausgegeben wird (Form, Label, Dropdown Box, was auch immer).
Dann ist aber dieses Verfahren dafür eher ungeeignet. Dafür gibts doch Ressourcen.

Ich brauche es, weil ich für meine Logging Routine lieber den Klartext des Aufzähltyps als eine nichtssagende Nummer verwenden möchte.
Dafür ist es wiederum sehr geeignet

Zusammengefasst: Ein Aufzählungstyp ist im Prinzip eine "Abkürzung" um nicht unzählige Konstanten verwenden zu müssen wobei man gleichzeitig noch den Wertebereich einschränken/festlegen kann.
Es ist eine "Programmierhilfe" um den Quelltext "lesbarer" zu machen
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

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

Re: Name von Aufzähltypen

Beitrag von theo »

Niesi hat geschrieben: Fr 24. Jan 2025, 06:28
theo hat geschrieben: Do 23. Jan 2025, 17:25

Code: Alles auswählen

var x: (blau, gelb, rot);
    S:String;
begin
WriteStr(S,gelb);
Caption:=S;
end;
Mir ist unklar, wofür das gut ist - was kann ich damit machen?
Naja, hier beschreiben (blau, gelb, rot) ja eigentlich nur eine Aufzählung (wie Konstanten: 0,1,2), es sind keine Strings.
Ord(gelb) gibt z.B. 1 zurück.
Wenn ich nun aber "menschenlesbar" wissen möchte was ausgewählt ist (z.B. fürs Logging), kann ich mit den genannten Methoden eben doch einen String 'gelb' erhalten.
Es grenzt an Magie! :lol:

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 596
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Name von Aufzähltypen

Beitrag von Niesi »

Zvoni hat geschrieben: Fr 24. Jan 2025, 10:22
braunbär hat geschrieben: Fr 24. Jan 2025, 08:57
...

Es ist eine "Programmierhilfe" um den Quelltext "lesbarer" zu machen
Wenn ich das bereits gezeigte Beispiel nehme:

Code: Alles auswählen

var
  x: (blau, gelb, rot);
  s: String;
begin
  Str(gelb, s);
  Writeln(s);
end.
Da spare ich ne Menge Zeilen und habe es verständlicher, wenn ich gleich

WriteLn('gelb');

eingebe ... :mrgreen:
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 596
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Name von Aufzähltypen

Beitrag von Niesi »

theo hat geschrieben: Fr 24. Jan 2025, 11:14
Niesi hat geschrieben: Fr 24. Jan 2025, 06:28
theo hat geschrieben: Do 23. Jan 2025, 17:25

Code: Alles auswählen

var x: (blau, gelb, rot);
    S:String;
begin
WriteStr(S,gelb);
Caption:=S;
end;
Mir ist unklar, wofür das gut ist - was kann ich damit machen?
Naja, hier beschreiben (blau, gelb, rot) ja eigentlich nur eine Aufzählung (wie Konstanten: 0,1,2), es sind keine Strings.
Ord(gelb) gibt z.B. 1 zurück.
Wenn ich nun aber "menschenlesbar" wissen möchte was ausgewählt ist (z.B. fürs Logging), kann ich mit den genannten Methoden eben doch einen String 'gelb' erhalten.
Es grenzt an Magie! :lol:
Hab Deine Antwort zu spät gesehen, musste gerade umsteigen ...

Wozu ist das gut? Wenn die User 'gelb' lesen sollen, geht das dann mit Konstanten nicht viel einfacher?
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
Zvoni
Beiträge: 401
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Name von Aufzähltypen

Beitrag von Zvoni »

Niesi hat geschrieben: Fr 24. Jan 2025, 11:32 Hab Deine Antwort zu spät gesehen, musste gerade umsteigen ...

Wozu ist das gut? Wenn die User 'gelb' lesen sollen, geht das dann mit Konstanten nicht viel einfacher?
Ich verstehe das eher so:
Ein Array kann bekanntlich auch mit einem Aufzählungstype deklaliert werden

Code: Alles auswählen

Type
   Farben = (gelb, blau, rot);
   
Var
  arr:Array[Farben] Of String;
Und je nachdem, welche "Sprache" der User für sich eingestellt hat, kann für

Code: Alles auswählen

//User hat deutsch
Writeln(arr[gelb]); //--> output = "gelb"
....
//User hat englisch
Writeln(arr[gelb]); //--> output = "yellow"
kommen, in seinem LOGGING würde aber immer "gelb" stehen, weil er den numerischen Wert "übersetzt"
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Antworten