bug codeblock/WITH OBJECT

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

bug codeblock/WITH OBJECT

Mensagem por JoséQuintas »

bug gravíssimo no harbour
isso pra quem considera que trocar variável em codeblock é grave....

Código: Selecionar todos

REQUEST HB_CODEPAGE_PTISO

#include "hbclass.ch"

PROCEDURE Main()

   LOCAL a, b, c

   SetMode(25,80)
   CLS
   Set( _SET_CODEPAGE, "PTISO" )

   a := TestObj():New()
   WITH OBJECT a
      :x := 10
      c := { || :x }
   ENDWITH
   WITH OBJECT b
      ? eval( c )
      ? a:x
   ENDWITH

   Inkey(0)

   RETURN

CREATE CLASS TestObj
   VAR x INIT 0
   ENDCLASS
Isso mostra
0
10

Era esperado mostrar
10
10

Criei o codeblock pra variável A, mas o resultado foi a variável B.

Gravíssimo.
NUNCA vamos poder saber o que existe em cada função que possa afetar qualquer valor de qualquer objeto.
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/
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

bug codeblock/WITH OBJECT

Mensagem por Kapiaba »

Assim, funciona bem com HARBOUR y [x]HARBOUR the best.

Código: Selecionar todos

// C:\FWH\SAMPLES\TESTE.PRG

#include "FiveWin.ch"
#include "hbclass.ch"

REQUEST HB_CODEPAGE_PTISO

PROCEDURE Main

   LOCAL a, b, c, x

   Set( _SET_CODEPAGE, "PTISO" )

   a := TestObj():New()

   WITH OBJECT a

      :x := 10

      c  := :x

   END WITH

   WITH OBJECT b

      ? "Objeto A: ", c

      ? "Objeto B: ", a:x

   END WITH

RETURN

CREATE CLASS TestObj

   VAR x INIT 0

ENDCLASS

// FIN / END
Regards, saludos.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

bug codeblock/WITH OBJECT

Mensagem por JoséQuintas »

Pra esse exemplo resolve.

Tenho codeblocks do recordset ADO, criados com WITH OBJECT.
Estou adicionando colunas no XBROWSE do fivewin, com WITH OBJECT.
O recordset vira xbrowse.
E pro xbrowse precisa ir codeblock não pode ser o resultado.

E se passar por isso, precisa rezar pro fivewin não usar WITH OBJECT internamente, senão pode acontecer isso também.

Infelizmente, é bug gravíssimo.

Confirme, porque pode ser gravíssimo pro xharbour também.
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

bug codeblock/WITH OBJECT

Mensagem por JoséQuintas »

Novamente de outro jeito:

Código: Selecionar todos

WITH OBJECT a
   :x := 10
   c := { || :x }
ENDWITH
Isso cria o codeblock, ok.

Código: Selecionar todos

? Eval( c )
Isso acima dá certo, o resultado é o esperado.

Código: Selecionar todos

WITH OBJECT y
   :Value := Eval( c )
ENDWITH
Isso acima dá resultado diferente.

Código: Selecionar todos

WITH OBJECT y
   :CodeBlock := c
ENDWITH
Isso acima também dá resultado diferente
E só está atribuindo uma variável à outra, é uma cópia do codeblock (ou deveria ser)

E isso pode se multiplicar internamente pelas LIBs, não temos controle delas.
De repente o WITH OBJECT virou algo extremamente perigoso.
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

bug codeblock/WITH OBJECT

Mensagem por JoséQuintas »

Código: Selecionar todos

   WITH OBJECT xControl
      :SetArray( Array( cnSQL:RecordCount() ) )
      :bOnSkip := { || cnSQL:Move( xControl:nArrayAt - 1, 1 ) }
      :bClrStd := { || { CLR_BLACK, iif( Mod( cnSQL:AbsolutePosition, 2 ) == 0, CLR_WHITE, RGB(179,207,231) ) } }
      :xUserData := cnSQL
      :xUserValue := 1
      :nArrayAt := 1
   ENDWITH
   FOR EACH aItem IN oTBrowse
      ADD oCol TO xControl ;
         DATA aItem[ 2 ] ;
         HEADER aItem[ 1 ]
   NEXT
Se colocar o for/next dentro do WITH OBJECT dá problema.
os elementos usam o objeto ADO, e viram o objeto xbrowse.

Isso pode acabar com todos os browses do aplicativo.

Quem sabe aqueles meus erros inexplicáveis encontraram explicação kkkkk
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

bug codeblock/WITH OBJECT

Mensagem por JoséQuintas »

witho.png
Quase 1.000 WITH OBJECT pra revisar.
A não ser que façam correção rápido.
E muitos usados em browse, exatamente o que deu problema agora pra fivewin.
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/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

bug codeblock/WITH OBJECT

Mensagem por alxsts »

Olá!

Penso que, como o próprio nome do comando sugere, WITH OBJECT espera uma variável do tipo OBJETO (Valtype() == "O" ).

No primeiro código postado, tem o comando WITH OBJECT b, sendo que a variável b contém NIL...

Penso que deveria ser gerado um Run Time Error...

Talvez o problema seja este.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

bug codeblock/WITH OBJECT

Mensagem por JoséQuintas »

alxsts escreveu:Penso que, como o próprio nome do comando sugere, WITH OBJECT espera uma variável do tipo OBJETO (Valtype() == "O" ).
No primeiro código postado, tem o comando WITH OBJECT b, sendo que a variável b contém NIL...
Penso que deveria ser gerado um Run Time Error...
Talvez o problema seja este.
Bem observado.
É que andei fazendo mais testes, e acabou fonte errado no post.
Do jeito que está postado realmente dá erro de run-time.

Mas não é isso.
Nos dois casos, a variável do objeto é trocada.
Se criado o objeto, retorna esse valor errado.
Se não criado o objeto, dá run-time, porque a variável não vai ter o método.
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

bug codeblock/WITH OBJECT

Mensagem por JoséQuintas »

Foi dito que é comportamento normal.
É assim mesmo, é o esperado, e não há o que fazer.

https://github.com/harbour/core/issues/361

Revisem os WITH OBJECT dos fontes.
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

bug codeblock/WITH OBJECT

Mensagem por JoséQuintas »

É interessante isso.

De repente, TODOS OS MEUS BROWSES, de quase 20 anos de uso se tornaram inválidos.
Até agora fazendo alterações neles.

Mundo GUI, fazer o que.
Parece que isso de um querer ser mais que o outro acontece até com os objetos.
No bug, você chama um objeto e vém o outro, talvez o que se considera "chefe".
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