AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Aufzählungstyp in string Umwandeln

Ein Thema von Mojito · begonnen am 29. Okt 2012 · letzter Beitrag vom 6. Mai 2020
Antwort Antwort
Mojito

Registriert seit: 29. Okt 2012
39 Beiträge
 
#1

Aufzählungstyp in string Umwandeln

  Alt 29. Okt 2012, 23:29
Hallo Freunde,

Ich muss mit einer Funktion(opToString) einen Parameter, der durch einen eigenen Aufzählungstyp aus einer anderen Unit deklariert ist, in einen String umwandeln. Leider bekomme ich dabei eine Fehlermeldung wenn ich IntToStr verwende, da es sich nun mal nicht um einen Integer handelt.
Wie wandel ich TOperator in einen String um?

[DCC Fehler] UTools.pas(22): E2250 Es gibt keine überladene Version von 'IntToStr', die man mit diesen Argumenten aufrufen kann

Der Code

Delphi-Quellcode:
type
TOperator = (opPlus, opMinus, opMultiply, opDivide);
Delphi-Quellcode:
implementation

function opToString(op:TFrmSettings.TOperator):string;
begin
opToString:=IntToStr(op);
end;

Vielen Dank!
  Mit Zitat antworten Zitat
MondiBob

Registriert seit: 5. Jul 2010
23 Beiträge
 
#2

AW: Aufzählungstyp in string Umwandeln

  Alt 29. Okt 2012, 23:45
Ich glaub so:
Delphi-Quellcode:
function OpToStr(op: TOperator): String;
begin
  Result := GetEnumName(TypeInfo(TOperator), Ord(op));
end;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Aufzählungstyp in string Umwandeln

  Alt 30. Okt 2012, 00:27
und wenn man ganz flexibel sein möchte (wurde von DeddyH auch schon gezeigt)
Delphi-Quellcode:
type
  TOperator = (opPlus, opMinus, opMultiply, opDivide);
const
  TOperatorStr : array[TOperator] of string = ( 'Plus', 'Minus', 'Multiply', 'Divide' );

...

procedure TForm1.Button1Click( Sender : TObject );
begin
  ShowMessage( TOperatorStr[opPlus] );
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#4

AW: Aufzählungstyp in string Umwandeln

  Alt 30. Okt 2012, 01:39
und wenn man ganz flexibel sein möchte
Das macht man heute doch über Attribute (RTTI).


GetEnumName ist natürlich schön und extrem schlank,
aber wer unbedingt will, kann natürlich auch die neue erweiterte RTTI wie TValue und Co. nutzen. (natürlich mit entsprechendem Delphi)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Aufzählungstyp in string Umwandeln

  Alt 30. Okt 2012, 09:05
Ich glaub so:
Delphi-Quellcode:
function OpToStr(op: TOperator): String;
begin
  Result := GetEnumName(TypeInfo(TOperator), Ord(op));
end;
Dazu eine Frage: Der Parameter von TypeInfo ist laut Doku und Programmierhilfe vom Typ TypeIdentifier. Wenn ich diesen Typen verwenden möchte meldet mir der Compiler Undeklarierter Bezeichner. Wieso und was muss ich anders machen um sowas zu realisieren?
Delphi-Quellcode:
function EnumeratorToString(AEnumType: TypeIdentifier; const AEnum): String;
begin
  Result := TypInfo.GetEnumName(TypInfo.TypeInfo(AEnumType), Ord(AEnum));
end;
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Aufzählungstyp in string Umwandeln

  Alt 30. Okt 2012, 09:35
Dazu eine Frage: Der Parameter von TypeInfo ist laut Doku und Programmierhilfe vom Typ TypeIdentifier. Wenn ich diesen Typen verwenden möchte meldet mir der Compiler Undeklarierter Bezeichner. Wieso und was muss ich anders machen um sowas zu realisieren?
Delphi-Quellcode:
function EnumeratorToString(AEnumType: TypeIdentifier; const AEnum): String;
begin
  Result := TypInfo.GetEnumName(TypInfo.TypeInfo(AEnumType), Ord(AEnum));
end;
TypeInfo ist keine "echte" Funktion, sondern Compiler magic. Du wirst wohl oder übel ein PTypeInfo als Parameter deklarieren müssen, genau wie bei GetEnumName:
function GetEnumName(TypeInfo: PTypeInfo; Value: Integer): string; Also so:
Delphi-Quellcode:
function EnumeratorToString(ATypeInfo: PTypeInfo; const AEnum): string;
begin
  Result := TypInfo.GetEnumName(ATypeInfo, Integer(AEnum));
end;
Aber dann lohnt sich die Wrapper-Funktion eigentlich auch gar nicht mehr. (Falls sie überhaupt funktioniert - hab's nicht getestet. Könnte nämlich sein, dass das mit dem untypisierten AEnum so nicht hinhaut. Aber kannst ja mal testen mit Enum-Typen unterschiedlicher Größe. )
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#7

AW: Aufzählungstyp in string Umwandeln

  Alt 30. Okt 2012, 10:25
Integer(AEnum) Da ein Enum, nicht immer genau 4 Byte ist, müßte deine Funktion vorher noch aus der TypeInfo die Größe auslesen und dann entsprechend unterschiedlich casten.
Idt der Enum z.B. nur 1 Byte groß, würdest du sonst eventuell auf nichtexistierenden Speicher zugreifen (passiert vermutlich fast nie, wegen der Speicherausrichtung), aber zumindestens wäre mit großer Sicherheit der ordinale Wert falsch, wegen den Daten, die in den restlichen 3 Byte liegen könnten.

Delphi-Quellcode:
function THelperClass.EnumeratorToString<T>(const AEnum: T): string;
begin
  Result := TypInfo.GetEnumName(TypeInfo<T>, Ord(T));
end;

// oder

function THelperClass<T>.EnumeratorToString(const AEnum: T): string;
...
Hach, wäre es nicht toll, wenn man generische Funktionen hätte.

Bei Letzerem könnte man sich einen Zeiger vom Typ THelperClass<T> anlegen und müßte den Typ T nicht ständig mit angeben.
Als Class Function braucht man nichtmal eine Instanz der Klasse.
Und als Static Class Function wäre es dann so schlank wie eine einfache Funktion.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (30. Okt 2012 um 10:31 Uhr)
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#8

AW: Aufzählungstyp in string Umwandeln

  Alt 6. Mai 2020, 10:44
Der Vollständigkeit halber, da dieser Thread bei meiner Google Suche fast ganz oben war, dein Wunsch wurde erhört:

Delphi-Quellcode:
uses
  System.Rtti;

var
  EnumValue: TEnumTyp;
  EnumName: string;

EnumName := TRttiEnumerationType.GetName(EnumValue);
EnumValue := TRttiEnumerationType.GetValue<TEnumTyp>(EnumName);
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz