powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Динамически создать array of TVarRec (FireDac.AppendRecord)
13 сообщений из 13, страница 1 из 1
Динамически создать array of TVarRec (FireDac.AppendRecord)
    #39826687
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, как динамически создать объект array of TVarRec и передать его функции ?
В интернете муть какая-то через Pointer...

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


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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;
...
Рейтинг: 0 / 0
Динамически создать array of TVarRec (FireDac.AppendRecord)
    #39826694
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странный код ... Какая задача ?
...
Рейтинг: 0 / 0
Динамически создать array of TVarRec (FireDac.AppendRecord)
    #39826696
Фотография sasha27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_B
Код: pascal
1.
 //FDMemTable1.AppendRecord([NULL, 'Hello World!',42]); //Вот так работает, но так не надо.



Может тут есть ответ...
...
Рейтинг: 0 / 0
Динамически создать array of TVarRec (FireDac.AppendRecord)
    #39826697
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
const Values: array of TVarRec не равно Values: array of TVarRec
Это разные типы.
...
Рейтинг: 0 / 0
Динамически создать array of TVarRec (FireDac.AppendRecord)
    #39826699
Фотография sasha27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_B,
да, задача какая стоит?
...
Рейтинг: 0 / 0
Динамически создать array of TVarRec (FireDac.AppendRecord)
    #39826717
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_B
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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 следует что-то вроде:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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;
...
Рейтинг: 0 / 0
Динамически создать array of TVarRec (FireDac.AppendRecord)
    #39826744
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry ArefievСтранный код ... Какая задача ?
А что в нём странного ?
Задача, если говорить вообще - добавить строку в FireDAC.

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


После того, как я разобрал этот Json и создал поля через FieldDefs.Add, в результате это свелось бы примерно к такому коду:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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;
...
Рейтинг: 0 / 0
Динамически создать array of TVarRec (FireDac.AppendRecord)
    #39826746
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот сейчас нашёл видео от Embarcadero Technologies на ютубе
[spoiler]
YouTube Video
...
Рейтинг: 0 / 0
Динамически создать array of TVarRec (FireDac.AppendRecord)
    #39826747
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И чем классика не устраивает ?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
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;
...
Рейтинг: 0 / 0
Динамически создать array of TVarRec (FireDac.AppendRecord)
    #39826751
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpЯ не проверял, но из описания типа TVarRec следует что-то вроде:

По моему это реальная жуть - указывать какие то типы, pointer и т.п.
По крайней мере, по сравнению со статическим методом... Не ужели всё на столько сложно ?
Код: pascal
1.
 FDMemTable.AppendRecord([1, 'Hello World!'])
...
Рейтинг: 0 / 0
Динамически создать array of TVarRec (FireDac.AppendRecord)
    #39826753
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry ArefievИ чем классика не устраивает ?

На самом деле так и сделано...
Тем что срабатывают события BeforePost, AfterPost и т.п.
Я подумал, что через AppendRecord они срабатывать не будут.

У меня есть наследник от FDMemTable(С переопределённым методом OpenCursor) который открывает Json такого типа.
Я работаю с ним так:
Код: pascal
1.
2.
 FDMemTable.FileName:='c:\Data.json';
 FDMemTable.Open;
...
Рейтинг: 0 / 0
Динамически создать array of TVarRec (FireDac.AppendRecord)
    #39826765
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_BПо моему это реальная жуть - указывать какие то типы, pointer и т.п.
По крайней мере, по сравнению со статическим методом... Не ужели всё на столько сложно ?
Код: pascal
1.
 FDMemTable.AppendRecord([1, 'Hello World!'])



Можно так:
Код: pascal
1.
 FDMemTable.AppendRecord([IntVar, StringVar]);


Сама структура array of const (array of TVarRec) предназначена именно для передачи неопределённого количества параметров без строгой привязки к типам. Она не предназначена для использования её "в живую", как переменной. Для этого есть механизмы, которые вам выше описали.

А компилятор из строки в вашем примере делает [примерно] тот код, который я выше написал.
...
Рейтинг: 0 / 0
Динамически создать array of TVarRec (FireDac.AppendRecord)
    #39826793
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_BТем что срабатывают события BeforePost, AfterPost и т.п.
Я подумал, что через AppendRecord они срабатывать не будут.
Тогда бы это был бы баг.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Динамически создать array of TVarRec (FireDac.AppendRecord)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]