Rotinas pra browse
Enviado: 30 Out 2018 10:49
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....
Esta outra um browse mais prático.
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
Criei pra tapar buraco no Flagship, e até que ficaram interessantes..... rs
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
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
É 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 )