Nja, es geht auch andersrum.
Byte(SomeTasteBud) := TasteBuds.ToEnum(tbSour);
oder
Delphi-Quellcode:
var
SomeTasteBudByte: Byte absolute SomeTasteBud;
SomeTasteBud := TasteBuds.ToEnum(tbSour);
Oder du definierst das TEnumHelper.ToEnum als Prozedur und gibst das Result ebenfalls als typlosen VAR/OUT-Parameter raus, genauso wie beim CONST.
Wenn du dir in den letzten paar 5 Jahren mal ein neueres Delph zugelegt hättest, dann ginge auch sowas.
Delphi-Quellcode:
RTTIServices = class
class function SetToStr<TSet>(const Value: TSet; Brackets: Boolean=True): string; static;
class function StrToSet<TSet>(const Value: string): TSet; static;
class function EnumToStr<TEnum>(const Value: TEnum): string; static;
class function StrToEnum<TEnum>(const Value: string): TEnum; static;
end;
var
S: string;
E: TTasteBuds;
S := RTTIServices.EnumToStr<TTasteBuds>(tbSour);
E := RTTIServices.StrToEnum<TTasteBuds>('tbSour');
Das entspricht in etwa deinem Code, wenn man den Typ direkt mit übergibt
Delphi-Quellcode:
ShowMessage(TasteBuds.ToString(TypeInfo(TTasteBuds), Ord(tbSour))); // 'tbSour'
SomeTasteBud := TTasteBuds(TasteBuds.ToEnum(TypeInfo(TTasteBuds), 'tbSour')); // tbSour
Es liese sich im Aufruf nochmal etwas kürzen, wenn man den generischen Typ nicht an die Methoden, sondern an die Klasse bindet.
Delphi-Quellcode:
type
EnumService<TEnum> = class
class function EnumToStr(const Value: TEnum): string; static;
class function StrToEnum(const Value: string): TEnum; static;
end;
type
X = EnumService<TTasteBuds>;
var
S: string;
E: TTasteBuds;
S := EnumService<TTasteBuds>.EnumToStr(tbSour);
E := EnumService<TTasteBuds>.StrToEnum('tbSour');
S := X.EnumToStr(tbSour);
E := X.StrToEnum('tbSour');
Und nein, TOrdType ist nicht immer richtig.
Eigentlich msstest du aus dem TypeInfo die Enum-Größe auslesen und dann entweder nach Byte, Word oder Integer casten,
denn wenn dein ENUM mehr als 256 Werte enthält, dann hast du ein Problem.