Código: Selecionar todos
DO WHILE lmore
oBrowse:RefreshCurrent()
// SetCursor( SC_NONE )
nkey := 0
DO WHILE nkey == 0 .AND. .NOT. oBrowse:Stable
oBrowse:Stabilize()
nkey := Inkey()
ENDDO
IF oBrowse:Stable
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 cursor
nkey := Inkey(600)
IF nKey == 0
KEYBOARD Chr( K_ESC )
LOOP
ENDIF
ENDIF
...
ENDDO
Por exemplo, o usuário teclando PageDown várias vezes seguidas.
Pra que atualizar a tela em cada PageDown, mais rápido atualizar só no final.
Explicando:
Código: Selecionar todos
nkey := 0
DO WHILE nkey == 0 .AND. .NOT. oBrowse:Stable
oBrowse:Stabilize()
nkey := Inkey()
ENDDO
Código: Selecionar todos
IF oBrowse:Stable
O próprio tbrowse já faz o controle sobre atualizar ou não a tela.
O que esta rotina faz é apenas não atrapalhar isso.
A tela representa vários registros do arquivo, precisa percorrer alguns registros pra fazer a atualização dela.
Não atualizar a tela economiza esse tempo de processamento.
E o registro atual não é definido pela tela, mas sim pelos controles internos do tbrowse.
Detalhe para a parte de código: oBrowse:ColorRect() .
Caso use a rotina padrão, troque por oBrowse:RefreshCurrent(), mas sem eliminar o inicial.
Só pra lembrar:
O primeiro oBrowse:RefreshCurrent() é pra DESMARCAR a posição anterior.
O segundo oBrowse:RefresshCurrent() ou oBrowse:ColorRect() é pra MARCAR a posição atual.
O erro nesses detalhes é que causam cores bagunçadas no tbrowse.
Nota:
Talvez no caso da navegação usar SET FILTER se perceba ainda mais, só testando.
Se pra atualizar a tela precisa navegar no arquivo, seriam alguns SKIP economizados.
Lembrando que a aceleração é no caso, por exemplo, de digitar PageUp/PageDown rápido, antes da tela ter sido completamente atualizada.
Nesse caso, já obederia o comando imediatamente, e a atualização de tela ficaria pra próxima pausa.
Nota2:
De quebra, o Inkey() ajuda a não mostrar o programa como travado em ambiente GUI.
E se for no Clipper, e usar OSLIB, pode ser interessante adicionar OL_Yield() no DO WHILE, já que libera tempo para o Windows acessar os dados em disco/na rede.
Em Clipper eu colocava OL_Yield() em todos os locais possíveis que poderiam ajudar o Windows, incluindo trocar Inkey() por MyInkey(), e a função já resolver tudo de uma vez.

