WITH OBJECT e codeblocks

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

WITH OBJECT e codeblocks

Mensagem por JoséQuintas »

Acabo de ter este problema.

Assim funciona:

Código: Selecionar todos

      cnMySql:cSql := "SELECT IDTRANSP, TPNOME, TPENDERECO, TPCIDADE, TPUF FROM JPTRANSP ORDER BY TPNOME"
      cnMySql:Execute()
      oTBrowse := { ;
         { "CODIGO",   { || StrZero( cnMySql:Number( "IDTRANSP" ), 6 ) } }, ;
         { "NOME",     { || cnMySql:String( "TPNOME", 30 ) } }, ;
         { "ENDERECO", { || cnMySql:String( "TPENDERECO", 30 ) } }, ;
         { "CIDADE",   { || cnMySql:String( "TPCIDADE", 21 ) } }, ;
         { "UF",       { || cnMySql:String( "TPUF", 2 ) } } }
   ADOBrowse( cnMySql, oTBrowse )
Mas assim não:

Código: Selecionar todos

   WITH OBJECT cnMySql
      :cSql := "SELECT IDTRANSP, TPNOME, TPENDERECO, TPCIDADE, TPUF FROM JPTRANSP ORDER BY TPNOME"
      :Execute()
      oTBrowse := { ;
         { "CODIGO",   { || StrZero( :Number( "IDTRANSP" ), 6 ) } }, ;
         { "NOME",     { || :String( "TPNOME", 30 ) } }, ;
         { "ENDERECO", { || :String( "TPENDERECO", 30 ) } }, ;
         { "CIDADE",   { || :String( "TPCIDADE", 21 ) } }, ;
         { "UF",       { || :String( "TPUF", 2 ) } } }
   ENDWITH
   ADOBrowse( cnMySql, oTBrowse )
É chato não poder tirar proveito do WITH OBJECT pra codeblocks.
Postei no Harbour users, mas não sei se pode ser 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/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

WITH OBJECT e codeblocks

Mensagem por asimoes »

Quintas,
Onde ocorre o problema?
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

WITH OBJECT e codeblocks

Mensagem por JoséQuintas »

Depois na hora de usar no tbrowse, dá erro de método não existente.
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
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

WITH OBJECT e codeblocks

Mensagem por asimoes »

Fiz esse teste e para mim funcionou:

Código: Selecionar todos

  WITH OBJECT oTeste := ClTeste():New()
      :CODIGO := 1
      oTBrowse := { ;
                    { "CODIGO",   { || StrZero( :CODIGO, 6 ) } } ;
                  }
   END
   

CREATE CLASS ClTeste
     
   EXPORTED :
   
   VAR CODIGO AS INTEGER INIT 0
   
ENDCLASS   
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

WITH OBJECT e codeblocks

Mensagem por asimoes »

Realmente tem um problema na execução com codeblock
assim funccionou:

Código: Selecionar todos

   WITH OBJECT oTeste := ClTeste():New()
      :CODIGO := 1
      oTBrowse := { ;
                    { "CODIGO",   { || StrZero( oTeste:CODIGO, 6 ) } } ;
                  }
   END
  
   FOR EACH oElemento IN oTBrowse
      otb := Eval( oElemento[2] )
   NEXT
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

WITH OBJECT e codeblocks

Mensagem por JoséQuintas »

Normal ok.
browse1.png
com WITH OBJECT
browse2.png
browse2.png (10.42 KiB) Exibido 1284 vezes
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
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

WITH OBJECT e codeblocks

Mensagem por asimoes »

Considera o nome da variável e não o seu conteúdo com WITH OBJECT

:CODIGO interpreta como nome de variável/método no CODEBLOCK, assim oTeste:CODIGO considera o valor
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

WITH OBJECT e codeblocks

Mensagem por JoséQuintas »

Tentei simular o problema, mas num teste simples funciona.

Código: Selecionar todos

#include "hbclass.ch"

FUNCTION MAIN()

   LOCAL cnMySql := ADOClass():New( { 10, 20 } ), bCode

   CLS
   WITH OBJECT cnMySql
      bCode := { || cnMySql:Test( 1 ) }
      ? Test( bCode )
      bCode := { || :Test( 1 ) }
      ? Test( bCode )
   ENDWITH

   Inkey(0)

   RETURN NIL

CREATE CLASS ADOClass
   METHOD New( x ) INLINE ::Rs := x, SELF
   METHOD Test( nValue ) INLINE ::Rs[ nValue ]
   VAR Rs
   ENDCLASS

FUNCTION Test( bCode )

   RETURN Eval( bCode )
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

WITH OBJECT e codeblocks

Mensagem por JoséQuintas »

Num mais complicado também.

Código: Selecionar todos

#include "hbclass.ch"

FUNCTION MAIN()

   LOCAL cnMySql := ADOClass():New(), oTBrowse

   CLS
   cnMySql:Execute()
   WITH OBJECT cnMySql
      oTBrowse := { ;
         { "test1", { || cnMySql:Test( 1 ) } }, ;
         { "Test2", { || cnMySql:Test( 2 ) } } }
   ENDWITH
   Test( cnMySql, oTBrowse )

   Inkey(0)

   RETURN NIL

CREATE CLASS ADOClass
   VAR Rs
   METHOD Test( nValue ) INLINE ::Rs[ nValue ]
   METHOD Execute() INLINE ::Rs := { 10, 20 }
   ENDCLASS

FUNCTION Test( cnMySql, oTBrowse )

   LOCAL aVar := {}, oElement

   FOR EACH oElement IN oTBrowse
      AAdd( aVar, { oElement[ 1 ], oElement[ 2 ] } )
   NEXT
   DoEval( aVar )
   HB_SYMBOL_UNUSED( cnMySql )

   RETURN NIL

FUNCTION DoEval( aVar )

   LOCAL oElement

   FOR EACH oElement IN aVar
      ? Eval( oElement[ 2 ] )
   NEXT

   RETURN NIL
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

WITH OBJECT e codeblocks

Mensagem por JoséQuintas »

Correção: no mais complicado aconteceu o mesmo erro do ADO.

Código: Selecionar todos

#include "hbclass.ch"

FUNCTION MAIN()

   LOCAL cnMySql := ADOClass():New(), oTBrowse

   CLS
   cnMySql:Execute()
   WITH OBJECT cnMySql
      oTBrowse := { ;
         { "test1", { || :Test( 1 ) } }, ;
         { "Test2", { || :Test( 2 ) } } }
   ENDWITH
   Test( cnMySql, oTBrowse )

   Inkey(0)

   RETURN NIL

CREATE CLASS ADOClass
   VAR Rs
   METHOD Test( nValue ) INLINE ::Rs[ nValue ]
   METHOD Execute() INLINE ::Rs := { 10, 20 }
   ENDCLASS

FUNCTION Test( cnMySql, oTBrowse )

   LOCAL aVar := {}, oElement

   FOR EACH oElement IN oTBrowse
      AAdd( aVar, { oElement[ 1 ], oElement[ 2 ] } )
   NEXT
   DoEval( aVar )
   HB_SYMBOL_UNUSED( cnMySql )

   RETURN NIL

FUNCTION DoEval( aVar )

   LOCAL oElement

   FOR EACH oElement IN aVar
      ? Eval( oElement[ 2 ] )
   NEXT

   RETURN NIL
SYSTEM ERROR
Error BASE/1004 No exported method: TEST
Called from TEST(0)
Called from (b)MAIN(12)
Called from DOEVAL(43)
Called from TEST(33)
Called from MAIN(14)
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

WITH OBJECT e codeblocks

Mensagem por JoséQuintas »

Resolvido, após comentários no harbour-users.

Pensei que WITH OBJECT era traduzido pelo pré-compilador, então não fazia diferença depois.

Mas é traduzido em run-time, como se fosse criada uma variável local (pointer) indicando a variável original.
Resultado: só existe entre WITH OBJECT/ENDWITH

Solução: chamar o tbrowse dentro do WITH OBJECT/ENDWITH

ao invés disto:

Código: Selecionar todos

   WITH OBJECT cnMySql
      oTBrowse := { ;
         { "test1", { || :Test( 1 ) } }, ;
         { "Test2", { || :Test( 2 ) } } }
   ENDWITH
   Test( cnMySql, oTBrowse )
]

usar isto:

Código: Selecionar todos

   WITH OBJECT cnMySql
      oTBrowse := { ;
         { "test1", { || :Test( 1 ) } }, ;
         { "Test2", { || :Test( 2 ) } } }
      Test( cnMySql, oTBrowse )
   ENDWITH
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