From f84a4c6a9e61732793c8995a3b69efaf74be4a27 Mon Sep 17 00:00:00 2001 From: david Date: Tue, 31 Mar 2009 16:45:29 +0000 Subject: [PATCH] Detectada fuga de memoria porque se quedaban objetos sin liberar git-svn-id: https://192.168.0.254/svn/Proyectos.Acana_FactuGES2/trunk@412 f4e31baf-9722-1c47-927c-6f952f962d4b --- .../Usuarios/Data/uUCROConn.pas | 49 +++++++++++++++++-- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/Source/ApplicationBase/Usuarios/Data/uUCROConn.pas b/Source/ApplicationBase/Usuarios/Data/uUCROConn.pas index 2561f3c9..f4016b9e 100644 --- a/Source/ApplicationBase/Usuarios/Data/uUCROConn.pas +++ b/Source/ApplicationBase/Usuarios/Data/uUCROConn.pas @@ -23,7 +23,7 @@ uses DBClient, SysUtils, uRORemoteService, uDADataStreamer, uROBinMessage, uROWinInetHttpChannel, - uDABin2DataStreamer, uDARemoteDataAdapter, UCDataConnector; + uDABin2DataStreamer, uDARemoteDataAdapter, UCDataConnector, uROClient; type TUCROConn = class(TUCDataConnector) @@ -59,10 +59,29 @@ implementation uses Forms, Dialogs, FactuGES_Intf, uROTypes, uDAClasses, uDADataTable, - uDACDSDataTable; + uDACDSDataTable, uROEncryption; { 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; @@ -120,6 +139,7 @@ begin begin FRemoteService.Message := FMessage; FRemoteService.Channel := FChannel; + with FDataAdapter do begin RemoteService := FRemoteService; @@ -184,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); @@ -191,7 +227,7 @@ begin if AStream <> nil then try - ADataTable := TDACDSDataTable.Create(Application); + ADataTable := TDACDSDataTable.Create(NIL); // Generar un nombre aleatorio Randomize; @@ -209,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); @@ -221,3 +259,4 @@ end; end. +