Autor Beitrag
Sliver18
Hält's aus hier
Beiträge: 7

WinXP, WinVista, Win7
D7E
BeitragVerfasst: 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:

ausblenden 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:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 05.08.11 06:44 
user profile iconSliver18 hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
Hält's aus hier
Beiträge: 7

WinXP, WinVista, Win7
D7E
BeitragVerfasst: Fr 05.08.11 08:23 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function EnumToStr( EnumElement:TEnumElement ):string// hier würde das Element übergeben werden - gibt es einen Typ für "TEnumElement"?
var id:TypeIdentifier; // wie deklariert man sowas? die function TypeOf aus der Unit system nimmt doch auch jeden Typ an, dort steht als Variablentyp "TypeIdentifier"
begin
  id := TypeIdentifierOf(EnumElement) // aus dem EnumeratorElement den dazugehörigen Enumerationstypen ermitteln - geht das? (TypeIdentifierOf ist natürlich fiktiv)
  result := GetEnumName( TypeInfo( id ), Ord( EnumElement ) ); // und den Namen des Elementes ausgeben
end;
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7

WinXP, WinVista, Win7
D7E
BeitragVerfasst: Fr 05.08.11 12:15 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 05.08.11 12:27 
user profile iconSliver18 hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden Delphi-Quelltext
1:
TRttiEnumerationType.GetName<TEnumElement>(EnumElement)					
Aber ohne Angabe des Typs geht es auch da nicht.
Sliver18 Threadstarter
Hält's aus hier
Beiträge: 7

WinXP, WinVista, Win7
D7E
BeitragVerfasst: Fr 05.08.11 14:04 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7

WinXP, WinVista, Win7
D7E
BeitragVerfasst: Fr 05.08.11 15:49 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Das geht mit deiner Uraltversion von Delphi leider noch nicht. Gar nicht. ;-)


Ich merke es schon :D

Trotzdem danke.