Classe não é destruida ?

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Classe não é destruida ?

Mensagem por JoséQuintas »

init.png
Detalhe talvez importante:

INIT não retorna SELF.
Trata-se de uma rotina de atribuir valores.
Só mesmo o NEW() que retorna SELF.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Classe não é destruida ?

Mensagem por JoséQuintas »

IMPORTANTE

Agora estou tendo muitos erros no aplicativo.

Código: Selecionar todos

ClienteClass():Valida( xxx )
Eu usava a conexão definida na variável, no VAR INIT.
O problema agora é que o método INIT() NÃO é executado ao usar diretamente desse jeito.
O método INIT() só é executado se primeiro usar o New() da classe.

É como o INIT() fazer parte do New(), e acaba pulando o método init() se usado dessa forma.

Talvez agora tenha que usar ClienteClass():New():Valida( xxx )

Vão ser muuuuuitas alterações agora, pensar agora qual será a melhor opção...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

Classe não é destruida ?

Mensagem por rossine »

Olá,

Seguindo com os testes, então cheguei a conclusão que, quando se usa o "METHOD INIT()" o "METHOD NEW()" não pode mais ser definido na classe, mas a variável recebe o Objeto normalmente:

Código: Selecionar todos

oClass := TMYCLASS:New()

? valtype( oClass )  // <- retorna "O"
Considerando-se que, quando se destroe um objeto:

Código: Selecionar todos

oClass := NIL
...as variáveis da classe continuam lá retendo o último valor movido para elas e ocupando mémoria, então talvez o ideal seria melhor limpar as variáveis antes do objeto ser destruído.

Código: Selecionar todos

#pragma /w2      //de 0 a 3
#pragma /es2     //de 0 a 2

REQUEST HB_CODEPAGE_PTISO

#include "hbclass.ch"

MEMVAR cVarTeste

PROCEDURE main()

   LOCAL oClass
   PUBLIC cVarTeste

   Set( _SET_CODEPAGE, "PTISO" )
   SetMode(40,100)
   CLS

   cVarTeste := "001"

   oClass := TMYCLASS():New()

   ? oClass:cTeste1, " <- Aqui teria que ser [001] - OK"
   ? ""

   ? "Tipo de variavel de [oClass]=", valtype(oClass)
   ? ""

   oClass := NIL

   ? "Tipo de variavel de [oClass]=", valtype(oClass)
   ? ""

   cVarTeste := "002"

   oClass := TMYCLASS():New()

   ? oClass:cTeste1, " <- Aqui teria que ser [002] - OK"
   ? ""

   oClass := NIL

   cVarTeste := "003"

   oClass := TMYCLASS():New()

   ? oClass:cTeste1, " <- Aqui teria que ser [003] - OK"
   ? ""

   oClass := NIL

   oClass := NIL

   cVarTeste := "004"

   oClass := TMYCLASS():New()

   cVarTeste := "005"

   ? oClass:cTeste1 := cVarTeste

   ? oClass:cTeste1, " <- Aqui teria que ser [005] - OK"
   ? ""

   oClass := NIL

   Inkey(0)

   RETURN

CREATE CLASS TMYCLASS

   VAR      cTeste1
   DATA     cTeste2
   CLASSVAR cTeste3

   METHOD INIT()

   DESTRUCTOR Destroy()

ENDCLASS

METHOD INIT() CLASS TMYCLASS

   ::cTeste1 := cVarTeste

RETURN NIL

METHOD Destroy CLASS TMYCLASS

   local aVars, n, aData

   ? "::cTeste1=", hb_valtoexp(::cTeste1), " <- Antes de Destruir"

//https://harbour.github.io/doc/harbour.html#__objsetvaluelist
   aVars := __objGetMsgList( Self, .T. )
   aData := array( len(aVars), 2 )   

   for n = 1 to len(aVars)
       aData[n,HB_OO_DATA_SYMBOL] := aVars[n]
       aData[n,HB_OO_DATA_VALUE]  := NIL
   next n

//https://harbour.github.io/doc/harbour.html#__objsetvaluelist
   __objSetValueList( Self, aData )

   ? "::cTeste1=", hb_valtoexp(::cTeste1), " <- Depois de Destruir"

return NIL
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

Classe não é destruida ?

Mensagem por rossine »

Olá,

Agora Redefinindo os valores das variáveis, método "REDEFINEVARS()"

Código: Selecionar todos

#pragma /w2      //de 0 a 3
#pragma /es2     //de 0 a 2

REQUEST HB_CODEPAGE_PTISO

#include "hbclass.ch"

MEMVAR cVarTeste

PROCEDURE main()

   LOCAL oClass, hVars

   PUBLIC cVarTeste

   Set( _SET_CODEPAGE, "PTISO" )
   SetMode(40,100)
   CLS

   cVarTeste := "001"

   oClass := TMYCLASS():New()

   ? oClass:cTeste1, " <- Aqui teria que ser [001] - OK"
   ? ""

   ? "Tipo de variavel de [oClass]=", valtype(oClass)
   ? ""

   oClass := NIL

   ? "Tipo de variavel de [oClass]=", valtype(oClass)
   ? ""

   cVarTeste := "002"

   oClass := TMYCLASS():New()

   ? oClass:cTeste1, " <- Aqui teria que ser [002] - OK"
   ? ""

   oClass := NIL

   cVarTeste := "003"

   oClass := TMYCLASS():New()

   ? oClass:cTeste1, " <- Aqui teria que ser [003] - OK"
   ? ""

   oClass := NIL

   oClass := NIL

   cVarTeste := "004"

   oClass := TMYCLASS():New()

   cVarTeste := "005"

   ? oClass:cTeste1 := cVarTeste

   ? oClass:cTeste1, " <- Aqui teria que ser [005] - OK"
   ? ""

   oClass := NIL

   oClass := TMYCLASS():New()

   hVars := { => }

   hVars["cTeste2"] := "Abc"
   hVars["cTeste3"] := "Def"

   oClass:REDEFINEVARS( hVars )

   ? "oClass:cTeste1=", oClass:cTeste1, " <- Aqui teria que ser [005] - OK"
   ? "oClass:cTeste2=", oClass:cTeste2
   ? "oClass:cTeste3=", oClass:cTeste3
   ? ""

   oClass := NIL

   Inkey(0)

   RETURN

CREATE CLASS TMYCLASS

   VAR      cTeste1
   DATA     cTeste2
   CLASSVAR cTeste3

   METHOD REDEFINEVARS( hVars )

   METHOD INIT()

   DESTRUCTOR Destroy()

ENDCLASS

METHOD INIT() CLASS TMYCLASS

   ::cTeste1 := cVarTeste

RETURN NIL

METHOD REDEFINEVARS( hVars )

   local aData, aKeys, cKey, n

   aData := array( len(hVars), 2 )   

   aKeys := hb_HKeys( hVars )

   for each cKey in aKeys
       n := cKey:__enumIndex()
       aData[n,HB_OO_DATA_SYMBOL] := cKey
       aData[n,HB_OO_DATA_VALUE]  := hVars[cKey]
   next

   __objSetValueList( Self, aData )
   
RETURN NIL

METHOD Destroy CLASS TMYCLASS

   local aVars, n, aData

   ? "::cTeste1=", hb_valtoexp(::cTeste1), " <- Antes de Destruir"

//https://harbour.github.io/doc/harbour.html#__objsetvaluelist
   aVars := __objGetMsgList( Self, .T. )
   aData := array( len(aVars), 2 )   

   for n = 1 to len(aVars)
       aData[n,HB_OO_DATA_SYMBOL] := aVars[n]
       aData[n,HB_OO_DATA_VALUE]  := NIL
   next n

//https://harbour.github.io/doc/harbour.html#__objsetvaluelist
   __objSetValueList( Self, aData )

   ? "::cTeste1=", hb_valtoexp(::cTeste1), " <- Depois de Destruir"

return NIL

Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

Classe não é destruida ?

Mensagem por rossine »

Olá,

Um exemplo agora onde, eu excluo as variáveis da classe (__objDelData()) e quando tento criar a classe novamente, me é retornado um erro de execução. :(

Não sei como o harbour gerencia as classes, mas me parece que quando elas são definidas pela primeira vez, ficam lá até o final da execução do sistema e as variáveis não podem ser excluídas.
Talvez eu esteja errado, mas foi o que entendi:

Código: Selecionar todos

//https://pctoledo.org/forum/viewtopic.php?f=4&t=26039

#pragma /w2      //de 0 a 3
#pragma /es2     //de 0 a 2

REQUEST HB_CODEPAGE_PTISO

#include "hbclass.ch"

MEMVAR cVarTeste

PROCEDURE main()

   LOCAL oClass

   PUBLIC cVarTeste

   Set( _SET_CODEPAGE, "PTISO" )
   SetMode(40,100)
   CLS

   cVarTeste := "001"
   
   oClass := TMYCLASS():New()
   oClass := NIL

   oClass := TMYCLASS():New()
   oClass := NIL

   Inkey(0)

   RETURN

CREATE CLASS TMYCLASS

   VAR      cTeste1
   DATA     cTeste2
   CLASSVAR cTeste3

   METHOD REDEFINEVARS( hVars )

   METHOD INIT()

   DESTRUCTOR Destroy()

ENDCLASS

METHOD INIT() CLASS TMYCLASS

   ::cTeste1 := cVarTeste

RETURN NIL

METHOD REDEFINEVARS( hVars )

   local aData, aKeys, cKey, n

   aData := array( len(hVars), 2 )   

   aKeys := hb_HKeys( hVars )

   for each cKey in aKeys
       n := cKey:__enumIndex()
       aData[n,HB_OO_DATA_SYMBOL] := cKey
       aData[n,HB_OO_DATA_VALUE]  := hVars[cKey]
   next

   __objSetValueList( Self, aData )
   
RETURN NIL

METHOD Destroy CLASS TMYCLASS

   local aVars, n, aData

   ? "::cTeste1=", hb_valtoexp(::cTeste1), " <- Antes de Destruir"

   //https://harbour.github.io/doc/harbour.html#__objsetvaluelist
   aVars := __objGetMsgList( Self, .T. )
   aData := array( len(aVars), 2 )   

   // Aqui Prepara as Variaveis para serem limpas
   for n = 1 to len(aVars)
       aData[n,HB_OO_DATA_SYMBOL] := aVars[n]
       aData[n,HB_OO_DATA_VALUE]  := NIL
   next n

   //https://harbour.github.io/doc/harbour.html#__objsetvaluelist
   __objSetValueList( Self, aData )

   ? "::cTeste1=", hb_valtoexp(::cTeste1), " <- Depois de Destruir"

   // Aqui é excluido a Variavel da Class
   for n = 1 to len(aVars)
       __objDelData( Self, aVars[n] )
       ? "Variavel " + aVars[n] + " excluida da classe..."
   next n

return NIL

Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Classe não é destruida ?

Mensagem por JoséQuintas »

rossine escreveu:Não sei como o harbour gerencia as classes, mas me parece que quando elas são definidas pela primeira vez, ficam lá até o final da execução do sistema e as variáveis não podem ser excluídas.
Talvez eu esteja errado, mas foi o que entendi:
Se não me engano, a classe inicial do post só tinha valor na primeira instância, e depois vinha Nil.
Sendo assim, fica uma classe pré-compilada que não é exatamente a primeira classe.

É como cada New() ser uma classe por herança do esqueleto inicial.
Se fosse exatamente a mesma, os valores do primeiro post seriam outros.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Classe não é destruida ?

Mensagem por JoséQuintas »

new.png
Os efeitos deste post.
muito fonte alterado.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Classe não é destruida ?

Mensagem por JoséQuintas »

assim tem o mesmo efeito.

Código: Selecionar todos

   METHOD New() INLINE ::cTeste := cVarTeste, Self
Acabei não entendendo pra que serve o Init(), se tem o mesmo efeito de New().
Mas provavelmente o Init() é executado antes do New().
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder