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
This commit is contained in:
David Arranz 2009-03-31 16:45:29 +00:00
parent 62b337a3a6
commit f84a4c6a9e

View File

@ -23,7 +23,7 @@ uses
DBClient, DBClient,
SysUtils, SysUtils,
uRORemoteService, uDADataStreamer, uROBinMessage, uROWinInetHttpChannel, uRORemoteService, uDADataStreamer, uROBinMessage, uROWinInetHttpChannel,
uDABin2DataStreamer, uDARemoteDataAdapter, UCDataConnector; uDABin2DataStreamer, uDARemoteDataAdapter, UCDataConnector, uROClient;
type type
TUCROConn = class(TUCDataConnector) TUCROConn = class(TUCDataConnector)
@ -59,10 +59,29 @@ implementation
uses uses
Forms, Dialogs, FactuGES_Intf, uROTypes, uDAClasses, uDADataTable, Forms, Dialogs, FactuGES_Intf, uROTypes, uDAClasses, uDADataTable,
uDACDSDataTable; uDACDSDataTable, uROEncryption;
{ TUCROConn } { 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); constructor TUCROConn.Create(AOwner: TComponent);
begin begin
inherited; inherited;
@ -120,6 +139,7 @@ begin
begin begin
FRemoteService.Message := FMessage; FRemoteService.Message := FMessage;
FRemoteService.Channel := FChannel; FRemoteService.Channel := FChannel;
with FDataAdapter do with FDataAdapter do
begin begin
RemoteService := FRemoteService; RemoteService := FRemoteService;
@ -184,6 +204,22 @@ var
AStream: TMemoryStream; AStream: TMemoryStream;
ADataStreamer: TDABin2DataStreamer; ADataStreamer: TDABin2DataStreamer;
ADataTable: TDACDSDataTable; 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 begin
Result := NIL; Result := NIL;
ADataStreamer := TDABin2DataStreamer.Create(NIL); ADataStreamer := TDABin2DataStreamer.Create(NIL);
@ -191,7 +227,7 @@ begin
if AStream <> nil then if AStream <> nil then
try try
ADataTable := TDACDSDataTable.Create(Application); ADataTable := TDACDSDataTable.Create(NIL);
// Generar un nombre aleatorio // Generar un nombre aleatorio
Randomize; Randomize;
@ -209,9 +245,11 @@ begin
ADataTable.Last; ADataTable.Last;
ADataTable.First; ADataTable.First;
Result := ADataTable.Dataset; ADataSet := TClientDataset.Create(NIL);
_CopiarDataSet;
Result := ADataSet;
finally finally
//FreeAndNIL(ADataTable); <-- No liberar, lo hace Application FreeAndNIL(ADataTable);
end; end;
finally finally
FreeAndNIL(AStream); FreeAndNIL(AStream);
@ -221,3 +259,4 @@ end;
end. end.