[delphi-br] [ RECORD LIMPAR MEMORIA]

2009-07-06 Por tôpico marciosulfabril
Pessoal estou utilizando a extrutura a abaixo , class com varios records,
e nao sei como fazer para limpar a memoria corretamente apos utilizar.

Record precisa limpar a memoria?

 Tnota = class(TObject)
  public
   codEmpresa   :  String;
   emitente :  Tipo_dados_emitente;
   destinatario :  Tipo_dados_destinatario;
   Produto  :  array of Tipo_dados_produto ;
 end;

Tipo_dados_produto = record
nItem   : String;
infAdProd: String;
cProd   : String;
cEAN: String;
ICMS: Tipo_ICMS;
PIS : Tipo_dados_ProdutoPISaliquota;
end ;

 Tipo_ICMS = record
CST00: Tipo_dados_CST00 ;
CST10: Tipo_dados_CST10 ;
CST20: Tipo_dados_CST20 ;
CST30: Tipo_dados_CST30 ;
CST40: Tipo_dados_CST40 ;
CST51: Tipo_dados_CST51 ;
CST60: Tipo_dados_CST60 ;
CST70: Tipo_dados_CST70 ;
CST90: Tipo_dados_CST90 ;
   end;


Tipo_dados_CST20  = Record
Orig : String;
CST : String;
modBC : String;
pRedBC : String;
vBC : String;
pICMS : String;
vICMS : String;
end;

//...


   Para utilizar u faco desta maneira 

var 
 nota : Tnota;

begin

nota := nil;
nota:= Tnota.Create;

nota.codEmpresa  := vetorLinha[1];
...
...
   inc(contprod);
   SetLength(nota.Produto,contprod);
   nota.Produto[contprod-1].nItem   := vetorLinha[1] ;
   nota.Produto[contprod-1].infAdProd:= vetorLinha[2] ;
   CONTINUE;;
..
...
  e para limpar faco assim
   nota.free;
   nota:= nil;

Esta correto desta maneira ??? 
esvazia toda a memororia ??


Socorro !!

Att. MArcio - Blumenau







Re: [delphi-br] [ RECORD LIMPAR MEMORIA]

2009-07-06 Por tôpico José Mário Silva Guedes
Eu tenho dúvidas quanto a isto também, e por desencargo, eu rescrevo o
Destructor da classe, para anular os arrays:
nota.Produto := nil;


[As partes desta mensagem que não continham texto foram removidas]



Re: [delphi-br] [ RECORD LIMPAR MEMORIA]

2009-07-06 Por tôpico EmbarcaDelphi
Quem entende muito disso é o João Morais, mas não apareceu mais na lista :)


José Mário Silva Guedes escreveu:


 Eu tenho dúvidas quanto a isto também, e por desencargo, eu rescrevo o
 Destructor da classe, para anular os arrays:
 nota.Produto := nil;

 .

 



Re: [delphi-br] [ RECORD LIMPAR MEMORIA]

2009-07-06 Por tôpico José Edvandro Máximo
Dá uma olhada nesse link:
http://www.planetadelphi.com.br/dica/4652/usando-tlist-e-record-como-array

2009/7/6 EmbarcaDelphi embarcadel...@yahoo.com.br



 Quem entende muito disso é o João Morais, mas não apareceu mais na lista :)

 José Mário Silva Guedes escreveu:
 
 
  Eu tenho dúvidas quanto a isto também, e por desencargo, eu rescrevo o
  Destructor da classe, para anular os arrays:
  nota.Produto := nil;
 
  .
 
 

  



[As partes desta mensagem que não continham texto foram removidas]



Re: [delphi-br] [ RECORD LIMPAR MEMORIA]

2009-07-06 Por tôpico Marcio
Aqui esta usando ponteiros 

nao e´ bem isso.






At 13:18 6/7/2009 -0300, you wrote:


Dá uma olhada nesse link:
http://www.planetadelphi.com.br/dica/4652/usando-tlist-e-record-como-arrayhttp://www.planetadelphi.com.br/dica/4652/usando-tlist-e-record-como-array

2009/7/6 EmbarcaDelphi 
mailto:embarcadelphi%40yahoo.com.brembarcadel...@yahoo.com.br

 
 
  Quem entende muito disso é o João Morais, mas não apareceu mais na lista :)
 
  José Mário Silva Guedes escreveu:
  
  
   Eu tenho dúvidas quanto a isto também, e por desencargo, eu rescrevo o
   Destructor da classe, para anular os arrays:
   nota.Produto := nil;
  
   .
  
  
 
 
 

[As partes desta mensagem que não continham texto foram removidas]




[As partes desta mensagem que não continham texto foram removidas]



Re: [delphi-br] [ RECORD LIMPAR MEMORIA]

2009-07-06 Por tôpico Leandro
a classe esta sendo destruida, os registros sao destruidos quando vc destroi
o form q o tem declarado..
acho q eh isso


2009/7/6 Marcio mar...@sulfabril.com.br



 Aqui esta usando ponteiros 

 nao e´ bem isso.


 At 13:18 6/7/2009 -0300, you wrote:

 Dá uma olhada nesse link:
 
 http://www.planetadelphi.com.br/dica/4652/usando-tlist-e-record-como-array
 
 http://www.planetadelphi.com.br/dica/4652/usando-tlist-e-record-como-array
 
 2009/7/6 EmbarcaDelphi
 mailto:embarcadelphi%40yahoo.com.br embarcadelphi%2540yahoo.com.br
 embarcadel...@yahoo.com.br embarcadelphi%40yahoo.com.br
 
  
  
   Quem entende muito disso é o João Morais, mas não apareceu mais na
 lista :)
  
   José Mário Silva Guedes escreveu:
   
   
Eu tenho dúvidas quanto a isto também, e por desencargo, eu rescrevo
 o
Destructor da classe, para anular os arrays:
nota.Produto := nil;
   
.
   
   
  
  
  
 
 [As partes desta mensagem que não continham texto foram removidas]
 
 

 [As partes desta mensagem que não continham texto foram removidas]

  




-- 
Leandro, MuTukA


[As partes desta mensagem que não continham texto foram removidas]



Re: [delphi-br] [ RECORD LIMPAR MEMORIA]

2009-07-06 Por tôpico Ricardo César Cardoso
Vc pode chamar o método Free e depois Nil ou tambem usar a procedure 
FreeAndNil( objeto ).

[]'s
Ricardo.

1) Evite escrever suas mensagens usando somente LETRAS MAIÚSCULAS.

2) Revise o texto de sua mensagem. Uma mensagem bem escrita é melhor 
compreendida.

3) Vamos ajudar o Grupo e o Yahoo! Apague o conteúdo irrelevante!

--- Em seg, 6/7/09, José Mário Silva Guedes jmariogue...@gmail.com escreveu:

De: José Mário Silva Guedes jmariogue...@gmail.com
Assunto: Re: [delphi-br] [ RECORD LIMPAR MEMORIA]
Para: delphi-br@yahoogrupos.com.br
Data: Segunda-feira, 6 de Julho de 2009, 10:24
















  
  Eu tenho dúvidas quanto a isto também, e por desencargo, eu rescrevo o

Destructor da classe, para anular os arrays:

nota.Produto := nil;



[As partes desta mensagem que não continham texto foram removidas]




 

  




 

















  

Veja quais são os assuntos do momento no Yahoo! +Buscados
http://br.maisbuscados.yahoo.com

[As partes desta mensagem que não continham texto foram removidas]



Re: [delphi-br] [ RECORD LIMPAR MEMORIA]

2009-07-06 Por tôpico Joao Morais
2009/7/6 marciosulfabril mar...@sulfabril.com.br:
 Pessoal estou utilizando a extrutura a abaixo , class com varios records,
 e nao sei como fazer para limpar a memoria corretamente apos utilizar.

 Record precisa limpar a memoria?

Não. Record é uma estrutura estática que o compilador aloca e o
compilador desaloca. Você só precisa desalocar memória que você aloca
manualmente, com exceção de strings e arrays dinâmicos, cuja limpeza
também é feita pelo compilador. Detalhes abaixo.


  Tnota = class(TObject)
  public
   codEmpresa   :  String;
   emitente     :  Tipo_dados_emitente;
   destinatario :  Tipo_dados_destinatario;
   Produto      :  array of Tipo_dados_produto ;
  end;

 Tipo_dados_produto = record
    nItem   : String;
    infAdProd: String;
    cProd   : String;
    cEAN    : String;
    ICMS    : Tipo_ICMS;
    PIS     : Tipo_dados_ProdutoPISaliquota;
 end ;

  Tipo_ICMS = record
    CST00: Tipo_dados_CST00 ;
    CST10: Tipo_dados_CST10 ;
    CST20: Tipo_dados_CST20 ;
    CST30: Tipo_dados_CST30 ;
    CST40: Tipo_dados_CST40 ;
    CST51: Tipo_dados_CST51 ;
    CST60: Tipo_dados_CST60 ;
    CST70: Tipo_dados_CST70 ;
    CST90: Tipo_dados_CST90 ;
   end;


 Tipo_dados_CST20  = Record
    Orig : String;
    CST : String;
    modBC : String;
    pRedBC : String;
    vBC : String;
    pICMS : String;
    vICMS : String;
 end;

 //...


   Para utilizar u faco desta maneira

 var
  nota : Tnota;

 begin

    nota := nil;

Você não precisa disso acima, e o compilador certamente emite um hint
nesse código.


    nota:= Tnota.Create;

    nota.codEmpresa  := vetorLinha[1];
 ...
 ...
   inc(contprod);
   SetLength(nota.Produto,contprod);

Array dinâmico acima. Os itens desse array será removido pelo
compilador assim que ele sair de contexto. Agora atenção, se algum
item desse array apontar para algum objeto, você tem que remover o
objeto manualmente. Se apontar para uma string ou outro array
dinâmico, você não precisa se preocupar.


   nota.Produto[contprod-1].nItem   := vetorLinha[1] ;
   nota.Produto[contprod-1].infAdProd    := vetorLinha[2] ;
   CONTINUE;;
 ..
 ...
  e para limpar faco assim
   nota.free;
   nota:= nil;

FreeAndNil(nota) é mais seguro que as duas linhas acima.



 Esta correto desta maneira ???
 esvazia toda a memororia ??

Use FastMM, ele é seu amigo.


Joao Morais


Re: [delphi-br] [ RECORD LIMPAR MEMORIA]

2009-07-06 Por tôpico Joao Morais
2009/7/6 José Mário Silva Guedes jmariogue...@gmail.com:
 Eu tenho dúvidas quanto a isto também, e por desencargo, eu rescrevo o
 Destructor da classe, para anular os arrays:
 nota.Produto := nil;

Não precisa. Quando há alguma estrutura em que esse apontamento faz
diferença (array dinâmico, interface e ansi string), o próprio
destrutor da classe associa nil ao ponteiro por você.

Joao Morais


Re: [delphi-br] [ RECORD LIMPAR MEMORIA]

2009-07-06 Por tôpico Joao Morais
On Mon, Jul 6, 2009 at 11:13 AM,
EmbarcaDelphiembarcadel...@yahoo.com.br wrote:
 Quem entende muito disso é o João Morais, mas não apareceu mais na lista :)

Não sou eu quem não apareci mais na lista, é a lista que não recebe
mais mensagens sobre a linguagem pascal, object pascal ou delphi.

Joao Morais


Re: [delphi-br] [ RECORD LIMPAR MEMORIA]

2009-07-06 Por tôpico Silvio Clecio
Em 6/7/2009 20:20, Joao Morais escreveu:
 2009/7/6 José Mário Silva Guedes jmariogue...@gmail.com
 mailto:jmarioguedes%40gmail.com:
   Eu tenho dúvidas quanto a isto também, e por desencargo, eu rescrevo o
   Destructor da classe, para anular os arrays:
   nota.Produto := nil;

 Não precisa. Quando há alguma estrutura em que esse apontamento faz
 diferença (array dinâmico, interface e ansi string), o próprio
 destrutor da classe associa nil ao ponteiro por você.

 Joao Morais

Aproveitando o gancho nessa thread ...

Supondo que tenho dois tipos,  TPessoaRecord e TPessoaClass, eu posso 
usar com um record da seguinte maneira, bem simples ...:

---
var
..VPessoaRecord: TPessoaRecord;
begin
..VPessoaRecord.Nome := 'Fulano de tal';
..ShowMessage(VPessoaRecord.Nome);
end;
---

... não usei create/free, agora com uma classe ...

---
var
..VPessoaClass: TPessoaClass;
begin
..VPessoaClass := TPessoaClass.Create;
..try
VPessoaClass.Nome := 'Fulano de tal';
ShowMessage(VPessoaClass.Nome);
..finally
VPessoaClass.Free;
..end;
end;
---

... com class eu posso usar inúmeros recursos do object pascal (herança, 
abstração, polimorfismo ...), então o class para TPessoa seria o mais 
indicado, já que tal objeto poderia conter várias propriedades, mas tem 
alguns casos que o objeto é bem simples, ex: TEndereco, que teria poucos 
campos (Rua, Numero, UF...), então seria correto eu usar o record para 
esse caso?
-- 
[]'s, Silvio Clécio
---
Linux User: #481900
Gmail, GTalk: silviop...@gmail.com
E-mail, Y! Messenger: silviop...@yahoo.com.br
BlogSite: http://silvioprog.blogspot.com/
BlogSpot: http://silvioclecio.blogspot.com/
VirtualDriver: http://silvioprog.4shared.com/
°oO| Seja livre, use Linux! |Oo°


Re: [delphi-br] [ RECORD LIMPAR MEMORIA]

2009-07-06 Por tôpico Silvio Clecio
Em 6/7/2009 09:01, marciosulfabril escreveu:
 Pessoal estou utilizando a extrutura a abaixo , class com varios records,
 e nao sei como fazer para limpar a memoria corretamente apos utilizar.

Pitacos...

Caso o teu Delphi não tenha o FastMM nativo 
(ReportMemoryLeaksOnShutdown) você pode utilizar um ótimo gerenciador de 
memória:

Link oficial - [http://sourceforge.net/projects/fastmm/].
Link com um demo em pt-br - 
[http://sites.google.com/site/silvioprogbs/downloads/FastMM4.zip?attredirects=0].

ps. Veja as dicas dos brothers e também visite esse blog: 
[http://blog.joaomorais.com.br/], nele tem *muita* informação sobre 
Object Pascal, em especial a postagem: Objetos com contagem de referência.

Boa sorte Marcio.
-- 
[]'s, Silvio Clécio
---
Linux User: #481900
Gmail, GTalk: silviop...@gmail.com
E-mail, Y! Messenger: silviop...@yahoo.com.br
BlogSite: http://silvioprog.blogspot.com/
BlogSpot: http://silvioclecio.blogspot.com/
VirtualDriver: http://silvioprog.4shared.com/
°oO| Seja livre, use Linux! |Oo°


Re: [delphi-br] [ RECORD LIMPAR MEMORIA]

2009-07-06 Por tôpico Joao Morais
2009/7/6 Silvio Clecio silviop...@yahoo.com.br:
 Em 6/7/2009 09:01, marciosulfabril escreveu:
 Pessoal estou utilizando a extrutura a abaixo , class com varios records,
 e nao sei como fazer para limpar a memoria corretamente apos utilizar.

 Pitacos...

 Caso o teu Delphi não tenha o FastMM nativo
 (ReportMemoryLeaksOnShutdown) você pode utilizar um ótimo gerenciador de
 memória:

 Link oficial - [http://sourceforge.net/projects/fastmm/].
 Link com um demo em pt-br -
 [http://sites.google.com/site/silvioprogbs/downloads/FastMM4.zip?attredirects=0].

Pra quem não sabe, o gerenciador de memória do D2006 em diante é o
próprio FastMM, que foi empacotado pela então Borland.

Joao Morais