2014-11-05 102 views
0

我试图dublicate记录在DataSet中。TvarRec并释放在delphi中的内存

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); 

我必须释放内存太大,或者它德尔福?

回答

2

您必须释放它。 TVarRec是一种仅用于参数的类型,并且通常由运行时管理,但只有在运行时分配并填充(形式为array of const)时才由管理。否则,由您来管理它们。

更多在这里,我写了一篇文章(最后有代码来管理TVarRecs :) Open array parameters and array of const

0

Rudy,感谢您的联系。我已阅读并做过

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;