Página 2 de 3

Erro no Tbrowse

Enviado: 22 Dez 2015 10:01
por JoséQuintas
Aqui uso Harbour 3.4 sem nenhuma configuração especial e já fica disponível.
Só consegui gerar o erro com o fonte acima, colocando o nome errado no fonte.

Vamos considerar o básico:

O nome do método é tbrowse:SETKEY()

O erro é não existir: tbrowse:HB_SETKEY()

Se não estiver no fonte, talvez possa ser possível algum arquivo .CH estar modificando.
Pode verificar o que contém a outra linha?
Called from A040300.PRG->DBDATA(242)

O erro é chamar nome errado, que não existe, e o nome chamado é :HB_SETKEY() quando deveria ser :SETKEY()

Erro no Tbrowse

Enviado: 22 Dez 2015 10:19
por asimoes
Quintas a linha 242:

oTBrowse:setKey(K_F12, {|| DiasAtraso("APA01")})

Muito estranho isso.

Está chamando outra função.

As minhas compilações são com harbour 3.4 e atualizei e gerei o harbour 2 dias atrás.

Erro no Tbrowse

Enviado: 22 Dez 2015 10:26
por JoséQuintas
Vou atualizar aqui e gerar, pra ver se mudaram alguma coisa.
Um teste relativamente básico que aqui funciona:

Código: Selecionar todos

#pragma -w3
#pragma -es2
#include "inkey.ch"
request DBFCDX

PROCEDURE Main

   LOCAL oTBrowse, oKeys

   RddSetDefault( "DBFCDX" )
   dbCreate( "test", { { "CODIGO", "C", 6, 0 }, { "NOME", "C", 30, 0 } } )
   USE test
   INDEX ON field->Nome to test
   SetMode( 25, 80 )
   SET COLOR TO W/B,N/W,,,W/B
   CLS
   oTBrowse := { ;
     { "CODIGO",   { || test->Codigo } }, ;
     { "NOME",     { || Left( test->Nome, 10 ) } } }
   oKeys := { ;
      { K_ENTER, { || AlgumaCoisa() } }, ;
      { K_F2,    { || AlgumaCoisa() } } }
   FazBrowse( oTBrowse, oKeys )
   CLOSE DATABASES
   RETURN

STATIC FUNCTION AlgumaCoisa()
   RETURN NIL

FUNCTION FazBrowse( oTBrowse, oKeys )

   LOCAL oBrowse, nCont, nKey
   MEMVAR cFiltro
   PRIVATE cFiltro := ""

   oBrowse := tbrowsedb( 1, 1, MaxRow(), MaxCol() )
   oBrowse:HeadSep := Chr(196)
   oBrowse:FootSep := Chr(196)
   oBrowse:ColSep  := ""
   FOR nCont = 1 TO Len( oTBrowse )
      oBrowse:AddColumn( tbColumnNew( "|", { || "|" } ) )
      oBrowse:AddColumn( tbColumnNew( oTBrowse[ nCont, 1 ], oTBrowse[ nCont, 2 ] ) )
   NEXT
   IF .NOT. oKeys == NIL
      FOR nCont = 1 TO Len( oKeys )
         oBrowse:SetKey( oKeys[ nCont, 1 ], oKeys[ nCont, 2 ] )
      NEXT
   ENDIF
   oBrowse:SetKey( K_BS, { | oBrowse, nKey | FazBrowseBackSpace( oBrowse, nKey ) } )
   oBrowse:RefreshAll()
   DO WHILE .T.
      DO WHILE .NOT. oBrowse:Stable()
         oBrowse:Stabilize()
      ENDDO
      nKey := Inkey(0)
      DO CASE
      CASE nKey == K_ESC
         EXIT
      CASE nKey > 31 .AND. nKey < Asc( "z" )
         FazBrowseAnyChar( oBrowse, nKey )
      ENDCASE
      oBrowse:ApplyKey( nKey )
   ENDDO
   SET SCOPE TO
   RETURN NIL

FUNCTION FazBrowseBackSpace( oBrowse, nKey )

   MEMVAR cFiltro

   IF Len( cFiltro ) > 0
      cFiltro := Substr( cFiltro, 1, Len( cFiltro ) - 1 )
      IF Len( cFiltro ) == 0
         SET SCOPE TO
      ELSE
         SET SCOPE TO ( cFiltro )
      ENDIF
      GOTO TOP
      oBrowse:RefreshAll()
   ENDIF
   HB_SYMBOL_UNUSED( nKey )
   RETURN NIL

FUNCTION FazBrowseAnyChar( oBrowse, nKey )

   MEMVAR cFiltro

   cFiltro += Upper( Chr( nKey ) )
   SET SCOPE TO ( cFiltro )
   GOTO TOP
   oBrowse:RefreshAll()
   RETURN NIL

Erro no Tbrowse

Enviado: 22 Dez 2015 10:29
por asimoes
Acho que achei o problema:

No include hbcompat.ch

#xtranslate hb_SetKey( [<x,...>] ) => SetKey( <x> )

#xtranslate SetKey( [<x,...>] ) => hb_SetKey( <x> )

Eu uso xhb.hbc nas minhas compilações.

E no hbp

-u+hbcompat.ch

Erro no Tbrowse

Enviado: 22 Dez 2015 10:43
por asimoes
É isso mesmo é esse translate:

#xtranslate SetKey( [<x,...>] ) => hb_SetKey( <x> )

Que estava gerando o erro.

O arquivo é hbcompat.ch

Isso é um problema, não acham? se usar hbcompat.ch em alguma rotina que use tbrowse e o método setkey vai dar erro por conta do translate.

Erro no Tbrowse

Enviado: 22 Dez 2015 10:46
por JoséQuintas
Ué, mas tá confuso isso.

Código: Selecionar todos

#xtranslate hb_SetKey( [<x,...>] ) => SetKey( <x> )
#xtranslate SetKey( [<x,...>] ) => hb_SetKey( <x> )
Converte SetKey() pra hb_SetKey(), ao mesmo tempo que converte hb_SetKey() pra SetKey()
Isso não criaria um loop infinito?

Se converte um método :SetKey() não seria um bug?
porque pode converter muita coisa que não deveria além disso aí.
Reportando o possível bug.

Erro no Tbrowse

Enviado: 22 Dez 2015 10:53
por asimoes
Tá com cara de bug na hbcompat.ch da xhb

Erro no Tbrowse

Enviado: 22 Dez 2015 11:00
por asimoes
No hbcompat.ch tem um

#ifdef __XHARBOUR__

e o

#xtranslate SetKey( [<x,...>] ) => hb_SetKey( <x> )

está no

#else

Linha 296

Erro no Tbrowse

Enviado: 22 Dez 2015 11:13
por JoséQuintas
Ok.
Reportei como bug.
Isso pode ser perigoso pra outras coisas, não somente para o :setkey()

Senão vamos ter que ficar olhando tudo que é arquivo .CH pra ver se interfere em alguma coisa...

Erro no Tbrowse

Enviado: 22 Dez 2015 11:18
por asimoes
Este translate conflita na chamada do método setkey na função TBrowsenew.

Erro no Tbrowse

Enviado: 22 Dez 2015 11:20
por asimoes
hbcompat.ch é para compatibilizar funções que trocaram de nome, mas pode como você disse Quintas, gerar um erro dificil de encontrar/solucionar.

No meu caso não posso usar o setkey por hora, porque toda aplicação usa hbcompat.ch por conta de try..catch e outras funções.
e ao invés de usar #include hbcompat.ch em todas rotinas eu já informo na compilação no hbp:

-u+hbcompat.ch

Erro no Tbrowse

Enviado: 22 Dez 2015 11:44
por JoséQuintas
A resposta do Viktor é que ele sempre recomendou não usar hbcompat.ch, que é uma espécie de guebra-galho.

https://github.com/vszakats/harbour-cor ... -166612929

Reforcei que isso não se trata apenas do que contém hbcompat.ch, mas do #xtranslate poder afetar nomes de métodos.

Só descobrimos porque o hbcompat.ch usa isso.
Pra esse caso, não considero hbcompat.ch como problema, mas como um arquivo contendo um exemplo de #xtranslate que causa problema.
Mais uma coisa pra ficar de olho.

Erro no Tbrowse

Enviado: 22 Dez 2015 12:00
por JoséQuintas
até que deduzi certo.
Vamos considerar o básico:
O nome do método é tbrowse:SETKEY()
O erro é não existir: tbrowse:HB_SETKEY()
Se não estiver no fonte, talvez possa ser possível algum arquivo .CH estar modificando.
Apesar do trabalho, um erro que é novidade pra todo mundo.
É difícil acontecer algo assim.
Mais difícil ainda ser causado por um arquivo do próprio Harbour.

É por isso que insisto: tem que simplificar fontes, pra ficar craque em coisas simples e básicas.
Ficando craque em coisas simples e básicas, o complicado que usa coisas simples e básicas também fica mais simples.
E a parte básica vale sempre, resolve qualquer coisa - até problema em método que usa codeblock dentro de uma classe!

Erro no Tbrowse

Enviado: 22 Dez 2015 12:17
por asimoes
O Viktor não recomenda usar hbcompat.ch e o legado? tem que modificar todo o código quando a função muda de nome?
Nós usamos o hbc porque contém os includes e libs atualizados e de um único local como componentes e eu nem me atrevo a alterar para gerar erros em outras rotinas. Penso que se fez o translate tem verificar todo o código da lib o que pode gerar incompatibilidade. Tem muita gente que não olha os fontes do harbour, principalmente os recem chegados a linguagem. Quintas quando você mencionou algum ch alterado, imediatamente vasculhei os ch´s do harbour e achei o problema. Agora se não recomenda usar hbcompat.ch, o que usar então?

Erro no Tbrowse

Enviado: 22 Dez 2015 16:29
por JoséQuintas
hbcompat.ch é pra aceitar compatibilidade com xHarbour, pra poder compilar fontes xHarbour.
Se decidiu pelo Harbour, não precisa mais compatibilidade.
Teria que verificar porque precisa dele.

Aliás... chega a alterar o comportamento do Harbour, o que pode deixar o programador incompatível... rs