{$IF defined(__ENUM_INTERFACE)} type __ENUM_HELPER = class private type TValueArray = packed array[0..__ENUM_LENGTH-1] of __ENUM_TYPE; public class function {%H}ToString(const Value: __ENUM_TYPE): String; reintroduce; class function TryToEnum(const Str: String; out Value: __ENUM_TYPE): boolean; overload; class function ToEnum(const Str: String; const aDefault: __ENUM_TYPE): __ENUM_TYPE; overload; class function ToEnum(const Str: String): __ENUM_TYPE; overload; class function Values: TValueArray; strict private const TABLE: packed record E: TValueArray; // array of values N: AnsiString; // comma-separated string of names end = {$ELSEIF defined (__ENUM_IMPLEMENTATION)} class function __ENUM_HELPER.ToString(const Value: __ENUM_TYPE): String; var i: integer; begin Result:= ''; if LookupVal(@Value, @TABLE.E, sizeof(__ENUM_TYPE), length(TABLE.E), i) then Result:= PickString(TABLE.N, i); end; class function __ENUM_HELPER.ToEnum(const Str: String): __ENUM_TYPE; begin if not TryToEnum(Str, Result) then raise EConvertErrorAlias.CreateFmt('"%s" is an invalid value',[Str]); end; class function __ENUM_HELPER.ToEnum(const Str: String; const aDefault: __ENUM_TYPE): __ENUM_TYPE; begin if not TryToEnum(Str, Result) then Result:= aDefault; end; class function __ENUM_HELPER.TryToEnum(const Str: String; out Value: __ENUM_TYPE): boolean; var i: integer; begin Result:= LookupString(Str, TABLE.N, i); if Result then Value:= TABLE.E[i]; end; class function __ENUM_HELPER.Values: TValueArray; begin Result:= TABLE.E; end; {$ENDIF} {$undef __ENUM_TYPE} {$undef __ENUM_LENGTH} {$undef __ENUM_HELPER}