2014-11-05 105 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;