Classe não é destruida ?
Moderador: Moderadores
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Classe não é destruida ?
Detalhe talvez importante:
INIT não retorna SELF.
Trata-se de uma rotina de atribuir valores.
Só mesmo o NEW() que retorna SELF.
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/
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/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Classe não é destruida ?
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...
Agora estou tendo muitos erros no aplicativo.
Código: Selecionar todos
ClienteClass():Valida( xxx )
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/
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/
Classe não é destruida ?
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:
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.
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"
Código: Selecionar todos
oClass := NIL
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.
Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
Classe não é destruida ?
Olá,
Agora Redefinindo os valores das variáveis, método "REDEFINEVARS()"
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.
Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
Classe não é destruida ?
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:
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.
Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Classe não é destruida ?
Se não me engano, a classe inicial do post só tinha valor na primeira instância, e depois vinha Nil.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:
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/
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/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Classe não é destruida ?
Os efeitos deste post.
muito fonte alterado.
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/
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/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Classe não é destruida ?
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().
Código: Selecionar todos
METHOD New() INLINE ::cTeste := cVarTeste, Self
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/
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/
