From 56dfc3b4ed6bf5f386b6566458bd65e4330239b4 Mon Sep 17 00:00:00 2001 From: david Date: Thu, 5 Mar 2009 11:57:48 +0000 Subject: [PATCH] Detectada fuga de memoria porque se quedaban objetos sin liberar git-svn-id: https://192.168.0.254/svn/Proyectos.Tecsitel_FactuGES2/trunk@919 0c75b7a4-871f-7646-8a2f-f78d34cc349f --- .../Usuarios/Data/uUCROConn.pas | 43 +++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/Source/ApplicationBase/Usuarios/Data/uUCROConn.pas b/Source/ApplicationBase/Usuarios/Data/uUCROConn.pas index ce921b21..34df3fdf 100644 --- a/Source/ApplicationBase/Usuarios/Data/uUCROConn.pas +++ b/Source/ApplicationBase/Usuarios/Data/uUCROConn.pas @@ -63,6 +63,25 @@ uses { TUCROConn } +procedure CopyRecord(Source, Destination: TDataSet); +var Ind:longint; + SField, DField: TField; +begin + for Ind := 0 to Source.FieldCount - 1 do + begin + SField := Source.Fields[ Ind ]; + DField := Destination.FindField(SField.FieldName); + if (DField <> nil) and (DField.FieldKind = fkData) and + not DField.ReadOnly then + if (SField.DataType = ftString) or + (SField.DataType <> DField.DataType) then + DField.AsString := SField.AsString + else + DField.Assign( SField ) + end; +end; + + constructor TUCROConn.Create(AOwner: TComponent); begin inherited; @@ -185,6 +204,22 @@ var AStream: TMemoryStream; ADataStreamer: TDABin2DataStreamer; ADataTable: TDACDSDataTable; + ADataSet : TClientDataset; + + procedure _CopiarDataSet; + begin + ADataSet.FieldDefs.Assign(ADataTable.DataSet.FieldDefs); + ADataSet.CreateDataSet; + + ADataSet.Open; + while not ADataTable.EOF do + begin + ADataSet.Append; + CopyRecord(ADataTable.DataSet, ADataSet); + ADataSet.Post; + ADataTable.Next; + end; + end; begin Result := NIL; ADataStreamer := TDABin2DataStreamer.Create(NIL); @@ -192,7 +227,7 @@ begin if AStream <> nil then try - ADataTable := TDACDSDataTable.Create(Application); + ADataTable := TDACDSDataTable.Create(NIL); // Generar un nombre aleatorio Randomize; @@ -210,9 +245,11 @@ begin ADataTable.Last; ADataTable.First; - Result := ADataTable.Dataset; + ADataSet := TClientDataset.Create(NIL); + _CopiarDataSet; + Result := ADataSet; finally - //FreeAndNIL(ADataTable); <-- No liberar, lo hace Application + FreeAndNIL(ADataTable); end; finally FreeAndNIL(AStream);