Текущий архив: 2004.09.19;
Скачать: CL | DM;
Вниз
InsertRecord Найти похожие ветки
← →
Vir (2004-08-22 01:45) [0]В рантайме нужно добовальть запись в ClientDataSet.
функции передается Array of Const.
Поскольку количество полей заранее не известно то Array of Const динамически создаю.
И где-то ошибся с выделением памяти
вот кусок кода.
var i:integer;
value,fname:string;
rec:array of TVarRec ;
p_value:Pchar;
begin
SetLength(rec,GoodsGrid.FieldCount-1);
for i:=0 to GoodsGrid.FieldCount-1 do
begin
fname:=GoodsGrid.Fields[i].FieldName;
if DataForm.GoodsQuery.FieldByName(fname).Value<>NULL
then value:=DataForm.GoodsQuery.FieldByName(fname).Value
else value:="NULL!";
p_value:=StrAlloc(length(value));
FillMemory(p_value,length(value)+1,0);
MoveMemory(p_value,@value[1],length(value));
rec[i].VType:=6;
rec[i].VPChar:=p_value;
end;
DataForm.ClientDataSet1.InsertRecord(rec);
Сам по себе он срабатывает но, по выходу из процедуры выпадаю в exception "Invalid Pointer Operation"
Помогите где ошибся?
← →
Desdechado © (2004-08-22 19:17) [1]что такое TVarRec?
и зачем вот этоp_value:=StrAlloc(length(value));
FillMemory(p_value,length(value)+1,0);
MoveMemory(p_value,@value[1],length(value));
rec[i].VType:=6;
rec[i].VPChar:=p_value;
← →
Erik1 (2004-08-23 10:46) [2]С масивами надо работать разрешоными средствами, а не топором по принципу куда нибудь да попадем. Вобщем код полная ерунда, откуда такой взялся непонятно. Создай масив
Rec: Array of Variant;
begin
j := 0;
SetLength(Rec, FieldCount);
for i := 0 to FieldCount-1 do
if Fields[i].Value <> nil then
begin
Rec[j] := Fields[i].Value;
inc(j);
end;
SetLength(Rec, j+1);
А вобщето все это можно сделать еще проще:
DataForm.ClientDataSet1.InsertRecord(DataForm.GoodsQuery.Fields);
Страницы: 1 вся ветка
Текущий архив: 2004.09.19;
Скачать: CL | DM;
Память: 0.44 MB
Время: 0.03 c