Problema no tbrowse
Enviado: 26 Dez 2015 00:39
O tbrowse está funcionando.
Numa máquina lenta, a atualização de tela acaba "comendo" letras da digitação.
Já testei algumas coisas mas não deu certo.
Por exemplo, oBrowse:Invalidate(), mas quando tecla ENTER, está posicionado em registro errado.
Durante o post vi duas possibilidades:
- Talvez usar Nextkey() em algum ponto
- Quando estabilizado, justamente o novo Inkey() acaba "comendo" a letra do inkey() anterior
A dificuldade maior agora é conseguir fazer um tbrowse lento pra poder testar.
Talvez a base de telefones de SP, com alguns milhões de registros, e com set filter....
Numa máquina lenta, a atualização de tela acaba "comendo" letras da digitação.
Já testei algumas coisas mas não deu certo.
Por exemplo, oBrowse:Invalidate(), mas quando tecla ENTER, está posicionado em registro errado.
Código: Selecionar todos
DO WHILE lmore
oBrowse:RefreshCurrent()
//------------ aqui a aceleração, pra só atualizar a tela enquanto não digitar nada
nkey := 0
DO WHILE nkey == 0 .AND. .NOT. oBrowse:Stable
oBrowse:Stabilize()
nkey := Inkey()
ENDDO
//-------------------------------
//------------ e aqui só pede pra digitar se estiver estabilizado - se foi teclado algo durante a atualização de tela anterior já prossegue
IF oBrowse:Stable
oBrowse:RefreshCurrent()
DO WHILE .NOT. oBrowse:Stabilize() // nem sei se precisaria, já que só entra aqui se estiver estabilizado
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
nkey := Inkey(600)
IF nKey == 0
KEYBOARD Chr( K_ESC )
ENDIF
ENDIF
//------------------------------------------------------------
IF ( mAcao := SetKey( nKey ) ) != NIL
Eval( mAcao, ProcName(), ProcLine(), ReadVar() )
ENDIF
//Traduz Mouse
nMRow := MROW()
nMCol := MCOL()
DO CASE
CASE nKey == K_RBUTTONDOWN
KEYBOARD Chr( K_ESC )
LOOP
CASE nKey == K_LBUTTONDOWN
FOR nCont = 1 TO Len( aHotKeys )
IF nMRow >= aHotKeys[ nCont, 1 ] .AND. nMRow <= aHotKeys[ nCont, 3 ] .AND. nMCol >= aHotKeys[ nCont, 2 ] .AND. nMCol <= aHotKeys[ nCont, 4 ]
nKey := aHotKeys[ nCont, 6 ]
EXIT
ENDIF
NEXT
ENDCASE
DO CASE
CASE nKey > 999
DO CASE
CASE mBrzMove( oBrowse, nMRow, nMCol, nTop + 1, nLeft + 1, nBottom - 1, nRight - 1 ) // aceleração de mouse
CASE mBrzClick( oBrowse, nMRow, nMCol ) // click no tbrowse atual // click do mouse
KEYBOARD Chr( K_ENTER )
nKey := Inkey(0)
ENDCASE
CASE nkey == K_DOWN ; oBrowse:Down() ; LOOP
CASE nkey == K_PGDN ; oBrowse:PageDown() ; LOOP
CASE nkey == K_PGUP ; oBrowse:PageUp() ; LOOP
CASE nkey == K_CTRL_PGDN ; oBrowse:GoBottom() ; LOOP
CASE nkey == K_UP ; oBrowse:Up() ; LOOP
CASE nkey == K_CTRL_PGUP ; oBrowse:GoTop() ; LOOP
CASE nkey == K_HOME ; oBrowse:GoTop() ; LOOP
CASE nkey == K_END ; oBrowse:GoBottom() ; LOOP
CASE nkey == K_RIGHT ; oBrowse:Right() ; LOOP
CASE nkey == K_LEFT ; oBrowse:Left() ; LOOP
//------------------------ este bloco é onde causa o problema em máquina lenta
CASE ( nkey > 31 .AND. nkey <= 127 ) .AND. ( .NOT. Empty( OrdKey() ) .AND. ValType( &( OrdKey() ) ) == "C" )
IF dbSeek( cUserScope + Chr( nkey ) )
cUserScope += Chr( nkey )
ELSEIF dbSeek( cUserScope + Upper( Chr( nkey ) ) )
cUserScope += Upper( Chr( nkey ) )
ELSE
MsgWarning( "Não Localizado texto iniciando com " + cUserScope + Chr( nkey ) + "!" )
KEYBOARD Chr( 205 )
Inkey(0)
ENDIF
dbSeek( cUserScope )
oBrowse:RefreshAll()
LOOP
//------------- termina aqui
//------------ já este bloco funciona perfeito, ao teclar back space, e a lógica é a mesma SEEK + refreshall
CASE nkey = K_BS
cUserScope := left( cUserScope, Max( Len( cUserScope ) - 1, Len( cDefaultScope ) ) )
IF .NOT. Empty( OrdKey() ) .AND. ValType( &( OrdKey() ) ) == "C"
dbSeek( cUserScope )
oBrowse:RefreshAll()
ENDIF
LOOP
// ----------termina aqui
...
ENDDO
- Talvez usar Nextkey() em algum ponto
- Quando estabilizado, justamente o novo Inkey() acaba "comendo" a letra do inkey() anterior
A dificuldade maior agora é conseguir fazer um tbrowse lento pra poder testar.
Talvez a base de telefones de SP, com alguns milhões de registros, e com set filter....