Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Datentyp eines Enumerator-Elements ermitteln
Sliver18 - Do 04.08.11 13:27
Titel: Datentyp eines Enumerator-Elements ermitteln
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 - Fr 05.08.11 01:41
Enumerations werden intern als Ordinalwerte behandelt. Und zusammen mit der Typeinfo kann man dann die Elemente auslesen.
jaenicke - Fr 05.08.11 06:44
Sliver18 hat folgendes geschrieben : |
nach mehreren Stunden Recherche gehe ich schlußendlich davon aus, dass folgendes nicht möglich ist: |
So wie du es möchtest nicht, nein.
Aber mir erschließt sich der Sinn nicht. An der Stelle des Aufrufs kennst du den Typ doch ohnehin.
BenBE hat folgendes geschrieben : |
Enumerations werden intern als Ordinalwerte behandelt. Und zusammen mit der Typeinfo kann man dann die Elemente auslesen. |
:gruebel:
Das ist doch genau das was bereits als Quelltext da steht. Es geht ja darum wie es anders geht...
Sliver18 - Fr 05.08.11 08:23
jaenicke hat folgendes geschrieben : |
Aber mir erschließt sich der Sinn nicht. An der Stelle des Aufrufs kennst du den Typ doch ohnehin. |
Habe mir schon gedacht, dass das etwas verwirrend klingt. Ich möchte praktisch, anstatt für jeden Enumerationstyp, den ich mir ausdenke, eine eigene EnumToStr-function zu schreiben, eine allgemeine function verwenden, die für jede Enumeration gilt. Aber um das zu realisieren müsste ich ja von dem übergebenen Element auf den Enumerationstypen schließen können. So in der Art:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| function EnumToStr( EnumElement:TEnumElement ):string; var id:TypeIdentifier; begin id := TypeIdentifierOf(EnumElement) result := GetEnumName( TypeInfo( id ), Ord( EnumElement ) ); end; |
jaenicke - 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.
Sliver18 - 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 - 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 - 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 - 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 - Fr 05.08.11 15:49
jaenicke hat folgendes geschrieben : |
Das geht mit deiner Uraltversion von Delphi leider noch nicht. Gar nicht. ;-) |
Ich merke es schon :D
Trotzdem danke.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!