{$IF defined(__SET_INTERFACE)} type __SET_HELPER = class public class function {%H}ToString(const Value: __SET_TYPE): String; reintroduce; class function TryToSet(const Str: String; out Value: __SET_TYPE): boolean; overload; class function ToSet(const Str: String; const aDefault: __SET_TYPE): __SET_TYPE; overload; class function ToSet(const Str: String): __SET_TYPE; overload; end; {$ELSEIF defined (__SET_IMPLEMENTATION)} class function __SET_HELPER.ToString(const Value: __SET_TYPE): String; var m: __ENUM_TYPE; begin Result:= ''; for m in __ENUM_HELPER.Values do if m in Value then begin if Result > '' then Result:= Result + ', '; Result:= Result + __ENUM_HELPER.ToString(m); end; end; class function __SET_HELPER.ToSet(const Str: String): __SET_TYPE; begin if not TryToSet(Str, Result) then raise SysUtils.EConvertError.CreateFmt('"%s" is an invalid value',[Str]); end; class function __SET_HELPER.ToSet(const Str: String; const aDefault: __SET_TYPE): __SET_TYPE; begin if not TryToSet(Str, Result) then Result:= aDefault; end; class function __SET_HELPER.TryToSet(const Str: String; out Value: __SET_TYPE): boolean; var i, j: Integer; s: String; m: __ENUM_TYPE; begin Result:= true; Value := []; i := 1; j := 1; while (i <= Length(Str)) do begin if (Str[i] = ',') then begin s := Trim(copy(Str, j, i-j)); Result:= Result and __ENUM_HELPER.TryToEnum(s, m); if not Result then Exit; Include(Value, m); j := i+1; end; inc(i); end; s := Trim(copy(Str, j, i-j)); if (s <> '') then begin Result:= Result and __ENUM_HELPER.TryToEnum(s, m); if not Result then Exit; Include(Value, m); end; end; {$ENDIF} {$undef __SET_HELPER} {$undef __SET_TYPE} {$undef __ENUM_TYPE} {$undef __ENUM_HELPER}