VB .NET - Gerenciando os eventos de teclado
Como você faria para detectar qual tecla foi pressionada em uma aplicação VB.NET ?
Se você conhece qualquer versão do Visual Basic anterior ao VB.NET , talvez tivesse a resposta na ponta da língua ... Mas vamos voltar ao VB.NET . Como você faria isto no VB.NET ?
Com certeza a primeira coisa que lhe viria a cabeça seria usar os eventos : KeyPress , KeyDown e KeyUp. Então , vamos recordar...
No VB 6.0 faríamos assim :
No caso do evento KeyPress usamos o parâmetro KeyAscII assim :
|
Nota: Podemos trocar a tecla pressionada por outra , como por exemplo , quando o usuário pressionar a tecla com o ponto para trocar pela virgula usamos o código : If KeyAscii = Asc(".") Then KeyAscii = Asc(",") . Podemos também evitar o sinal sonoro (beep) atribuindo o valor zero a keyAscii : Ex: KeyAscii = 0
No caso dos eventos KeyDown e KeyUp usamos o parâmetro KeyCode.
|
Então , como saber o código da tecla pressionada no VB.NET ?
Para fazer isto no VB.NET podemos usar a função ChrW ou o método ToChar da classe Convert além de usar a conversão para uma cadeia de caracteres usando a letra C depois da cadeia ( válido somente para as teclas normais), o código usado pode ser o seguinte :
If e.KeyChar =
Convert.ToChar(Keys.Return)
Then
If e.KeyChar =
ChrW(Keys.Return) Then
If e.KeyChar =
"."c Then
Nota :Os eventos de teclado ocorrem na seguinte ordem:
Vamos criar um pequeno projeto onde iremos mostrar como gerenciar alguns eventos de teclado no VB.NET.
|
- Dois
controles TextBox - TxtValor para receber valores e TxtData para
receber datas - Dois controles Button - btnIncluir e btnSair - Um controle ListBox - ListBox1 O objetivo e preencher os TextBox e incluir os valores informados no ListBox |
Vejamos agora o código associado a cada controle :
1- O evento ENTER do controle TextBox - txtValor.text - Ao receber o foco o conteúdo do controle é selecionado.
Private
Sub
txtValor_Enter(ByVal
sender As System.Object,
ByVal e
As System.EventArgs)
Handles
txtValor.Enter, txtData.Enter ' ao receber o foco , o conteudo do controle será selecionado CType(sender, TextBox).SelectAll() End Sub |
- O evento
Enter é usado para que quando controle receber o foco todo o conteúdo
do controle será selecionado. O evento de Focus ocorre na seguinte ordem :
|
2- O evento KeyPress do controle TxtValor : Se teclar ENTER o foco vai para o controle txtData ; se for pressionado o ponto será convertido para vírgula.
Private
Sub txtValor_KeyPress(ByVal
sender As System.Object,
ByVal e
As System.Windows.Forms.KeyPressEventArgs)
Handles
txtValor.KeyPress
' ao pressionar a tecla ENTER ( Return) o foco vai para o proximo controle If e.KeyChar = Convert.ToChar(Keys.Return) Thene.Handled = TruetxtData.Focus() ElseIf e.KeyChar = "."c Then ' converte o ponto para virgula e.Handled = TrueSendKeys.Send(",") End If End Sub |
A
propriedade - KeyPressEventArgs.KeyChar - obtém o caractere
correspondente a tecla pressionada no caso representada pela letra e. - e.Handle = True tem o mesmo efeito que KeyAScii = 0 , ou seja, evita o efeito sonoro (beep). - Se a tecla pressionada for igual ao ponto (.) será convertido para vírgula (,) = Sendkeys.Send(,)
|
3- O evento KeyPress do controle TxtData ; Pressionando ENTER o foco vai para botão Incluir ; Se pressionarmos : ponto , virgula ou traço , estes caracteres serão convertidos para barra ( / ).
Private
Sub txtData_KeyPress(ByVal
sender As System.Object,
ByVal e
As System.Windows.Forms.KeyPressEventArgs)
Handles
txtData.KeyPress
Select Case e.KeyChar Case Convert.ToChar(Keys.Return) 'ChrW(Keys.Return) e.Handled = TruebtnIncluir.Focus() Case "."c, ","c, "-"c 'ao pressionar . , ou - serão convetidos para / e.Handled = TrueSendKeys.Send("/") End Select End Sub |
- O método Send
da classe SendKeys envia o código da tecla para a aplicação ativa.
Cada tecla é representada por um ou mais caracteres. Para enviar a
tecla A use o código A.Alguns teclas possuem caracteres especiais . Abaixo
alguns valores :
No exemplo estamos enviando a barra : / |
4- Evento Click do controle ListBox ; Inclui os valores digitados nas caixas de texto no controle ListBox.
Private
Sub btnIncluir_Click(ByVal
sender As System.Object,
ByVal e
As System.EventArgs)
Handles
btnIncluir.Click ' inclui o conteúdo das caixas de texto no listbox ListBox1.Items.Add(txtValor.Text & ", " & txtData.Text) txtValor.Focus() End Sub |
- ListBox1.Items.Add(txtValor.Text & ", " & txtData.Text) |
5- O evento KeyDown do controle ListBox ; a pressionar a tecla Delete o item selecionado no controle será removido.
Private
Sub ListBox1_KeyDown(ByVal
sender As
Object,
_
ByVal e As System.Windows.Forms.KeyEventArgs) _ Handles ListBox1.KeyDown ' Ao pressionar a tecla Delete eliminamos o elemento selecionado no listbox If e.KeyCode = Keys.Delete Then ListBox1.Items.Remove(ListBox1.SelectedItem) End If End Sub |
- ListBox1.Items.Remove(ListBox1.SelectedItem) |
Alem das teclas padrão podemos querer gerenciar as teclas SHIFT , ALT e CTRL ; conhecidas como teclas modificadoras. Para determinar quando uma dessas teclas foi pressionada podemos usar o seguinte código :
Private Sub button1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
Handles button1.KeyPress
If (Control.ModifierKeys And Keys.Shift) = Keys.Shift Then |
A propriedade - Control.ModifierKeys - obtém o valor que indica qual modificador (SHIFT, CTRL, and ALT) foi pressionada
Criando efeitos com a Tecla seta para cima e set para baixo
Que tal obter o seguinte efeito: Em um formulário com algumas caixas de texto , quando a caixa de texto tiver com o foco se você pressionar seta para baixo (KeyDown) o foco vai para o próximo controle , e, se você pressionar tecla para cima(KeyUp) vai para o controle anterior.
Inicie um novo projeto do tipo Windows Application e no formulário padrão form1.vb inclua três caixas de texto e um botão de comando. Agora inclua o seguinte código no formulário:
Private Sub MoverFoco(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) ' Verifica a tecla pressionada e obtem o proximo controle ou o anterior, dependendo da tecla pressionada If e.KeyCode = Keys.Up Then If Not Me.GetNextControl(sender, False) Is Nothing Then Me.GetNextControl(sender, False).Focus() ElseIf e.KeyCode = Keys.Down Or e.KeyCode = Keys.Enter Then If Not Me.GetNextControl(sender, True) Is Nothing Then Me.GetNextControl(sender, True).Focus() End If End Sub Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown MoverFoco(sender, e) End Sub Private Sub TextBox2_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox2.KeyDown MoverFoco(sender, e) End Sub Private Sub TextBox3_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox3.KeyDown MoverFoco(sender, e) End Sub Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress e.Handled = True End Sub |
A função MoverFoco(sender,e) é responsável em mover o foco para o controle anterior/posterior quando o usuário pressionar a tecla KeyUP/KeyDown.
A função para KeyPress em TextBox1 apenas evita o beep que a tecla ENTER gera , pois e.Handled = True evita o beep.
Pesquisando a ajuda do VB.NET você vai encontrar muito mais detalhes sobre o assunto.
Até mais ver...
Veja os
Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique
e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ? |
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências: