Rotinas pra browse

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

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

Rotinas pra browse

Mensagem por JoséQuintas »

Por causa do FlagShip, acabei criando algumas rotinas auxiliares pra browse.

Esta primeira apenas trata as teclas padrão.
Permite pelo menos eliminar repetição da parte comum.
Lá na sua rotina de browse....

Código: Selecionar todos

DO WHILE .T.
   DO CASE
   CASE BrowseNavigate( oBrowse, @nKey )
   CASE nKey == K_ESC
      EXIT
   ENDCASE
ENDDO

Código: Selecionar todos

FUNCTION BrowseNavigate( oBrowse, nKey )

   LOCAL lNavigate := .T.

   DO WHILE ! oBrowse:Stabilize()
      nKey := Inkey()
      IF nKey != 0
         EXIT
      ENDIF
   ENDDO
   IF oBrowse:Stable
      nKey := Inkey(0)
   ENDIF
   DO CASE
   CASE nKey == K_UP         ; oBrowse:up()
   CASE nKey == K_DOWN       ; oBrowse:down()
   CASE nKey == K_LEFT       ; oBrowse:left()
   CASE nKey == K_RIGHT      ; oBrowse:right()
   CASE nKey == K_HOME       ; oBrowse:home()
   CASE nKey == K_END        ; oBrowse:end()
   CASE nKey == K_PGUP       ; oBrowse:pageup()
   CASE nKey == K_PGDN       ; oBrowse:pagedown()
   CASE nKey == K_CTRL_PGUP  ; oBrowse:gotop(); oBrowse:RefreshAll()
   CASE nKey == K_CTRL_PGDN  ; oBrowse:gobottom(); oBrowse:RefreshAll()
   CASE nKey == K_CTRL_HOME  ; oBrowse:panhome()
   CASE nKey == K_CTRL_END   ; oBrowse:panend()
   CASE nKey == K_CTRL_LEFT  ; oBrowse:panleft()
   CASE nKey == K_CTRL_RIGHT ; oBrowse:panright()
   OTHERWISE
      lNavigate := .F.
   ENDCASE

   RETURN lNavigate
Esta outra um browse mais prático.

Código: Selecionar todos

LOCAL oTBrowse := { ;
      { "codigo", { || código } }, ;
     { "nome", { || nome } } }
MyBrowse( 0, 0, 24, 79, oTBrowse )

Código: Selecionar todos

FUNCTION MyBrowse( nTop, nLeft, nBottom, nRight, oTBrowse, bFunction, obSetKey )

   LOCAL oBrowser, nKey, nCont, nItem

   IF pCount() < 7
      obSetKey := {}
   ENDIF
   IF pCount() < 6
      bFunction := NIL
   ENDIF
   oBrowser := TBrowseDb( nTop, nLeft, nBottom, nRight )
   oBrowser:HeadSep := Chr(194) + Chr(196)
   oBrowser:ColSep  := Chr(179)
   FOR nCont = 1 TO Len( oTBrowse )
      oBrowser:AddColumn( TBColumnNew( oTBrowse[ nCont, 1 ], oTBrowse[ nCont, 2 ] ) )
   NEXT
   AAdd( obSetKey, { K_UP,         { || oBrowser:Up() } } )
   AAdd( obSetKey, { K_DOWN,       { || oBrowser:Down() } } )
   AAdd( obSetKey, { K_LEFT,       { || oBrowser:Left() } } )
   AAdd( obSetKey, { K_RIGHT,      { || oBrowser:Right() } } )
   AAdd( obSetKey, { K_HOME,       { || oBrowser:Home() } } )
   AAdd( obSetKey, { K_END,        { || oBrowser:End() } } )
   AAdd( obSetKey, { K_PGUP,       { || oBrowser:PageUp() } } )
   AAdd( obSetKey, { K_PGDN,       { || oBrowser:PageDown() } } )
   AAdd( obSetKey, { K_CTRL_PGUP,  { || oBrowser:GoTop(), oBrowser:RefreshAll() } } )
   AAdd( obSetKey, { K_CTRL_PGDN,  { || oBrowser:GoBottom(), oBrowser:RefreshAll() } } )
   AAdd( obSetKey, { K_CTRL_HOME,  { || oBrowser:GoTop(), oBrowser:RefreshAll() } } )
   AAdd( obSetKey, { K_CTRL_END,   { || oBrowser:GoBottom(), oBrowser:RefreshAll() } } )
   AAdd( obSetKey, { K_CTRL_LEFT,  { || oBrowser:PanLeft() } } )
   AAdd( obSetKey, { K_CTRL_RIGHT, { || oBrowser:PanRight() } } )
   DO WHILE .T.
      DO WHILE ! oBrowser:Stable() .AND. nKey == 0
         nKey := Inkey()
         oBrowser:Stabilize()
      ENDDO
      IF nKey == 0
         nKey := Inkey(0)
      ENDIF
      DO CASE
      CASE ( nItem := AScan( obSetKey, { | e | e[ 1 ] == nKey } ) ) != 0
         DO WHILE ! oBrowser:Stable()
            oBrowser:Stabilize()
         ENDDO
         Eval( obSetKey[ nItem, 2 ], oBrowser, nKey )
         oBrowser:RefreshAll()
      CASE nKey == K_ESC        ; EXIT
      CASE nKey == K_UP         ; oBrowser:Up()
      CASE nKey == K_DOWN       ; oBrowser:Down()
      CASE nKey == K_LEFT       ; oBrowser:Left()
      CASE nKey == K_RIGHT      ; oBrowser:Right()
      CASE nKey == K_HOME       ; oBrowser:Home()
      CASE nKey == K_END        ; oBrowser:End()
      CASE nKey == K_PGUP       ; oBrowser:PageUp()
      CASE nKey == K_PGDN       ; oBrowser:PageDown()
      CASE nKey == K_CTRL_PGUP  ; oBrowser:GoTop();    oBrowser:RefreshAll()
      CASE nKey == K_CTRL_PGDN  ; oBrowser:GoBottom(); oBrowser:RefreshAll()
      CASE nKey == K_CTRL_HOME  ; oBrowser:PanHome()
      CASE nKey == K_CTRL_END   ; oBrowser:PanEnd()
      CASE nKey == K_CTRL_LEFT  ; oBrowser:PanLeft()
      CASE nKey == K_CTRL_RIGHT ; oBrowser:PanRight()
      OTHERWISE
         IF bFunction != NIL
            DO WHILE ! oBrowser:Stable()
               oBrowser:Stabilize()
            ENDDO
            Eval( bFunction, oTBrowse, nKey )
            oBrowser:RefreshAll()
         ENDIF
      ENDCASE
   ENDDO

   RETURN NIL
Ponto interessante:

É melhor usar codeblock do que função. Porque? porque a função do codeblock pode ser STATIC, portanto, visível somente no módulo.
Também dá pra usar o bSetKey pra acionar rotinas conforme a tecla, e usar funções STATIC

Código: Selecionar todos

bSetKey := { ;
   { K_F2, { || incluir() } }, ;
   { K_F3, { || Alterar() } }, ;
   { K_F4, { || Excluir() } }, ;
   { K_F5, { || Imprimir() } } }
...
MyBrowse( 0, 0, 24, 79, oTBrowse, , bSetKey )
Criei pra tapar buraco no Flagship, e até que ficaram interessantes..... rs
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

Rotinas pra browse

Mensagem por alxsts »

Olá!

O Harbour encapsulou esta parte de teste de teclas em um método que não existia no Clipper: applyKey( nKey ). Isto não funciona em FlagShip?

Código: Selecionar todos

      // display browser and process user input
      DO WHILE .T.
         oTBrowse:forceStable()
         nKey := Inkey(0)

         IF oTBrowse:applyKey( nKey ) == TBR_EXIT
            EXIT
         ENDIF
      ENDDO
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Rotinas pra browse

Mensagem por alxsts »

Olá!

Eu já usava estes codeblocks no tempo do Clipper. Carregava um array com a associação de teclas e funções na variável cargo do TBrowse e verificava no momento em que o usuário digitava algo.:

Código: Selecionar todos

oBrowse:cargo := { ;
   { K_F2, { || incluir() } }, ;
   { K_F3, { || Alterar() } }, ;
   { K_F4, { || Excluir() } }, ;
   { K_F5, { || Imprimir() } } }
      . 
      .
      .
   IF oBrowse:Stable
      nKey := Inkey(0)
   ENDIF

   DO CASE

      CASE !Empty( oBrowse:cargo ) .And. Valtype( oBrowse:cargo ) == "A"
         AEval( oBrowse:cargo, { |e| IF( e[1] == nKey, Eval( e[2] ), NIL ) } )
      CASE nKey == K_UP         ; oBrowse:up()
      . 
      .
      .
   ENDCASE
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotinas pra browse

Mensagem por JoséQuintas »

O problema do Flagship é que não é tão compatível assim.
Classes não tem nada a ver com Harbour.
Rotina de erros, getsys, etc. nada a ver.
Então... só resta alguns quebra-galhos até trocar pra Harbour.
Nem mouse funciona no Flagship, e nem a tecla de backspace, só seta pra esquerda.
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

Rotinas pra browse

Mensagem por JoséQuintas »

É o visual do tbrowse normal. Isso é pra facilitar código fonte, e não pra alterar visual.
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