uses TypInfo;function GetSetString(P: PTypeInfo; const value): string; var I: Integer; BaseType: PTypeInfo; begin Result := ''; BaseType := GetTypeData(P)^.CompType^; for I := 0 to SizeOf(TIntegerSet) * 8 - 1 do if I in TIntegerSet(value) then Result := Result + GetEnumName(BaseType, I) + ','; if Result <> '' then Delete(Result, Length(Result), 1); Result := Format('[%s]', [Result]); end;procedure GetSetvalue(SetType: PTypeInfo; const value: string; var Result); var P, S: PChar; Len: Integer; EnumName: string; EnumType: PTypeInfo; procedure IncludeResult; begin Len := P - S; SetLength(EnumName, Len); Move(S^, EnumName[1], Len); EnumName := Trim(EnumName); Include(TIntegerSet(Result), GetEnumvalue(EnumType, EnumName)); end;begin TIntegerSet(Result) := []; EnumType := GetTypeData(SetType)^.CompType^; P := PChar(value); S := P; while True do begin case P^ of '[': S := P + 1; ',': begin IncludeResult; S := P + 1; end; #0, ']': begin IncludeResult; break; end; end; Inc(P); end; end;type TTest = (test1, test2, test3); TTests = set of TTest;procedure TForm1.Button1Click(Sender: TObject); begin Caption := GetSetString(TypeInfo(TTests), [test1, test2]); end;procedure TForm1.Button2Click(Sender: TObject); var V: TTests; begin GetSetvalue(TypeInfo(TTests), '[test1, test2, test3]', V); if test1 in V then ShowMessage('test1 in V'); if test2 in V then ShowMessage('test2 in V'); if test3 in V then ShowMessage('test3 in V'); end;
uses TypInfo;function GetSetString(P: PTypeInfo; const value): string;
var
I: Integer;
BaseType: PTypeInfo;
begin
Result := '';
BaseType := GetTypeData(P)^.CompType^;
for I := 0 to SizeOf(TIntegerSet) * 8 - 1 do
if I in TIntegerSet(value) then
Result := Result + GetEnumName(BaseType, I) + ',';
if Result <> '' then
Delete(Result, Length(Result), 1);
Result := Format('[%s]', [Result]);
end;procedure GetSetvalue(SetType: PTypeInfo; const value: string; var Result);
var
P, S: PChar;
Len: Integer;
EnumName: string;
EnumType: PTypeInfo; procedure IncludeResult;
begin
Len := P - S;
SetLength(EnumName, Len);
Move(S^, EnumName[1], Len);
EnumName := Trim(EnumName);
Include(TIntegerSet(Result), GetEnumvalue(EnumType, EnumName));
end;begin
TIntegerSet(Result) := [];
EnumType := GetTypeData(SetType)^.CompType^;
P := PChar(value);
S := P;
while True do
begin
case P^ of
'[':
S := P + 1;
',':
begin
IncludeResult;
S := P + 1;
end;
#0, ']':
begin
IncludeResult;
break;
end;
end;
Inc(P);
end;
end;type
TTest = (test1, test2, test3);
TTests = set of TTest;procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := GetSetString(TypeInfo(TTests), [test1, test2]);
end;procedure TForm1.Button2Click(Sender: TObject);
var
V: TTests;
begin
GetSetvalue(TypeInfo(TTests), '[test1, test2, test3]', V);
if test1 in V then
ShowMessage('test1 in V');
if test2 in V then
ShowMessage('test2 in V');
if test3 in V then
ShowMessage('test3 in V');
end;