Página 2 de 2
Classe não é destruida ?
Enviado: 20 Out 2021 19:16
por JoséQuintas
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.
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:
...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
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.
Acabei não entendendo pra que serve o Init(), se tem o mesmo efeito de New().
Mas provavelmente o Init() é executado antes do New().