Página 1 de 1

bug codeblock/WITH OBJECT

Enviado: 26 Nov 2024 15:31
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.

bug codeblock/WITH OBJECT

Enviado: 26 Nov 2024 16:07
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.

bug codeblock/WITH OBJECT

Enviado: 26 Nov 2024 16:14
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.

bug codeblock/WITH OBJECT

Enviado: 26 Nov 2024 16:19
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.

bug codeblock/WITH OBJECT

Enviado: 26 Nov 2024 16:47
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

bug codeblock/WITH OBJECT

Enviado: 26 Nov 2024 17:12
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.

bug codeblock/WITH OBJECT

Enviado: 26 Nov 2024 18:40
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.

bug codeblock/WITH OBJECT

Enviado: 26 Nov 2024 21:15
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.

bug codeblock/WITH OBJECT

Enviado: 27 Nov 2024 11:30
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.

bug codeblock/WITH OBJECT

Enviado: 27 Nov 2024 15:50
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".