Перейти к содержанию
  • Регистрация
  • 0
rareMax

Записать массив в TValue

Вопрос

Помогите разобраться, как можно записать массив в TValue. Пробовал следующим образом: 

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.Rtti,
  System.SysUtils,
  System.TypInfo;

procedure TestArrayTValue;
var
  FValue: TValue;
  FInputArray: TArray<String>;
  FInputValue: TArray<TValue>;
  I: Integer;
Begin
  FInputArray := ['1', '2', '3'];
  SetLength(FInputValue, length(FInputArray));
  for I := Low(FInputValue) to High(FInputValue) do
    FInputValue[I] := FInputArray[I];
  FValue.FromArray(PTypeInfo(FInputValue), FInputValue);
End;

begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
    TestArrayTValue;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.

но к сожалению ошибка:

Цитата

First chance exception at $751AA832. Exception class EArgumentException with message 'ArrayTypeInfo'. Process Project12.exe (4256)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0

В одну сторону работает. 

Type
  TArrayString = Array of String;
  //TArrayString = TArray<String>;
procedure TestArrayTValue;
var
  FValue: TValue;
  FInputArray, Return: TArrayString; // TArray<String>;
  I: Integer;
Begin
  FInputArray := ['1', '2', '3'];
  FValue.From<TArrayString>(FInputArray);
  Writeln('is TArrayString: ', FValue.IsType<TArrayString>);
  Return := FValue.AsType<TArrayString>; { Возвращает пустой массив -_- }
  Writeln('Length: ', Length(Return));
  for I := Low(Return) to High(Return) do
    Writeln(Return[I]);
End;

В консоле:

Цитата

is TArrayString: TRUE
Length: 0

Определяет что это массив - но не возвращает элементы. Или неправильно извлекаю их?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 1
  FInputArray := ['1', '2', '3'];


  FValue := TValue.From<TArrayString>(FInputArray);
  Writeln('is TArrayString: ', FValue.IsType<TArrayString>);

  SetLength(Return, Length(FValue.AsType<TArrayString>));
  FValue.ExtractRawData(@Return);


  Writeln('Length: ', Length(Return));
  for I := Low(Return) to High(Return) do
    Writeln(Return[I]);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...