A rotina pra array é a mesma pra DBF, o que altera são as rotinas de posicionamento.
Peguei dos fontes em Flagship, um fonte qualquer.
ToBrowse() e BrowseNavigate() é a parte genérica pra qualquer browse, e pra deixar tudo no mesmo padrão.
Pra estas, tanto faz se é dbf ou array.
O Browse do array
Código: Selecionar todos
STATIC FUNCTION MostDaT( aBrowList )
LOCAL n_lin := 4
LOCAL nkey := 0
LOCAL nBrowIndex := 1 // INDEX in the array
LOCAL oMyBrowse := TBROWSENEW (n_lin,30,n_lin+16,78) // create TBrowse object
LOCAL oTBrowse
* SetColor( cmens )
Scroll( n_lin,30,n_lin+16,78 )
oTBrowse := { ;
{ "Nota", {|| aBrowList[nBrowIndex][1]} }, ;
{ "Valor ", {|| aBrowList[nBrowIndex][2] } }, ;
{ "Emissao", {|| aBrowList[nBrowIndex][3]} }, ;
{ "Observacao ", {|| aBrowList[nBrowIndex][4] } } }
ToBrowse( oTBrowse, oMyBrowse )
oMyBrowse:SKIPBLOCK := { |input, temp| temp := nBrowIndex, ;
nBrowIndex := MAX(1, MIN(Len(aBrowList), ;
nBrowIndex + input)), nBrowIndex - temp }
DO WHILE .T.
Mensagem( " <F2 Produtos> <F4 Duplicatas> <F6 Periodo> <ESC Sair>" )
oMyBrowse:ForceStable()
DO CASE
CASE BrowseNavigate( oMyBrowse, @nKey )
CASE nkey == K_ESC // sai
Scroll( n_lin,30,n_lin+16,78 )
EXIT
CASE nKey == K_F2 // Produtos
Prodnota( aBrowList[ nBrowIndex ][ 1 ] )
oMyBrowse:refreshAll()
CASE nKey == K_F4 // Duplicatas
f_DuplCl( aBrowList[ nBrowIndex ][ 1 ] )
CASE nKey == K_F6 // Periodo
oMyBrowse:refreshAll()
ENDCASE
ENDDO
RETURN NIL
A configuração default, tanto faz dbf ou array
Código: Selecionar todos
FUNCTION Tobrowse( oTBrowse, oMyBrowse )
LOCAL nCont, oColumn
oMyBrowse:headsep := "-"
oMyBrowse:colsep := " "
oMyBrowse:ColorSpec := SetColTBrowse()
FOR nCont = 1 TO Len( oTBrowse )
oColumn := TBColumnNew( oTBrowse[ nCont, 1 ], oTBrowse[ nCont, 2 ] )
IF Len( oTBrowse[ nCont ] ) > 2
oColumn:ColorBlock := oTBrowse[ nCont, 3 ]
ENDIF
oMyBrowse:AddColumn( oColumn )
NEXT
RETURN NIL
A navegação, tanto faz dbf ou array
Código: Selecionar todos
FUNCTION BrowseNavigate( oBrowse, nKey )
LOCAL lNavigate := .T.
hb_Default( @nKey, 0 )
DO WHILE ! oBrowse:Stable
oBrowse:Stabilize()
ENDDO
//oBrowse:RefreshCurrent()
oBrowse:ColorRect( { oBrowse:RowPos, 1, oBrowse:RowPos, oBrowse:ColCount }, { 3, 3 } ) // linha está com o cursor
oBrowse:ColorRect( { oBrowse:RowPos, oBrowse:ColPos, oBrowse:RowPos, oBrowse:ColPos }, { 2, 2 } ) // linha/coluna está com o cursor
nKey := Inkey(0)
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:GoTop(); oBrowse:RefreshAll() // oBrowse:Home()
CASE nKey == K_END ; oBrowse:GoBottom(); oBrowse:RefreshAll() // oBrowse:End()
CASE nKey == K_PGUP ; oBrowse:pageup(); oBrowse:RefreshAll()
CASE nKey == K_PGDN ; oBrowse:pagedown(); oBrowse:RefreshAll()
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
oBrowse:RefreshCurrent()
DO WHILE ! oBrowse:Stable
oBrowse:Stabilize()
ENDDO
oBrowse:ColorRect( { oBrowse:RowPos, 1, oBrowse:RowPos, oBrowse:ColCount }, { 3, 3 } ) // linha está com o cursor
oBrowse:ColorRect( { oBrowse:RowPos, oBrowse:ColPos, oBrowse:RowPos, oBrowse:ColPos }, { 2, 2 } ) // linha/coluna está com o cursor
RETURN lNavigate