Buenas con todos,
Quiero comentarles que de a pocos he ido depurando mi código y he logrado disminuir las perdidas de memoria, he detectado que cuando invoco este procedimiento:
me genera una perdida de memoria, que hasta ahora no puedo saber porque: les paso el procedimiento y el mensaje y el código de las clases involucradas también
esta clase es como una capa donde me conecto con la base de datos: SQL
Código Delphi
[-]
function TCx_Presupuesto.GetPresupuesto(Id: integer): TPresupuesto;
var MiQuery: TAdoQuery;
iPresupuesto:TPresupuesto;
Cad:String;
ConCli:TCx_Cliente;
begin
try
iPresupuesto := TPresupuesto.Create;
MiQuery := TAdoQuery.Create(nil);
MiQuery.SQL.Clear;
MiQuery.Connection := Conexion.Dm.PrincipalADOConnection;
MiQuery.SQL.Clear;
Cad := 'select * from Presupuesto where Id_Presupuesto='+IntToStr(Id) ;
MiQuery.SQL.Add(Cad);
MiQuery.Active := true;
if MiQuery.RecordCount>0 then
begin
MiQuery.First;
iPresupuesto.iId_Presupuesto := MiQuery.FieldByName('Id_Presupuesto').AsInteger;
iPresupuesto.iId_Cliente := MiQuery.FieldByName('Id_Cliente').AsInteger;
iPresupuesto.iFEmision := VarToDateTime(MiQuery.FieldByName('FEmision').AsVariant);
if iPresupuesto.iFfin <> 0.0 then
iPresupuesto.iFfin := VarToDateTime(MiQuery.FieldByName('Ffin').AsVariant);
iPresupuesto.iCerrado := MiQuery.FieldByName('Cerrado').AsBoolean;
iPresupuesto.iObservaciones := MiQuery.FieldByName('Observaciones').AsString;
iPresupuesto.iId_Usuario := MiQuery.FieldByName('Id_Usuario').AsInteger;
iPresupuesto.iFRegistro := VarToDateTime(MiQuery.FieldByName('FRegistro').AsVariant);
try
ConCli := TCx_Cliente.Create;
iPresupuesto.iCliente := ConCli.GetCliente(iPresupuesto.iId_Cliente);
finally
FreeAndNil(ConCli);
end;
end;
finally
FreeAndNil(MiQuery);
result := iPresupuesto;
iPresupuesto := nil; FreeAndNil(iPresupuesto);
end;
end;
mensaje:
21 - 28 bytes: TMemoryStream x 3
61 - 68 bytes: TParametro x 3, TPresupuesto x 1
117 - 124 bytes: TCliente x 2
Código Delphi
[-]
TPresupuesto = class(TObject)
Private
Id_Presupuesto:integer;
Id_Cliente:integer;
FEmision:TDate;
Ffin:TDate;
Cerrado:Boolean;
Observaciones:String;
Id_Usuario:integer;
FRegistro:TDate;
Cliente:TCliente;
Eliminado:Boolean;
Protected
Public
Constructor Create;
Destructor Destroy; override;
procedure Clear;
property iId_Presupuesto:Integer read Id_Presupuesto write Id_Presupuesto;
property iId_Cliente:integer read Id_Cliente write Id_Cliente;
property iFEmision:TDate read FEmision write FEmision;
property iFfin:TDate read Ffin write Ffin;
property iCerrado:Boolean read Cerrado write Cerrado;
property iObservaciones:String read Observaciones write Observaciones;
property iId_Usuario:integer read Id_Usuario write Id_Usuario;
property iFRegistro:TDate read FRegistro write FRegistro;
property iCliente:TCliente read Cliente write Cliente;
property iEliminado:Boolean read Eliminado write Eliminado;
end;
procedure TPresupuesto.Clear;
begin
Id_Presupuesto := 0;
Id_Cliente := 0;
FEmision := 0.0;
Ffin := 0.0;
Cerrado := false;
Observaciones := '';
Id_Usuario := 0;
FRegistro := 0.0;
Cliente := TCliente.Create;
Eliminado := false;
end;
constructor TPresupuesto.Create;
begin
inherited;
Clear;
end;
destructor TPresupuesto.Destroy;
begin
FreeAndNil(Cliente);
inherited;
end;
TCliente = class(TObject)
Private
Id_Cliente:integer;
Id_ClienteBrocker:integer;
Brocker:boolean;
RazonSocial:String;
.......
DireccionAnexo4:String;
Comentarios:String;
Protected
Public
Constructor Create;
Destructor Destroy; override;
procedure Clear;
property iId_Cliente:Integer read Id_Cliente write Id_Cliente;
property iId_ClienteBrocker:integer read Id_ClienteBrocker write Id_ClienteBrocker;
property iBrocker:boolean read Brocker write Brocker;
....
property iDireccionAnexo3:String read DireccionAnexo3 write DireccionAnexo3;
property iDireccionAnexo4:String read DireccionAnexo4 write DireccionAnexo4;
property iComentarios:String read Comentarios write Comentarios;
property iTipoDocumento:TParametro read TipoDocumento write TipoDocumento;
end;
procedure TCliente.Clear;
begin
Id_Cliente := 0;
Id_ClienteBrocker := 0;
Brocker := false;
......
Comentarios := '';
TipoDocumento := TParametro.Create;
end;
constructor TCliente.Create;
begin
inherited;
Clear;
end;
destructor TCliente.Destroy;
begin
FreeAndNil(TipoDocumento);
inherited;
end;
TParametro = class(TObject)
Private
Id_Parametro:integer;
Id_TipoParametro:integer;
Nombre:String;
NombreCorto:String;
Abreviatura:String;
ValorInt:integer;
ValorReal:real;
ValorFecha:TDate;
ValorMemo:wideString;
ValorImagen:TMemoryStream;
edita:boolean;
elimina:boolean;
NombreTipoParametro:String;
Public
property iId_Parametro:integer read Id_Parametro write Id_Parametro;
property iId_TipoParametro:integer read Id_TipoParametro write Id_TipoParametro;
property iNombre:String read Nombre write Nombre;
property iNombreCorto:String read NombreCorto write NombreCorto;
property iAbreviatura:String read Abreviatura write Abreviatura;
property iValorInt:integer read ValorInt write ValorInt;
property iValorReal:Real read ValorReal write ValorReal;
property iValorFecha:TDate read ValorFecha write ValorFecha;
property iValorMemo:wideString read ValorMemo write ValorMemo;
property iValorImagen:TMemoryStream read ValorImagen write ValorImagen;
property iedita:boolean read edita write edita;
property ielimina:boolean read elimina write elimina;
property iNombreTipoParametro:String read NombreTipoParametro write NombreTipoParametro;
Constructor Create;
Destructor Destroy; override;
procedure Clear;
end;
procedure TParametro.Clear;
begin
Id_Parametro := 0;
Id_TipoParametro := 0;
Nombre := '';
NombreCorto := '';
Abreviatura := '';
ValorInt := 0;
ValorReal := 0;
ValorFecha := 0.0;
ValorMemo := '';
ValorImagen := TMemoryStream.Create;
edita := true;
elimina := true;
ValorImagen.Clear;
end;
Constructor TParametro.Create;
begin
inherited;
Clear;
end;
destructor TParametro.Destroy;
begin
FreeAndNil(ValorImagen);
inherited;
end;
He revisado varias veces pero creo que se me esta pasando un avión por los ojos y no me estoy dando cuenta, por favor amigos ayúdenme que ya llevo varios días en esto y no puedo dar con la solución final.
Muchas gracias de antemano.