Динамически создать array of TVarRec (FireDac.AppendRecord)

Valery_B
Дата: 14.06.2019 16:43:42
Подскажите, как динамически создать объект array of TVarRec и передать его функции ?
В интернете муть какая-то через Pointer...

У меня есть класс(не мой), в котором есть метод Append(const Values: array of TVarRec);
Сейчас, нашёл сейчас в ФаирДак такой же аналог:
FDMemTable.AppendRecord(const Values: array of TVarRec);

procedure TForm1.Button1Click(Sender: TObject);
var
 DataArray:array of TVarRec;
begin
 SetLength(DataArray, 3);
 DataArray[0]:=NULL; //E2010 Incompatible types: 'TVarRec' and 'Variant'
 DataArray[1]:='Hello World!';
 DataArray[2]:=42;
 FDMemTable1.AppendRecord(DataArray);
 //FDMemTable1.AppendRecord([NULL, 'Hello World!',42]); //Вот так работает, но так не надо.
end;
Dmitry Arefiev
Дата: 14.06.2019 17:03:32
Странный код ... Какая задача ?
sasha27
Дата: 14.06.2019 17:06:08
Valery_B
 //FDMemTable1.AppendRecord([NULL, 'Hello World!',42]); //Вот так работает, но так не надо.


Может тут есть ответ...
X-Cite
Дата: 14.06.2019 17:07:05
const Values: array of TVarRec не равно Values: array of TVarRec
Это разные типы.
sasha27
Дата: 14.06.2019 17:08:33
Valery_B,
да, задача какая стоит?
alekcvp
Дата: 14.06.2019 17:39:19
Valery_B
procedure TForm1.Button1Click(Sender: TObject);
var
 DataArray:array of TVarRec;
begin
 SetLength(DataArray, 3);
 DataArray[0]:=NULL; //E2010 Incompatible types: 'TVarRec' and 'Variant'
 DataArray[1]:='Hello World!';
 DataArray[2]:=42;
 FDMemTable1.AppendRecord(DataArray);
 //FDMemTable1.AppendRecord([NULL, 'Hello World!',42]); //Вот так работает, но так не надо.
end;

Я не проверял, но из описания типа TVarRec следует что-то вроде:
procedure TForm1.Button1Click(Sender: TObject);
var
 DataArray:array of TVarRec;
begin
 SetLength(DataArray, 3);
 DataArray[0].VType := vtVariant;
 DataArray[0].VVariant := NULL;
// DataArray[1].VType := vtUnicodeString;
// DataArray[1].VUnicodeString := 'Hello World!'; - вот тут непонятно как быть, т.к. VUnicodeString - это Pointer, и хз кто будет управлять памятью
 DataArray[2].VType := vtInteger;
 DataArray[2].VInteger:= 42;
 FDMemTable1.AppendRecord(DataArray);
end;
Valery_B
Дата: 14.06.2019 19:18:14
Dmitry Arefiev
Странный код ... Какая задача ?

А что в нём странного ?
Задача, если говорить вообще - добавить строку в FireDAC.

Ну а если конкретно, я хочу уметь выводить в TDBGrid Json такой структуры:
[
  {"id": 1, "Name": "Vasya", "Number": 42},
  {"id": 2, "Name": "Petya", "Number": 43},
  {"id": 3, "Name": "Vova", "Number": 55}
]

После того, как я разобрал этот Json и создал поля через FieldDefs.Add, в результате это свелось бы примерно к такому коду:
procedure AppendDataRow(jDataRow:TJsonArray);
var 
 DataArray:array of TVarRec;
 x:Integer;
begin
 SetLength(DataArray, jDataRow.Count)
 for x:=0 to ARow.Count-1 do
  DataArray[x]:=jDataRow[x].Value; //Но не работает)
 FDMemTable.AppendRecord(DataArray); 
end;
Valery_B
Дата: 14.06.2019 19:23:16
Вот сейчас нашёл видео от Embarcadero Technologies на ютубе
+

Именно так они и говорят делать, через AppendRecord.
Только в примере добавляют статический массив, а не динамический.
Dmitry Arefiev
Дата: 14.06.2019 19:23:50
И чем классика не устраивает ?
procedure AppendDataRow(jDataRow:TJsonArray);
var 
 x:Integer;
begin
 FDMemTable.Append;
 for x:=0 to jDataRow.Count-1 do
  FDMemTable.Fields[x].AsString :=  jDataRow[x].Value;
 FDMemTable.Post;
end;
Valery_B
Дата: 14.06.2019 19:27:52
alekcvp
Я не проверял, но из описания типа TVarRec следует что-то вроде:

По моему это реальная жуть - указывать какие то типы, pointer и т.п.
По крайней мере, по сравнению со статическим методом... Не ужели всё на столько сложно ?
 FDMemTable.AppendRecord([1, 'Hello World!'])