Página 1 de 1

Rotinas pra browse

Enviado: 30 Out 2018 10:49
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

Rotinas pra browse

Enviado: 30 Out 2018 11:20
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

Rotinas pra browse

Enviado: 30 Out 2018 11:32
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

Rotinas pra browse

Enviado: 30 Out 2018 12:09
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.

Rotinas pra browse

Enviado: 30 Out 2018 21:30
por JoséQuintas
É o visual do tbrowse normal. Isso é pra facilitar código fonte, e não pra alterar visual.