You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
1.8 KiB

  1. {$IF defined(__SET_INTERFACE)}
  2. type __SET_HELPER = class
  3. public
  4. class function {%H}ToString(const Value: __SET_TYPE): String; reintroduce;
  5. class function TryToSet(const Str: String; out Value: __SET_TYPE): boolean; overload;
  6. class function ToSet(const Str: String; const aDefault: __SET_TYPE): __SET_TYPE; overload;
  7. class function ToSet(const Str: String): __SET_TYPE; overload;
  8. end;
  9. {$ELSEIF defined (__SET_IMPLEMENTATION)}
  10. class function __SET_HELPER.ToString(const Value: __SET_TYPE): String;
  11. var
  12. m: __ENUM_TYPE;
  13. begin
  14. Result:= '';
  15. for m in __ENUM_HELPER.Values do
  16. if m in Value then begin
  17. if Result > '' then
  18. Result:= Result + ', ';
  19. Result:= Result + __ENUM_HELPER.ToString(m);
  20. end;
  21. end;
  22. class function __SET_HELPER.ToSet(const Str: String): __SET_TYPE;
  23. begin
  24. if not TryToSet(Str, Result) then
  25. raise SysUtils.EConvertError.CreateFmt('"%s" is an invalid value',[Str]);
  26. end;
  27. class function __SET_HELPER.ToSet(const Str: String; const aDefault: __SET_TYPE): __SET_TYPE;
  28. begin
  29. if not TryToSet(Str, Result) then
  30. Result:= aDefault;
  31. end;
  32. class function __SET_HELPER.TryToSet(const Str: String; out Value: __SET_TYPE): boolean;
  33. var
  34. i, j: Integer;
  35. s: String;
  36. m: __ENUM_TYPE;
  37. begin
  38. Result:= true;
  39. Value := [];
  40. i := 1;
  41. j := 1;
  42. while (i <= Length(Str)) do begin
  43. if (Str[i] = ',') then begin
  44. s := Trim(copy(Str, j, i-j));
  45. Result:= Result and __ENUM_HELPER.TryToEnum(s, m);
  46. if not Result then
  47. Exit;
  48. Include(Value, m);
  49. j := i+1;
  50. end;
  51. inc(i);
  52. end;
  53. s := Trim(copy(Str, j, i-j));
  54. if (s <> '') then begin
  55. Result:= Result and __ENUM_HELPER.TryToEnum(s, m);
  56. if not Result then
  57. Exit;
  58. Include(Value, m);
  59. end;
  60. end;
  61. {$ENDIF}
  62. {$undef __SET_HELPER}
  63. {$undef __SET_TYPE}
  64. {$undef __ENUM_TYPE}
  65. {$undef __ENUM_HELPER}