Как набор не совместим с назначением с TValue, как мне представить набор с помощью TValue? - PullRequest
0 голосов
/ 03 мая 2020

У меня есть строка '[Top,Left,Bottom,Right]', которую я хочу преобразовать в набор. Для этого у меня есть функция StringToSet, расположенная в System.TypInfo Но я не знаю, как мне присвоить результат StringToSet для tvalue (или любой другой способ преобразовать '[Top,Left,Bottom,Right]' в tvalue)?

код функции delphi StringToSet:

function StringToSet(TypeInfo: PTypeInfo; const Value: string): Integer;
var
  P: PChar;
  EnumName: string;
  EnumValue: NativeInt;
  PEnumInfo: PPTypeInfo;

  // grab the next enum name
  function NextWord(var P: PChar): string;
  var
    i: Integer;
  begin
    i := 0;

    // scan til whitespace
    while not (P[i] in [',', ' ', #0,']']) do
      Inc(i);

    SetString(Result, P, i);

    // skip whitespace
    while (P[i] in [',', ' ',']']) do
      Inc(i);

    Inc(P, i);
  end;

begin
  Result := 0;
  if Value = '' then Exit;
  P := PChar(Value);

  // skip leading bracket and whitespace
  while (P^ in ['[',' ']) do
    Inc(P);

  PEnumInfo := GetTypeData(TypeInfo)^.CompType;
  if PEnumInfo <> nil then
  begin
    EnumName := NextWord(P);
    while EnumName <> '' do
    begin
      EnumValue := GetEnumValue(PEnumInfo^, EnumName);
      if EnumValue < 0 then
        raise EPropertyConvertError.CreateResFmt(@SInvalidPropertyElement, [EnumName]);
      Include(TIntegerSet(Result), enumvalue);
      EnumName := NextWord(P);
    end;
  end
  else
  begin
    EnumName := NextWord(P);
    while EnumName <> '' do
    begin
      EnumValue := StrToIntDef(EnumName, -1);
      if EnumValue < 0 then
        raise EPropertyConvertError.CreateResFmt(@SInvalidPropertyElement, [EnumName]);
      Include(TIntegerSet(Result), enumvalue);
      EnumName := NextWord(P);
    end;
  end;
end;
...