Clipper On Line • Ver Tópico - Classe não é destruida ?

Classe não é destruida ?

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

Moderador: Moderadores

 

Classe não é destruida ?

Mensagempor JoséQuintas » 20 Out 2021 19:16

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18152
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Classe não é destruida ?

Mensagempor JoséQuintas » 21 Out 2021 09:31

IMPORTANTE

Agora estou tendo muitos erros no aplicativo.

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18152
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Classe não é destruida ?

Mensagempor rossine » 21 Out 2021 10:19

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:

oClass := TMYCLASS:New()

? valtype( oClass )  // <- retorna "O"


Considerando-se que, quando se destroe um objeto:

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.

#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: 313
Data de registro: 06 Ago 2007 09:57
Cidade/Estado: Divinópolis-MG
Curtiu: 1 vez
Mens.Curtidas: 21 vezes

Classe não é destruida ?

Mensagempor rossine » 21 Out 2021 10:34

Olá,

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

#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: 313
Data de registro: 06 Ago 2007 09:57
Cidade/Estado: Divinópolis-MG
Curtiu: 1 vez
Mens.Curtidas: 21 vezes

Classe não é destruida ?

Mensagempor rossine » 21 Out 2021 10:51

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:

//http://www.pctoledo.com.br/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.
rossine
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 313
Data de registro: 06 Ago 2007 09:57
Cidade/Estado: Divinópolis-MG
Curtiu: 1 vez
Mens.Curtidas: 21 vezes

Classe não é destruida ?

Mensagempor JoséQuintas » 21 Out 2021 11:03

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18152
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Classe não é destruida ?

Mensagempor JoséQuintas » 21 Out 2021 11:05

new.png


Os efeitos deste post.
muito fonte alterado.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18152
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Classe não é destruida ?

Mensagempor JoséQuintas » 21 Out 2021 23:46

assim tem o mesmo efeito.

   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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18152
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Anterior



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 7 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro