Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   String in Enum umwandeln - Problem mit meiner Funktion (https://www.delphipraxis.net/192405-string-enum-umwandeln-problem-mit-meiner-funktion.html)

a.def 15. Apr 2017 16:08

String in Enum umwandeln - Problem mit meiner Funktion
 
Ich möchte gerne anhand eines Strings das passende Enum als Funktions-Resultat zurückbekommen.

Dazu habe ich diese Funktion hier
Delphi-Quellcode:
class function TEnumFunctions.GetValue<T>(AValue: string): T;
var
 Tipo: PTypeInfo;
 Temp: Integer;
 PTemp: pointer;
begin
 Tipo := TypeInfo(T);
 Temp := GetEnumValue(Tipo, AValue);
 PTemp := @Temp;
 Result := T(PTemp^);
end;
Aufruf
Delphi-Quellcode:
var
 xyz: TMeinEnum;
begin
 xyz := TEnumFunctions.GetValue('meTest');
Als Fehlermeldung erhalte ich
Zitat:

E2531 Methode 'GetValue' erfordert explizite Typargumente
Leider verstehe ich diese Meldung nicht so richtig. Der Originalcode hatte einen Var-Parameter im Kopf der Prozedur. Also dachte ich mache ich daraus eine Funktion mit Rückgabewert T.
Ging wohl in die Hose

uligerhardt 15. Apr 2017 16:24

AW: String in Enum umwandeln - Problem mit meiner Funktion
 
Ich kenn mich ja mit Generics nicht aus, aber du musst dem Compiler doch verraten, welchen Typ du erwartest. Sowas wie:
Delphi-Quellcode:
xyz := TEnumFunctions.GetValue<TMeinEnum>('meTest');

Uwe Raabe 15. Apr 2017 16:26

AW: String in Enum umwandeln - Problem mit meiner Funktion
 
Zitat:

Zitat von a.def (Beitrag 1367779)
Ich möchte gerne anhand eines Strings das passende Enum als Funktions-Resultat zurückbekommen.

Gibt's doch schon fertig:
Delphi-Quellcode:
TRttiEnumerationType.GetValue<T>(<Name>)

a.def 15. Apr 2017 16:45

AW: String in Enum umwandeln - Problem mit meiner Funktion
 
Mh ich glaube ich stelle mich zu doof an.
Delphi-Quellcode:
class function TEnumFunctions.GetValueX<T>(AValue: string): T;
begin
 Result := System.Rtti.TRttiEnumerationType.GetValue<T>(AValue);
end;
Umgekehrt klappt es wunderbar
Delphi-Quellcode:
class function TEnumFunctions.GetName<T>(AValue: T): string;
begin
 Result := System.Rtti.TRttiEnumerationType.GetName(AValue);
end;

Uwe Raabe 15. Apr 2017 16:55

AW: String in Enum umwandeln - Problem mit meiner Funktion
 
Zitat:

Zitat von a.def (Beitrag 1367788)
Mh ich glaube ich stelle mich zu doof an.

Wie meinst du das? Das compiliert doch beides.

a.def 15. Apr 2017 16:57

AW: String in Enum umwandeln - Problem mit meiner Funktion
 
Hab mich extrem doof angestellt und was vergessen deswegen klappte es nicht.

Delphi-Quellcode:
 xyz := TEnumFunctions.GetValueX<TIntervalModes>('meTest'); // <TIntervalModes> vergessen!
Nur eine Frage habe ich noch.

Wenn "meTest" nicht zugeordnet werden kann, wird standardmäßig 255 zurückgegeben. Wie kann ich das prüfen und ggf. 0 zurückgeben?
Bei diesem "Fertig-Code" mit ein paar Zeilen mehr (siehe erster Beitrag) ist Temp in dem Fall -1 und das kann man prüfen.

Uwe Raabe 15. Apr 2017 17:47

AW: String in Enum umwandeln - Problem mit meiner Funktion
 
Zitat:

Zitat von a.def (Beitrag 1367790)
Wenn "meTest" nicht zugeordnet werden kann, wird standardmäßig 255 zurückgegeben.

Wie ermittelst du das? Bei mir liefert ord(myEnum) auch -1;

Delphi-Quellcode:
type
  TMyEnum = (one, two, three);

var
  temp: TMyEnum;
begin
  temp := TEnumFunctions.GetValueX<TMyEnum>('Hallo?');
  Writeln(Ord(temp));
end;
Intern wird auch hier -1 zurückgegeben. Durch den Cast auf Byte (vermutlich passt der Enum da rein) wird daraus halt 255.

a.def 15. Apr 2017 18:28

AW: String in Enum umwandeln - Problem mit meiner Funktion
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1367799)
Wie ermittelst du das? Bei mir liefert ord(myEnum) auch -1;

Mit meiner alten Prozedur werte ich Temp aus
Delphi-Quellcode:
class function TEnumFunctions.GetValue<T>(AValue: string): T;
var
 Tipo: PTypeInfo;
 Temp: Integer;
 PTemp: pointer;
begin
 Tipo := TypeInfo(T);
 Temp := GetEnumValue(Tipo, AValue);
 if Temp < 0 then
  Temp := 0;
 PTemp := @Temp;
 Result := T(PTemp^);
end;
Das geht mit TRttiEnumerationType.GetValue<T> natürlich nicht (also innerhalb der Funktion GetValueX), weil man dort den Enum-Typ nicht kennt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:41 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