同上

解决方案 »

  1.   


    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;