Autor |
Beitrag |
Sliver18
Hält's aus hier
Beiträge: 7
WinXP, WinVista, Win7
D7E
|
Verfasst: Do 04.08.11 13:27
Hallöchen,
nach mehreren Stunden Recherche gehe ich schlußendlich davon aus, dass folgendes nicht möglich ist:
Ich würde gerne ein Enumerator-Element in einen String umwandeln - das klappt ja auch wunderbar mit folgendem Code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| [...]
uses TypInfo;
[...]
type TMyEnumerator = ( meElement1, meElement2, meElement3 );
[...]
implementation
[...]
function MyEnumToStr( const PI_eElement:TMyEnumerator ):string; begin result := GetEnumName( TypeInfo( TMyEnumerator ), Ord( PI_eElement ) ); end; |
Ich habe mich jedoch gefragt, ob es nicht eine allgemeinere Methode gibt, Enumerator-Elemente in Strings umzuwandeln. So etwas in der Art:
Delphi-Quelltext 1: 2: 3: 4:
| function EnumToStr( const EnumeratorElement: ??? ):string; begin result := GetEnumName( GetEnumeration( EnumeratorElement ), EnumeratorElement ); end; |
Aber dafür muss ich innerhalb der function wissen, um welchen Datentyp es sich handelt - gibt es einen Basistyp für Enumerationen?
Edit: Vielleicht ist es so klarer: Im Endeffekt möchte ich lediglich aufrufen:
Delphi-Quelltext 1: 2: 3:
| TMyEnumerator = ( meElement1, meElement2, meElement3 );
mystring := EnumToStr( meElement1 ); |
/Edit
Allerdings gibt es ja (soweit ich weiß) keinen als Parameter übergebaren "Enumeratoren-Basis-Typ" und auch keinen "Enumerator-Element-Basis-Typ".
Oder hat jemand eine Idee?
Ich nutze Delphi 7 - Windows 7
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 05.08.11 01:41
Enumerations werden intern als Ordinalwerte behandelt. Und zusammen mit der Typeinfo kann man dann die Elemente auslesen.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 05.08.11 06:44
|
|
Sliver18 
Hält's aus hier
Beiträge: 7
WinXP, WinVista, Win7
D7E
|
Verfasst: Fr 05.08.11 08:23
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 05.08.11 09:54
Das heißt es geht dir nur um das bisschen Schreibarbeit nicht jedesmal GetEnumName usw. zu schreiben sondern eine Funktion, die den Wert bekommt?
Das wird so nicht gehen, da brauchst du wohl ein anderes Konzept.
Für diesen Beitrag haben gedankt: Sliver18
|
|
Sliver18 
Hält's aus hier
Beiträge: 7
WinXP, WinVista, Win7
D7E
|
Verfasst: Fr 05.08.11 12:15
jaenicke hat folgendes geschrieben : | Das heißt es geht dir nur um das bisschen Schreibarbeit nicht jedesmal GetEnumName usw. zu schreiben sondern eine Funktion, die den Wert bekommt?
Das wird so nicht gehen, da brauchst du wohl ein anderes Konzept. |
So ähnlich. Ich finde den Weg nicht wirklich intuitiv, beides (also Enumerationswert und -typ) zu übergeben. Ich schreibe ja auch nicht StrToInt( '500', integer ) oder IntToStr( 500, integer ).
Ich dachte mir, ich schreibe eine function, die das etwas "netter" abhandelt. Aber dann ist das so - danke für die Mühe.
Gibt es dennoch einen Weg einen Typeidentifier zu übergeben? So, wie TypeInfo einen erwartet?
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 05.08.11 12:27
Sliver18 hat folgendes geschrieben : | Ich schreibe ja auch nicht StrToInt( '500', integer ) oder IntToStr( 500, integer ). |
Dort schreibst du ja auch IntToStr.
So ein Enumerationswert ist eben intern nur eine Zahl. Das heißt in dem Moment, in dem du das castest um es an eine allgemeine Funktion zu übergeben, verlierst du die notwendigen Informationen. Das ist so und lässt sich auch nicht umgehen.
Nebenbei, in XE ginge das so: Delphi-Quelltext 1:
| TRttiEnumerationType.GetName<TEnumElement>(EnumElement) | Aber ohne Angabe des Typs geht es auch da nicht.
|
|
Sliver18 
Hält's aus hier
Beiträge: 7
WinXP, WinVista, Win7
D7E
|
Verfasst: Fr 05.08.11 14:04
jaenicke hat folgendes geschrieben : | So ein Enumerationswert ist eben intern nur eine Zahl. Das heißt in dem Moment, in dem du das castest um es an eine allgemeine Funktion zu übergeben, verlierst du die notwendigen Informationen. |
Genau. Aus diesem Grund kam der Ansatz, einen Typeidentifier zu übergeben - was zwar das Problem nicht verändert, ich müsste ja weiterhin zwei Parameter füllen, mich aber dennoch interessiert.
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 05.08.11 15:46
Das geht mit deiner Uraltversion von Delphi leider noch nicht. Gar nicht.  Wie es in XE geht, habe ich ja geschrieben.
|
|
Sliver18 
Hält's aus hier
Beiträge: 7
WinXP, WinVista, Win7
D7E
|
Verfasst: Fr 05.08.11 15:49
|
|
|