我试图在DataSet中公开记录。
procedure TMSExtQuery.CloneCurRecord(IgnoreFields: array of const);
begin
AppendRecord(RecordFieldsValue(IgnoreFields));
end;
function TMSExtQuery.RecordFieldsValue(IgnoreFields: array of const): TFieldsArray;
var
Idx: integer;
V: Variant;
begin
SetLength(Result, FieldCount);
for Idx := 0 to Pred(FieldCount) do
begin
if not FieldInArray(Fields[Idx], IgnoreFields) then
Result[Idx] := VarToVarRec(Fields[Idx].Value)
else
Result[Idx] := VarToVarRec(Null);
end;
end;
function VarToVarRec(const AInput: Variant): TVarRec;
begin
New(Result.VVariant);
Result.VType := vtVariant;
Result.VVariant^ := AInput;
end;
当我创建动态变量时,我必须释放为其分配的内存。 例如:
function VarToVarRec(const AInput: Variant): TVarRec;
var
V: PVariant;
begin
New(V);
V^ := AInput;
Result.VType := vtVariant;
Result.VVariant := V;
Dispose(V);
end;
当我做的时候
New(Result.VVariant);
我必须释放内存,还是Delphi?
答案 0 :(得分:2)
你必须释放它。 TVarRec是一种仅用于 作为参数的类型,通常由运行时管理,但仅在运行时分配并填充时,以array of const
。否则,您可以自行管理它们。
更多这里,在我写的一篇文章中(最后有管理TVarRecs的代码:) Open array parameters and array of const。
答案 1 :(得分:0)
procedure TMSExtQuery.RecordFieldsValue(IgnoreFields: array of const; out Result: TFieldsArray);
var
Idx: integer;
begin
SetLength(Result, FieldCount);
for Idx := 0 to Pred(FieldCount) do
begin
New(Result[Idx].VVariant);
Result[Idx].VType := vtVariant;
if not FieldInArray(Fields[Idx], IgnoreFields) then
Result[Idx].VVariant^ := Fields[Idx].Value
else
Result[Idx].VVariant^ := Null;
end;
end;
procedure TMSExtQuery.CloneCurRecord(IgnoreFields: array of const);
var
Args: TFieldsArray;
begin
RecordFieldsValue(IgnoreFields, Args);
AppendRecord(Args);
FinalizeVarRecArray(Args);
end;
procedure TMSExtQuery.FinalizeVarRecArray(var Arr: TFieldsArray);
var
I: Integer;
begin
for I := Low(Arr) to High(Arr) do
Dispose(Arr[I].VVariant);
Arr := nil;
end;