ROTINA PARA FLEXGRID SETAS

LUIS.HERRERA 14/07/2005 16:41:23
#94163
Alguém aqui já fez uma rotina para percorrer as linhas de um MSFlexGrid com as teclas de setas (Up e Down)?

Encontrei um fragmento de código para identificar o pressionar das teclas no Grid, mas havia um comentário que poderia só funcionar no Windows XP - SP2 já que não foi testado em outras versões do windows.

Estou testando no Windows XP - SP1, mas ao fechar o aplicativo ele continua em execução, fecha os forms mas o ambiente do VB não recebe o foco design time. Tenho de clicar no END para finalizar.
 Em um módulo BAS:
'aqui é a chamada da API para capturar as teclas
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Const VK_DOWN = &H28
Public Const VK_LEFT = &H25
Public Const VK_RIGHT = &H27
Public Const VK_UP = &H26

'No formulário coloquei um MSFlexGrid com nome grid1
Private Sub grid1_GotFocus()
'reset the key states
Call GetAsyncKeyState(VK_UP)
Call GetAsyncKeyState(VK_DOWN)
Call GetAsyncKeyState(VK_UP)
Call GetAsyncKeyState(VK_UP)
RunLoop
End Sub

Private Sub grid1_LostFocus()
bExitLoop = True
End Sub


Dim bExitLoop As Boolean
Private Sub RunLoop()
Do
If GetAsyncKeyState(VK_UP) And 1 Then msgbox "Tecla UP Pressionada"
If GetAsyncKeyState(VK_DOWN) And 1 Then msgbox "Tecla DOWN Pressionada"
If GetAsyncKeyState(VK_LEFT) And 1 Then msgbox "Tecla LEFT Pressionada"
If GetAsyncKeyState(VK_RIGHT) And 1 Then msgbox "Tecla RIGHT Pressionada"
DoEvents
Sleep 25
DoEvents
Loop Until bExitLoop
bExitLoop = False
End Sub


Será que tenho de colocar Sleep = 0 para finalizar o processo ou o que pode estar pendente para finalizar?
Nota: O sistema estava perfeito antes de incluir esse código, então é algo nele que não finaliza corretamente.

Não estou conseguindo também percorrer as linhas no grid.
JEAN.JEDSON 14/07/2005 19:01:46
#94188
bem... peguei um banco de dados meu, fiz um projeto que carregasse os dados dele em um FlexGrid... por padrão ele já funcionou com as teclas up e down - sem nenhum código auxiliar como este acima... o que vc quer fazer exatamente?
LUIS.HERRERA 15/07/2005 13:40:29
#94339
Jean eu não uso a propriedade HigtLight do Flexgrid, pois o código para zebrar causa problemas com o padrão do componente. Além disso esse recurso do componente não seleciona a linha completa, a primeira coluna fica sem ser selecionada e isso é ruim.

Consegui encontrar alguns erros no código e implementar essa mudança de linhas, mas falta 1 coizinha para ficar 100%:

Quando vou pressionando seta para baixo ou para cima, não estou conseguindo dar o efeito de deslocamento, ou seja, pular uma linha para baixo ou para cima tudo.

Se usar a linha abaixo:
flexgridConsulta.TopRow = flexgridConsulta.RowSel

isso faz com que a linha selecionada fique sempre no topo da área visível, mas gostaria de simular as linhas subindo ou descendo uma a uma como ocorre nas planilhas ou outros componentes deste tipo.

Se fizer como implementei no código abaixo:

' tecla UP
If flexgridConsulta.TopRow > 1 Then
flexgridConsulta.TopRow = flexgridConsulta.TopRow - 1
End If

' tecla DOWN
flexgridConsulta.TopRow = flexgridConsulta.TopRow + 1

Se a linha selecionada estiver no topo, tanto faz se pressionar Down ou UP as linha rolarão, mas a que está selecionada sempre fica no topo.
Agora se a selecionada estiver na última linha visível, também tanto faz se pressionar Down ou UP as linhas também rolarão, mas a que está visível agora fica sempre na parte de baixo.

Como poderia resolver isso para deslocar normal, só ficar no topo se chegar até ele e só ficar no parte inferior se chegar até ela?

Meu código para deslocamento está assim:

Private Sub RunLoop()
Do
If GetAsyncKeyState(VK_UP) And 1 Then
If flexgridConsulta.RowSel > 0 Then
flexgridConsulta.RowSel = flexgridConsulta.RowSel - 1
End If
If flexgridConsulta.TopRow > 1 Then
flexgridConsulta.TopRow = flexgridConsulta.TopRow - 1
End If
flexgridConsulta_Click
End If
If GetAsyncKeyState(VK_DOWN) And 1 Then
If flexgridConsulta.RowSel < flexgridConsulta.Rows - 1 Then
flexgridConsulta.RowSel = flexgridConsulta.RowSel + 1
End If
flexgridConsulta.TopRow = flexgridConsulta.TopRow + 1
flexgridConsulta_Click
End If
DoEvents
Sleep 25
DoEvents
Loop Until bExitLoop
bExitLoop = False
End Sub
LUIS.HERRERA 15/07/2005 16:41:25
#94380
Bem pessoal eu fiz um exemplo que postei aqui na Atualizações, mas tem que esperar ser aprovado. Então publiquei nesse link para quem puder me auxiliar a identificar os problemas no código. link: http://paginas.terra.com.br/informatica/lhflashdatabase/FlexGrid_Setas.zip

Problemas:
1) Ocorre que ao clicar no Nome (Ana Paulo) o primeiro da lista e pressionar a seta para baixo (Down) ele ordena as colunas como se estivesse clicando no cabeçalho da coluna e não deslocando a seleção para baixo. De fizer a seleção novamente ou tentar pressionar a seta para cima então funciona.

O problema é que isso é intermitente, uma hora funciona outra não na primeira vez que o form é aberto e não encontro o motivo.

2) Ao pressionar o seta down ( para baixo), ela não chega até a última linha para só depois começar a rolagem do grid, já na penúltima linha a rolagem começa.

3) O mesmo ocorre para a seta UP (para cima), as vezes ao chegar na terceira linha a rolagem já inicia e as vezes é na segunda linha, nunca se inicia ao chegar no topo da lista que seria o correto.

O último problema só está ocorrendo no meu sistema. Ao manter a tecla Up ou Down pressionada direto, a rolagem é mais rápida que a atualização da seleção da linha e a linha selecionada some do grid, ficando somente zebrado. Como meu sistema tem várias colunas e dados que são carregados do DB, isso não ocorre nesse exemplo pois incluí somente 3 colunas e poucos dados, então aparentemente não ocorre.

Agradeço se alguém puder me ajudar.
Tópico encerrado , respostas não são mais permitidas