Esta primeira apenas trata as teclas padrão.
Permite pelo menos eliminar repetição da parte comum.
Lá na sua rotina de browse....
DO WHILE .T.
DO CASE
CASE BrowseNavigate( oBrowse, @nKey )
CASE nKey == K_ESC
EXIT
ENDCASE
ENDDO
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.
LOCAL oTBrowse := { ;
{ "codigo", { || código } }, ;
{ "nome", { || nome } } }
MyBrowse( 0, 0, 24, 79, oTBrowse )
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
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