Ver Mensaje Individual
  #9  
Antiguo 06-06-2019
javicho_villa javicho_villa is offline
Miembro
 
Registrado: feb 2005
Ubicación: Lima - Perú
Posts: 99
Reputación: 20
javicho_villa Va por buen camino
Smile

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; //TPresupuesto.Create;
    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;

//--- La clase cliente

  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;

{ TCliente }

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;

//-- La Clase TParametro - que es la que tiene TMemoryStream --//

  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;

{ TParametro }

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.
__________________
Javier Villa Sánchez
jvilla@andreaproducciones.com
Responder Con Cita