Jump to content
Fivewin Brasil

Como escrever o Metodo End de maneira correta?!


Anderson.OL

Recommended Posts

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:???

sign1be9.png

sign2ov5.png

Link to comment
Share on other sites

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:???

sign1be9.png

sign2ov5.png

Link to comment
Share on other sites

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 ;)

sign1be9.png

sign2ov5.png

Link to comment
Share on other sites

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())

5EventoFW.gif

Link to comment
Share on other sites

citação:

Kapiaba, vc sugere usar no lugar do método ::End() usar:


oPagto := nil

id=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?!?!

sign1be9.png

sign2ov5.png


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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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..

sign1be9.png

sign2ov5.png

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...