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:
Isso cria o codeblock, ok.
Isso acima dá certo, o resultado é o esperado.
Isso acima dá resultado diferente.
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
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".