![]() |
Aufzählungstyp in string Umwandeln
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!:thumb: |
AW: Aufzählungstyp in string Umwandeln
Ich glaub so:
Delphi-Quellcode:
function OpToStr(op: TOperator): String;
begin Result := GetEnumName(TypeInfo(TOperator), Ord(op)); end; |
AW: Aufzählungstyp in string Umwandeln
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; |
AW: Aufzählungstyp in string Umwandeln
Zitat:
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) |
AW: Aufzählungstyp in string Umwandeln
Zitat:
![]()
Delphi-Quellcode:
function EnumeratorToString(AEnumType: TypeIdentifier; const AEnum): String;
begin Result := TypInfo.GetEnumName(TypInfo.TypeInfo(AEnumType), Ord(AEnum)); end; |
AW: Aufzählungstyp in string Umwandeln
Zitat:
Delphi-Quellcode:
Also so:
function GetEnumName(TypeInfo: PTypeInfo; Value: Integer): string;
Delphi-Quellcode:
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. :mrgreen:)
function EnumeratorToString(ATypeInfo: PTypeInfo; const AEnum): string;
begin Result := TypInfo.GetEnumName(ATypeInfo, Integer(AEnum)); end; |
AW: Aufzählungstyp in string Umwandeln
Delphi-Quellcode:
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.
Integer(AEnum)
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:
Hach, wäre es nicht toll, wenn man generische Funktionen hätte. :cry:
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; ... 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. |
AW: Aufzählungstyp in string Umwandeln
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); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz