Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Aufzählungstyp in string Umwandeln (https://www.delphipraxis.net/171283-aufzaehlungstyp-string-umwandeln.html)

Mojito 29. Okt 2012 22:29

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:

MondiBob 29. Okt 2012 22:45

AW: Aufzählungstyp in string Umwandeln
 
Ich glaub so:
Delphi-Quellcode:
function OpToStr(op: TOperator): String;
begin
  Result := GetEnumName(TypeInfo(TOperator), Ord(op));
end;

Sir Rufo 29. Okt 2012 23:27

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;

himitsu 30. Okt 2012 00:39

AW: Aufzählungstyp in string Umwandeln
 
Zitat:

Zitat von Sir Rufo (Beitrag 1188988)
und wenn man ganz flexibel sein möchte

Das macht man heute doch über Attribute (RTTI). :roll:


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)

Andreas L. 30. Okt 2012 08:05

AW: Aufzählungstyp in string Umwandeln
 
Zitat:

Zitat von MondiBob (Beitrag 1188986)
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;

uligerhardt 30. Okt 2012 08:35

AW: Aufzählungstyp in string Umwandeln
 
Zitat:

Zitat von Andreas L. (Beitrag 1189009)
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:
Delphi-Quellcode:
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. :mrgreen:)

himitsu 30. Okt 2012 09:25

AW: Aufzählungstyp in string Umwandeln
 
Delphi-Quellcode:
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. :cry:

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.

dominikkv 6. Mai 2020 09:44

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 00:35 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