Clique aqui para instalar o Silverlight*
BrasilAlterar|Todos os sites da Microsoft
MSDN
|Developer Centers|Biblioteca|Downloads|Assinaturas MSDN
Pesquisa rápida


Menus e Input Panel no Pocket PC

Por Renato Haddad, Microsoft Most Valuable Professional .NET Compact Framework. Autor de diversos livros e ministra palestras e treinamentos sobre a tecnologia .NET.

Tecnologias Utilizadas

.NET Compact Framework

Quando desenvolvemos aplicações para dispositivos móveis (seja Pocket PC, Smartphone ou qualquer outro device) é importante pensar na interface com o usuário. O objetivo deste artigo é mostrar dois controles muito utilizados no Pocket PC: o Menu e o InputPanel. Irei mostrar ainda alguns truques da linguagem VB.NET para novos programadores.

O tamanho da tela e a forma que o usuário irá interagir pode tornar uma aplicação viável do ponto de vista de produtividade. O uso de uma caneta touch-screen para o Pocket é a forma usual de interagir com a aplicação, pelo menos enquanto não utilizamos a tecnologia de Speach para poder dar os comandos por voz. Sendo assim, alguns tipos de controles como TextBox, onde o usuário precisa digitar algo, é imprescindível que o teclado seja exibido ou não no momento correto.

Vamos criar um projeto no Visual Studio .NET 2003 (que na minha opinião é a melhor ferramenta para Pocket PC) conforme a seguinte opções:

Project Types: Visual Basic Projects

Templates: Smart Device Application

Name: PocketPC

Location: C:\MSDN\PocketPC

Clique no botão OK e note que é exibida a janela para você selecionar o tipo de aplicação:

Clique no botão OK. No Solution Explorer, adicione um novo Windows Form chamado Menu.

Monte uma UI de acordo com a seguinte figura: dois Labels, dois TextBox (txtNome e txtEmail), dois Buttons (btnMsg1, e btnMsg2), dois checkBox, um MainMenu e um InputPanel. Configure as seguintes propriedades do formulário: BackColor=Wheat e MinimizeBox=False. A propriedade MinimizeBox permite minimizar o formulário, mas se você configurar para False, automaticamente o formulário é fechado e retirado da memória.

Para criar um menu, basta selecioná-lo e digitar as opções conforme o aplicativo. Caso queira inserir um separador de opção, clique com o botão direito na posição a ser inserido e selecione Insert Separator. Insira as seguinte opções:

Os nomes default dos menus são MenuItem1, 2, 3 e assim sucessivamente. Para alterá-los, a opção mais rápida é clicando com o botão direito sobre qualquer opção e selecione Edit Names. Neste artigo vou manter os nomes default.

Códigos

Menu

Dê um duplo clique na opção “Apagar conteúdo” e digite o seguinte código que irá apagar o conteúdo digitado nos respectivos TextBoxes. Note que usei o String.Empty e não o “”. O efeito é o mesmo, mas já que estamos aprendendo a programar em .NET, usemos da forma correta.

Private Sub MenuItem3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles MenuItem3.Click
txtNome.Text = String.Empty
txtEmail.Text = String.Empty
End Sub
	

Volte a UI e dê um duplo clique na opção “Capturar dados”, o qual captura o conteúdo digitado em cada TextBox e exibe em uma janela. Note que existe uma verificação se existem dados digitados nos TextBoxes. Caso esteja faltando algum, é exibida uma mensagem de Atenção. Caso contrário, é definida uma variável chamada “dados” do tipo StringBuilder, o qual monta na memória uma string com tudo o que é necessário exibir ao usuário e usa o Messagebox.Show para enviar a respectiva mensagem. É claro que você poderia concatenar toda a mensagem direto em Messagebox.Show, no entanto, como isto é um artigo, aproveitei para mostrar o uso do StringBuilder, que é sem nenhuma dúvida o meio mais rápido de se manipular strings.

Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles MenuItem2.Click
   If txtNome.Text.Trim = String.Empty Or _ 
      txtEmail.Text.Trim = String.Empty Then
      MessageBox.Show("Por favor digite todos os campos", _ 
                      "Atenção")
   Else
      Dim dados As New System.Text.StringBuilder
      dados.Append("Caro(a): ")
      dados.Append(txtNome.Text.Trim)
      dados.Append("-bem vindo ao mundo Pocket PC")
      dados.Append(vbNewLine)
      dados.Append("Seu e-mail é: ")
      dados.Append(txtEmail.Text.Trim)
      MessageBox.Show(dados.ToString, "POCKET PC")
   End If
End Sub

Digite o código do menu Sair

Private Sub MenuItem7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles MenuItem7.Click
   Me.Close()
End Sub
	

Selecione o menu Project / PocketPC Properties e define na opção Startup Object o Menu, que é o formulário a ser executado quando você fizer o Deploy da aplicação.

Pressione F5 ou selecione o menu Debug / Start para executar os testes. Será exibida uma janela contendo todas as opções de emuladores. Você pode selecionar o emulador que tiver instalado na máquina, e caso tenha um pocket conectado via ActiveSync, selecione a opção Pocket PC Device. Cabe ressaltar que os emuladores do Pocket PC 2003 podem ser conseguidos em “Emulator Images for Windows Mobile 2003 Second Edition-based Pocket PC Development”

(http://www.microsoft.com/downloads/details.aspx?familyid=4953d34d-692f-4c87-ac69-cb235dbdad1d&displaylang=en).

Clique no botão Deploy e teste a aplicação.

InputPanel

Como temos dois TextBoxes no formulário, é preciso uma forma de exibir automaticamente o InputPanel assim que o foco entrar nos TextBoxes. Sendo assim, selecione o objeto txtNome em Class Name e o evento GotFocus em Method Name.

Digite o seguinte código para exibir o InputPanel:

Private Sub txtNome_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) 
	Handles txtNome.GotFocus
   InputPanel1.Enabled = True
End Sub

Você concorda que o mesmo código serve para o txtEmail, então, o que fazer? Você tem 3 alternativas:

1) Criar o mesmo código para o txtEmail (esta não é a melhor opção), ficando:

Private Sub txtEmail_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) 
Handles txtEmail.GotFocus
   InputPanel1.Enabled = True
End Sub

2) Criar uma rotina que recebe o valor True ou False para exibir ou não o InputPanel.

Private Sub TrataInputPanel(ByVal exibe As Boolean)
   InputPanel1.Enabled = exibe
End Sub

E na chamada dos códigos dos botões, você invocaria esta rotina passando o argumento True:

Private Sub txtNome_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) 
Handles txtNome.GotFocus
   TrataInputPanel(True)
End Sub

Private Sub txtEmail_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) 
Handles txtEmail.GotFocus
   TrataInputPanel(True)
End Sub

3) Esta é a melhor alternativa que o .NET proporciona aos programadores. Veja a rotina original:

Private Sub txtNome_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) 
Handles txtNome.GotFocus
   InputPanel1.Enabled = True
End Sub

Repare no Handles. Note que é invocado o objeto + evento, portanto, é só incluir o outro objeto + evento no final da linha, sendo:

Private Sub txtNome_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) 
Handles txtNome.GotFocus, txtEmail.GotFocus
   InputPanel1.Enabled = True
End Sub

Só isso, mais nenhum outro código é preciso. Cabe ressaltar que isto vale para qualquer objeto (button, dropdown, listbox, etc). Sendo assim, use e abuse do Handles adicionando objetos e eventos ao mesmo toda vez que precisar executar uma rotina. Faça o mesmo código para o evento LostFocus para ocultar o InputPanel quando os TextBoxes perderem o foco.

Private Sub txtNome_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) 
Handles txtNome.LostFocus, txtEmail.LostFocus
   InputPanel1.Enabled = False
End Sub

Truques

Agora vamos aos truques de programação de objetos. Vale lembrar que isto serve para qualquer aplicação em .NET. Você tem dois Buttons que devem disparar uma mensagem qualquer ao usuário ou executar uma rotina. Normalmente você faria o seguinte procedimento:

Dê um duplo clique no primeiro botão;

É criado o seguinte código:

Private Sub btnMsg1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles btnMsg1.Click

End Sub

Note que é criado o Sub btnMsg1_Click com os argumentos sender (que é o objeto) e o “e” (que são os argumentos do objeto). No final é criado o:

Handles btnMsg1.Click

Com certeza você colocaria o código da rotina aqui dentro, ficando:

Private Sub btnMsg1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles btnMsg1.Click
   MessageBox.Show("Hello Pocket")
End Sub

E para o botão btnMsg2 você criaria o código:

Private Sub btnMsg2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles btnMsg2.Click
   MessageBox.Show("Hello Pocket")
End Sub

Mas, como você acabou de aprender que existe o Handles, então este código servirá para os dois botões, sendo:

Private Sub btnMsg1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
 Handles btnMsg1.Click, btnMsg2.Click
   MessageBox.Show("Hello Pocket")
End Sub

O que você acha que significa o btnMsg1_Click? Este é apenas um nome default para a rotina. Altere toda esta rotina para o seguinte código:

Private Sub MinhaRotina(ByVal sender As System.Object, ByVal e As System.EventArgs)
 Handles btnMsg1.Click, btnMsg2.Click
   MessageBox.Show("Hello Pocket. Você clicou no objeto: " & _ 
                   CType(sender, Button).Text)
End Sub

Temos assim uma rotina genérica que será disparada pelos objetos descritos no Handles. Observe ainda que para saber qual é o objeto ativo, usei o CType(sender, Button). Com isso, este código serve para qualquer botão existente no formulário.

Outra dica de programação ocorre em situações em que você precisa ocultar ou exibir um determinado controle. Usaremos o checkBox para isto, portanto, o código usual para ocultar o txtNome é:

Private Sub CheckBox1_CheckStateChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles CheckBox1.CheckStateChanged
   If CheckBox1.Checked Then
      txtNome.Visible = True
   Else
      txtNome.Visible = False
   End If
End Sub

Na minha opinião este não é um código “bem escrito”. Existe uma forma mais elegante de escrever o mesmo código, sendo:

Private Sub CheckBox1_CheckStateChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles CheckBox1.CheckStateChanged
   txtNome.Visible = CheckBox1.Checked
End Sub

Aproveite e insira no Handles o segundo CheckBox.

Private Sub CheckBox1_CheckStateChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles CheckBox1.CheckStateChanged, CheckBox2.CheckStateChanged
   txtNome.Visible = CheckBox1.Checked
End Sub

No entanto, você deve estar pensando que o código valera para os dois objetos no Handles, mas note que o True ou False depende apenas do CheckBox1. Sendo assim, a melhor alternativa é o seguinte código, onde existe uma rotina com os respectivos Handles anteriores que atribui o True ou False em relação ao objeto atual passado como parâmetro.

Private Sub TrataVisible(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles CheckBox1.CheckStateChanged, CheckBox2.CheckStateChanged
   txtNome.Visible = CType(sender, CheckBox).Checked
End Sub

Aproveitando o artigo, já que criei a opção Visible no menu Ferramentas, então dê um duplo clique nesta opção e digite o seguinte código que oculta ou não o txtMail e atribui o True ou False à respectiva opção do menu. Note que a variável blnStatus é do tipo Boolean e contém a negativa do Checked do MenuItem 5 (Ferramentas/Visible).

Private Sub MenuItem5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles MenuItem5.Click
   Dim blnStatus As Boolean = Not MenuItem5.Checked
   MenuItem5.Checked = blnStatus
   txtEmail.Visible = blnStatus
End Sub

O Pocket PC permite desabilitar um determinado controle para que o usuário não tenha acesso. Crie o código para o menu Ferramentas/Enable.

Private Sub MenuItem6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles MenuItem6.Click
   Dim blnStatus As Boolean = Not MenuItem6.Checked
   MenuItem6.Checked = blnStatus
   txtEmail.Enabled = blnStatus
End Sub

Conclusão

Antes de criar uma interface com o usuário, pense em facilitar ao máximo o manuseio do dispositivo, analise junto ao seu usuário como que ele irá manipular os dados e crie a UI de acordo com a necessidade dele. Aplique as dicas e truques da linguagem deixando o seu código mais limpo, produtivo e de fácil manutenção.

Bons estudos e lembre-se: No Stress, think .NET!!!

Renato Haddad (rehaddad@msn.com) é MVP, editor da revista MSDN Magazine Brasil, autor de 9 livros de tecnologia Microsoft, ministra treinamentos e palestras sobre .NETe autor de diversos livros e treinamentos em CD multimídia de ASP.NET, Visual Studio .NET 2003 e Aplicações Móveis para celulares e Pocket PC, tanto no Brasil como em outros países da América Latina.
BLOG: http://br.thespoke.net/MyBlog/RenatoHaddad/MyBlog.aspx

Referências:

www.microsoft.com/windowsmobile


 

©2017 Microsoft Corporation. Todos os direitos reservados. Entre em contato |Nota Legal |Marcas comerciais |Política de Privacidade
Microsoft