Página 2 de 2

Classe não é destruida ?

Enviado: 20 Out 2021 19:16
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.

Classe não é destruida ?

Enviado: 21 Out 2021 09:31
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...

Classe não é destruida ?

Enviado: 21 Out 2021 10:19
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

Classe não é destruida ?

Enviado: 21 Out 2021 10:34
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


Classe não é destruida ?

Enviado: 21 Out 2021 10:51
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


Classe não é destruida ?

Enviado: 21 Out 2021 11:03
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.

Classe não é destruida ?

Enviado: 21 Out 2021 11:05
por JoséQuintas
new.png
Os efeitos deste post.
muito fonte alterado.

Classe não é destruida ?

Enviado: 21 Out 2021 23:46
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().