У меня есть строка '[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;