|
- {$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;
- class function Compare(const aSet1, aSet2: __SET_TYPE): Integer;
- 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;
-
- class function __SET_HELPER.Compare(const aSet1, aSet2: __SET_TYPE): Integer;
- var
- i: __ENUM_TYPE;
- begin
- result := 0;
- for i := High(i) downto Low(i) do begin
- if (i in aSet1) and not (i in aSet2) then begin
- result := 1;
- break;
- end else if not (i in aSet1) and (i in aSet2) then begin
- result := -1;
- break;
- end;
- end;
- end;
-
- {$ENDIF}
- {$undef __SET_HELPER}
- {$undef __SET_TYPE}
- {$undef __ENUM_TYPE}
- {$undef __ENUM_HELPER}
|