Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

89 строки
2.2 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. class function Compare(const aSet1, aSet2: __SET_TYPE): Integer;
  9. end;
  10. {$ELSEIF defined (__SET_IMPLEMENTATION)}
  11. class function __SET_HELPER.ToString(const Value: __SET_TYPE): String;
  12. var
  13. m: __ENUM_TYPE;
  14. begin
  15. Result:= '';
  16. for m in __ENUM_HELPER.Values do
  17. if m in Value then begin
  18. if Result > '' then
  19. Result:= Result + ', ';
  20. Result:= Result + __ENUM_HELPER.ToString(m);
  21. end;
  22. end;
  23. class function __SET_HELPER.ToSet(const Str: String): __SET_TYPE;
  24. begin
  25. if not TryToSet(Str, Result) then
  26. raise SysUtils.EConvertError.CreateFmt('"%s" is an invalid value',[Str]);
  27. end;
  28. class function __SET_HELPER.ToSet(const Str: String; const aDefault: __SET_TYPE): __SET_TYPE;
  29. begin
  30. if not TryToSet(Str, Result) then
  31. Result:= aDefault;
  32. end;
  33. class function __SET_HELPER.TryToSet(const Str: String; out Value: __SET_TYPE): boolean;
  34. var
  35. i, j: Integer;
  36. s: String;
  37. m: __ENUM_TYPE;
  38. begin
  39. Result:= true;
  40. Value := [];
  41. i := 1;
  42. j := 1;
  43. while (i <= Length(Str)) do begin
  44. if (Str[i] = ',') then begin
  45. s := Trim(copy(Str, j, i-j));
  46. Result:= Result and __ENUM_HELPER.TryToEnum(s, m);
  47. if not Result then
  48. Exit;
  49. Include(Value, m);
  50. j := i+1;
  51. end;
  52. inc(i);
  53. end;
  54. s := Trim(copy(Str, j, i-j));
  55. if (s <> '') then begin
  56. Result:= Result and __ENUM_HELPER.TryToEnum(s, m);
  57. if not Result then
  58. Exit;
  59. Include(Value, m);
  60. end;
  61. end;
  62. class function __SET_HELPER.Compare(const aSet1, aSet2: __SET_TYPE): Integer;
  63. var
  64. i: __ENUM_TYPE;
  65. begin
  66. result := 0;
  67. for i := High(i) downto Low(i) do begin
  68. if (i in aSet1) and not (i in aSet2) then begin
  69. result := 1;
  70. break;
  71. end else if not (i in aSet1) and (i in aSet2) then begin
  72. result := -1;
  73. break;
  74. end;
  75. end;
  76. end;
  77. {$ENDIF}
  78. {$undef __SET_HELPER}
  79. {$undef __SET_TYPE}
  80. {$undef __ENUM_TYPE}
  81. {$undef __ENUM_HELPER}