cor no tbrowse

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

cor no tbrowse

Mensagem por cjp »

Tem no início do seu aplicativo isto aqui?
Tinha, mas estava comentado, não sei por quê. Reativei, e parou de dar o problema na tela. Este problema está resolvido. Obrigado.
Nunca usei oTbr:ApplyKey(), não sei como fica o comportamento ao retornar dela, se a tecla ainda vale.
Não te entendi bem, não sei o que eu precisaria fazer aqui.
Te passei antes o bloco a ser usado.
Se o bloco usa nKey, que é a tecla pressionada, com certeza ele vai ficar depois de nKey := Inkey(0)
Também não entendi e não sei o que precisaria fazer.

Por ora, para eu poder passar a adotar este teu exemplo em meu sistema, preciso resolver três coisas:

1) fazer funcionar a função de usuário; ainda não entendi como devo chamá-la;
2) o problema de collation, que não faço ideia do que seja nem como resolver;
3) tá dando um erro de acentuação no meu sistema depois que uso esta função.

Pode me ajudar?
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

cor no tbrowse

Mensagem por JoséQuintas »

cjp escreveu:Também não entendi e não sei o que precisaria fazer.
Te passei o trecho de fonte que vai usar pra testar.
Não entendeu isso?
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/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

cor no tbrowse

Mensagem por cjp »

Não, porque eu estou usando exatamente o código que vc me passou, conforme postei acima. Não era isso? Tem alguma coisa que eu deixei escapar?
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

cor no tbrowse

Mensagem por JoséQuintas »

Sim tem, o acréscimo do post anterior.
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/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

cor no tbrowse

Mensagem por cjp »

Sim tem, o acréscimo do post anterior.
Vc está falando deste código:

Código: Selecionar todos

IF oTbr:applyKey( nKey ) == TBR_EXIT
   EXIT
ENDIF
IF bUserFunction != NIL
   DO WHILE ! oBrowse:Stable
      oBrowse:Stabilize()
   ENDDO
   Eval( bUserFunction, oBrowse, oRs, nKey )
   oBrowse:RefreshAll()
ENDIF
nKey := 0 
Seria pra acrescer na tbrowseADO2? Onde exatamente?

Testei acrescer, mas dá erro na compilação. Veja no anexo. Não sei corrigi-lo.
Anexos
tela.png
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

cor no tbrowse

Mensagem por JoséQuintas »

Nesse último post fui repetir e confundi a função de usuário com a chamada.
É igual ao anterior.

Código: Selecionar todos

{ | oBrowse, nKey | TestUser( oRs, oBrowse, nkey ) }
Se a chamada é assim, significa que são só 2 parâmetros: | oBrowse, nKey |
A função é que vai receber 3 parâmetros.
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

cor no tbrowse

Mensagem por JoséQuintas »

Quanto aos erros:

ambiguous reference BUSERFUNCTION

Tá usando uma variável que não existe.... esqueceu que ela precisa chegar na função como parâmetro?
Isso não tem a ver com tbrowse, é uma parte comum em qualquer função.
Já falamos disso outras vezes.
E é sobre isso que comento de só copiar e colar fonte.
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/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

cor no tbrowse

Mensagem por cjp »

Se a chamada é assim, significa que são só 2 parâmetros: | oBrowse, nKey |
A função é que vai receber 3 parâmetros.
Desculpe, mas não te entendo. A verdade é que não sei programar desta forma, por isso acabo só colando.

Vamos ver se consigo te entender. Vc está falando desta chamada da função?

Código: Selecionar todos

      tBrowseADO2( oRs, oTBrowse, { | oBrowse, nKey | TestUser( oRs, oBrowse, nkey ) } )
Se for isto, onde está o erro? Eu só copiei da tua função, que está funcionando.

Ela chama esta função:

Código: Selecionar todos

FUNCTION tBrowseADO2( oRs, oTBrowse )
Que só está recebendo dois parâmetros.

Então, vc está dizendo que está passando três e recebendo dois? Seria esse o erro? E como corrigi-lo? Como receberia o terceiro?
ambiguous reference BUSERFUNCTION

Tá usando uma variável que não existe.... esqueceu que ela precisa chegar na função como parâmetro?
Que variável seria? Eu não acresci nenhuma variável na função de usuário. Aliás, não acresci absolutamente nada. O que não entendo é que funciona no teu sistema e, quando colo no meu, sem mudar nada, já não funciona.
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

cor no tbrowse

Mensagem por JoséQuintas »

cjp escreveu:Ela chama esta função:
FUNCTION tBrowseADO2( oRs, oTBrowse )
Que só está recebendo dois parâmetros.
Então, vc está dizendo que está passando três e recebendo dois? Seria esse o erro? E como corrigi-lo? Como receberia o terceiro?
Justamente a variável que está dando falta.

Código: Selecionar todos

FUNCTION tBrowseADO2( oRs, oTBrowse, bUserFunction )
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

cor no tbrowse

Mensagem por JoséQuintas »

cjp escreveu:Desculpe, mas não te entendo. A verdade é que não sei programar desta forma, por isso acabo só colando.
Toda programação é baseada em funções.
Uma função pode ou não receber parâmetros, depende do que faz.
Uma coisa é não conhecer tbrowse, e outra coisa é função.

Função recebe parâmetros e retorna resultado.

A sua função anterior, trata coisas que não vém por parâmetro.
A função atual só vai tratar o que receber por parâmetro.

TUDO que quiser expandir, vai ser por parâmetro.
Se não entender isso.... só vamos perder tempo, porque vai acabar fazendo a mesma coisa de novo pra tratar outras coisas.

Se toda programação é baseada em funções...
Então tem algo errado, se estou tendo que ensinar o que é, e como funciona uma função.
Tente se concentrar em entender função, porque tudo depende disso.
Comece dominando funções menores, e vá expandindo.

Pra quem nunca teve curiosidade de olhar.... o fonte do tbrowse pra DBF, do Harbour:

Código: Selecionar todos


FUNCTION TBrowseDB( nTop, nLeft, nBottom, nRight )

   LOCAL oBrowse := TBrowseNew( nTop, nLeft, nBottom, nRight )

   oBrowse:SkipBlock     := {| nRecs | __dbSkipper( nRecs ) }
   oBrowse:GoTopBlock    := {|| dbGoTop() }
   oBrowse:GoBottomBlock := {|| dbGoBottom() }

   RETURN oBrowse
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/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

cor no tbrowse

Mensagem por cjp »

Justamente a variável que está dando falta.
FUNCTION tBrowseADO2( oRs, oTBrowse, bUserFunction )
Fiz assim e também com TestUser, mas não funcionou. Veja a imagem anexa.

Toda programação é baseada em funções.
Uma função pode ou não receber parâmetros, depende do que faz.
Uma coisa é não conhecer tbrowse, e outra coisa é função.

Função recebe parâmetros e retorna resultado.
Esta parte, obviamente, eu já sabia.
A sua função anterior, trata coisas que não vém por parâmetro.
Aqui que não estou entendendo. Essa tua forma de passar parâmetros (acho que vcs chamam de codeblock, é isso?) é que eu não entendo.

Exemplo:

Código: Selecionar todos

      tBrowseADO2( oRs, oTBrowse, { | oBrowse, nKey | TestUser( oRs, oBrowse, nkey ) } )
Não entendo o | usado aí, nem as chaves.

Outro exemplo:

Código: Selecionar todos

         { "COMIDA",     { || oRs:ToString( "COMIDA", 30 ) }, { | x | If( At( "TOTAL ", Upper( x ) ) > 0, { 5, 5 }, { 1, 2 } ) } }, ;
Isto me dá um total nó na cabeça.

Pode por favor me explicar como fazer este browse funcionar?
Anexos
tela.png
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

cor no tbrowse

Mensagem por JoséQuintas »

Agora aconteceu o contrário:
A compilação está dizendo que a variável está na função, mas não está sendo usada.
Se antes dava falta da variável, e agora diz que não está em uso.... provavelmente você apagou o que estava lá antes.

Eu também demorei pra entender codeblock.
Considere que é uma função sem nome.

{ | a, b | a * b }

Isso seria meio equivalente a:

Código: Selecionar todos

FUNCTION SemNome( a, b )
   RETURN a * b
É como se estivesse criando uma função sem nome, o próprio codeblock vai ser a função.

Nota: ainda bem que está usando compilação -w3 -es2, senão não teria esses alertas, e só veria erro depois na execução.
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

cor no tbrowse

Mensagem por alxsts »

Olá!
cjp escreveu:...Aqui que não estou entendendo. Essa tua forma de passar parâmetros (acho que vcs chamam de codeblock, é isso?) é que eu não entendo...
Não entendo o | usado aí, nem as chaves....
Isto me dá um total nó na cabeça....
...indicação de algum livro ou coisa assim em que eu pudesse estudar melhor isto...
alxsts escreveu:...Ainda nos anos 1990 li o livro Programacao Orientada ao Objeto Em Clipper 5.0 - Marcelo Ferreira e Flavio J. Jarabeck Este livro mudou totalmente a minha forma de programar em Clipper 5. Foi onde aprendi TBrowse e code blocks. Neste link tem um exemplar a venda por 10 reais mais o frete.
Acho incrível esta dúvida ainda estar rodando em círculos desde 22/07/2021... e sem progresso. Acho que só alguém conectando aí e fazendo pra você...

Disse que comprou o livro... por que não o lê? Ensina quase tudo sobre code blocks. Não são os programadores que chamam de code block. É a linguagem que define este nome. Se tivesse estudado, já saberia pelo menos o formato de um code block...

Postei um exemplo simples e funcional, que depois foi completamente descaracterizado e transformado em algo mais complexo. Você adotou a segunda opção. Ora, se não consegue entender as coisas mais simples, por que escolher as mais complicadas? Quando postei meu exemplo, ainda escrevi: "Segue o código. Estude, adapte à tua necessidade e informe se funcionou.". Se você continuar no chute, colando código pra ver se funciona, vai ser difícil... a solução é estudar.

Code blocks realmente são bem abstratos, difíceis de entender se não estudar. Sugiro que você estude o assunto e faça um tutorial do uso e depois poste no fórum para ajudar quem ainda não entende do assunto.

Espero que não se importe com a crítica pois ela é construtiva e tem a intenção de te ajudar a mudar o teu patamar de conhecimento e passar de alguém que depende de uma "muleta" chamada fórum e passar a ajudar os que conhecem um pouco menos.
[]´s
Alexandre Santos (AlxSts)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

cor no tbrowse

Mensagem por cjp »

A compilação está dizendo que a variável está na função, mas não está sendo usada.
Se antes dava falta da variável, e agora diz que não está em uso.... provavelmente você apagou o que estava lá antes.
Realmente, eu tinha apagado para poder compilar meu sistema. Recoloquei.

Ainda deu dois erros na compilação, em obrowse e nkey (vide imagem anexa). Troquei obrowse por otbrowse e comentei nkey, para poder compilar. Compilou, mas deu o seguinte erro na execução (creio que pela falta de nkey, ou por eu ter colocado essa parte adicional no lugar errado), que não sei resolver:
Error BASE/1004 Método não exportado: STABLE
Posto a função da forma como está agora, para vc me corrigir se for possível:

Código: Selecionar todos

/*
Exibição das linhas de um Record set ADO usando TBrowseDB()
Alexandre Santos
Compilar: Hbmk2 tbado hbwin.hbc
*/

#pragma -w3
#pragma -es2
#include "tbrowse.ch"
#include "inkey.ch"
#include "setcurs.ch"
#include "hbgtinfo.ch"
#include "box.ch"
#include "set.ch"
#include "hbclass.ch"

REQUEST HB_CODEPAGE_PTISO

   
FUNCTION Tbrowseado(cSql)
   LOCAL oRs, oTBrowse
   LOCAL oCN :=ConexaoMySQL( "mysql.xxx.com.br", "xxx", "xxx", "xxx" )
   local tela :=savescreen(0,0,maxrow(),maxcol())

   Set( _SET_CODEPAGE, "PTISO" )
   Set( _SET_EVENTMASK, INKEY_ALL + HB_INKEY_GTEVENT - INKEY_MOVE )
   SET DATE BRITISH

*   hb_gtInfo( HB_GTI_WINTITLE , "TBrowse colorBlock() com Acesso ao MySQL via ADO" )
*   hb_gtInfo( HB_GTI_FONTNAME , "Lucida Console" )
   SetColor( "W/B","N/W",,,"W/B" )
   CLS

   oCn:open()

   DO WHILE .T.
      @ 4, MaxRow() SAY Padr( "Obtendo informações...", 22 ) COLOR "W/W"
      oRs := oCn:Execute( cSql )
      SuperADO( oRs )
      IF oRs == NIL .OR. oRs:Eof()
         Hb_Alert( "Não foi possível obter dados para exibição",, "W+/B" )
         EXIT
      ENDIF
      oTBrowse := { ;
         { "DATA",       { || oRs:ToDate( "DATA" ) } }, ;
         { "HORA",       { || oRs:ToString( "HORA", 8 ) } }, ;
         { "COMIDA",     { || oRs:ToString( "COMIDA", 30 ) }, { | x | If( At( "TOTAL ", Upper( x ) ) > 0, { 5, 5 }, { 1, 2 } ) } }, ;
         { "QUANTIDADE", { || oRs:ToString( "QUANTIDADE", 20 )  } }, ;
         { "PONTOS",     { || oRs:ToStr( "PONTOS", 6 ) } }, ;
         { "ID",         { || oRs:ToStr( "ID", 6 ) } } }

      tBrowseADO2( oRs, oTBrowse, { | oTBrowse, nKey | TestUser( oRs, oTBrowse, nkey ) } )
*      tBrowseADO2( oRs, oTBrowse )
*      IF Alert( "Fechar?", { " Não ", " Sim " }, "W+/N" ) == 2
         oRs:Close()
         EXIT
*      ENDIF
*      EXIT
   ENDDO
   oCn:close()

   rest scre from tela
RETURN Nil


FUNCTION tBrowseADO2( oRs, oTBrowse, TestUser )
   LOCAL oTbr, nKey, oColumn, aItem, nLen, I

   oTbr := TBrowse():new( 02, 3, MaxRow() - 3, MaxCol() - 3 )
   oTbr:headSep       := Chr(196) + Chr(194) + Chr(196)
   oTbr:colSep        := " " + Chr(179) + " "
   oTbr:footSep       := Chr(196) + Chr(193) + Chr(196)
   oTbr:goTopBlock    := { || oRs:moveFirst() }
   oTbr:goBottomBlock := { || oRs:moveLast() }
   oTbr:skipBlock     := { |n| ADORecordSetSkipper( oRs,n ) }
   oTbr:colorSpec     := "W/B,W+/N,N/W*,W+/R,R+/B,R/W*"

   IF oTBrowse == Nil
      // create TBColumn objects and add them to TBrowse object - zero based
      nLen := oRs:fields():count() - 1
      FOR i := 0 TO nLen
         // add code block for individual columns of the record set
         oColumn := TBColumnNew( oRs:fields(i):name(), ADORecordSetFieldBlock( oRs, i ) )
         // Column widths. For some data types, definedSize returns -1...
         oColumn:width := Max( Min( oRs:Fields(i):definedSize,50), Len( oRs:fields(i):name ) ) + 5
         // Add new column to TBrowse
         oTbr:addColumn( oColumn )
      NEXT
   ELSE
      FOR EACH aItem IN oTBrowse
         oColumn := TBColumnNew( aItem[1], aItem[2] )
         IF Len( aItem ) > 2
            oColumn:ColorBlock := aItem[3]
         ENDIF
         oTbr:AddColumn( oColumn )
      NEXT
   ENDIF

   // border
   DispBox( oTbr:nTop - 1, oTbr:nLeft - 1, oTbr:nBottom + 3, oTbr:nRight + 1, B_SINGLE )

   DO WHILE .T.

IF oTbr:applyKey( nKey ) == TBR_EXIT
   EXIT
ENDIF
IF TestUser != NIL
   DO WHILE ! oTBrowse:Stable
      oTBrowse:Stabilize()
   ENDDO
   Eval( TestUser, oTBrowse, oRs, nKey )
   oTBrowse:RefreshAll()
ENDIF
*nKey := 0 
      oTbr:refreshCurrent()
      DO WHILE ! oTbr:Stable()
         oTbr:Stabilize()
      ENDDO
      // Paint TBrowse current line...
      //oTbr:ColorRect( { oTbr:RowPos, oTbr:LeftVisible, oTbr:RowPos, oTbr:RightVisible }, { 2, 1 } )

      @ MaxRow() - 1, 3 SAY Padr( " Registro " + Ltrim( Str( oRs:AbsolutePosition ) ) + " de " + Ltrim( Str( oRs:recordCount ) ) + " ", 20 ) COLOR "N/W"

      nKey := Inkey(0)

      IF oTbr:applyKey( nKey ) == TBR_EXIT
         EXIT
      ENDIF
   ENDDO

RETURN Nil

STATIC FUNCTION ADORecordSetFieldBlock( oRs, i, xVal )
   LOCAL bRet

   IF xVal == NIL
      IF oRs:Eof()
         bRet := { || Space( Max( oRs:Fields( i ):DefinedSize , Len( oRs:Fields( i ):name ) ) ) }
      ELSE
         bRet := { || oRs:Fields( i ):value }
      ENDIF
   ELSE
      bRet := { |xVal| oRs:Fields( i ):Value := xVal }
   ENDIF

RETURN bRet

STATIC FUNCTION ADORecordSetSkipper(oRecordSet,nSkip)
   LOCAL nRec := oRecordSet:AbsolutePosition

   IF ! ( oRecordSet:eof )
      oRecordSet:Move( nSkip )

      IF oRecordSet:eof
         oRecordSet:moveLast()
      ENDIF

      IF oRecordSet:bof
         oRecordSet:moveFirst()
      ENDIF
   ENDIF

RETURN (oRecordSet:AbsolutePosition - nRec)

   
STATIC FUNCTION ConexaoMySQL( cServer, cDatabase, cUser, cPassword )

   LOCAL oCn := win_OleCreateObject("ADODB.Connection")

   oCn:ConnectionString := "DRIVER={MariaDB ODBC 3.1 Driver};TCPIP=1;SERVER=" + ;
      cServer + ";Database=" + cDatabase + ";UID=" + cUser + ";PWD=" + cPassword + ";PORT=3306"
   oCn:CursorLocation   := 3

RETURN oCn


FUNCTION SuperADO( oRs )

   __ObjAddMethod( oRs, "TOSTRING", @ADOToString() )
   __ObjAddMethod( oRs, "TONUMBER", @ADOToNumber() )
   __ObjAddMethod( oRs, "TODATE",   @ADOToDate() )
   __ObjAddMethod( oRs, "TOSTR",    @ADOToStr() )

RETURN Nil

STATIC FUNCTION ADOToDate( cField )
   LOCAL x, Self := QSelf()

   x := ::Fields( cField ):Value
   IF ValType( x ) != "D"
      x := Ctod("")
   ENDIF
RETURN x

STATIC FUNCTION ADOToString( cField, nLen )
   LOCAL x, Self := QSelf()

   x := ::Fields( cField ):Value
   IF ValType( x ) != "C"
      x := ""
   ENDIF
   IF nLen != Nil
      x := Pad( x, nLen )
   ENDIF
RETURN x

STATIC FUNCTION ADOToNumber( cField )
   LOCAL x, Self := QSelf()

   x := ::Fields( cField ):Value
   IF ValType( x ) != "N"
      x := 0
   ENDIF

RETURN x

STATIC FUNCTION ADOToStr( cField, nLen, nDec )
   LOCAL x, Self := QSelf()

   x := ::Fields( cField ):Value
   IF ValType( x ) != "N"
      x := 0
   ENDIF
   IF nLen == Nil
      x := Str( x )
   ELSEIF nDec == Nil
      x := Str( x, nLen )
   ELSE
      x := Str( x, nLen, nDec )
   ENDIF

RETURN x

STATIC FUNCTION TestUser( oRs, oTBrowse, nKey )
   IF nKey == K_F5
      Alert( "Foi teclado F5" )
      Alert( oRs:ToString( "COMIDA" ) )
     oTBrowse:RefreshAll()
   ENDIF

RETURN 1


Eu também demorei pra entender codeblock.
Considere que é uma função sem nome.

{ | a, b | a * b }

Isso seria meio equivalente a:

Expandir visualizacaoVer codigo
1 FUNCTION SemNome( a, b )
2 RETURN a * b
3


É como se estivesse criando uma função sem nome, o próprio codeblock vai ser a função.

Entendi esta parte. Pela primeira vez eu vejo uma explicação simples sobre codeblock.

Acho incrível esta dúvida ainda estar rodando em círculos desde 22/07/2021... e sem progresso. Acho que só alguém conectando aí e fazendo pra você...

Disse que comprou o livro... por que não o lê? Ensina quase tudo sobre code blocks. Não são os programadores que chamam de code block. É a linguagem que define este nome. Se tivesse estudado, já saberia pelo menos o formato de um code block...

Postei um exemplo simples e funcional, que depois foi completamente descaracterizado e transformado em algo mais complexo. Você adotou a segunda opção. Ora, se não consegue entender as coisas mais simples, por que escolher as mais complicadas? Quando postei meu exemplo, ainda escrevi: "Segue o código. Estude, adapte à tua necessidade e informe se funcionou.". Se você continuar no chute, colando código pra ver se funciona, vai ser difícil... a solução é estudar.

Code blocks realmente são bem abstratos, difíceis de entender se não estudar. Sugiro que você estude o assunto e faça um tutorial do uso e depois poste no fórum para ajudar quem ainda não entende do assunto.

Espero que não se importe com a crítica pois ela é construtiva e tem a intenção de te ajudar a mudar o teu patamar de conhecimento e passar de alguém que depende de uma "muleta" chamada fórum e passar a ajudar os que conhecem um pouco menos.
Comprei o livro, e estou lendo. Mas o livro tem 334 páginas. Gostaria muito de lê-lo num só dia (já foi tempo em que eu cheguei a ler livros desse tamanho num só dia), mas infelizmente meu trabalho não me permite. Não sou profissional da área da informática. Só consigo mexer nisso esta hora (meia noite em diante). Então, infelizmente, vou levar muitos dias, talvez meses, para terminar de ler o livro.
E não creio que apenas lendo o livro eu vá conseguir entender tudo de code block e tbrowse, a ponto de não precisar mais de ajuda e começar a ajudar os outros nessa área. Até chegar a esse ponto, creio que ainda vou precisar de muita ajuda.
O exemplo que vc postou funcionou bem, mas, ao colocar no meu sistema (que está realmente muito confuso), não funcionou.
Aceito sua crítica e te entendo. Não quero incomodar ninguém. Mas acho que o espírito do fórum é este: quem sabe mais ajuda quem está aprendendo. Não quero que ninguém faça pra mim, quero aprender. Mas é difícil aprender coisa difícil assim sem ajuda. Então, sigo contando com a vossa ajuda. Se não puderem me ajudar, compreendo, paciência.
Anexos
tela.png
Editado pela última vez por JoséQuintas em 03 Set 2021 13:10, em um total de 1 vez.
Razão: Editado pra remover informações pessoais
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

cor no tbrowse

Mensagem por JoséQuintas »

Troque o nome das variáveis.
Antes não usava lista de campos, e agora tá confundindo tudo.

Troque o nome da lista, que é oTBrowse pra aCamposList
Troque o nome do browse, que é oTbr pra oBrowse

A partir daí, corrija aonde está usando variável errada.
A lista de campos é usada pra criar o browse, e nada mais. ( o que hoje está com o nome de oTBrowse )
Todo restante é oBrowse.( que hoje está com o nome otbr )

Mudando o nome, não confunde mais depois.

O nome atual oTBrowse está te confundindo, porque está achando que tem alguma coisa a ver com o browse.
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