ROTINA PARA FLEXGRID SETAS
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.
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.
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.
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?
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:
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:
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:
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
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.
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