type
TOneDept = packed record
DeptId : Integer;
DeptName : ShortString;
end;
TDeptArray = array [0..0] of TOneDept;
TDept = record
Status : TStatusRec;
Count : Integer;
Datas : ^TDeptArray;
end;
function GetDept (var R:TDept):BOOL;
function GetDeptFree (var R:TDept):BOOL;
function AllocBlock(Size: Integer): Pointer;
begin
GetMem(Result, Size);
end;
function GetDept (var R:TDept):BOOL;
var S:String; I:Integer;
js:TlkJSONobject;
jsList:TlkJSONlist;
A: array of TOneDept;
begin
...
js := TlkJSON.ParseText(S) as TlkJSONobject;
try
jsList:= js.Field['table'] as TlkJSONlist;
if Assigned(jsList) then
begin
SetLength(A , jsList.Count);
for I:=Low(A) to High(A) do
begin
A[I].DeptId:=(jsList.Child[i] as TlkJSONobject).getInt('Int1');
A[I].DeptName := (jsList.Child[i] as TlkJSONobject).getString('Str1');
end;
R.Count:=Length(A);
R.Datas:=AllocBlock(SizeOf(TOneDept) * R.Count);
R.Datas:=@A[0];
end;
finally
js.Free;
end;
...
end;
procedure FreeBlock(P: Pointer);
begin
FreeMem(P);
end;
function GetDeptFree (var R:TDept):BOOL;
begin
FreeBlock(R.Datas);
end;
procedure TForm1.Button9Click(Sender: TObject);
var R:TDept; I:Integer;
begin
if GetDept(R) then
begin
for I:=0 to R.Count-1 do
begin
Memo1.Lines.Add(Format('Dept Id: %d Name: %s',[R.Datas[I].DeptId, R.Datas[I].DeptName]));
end;
end;
GetDeptFree(R);
end;
Что я делаю не так и понять не могу что.
Без выделения и освобождения тоже не работает, т.к. массив успевает разрушиться. Работает, когда выделил, но не освободил, но это не правильно, т.к. утечка.