Anderson.OL Posted November 13, 2007 Report Share Posted November 13, 2007 Pessoal, tenho por habito escreve nas minhas classes assim o metodo end: METHOD End() CLASS TPagamento **************************************************************************** local Result := nil Self := nil return Result /*------------------------------------------------------------------------*/ id=brown>id=code>id=code>Mas nos meus teste isto nao destroi o objeto!! Alert(ValType(oPagto)) Alert(oPagto:cIdCliente)id=brown>id=code>id=code>Qdo executo o codigo acima, o primeiro alert me exibe a letra "O" e o segundo o valor armazenado na propriedade.. Como faço para destruir o objeto e atribui nil para a variavel:??? Quote Link to comment Share on other sites More sharing options...
Anderson.OL Posted November 13, 2007 Author Report Share Posted November 13, 2007 Pessoal, tenho por habito escreve nas minhas classes assim o metodo end: METHOD End() CLASS TPagamento **************************************************************************** local Result := nil Self := nil return Result /*------------------------------------------------------------------------*/ id=brown>id=code>id=code>Mas nos meus teste isto nao destroi o objeto!! Alert(ValType(oPagto)) Alert(oPagto:cIdCliente)id=brown>id=code>id=code>Qdo executo o codigo acima, o primeiro alert me exibe a letra "O" e o segundo o valor armazenado na propriedade.. Como faço para destruir o objeto e atribui nil para a variavel:??? Quote Link to comment Share on other sites More sharing options...
kapiaba Posted November 13, 2007 Report Share Posted November 13, 2007 //-> Tente: DeleteObject( ::MeuObjeto ) ::MeuObjeto := Nil id=code>id=code>João Santos - São Paulo. kmt_karinha@pop.com.br kapiaba@brfree.com.br Skype: fw_kapiaba FWH 2.7 - xHARBOUR 0.99.61 - WorkShop.Exe Quote Link to comment Share on other sites More sharing options...
Anderson.OL Posted November 13, 2007 Author Report Share Posted November 13, 2007 Kapiaba, vc sugere usar no lugar do método ::End() usar: oPagto := nilid=code>id=code> ??Nos meus testes sua dica funcionou mas estou inseguro pois com este procedimento todas as propriedades serão devidamente liberadas da memória?!?! Quote Link to comment Share on other sites More sharing options...
Anderson.OL Posted November 13, 2007 Author Report Share Posted November 13, 2007 Soh pra constar... o motivo da minha duvida eh o seguinte: -> se usar somente o DeleteObject() ainda consigo usar os metodos -> o comando oObj := nil não muda somente o ponteiro?! Sendo assim acredito que todos os atributos continuem na memoria!! Preciso disto urgente kapiaba, mostre agora todo seu conhecimento!! Abraços Quote Link to comment Share on other sites More sharing options...
vailtom Posted November 13, 2007 Report Share Posted November 13, 2007 Se eu não estiver errado (e desculpem minha ignorancia se estiver) mas lá vai: Qdo vc cria um objeto ele se comporta na memória como um ARRAY() e é isto o que ele é internamente. Sendo assim, ele só será destruido efetivamente qdo receber um NIL ou quando chegar o final da procedure/function que instanciou o objeto. E mesmo assim, a afirmativa só será valida QUANDO não houver mais nenhuma referência à aquele objeto que foi instanciado. Exemplo: local a,b a := TButton():New() b := child() b:End() // executa o metodo mas nao mata o objeto!!! /* * O comando abaixo não deleta o objeto. Ele chama a função DeleteObject() do * FWH que é um wrapper da função DeleteObject() da API do Windows e ela só * deve ser usada com alguns tipos de objetos, como explica o proprio manual * do FWH: * * This function deletes a GDI object from memory, freeing all system storage * associated (objects include pens, brushes, fonts, bitmaps, regions, and * palettes). * */ DeleteObject© /* * O comando abaixo elimiva o objeto da memoria, setando a variavel para NIL. */ a := nil /* * O return abaixo mata definitivamente a variavel B eliminando-a da memoria */ return function child() local c,d c := TButton():new() d := TButton():new() return d /* Aqui neste RETURN ACIMA o objeto C irá ser destruido mas D não pois ainda há uma referência dele (usava pelo comando RETURN) */id=code>id=code>Creio eu que o Linares tomou como padrão usar o END() nas classes do FW usando-o como metodo "destruidor" da classe apenas por conveniência, visto que um metodo DESTRUCTOR pode realmente ser utilizado para interceptar quando o objeto for definitivamente eliminado da memoria (isto é permitido em xHB, mas não em HB) e ele pode ter qualquer nome (não necessariamente END()) Quote Link to comment Share on other sites More sharing options...
kapiaba Posted November 13, 2007 Report Share Posted November 13, 2007 citação:Kapiaba, vc sugere usar no lugar do método ::End() usar: oPagto := nilid=code>id=code> ??Nos meus testes sua dica funcionou mas estou inseguro pois com este procedimento todas as propriedades serão devidamente liberadas da memória?!?! id=quote>id=quote>Do meu ponto de vista, melhor usar o ::End() e na saida do ACTIVATE DIALOG da sua FUNCAO, se tiver FUNCAO, use o RELEASE ALL ou RELEASEDC(oBjeto). João Santos - São Paulo. kmt_karinha@pop.com.br kapiaba@brfree.com.br Skype: fw_kapiaba FWH 2.7 - xHARBOUR 0.99.61 - WorkShop.Exe Quote Link to comment Share on other sites More sharing options...
Yury Posted November 13, 2007 Report Share Posted November 13, 2007 olá Anderson, vou dar aqui minha opnião sobre o assunto: eu utilizo sempre a variável declarada como local para "matar" o objeto da classe, e não propriamente o método End(), muito em razão do que foi escrito acima pelo Vailton... oq eu quero dizer é que não é errado utilizar o End(), mas que somente ele não elimina da memória se você utilizar variáveis publicas/privates para objetos, creio mesmo após fazer End() no objeto, ficará na memória com todos os atributos da classe (mesmo que sem contéudo nas propriedades)... somente "mata" se fizer release... veja o teste: #include 'FiveWin.ch' //------------------------------------------------------------------- Function Teste1() private ilf:=chr(13)+chr(10) private oDlg define dialog oDlg from 01,01 to 10,20 title "Teste de Objeto" @ 01,01 button 'Button' of oDlg size 30,12 action (oDlg:End()) activate dialog oDlg centered // ao sair do dialogo já fez End() no objeto, certo ? msginfo( oDlg:ClassName(), "ainda aqui" ) // então como ainda está vinculada a uma classe ? Teste2() return //------------------------------------------------------------------- //------------------------------------------------------------------- Function Teste2() // aqui ainda vinculada msgalert( oDlg:ClassName(), "ainda aqui" ) return //------------------------------------------------------------------- id=code>id=code>espero q ajude, um abraço V ENCONTRO DE FW - NOVEMBRO/2007 - Eu vou !!! E você ? Yury Marcelino Al Viman Sistemas vimansca@vimansca.com.br yury030575@yahoo.com.br (msn) skype: yury.marcelino.al Leme / SP FW 2.6 / [x]Harbour 99.50 / WS / xDev 0.65 / @say Editado por - yury on 13/11/2007 17:50:50 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted November 13, 2007 Report Share Posted November 13, 2007 Function Teste2() // aqui ainda vinculadamsgalert( oDlg:ClassName(), "ainda aqui" ) return Desculpe Yuri, posso até está errado, mas o Nome da Classe, é como o nome de cualcuer função que é enxergada por todo sistema, ou seja o nome da classe, não morre. Quem morre, é o Objeto ODLG. João Santos - São Paulo. kmt_karinha@pop.com.br kapiaba@brfree.com.br Skype: fw_kapiaba FWH 2.7 - xHARBOUR 0.99.61 - WorkShop.Exe Quote Link to comment Share on other sites More sharing options...
Yury Posted November 13, 2007 Report Share Posted November 13, 2007 citação:Desculpe Yuri, posso até está errado, mas o Nome da Classe, é como o nome de cualcuer função que é enxergada por todo sistema, ou seja o nome da classe, não morre. Quem morre, é o Objeto ODLG. João Santos - São Paulo. kmt_karinha@pop.com.br kapiaba@brfree.com.br Skype: fw_kapiaba FWH 2.7 - xHARBOUR 0.99.61 - WorkShop.Exe id=quote>id=quote>não João, você não está errado... mas também não tá certo... rsrsrsrsrsr o objeto não "morre" totalmente, ele ainda fica meio "morto-vivo" .... vc mencionou o método ClassName(), mas se substituir onde eu usei ODlg:ClassName() por oDlg:cTitle por exemplo, verá que não vai dar erro, pois a propriedade ::cTitle AINDA ESTà PRESENTE na memória... eu falei que é meio "morto-vivo" porque a propriedade vai perder o conteúdo, ou seja, vai estar vazia, mas ainda vai existir... resumindo, o End() do diálogo limpa o conteúdo das propriedades, mas não "mata" o objeto da classe... uma abraço V ENCONTRO DE FW - NOVEMBRO/2007 - Eu vou !!! E você ? Yury Marcelino Al Viman Sistemas vimansca@vimansca.com.br yury030575@yahoo.com.br (msn) skype: yury.marcelino.al Leme / SP FW 2.6 / [x]Harbour 99.50 / WS / xDev 0.65 / @say Quote Link to comment Share on other sites More sharing options...
giovanyvecchi Posted November 13, 2007 Report Share Posted November 13, 2007 O method End(), Internalmente da um PostMsg( WM_CLOSE ) no objeto que é para o Windows entender que não se deve mais movimentar este objeto com os eventos internos fo windows. Tipo assim, quando voce passa o mouse em cima de um botão o botão recebe informação de EVENT HANDLE, ou quando voce clica recebe um BN_PUSH, ao dar END ,voce corta esta comunicação com o windows. Por isto que quando c cria um objeto tem as propriedades de funcionamento dele, WS_CHILD, WS_PUSHBUTTON, WS_BORDER, ETC.. Agora quando o objeto esta ligado a algum recurso, é como se fosse a linha e o recurso a pipa, antes de finalizar a variavel não pelo metodo end, e sim pelo fator de alocação: STATIC, PUBLIC, LOCAL PRIVATE, voce tem que retirar a alocação do recurso, com por exemplo o DeleteObject, que finalizara o recurso alocado na memoria e liberando-a, depois a variavel objet pode ser eliminada tambem, senão a pipa fica sem linha e alocando bytes de memoria. Creio eu que deu pra entender, certo ? Giovany Vecchi - Jales - SP FWH 2.8 /Clipper 5.3b /Blinker 5.0 / Harbour 0.99 / xHarbour 99.71/ Bcc 5.6 / Ads 7.1 /PellesC Quote Link to comment Share on other sites More sharing options...
Yury Posted November 14, 2007 Report Share Posted November 14, 2007 citação:Creio eu que deu pra entender, certo ? Giovany Vecchi - Jales - SP FWH 2.8 /Clipper 5.3b /Blinker 5.0 / Harbour 0.99 / xHarbour 99.71/ Bcc 5.6 / Ads 7.1 /PellesC id=quote>id=quote>ok... um abraço V ENCONTRO DE FW - NOVEMBRO/2007 - Eu vou !!! E você ? Yury Marcelino Al Viman Sistemas vimansca@vimansca.com.br yury030575@yahoo.com.br (msn) skype: yury.marcelino.al Leme / SP FW 2.6 / [x]Harbour 99.50 / WS / xDev 0.65 / @say Quote Link to comment Share on other sites More sharing options...
kapiaba Posted November 14, 2007 Report Share Posted November 14, 2007 citação:O method End(), Internalmente da um PostMsg( WM_CLOSE ) no objeto que é para o Windows entender que não se deve mais movimentar este objeto com os eventos internos fo windows. Tipo assim, quando voce passa o mouse em cima de um botão o botão recebe informação de EVENT HANDLE, ou quando voce clica recebe um BN_PUSH, ao dar END ,voce corta esta comunicação com o windows. Por isto que quando c cria um objeto tem as propriedades de funcionamento dele, WS_CHILD, WS_PUSHBUTTON, WS_BORDER, ETC.. Agora quando o objeto esta ligado a algum recurso, é como se fosse a linha e o recurso a pipa, antes de finalizar a variavel não pelo metodo end, e sim pelo fator de alocação: STATIC, PUBLIC, LOCAL PRIVATE, voce tem que retirar a alocação do recurso, com por exemplo o DeleteObject, que finalizara o recurso alocado na memoria e liberando-a, depois a variavel objet pode ser eliminada tambem, senão a pipa fica sem linha e alocando bytes de memoria. Creio eu que deu pra entender, certo ? Giovany Vecchi - Jales - SP FWH 2.8 /Clipper 5.3b /Blinker 5.0 / Harbour 0.99 / xHarbour 99.71/ Bcc 5.6 / Ads 7.1 /PellesC id=quote>id=quote>EXCELENTE APORTACIONE GIOVANNY. MUITO BOM! MAS, O QUE ME INTERESSA MESMO, É VER SEU NOME NA LISTA DE INSCRITOS PARA O QUINTO ENCONTRO. COMO É, VAI ME DAR O PRAZER DE VE-LO PESSOALMENTE ACà EM SAMPA, OU NÃO?id=size5> João Santos - São Paulo. kmt_karinha@pop.com.br kapiaba@brfree.com.br Skype: fw_kapiaba FWH 2.7 - xHARBOUR 0.99.61 - WorkShop.Exe Quote Link to comment Share on other sites More sharing options...
Yury Posted November 14, 2007 Report Share Posted November 14, 2007 pessoal, Somente mais uma dúvida. Se eu faço uma classe assim: CLASS TProduto DATA nCodigo DATA cDescricao DATA cGrupo DATA nPreco DATA oCodigo DATA oDescricao DATA oGrupo DATA oPreco METHOD New() CONSTRUCTOR METHOD Load() METHOD Default() METHOD End() ENDCLASS //----------------------------------------------------------------------------// METHOD New() CLASS TProduto ::Default() return Self //----------------------------------------------------------------------------// METHOD Default() ::nCodigo := 0 ::cDescricao := SPACE(50) ::cGrupo := SPACE(10) ::nPreco := 0 return //----------------------------------------------------------------------------// METHOD Load() ::nCodigo := Produto->Codigo ::cDescricao := Produto->Descricao ::cGrupo := Produto->Grupo ::nPreco := Produto->Preco return //----------------------------------------------------------------------------// METHOD End() DeleteObject( ???? ) Self = nil return //----------------------------------------------------------------------------// id=code>id=code>como obter o parâmetro a ser passado para a função DeleteObject() no método End() ? segundo o help do FW: DeleteObject( ) The handle of the GDI object, obtained with its corresponding creating function. id=code>id=code>um abraço V ENCONTRO DE FW - NOVEMBRO/2007 - Eu vou !!! E você ? Yury Marcelino Al Viman Sistemas vimansca@vimansca.com.br yury030575@yahoo.com.br (msn) skype: yury.marcelino.al Leme / SP FW 2.6 / [x]Harbour 99.50 / WS / xDev 0.65 / @say Quote Link to comment Share on other sites More sharing options...
kapiaba Posted November 14, 2007 Report Share Posted November 14, 2007 Quem é o Objeto?? Tudo que começa com (o)Bjeto. Por ejemplo: DeleteObject( oCodigo ) oCodigo := nil No METHOD End(). João Santos - São Paulo. kmt_karinha@pop.com.br kapiaba@brfree.com.br Skype: fw_kapiaba FWH 2.7 - xHARBOUR 0.99.61 - WorkShop.Exe Quote Link to comment Share on other sites More sharing options...
Anderson.OL Posted November 14, 2007 Author Report Share Posted November 14, 2007 Pessoal, lendo as respostas dos amigos, eu escrevi meu metodo end da seguinte forma: METHOD End() CLASS TPagamento **************************************************************************** local i := 0 for i := 1 to Len(aCrediario) aCrediario:End() aCrediario := nil end for i := 1 to Len(aCartao) aCartao:End() aCartao := nil end for i := 1 to Len(aCheque) aCheque:End() aCheque := nil end for i := 1 to Len(aConvenio) aConvenio:End() aConvenio := nil end for i := 1 to Len(aBoleto) aBoleto:End() aBoleto := nil end Self := Nil return nil /*------------------------------------------------------------------------*/ id=brown>id=code>id=code>e na hora de destruir o objeto executo o seguinte comando: oPagto := nil id=brown>id=code>id=code>Gostaria de saber se este é o metodo certo, já que meus objetos não são derivados do windows.. Quote Link to comment Share on other sites More sharing options...
Burai Posted November 14, 2007 Report Share Posted November 14, 2007 O metodo END é relativo, nem toda classe precisa ter. É obrigatorio quando vc o utiliza para matar recursos, ponteiros etc que criou em outros metodos da classe. Imagine que vc criou uma font ::oFont em :New(), seria no :End() que vc a eliminaria, e assim por diante. Depende muito do que sua classe faz. Eu quando nao instancio nada, crio um End apenas por conveniencia dessa maneira: METHOD END() CLASS TClasse return( Self := Nil ) O End encerra a classe, mas dependendo do tipo de classe ainda mantem o ponteiro apontando pra variavel à qual foi atribuida, se for variavel LOCAL ele morre onde foi criada, se for public, global, private e similares, seria legal jogar um Nil pra ela, tipo: oVariavel:End() oVariavel := nil O proprio Delphi tem uma função FreeAndNil( variavel ) que faz as duas coisas acima, da ate pra criar uma pseudo-function neste esquema: #xTranslate FreeAndNil( ) => :End() ; := Nil Ou algo assim, hehehehe [ ]'s Maurilio FWH 7.01 | xHB + SQLRDD | Workshop 4.5 | xDevStudio Garça - SP Quote Link to comment Share on other sites More sharing options...
Yury Posted November 14, 2007 Report Share Posted November 14, 2007 muito obrigado Maurilio... um abraço V ENCONTRO DE FW - NOVEMBRO/2007 - Eu vou !!! E você ? Yury Marcelino Al Viman Sistemas vimansca@vimansca.com.br yury030575@yahoo.com.br (msn) skype: yury.marcelino.al Leme / SP FW 2.6 / [x]Harbour 99.50 / WS / xDev 0.65 / @say Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.