Os formulários Windows e a Interface com o usuário

O Visual Basic pode ser considerado o precursor das linguagens visuais. Junte sua interface amigável com a facilidade e popularidade da linguagem Basic e creio que isto por si só explica toda a popularidade da linguagem.  Se hoje existem outras linguagens visuais como Delphi , PowerBuilder , etc. o caminho foi aberto pelo Visual Basic.

A interface com o usuário é o diferencial principal do Visual Basic e os formulários Windows são o coração da interface Visual. Vamos pois neste artigo falar um pouco sobre formulários Windows e como podemos usá-los no Visual Basic .NET. Vou começar com uma recordação de dois conceitos fundamentais sobre formulários:

1- Janela - Bem ,  uma janela pode ser considerada uma área da tela do computador que usamos para exibir informações. Podemos usar várias janelas e também podemos mover e redimensionar as janelas. As janelas possuem dois estados :

2- Controles - Tudo que existe em uma janela : botões , caixas de textos , listas , figuras , etc. pode ser considerado um controle. Eles pode ser clicados , digitados e permitem a interação com o usuário.

A primeira coisa que você deve fazer para desenvolver um projeto no VB.NET com formulários Windows é criar um projeto novo selecionando o tipo de projeto aplicativo Windows - Windows Application . Veja na figura abaixo:

A janela New Project

As janelas : Solution Explorer e Properties

Quando você clicar no botão OK , um novo projeto será gerado com um único formulário que será chamado de - form1.vb . Vamos então aproveitar e criar um aplicativo usando o formulário que temos no projeto. Antes é bom mudar o nome do formulário , afinal , form1 não significa muita coisa. Como você pode fazer isto ? É fácil ...

  1. Clique com o botão direito no formulário - form1.vb  -  e na janela - Solution Explorer - altere o nome do formulário para frmWinForm1.vb
  2. Vamos agora alterar o nome do formulário. Clique no formulário e na janela - Properties - altere a propriedade Name para frmWinForm1
  3. Altere também a propriedade Text do formulário para exibir o título : "Minha aplicação Windows Form"
Vamos inserir alguns controles no formulário . Para você inserir um controle no formulário padrão que até o presente momento esta vazio basta ativar a janela ToolBox , pois nela estão todos os controles que podemos incluir em um formulário Windows. Você pode abrir a janela ToolBox clicando no Menu View e a seguir em ToolBox ou pressionando Ctrl_Alt+X.

Neste nosso projeto vamos usar os controles : Button , TextBox e Label.

Para incluir um controle no formulário clique sobre o controle  e a seguir clique no formulário e desenhe o controle no formulário ; outra maneira de inserir um controle no formulário é clicar duas vezes sobre o controle na janela ToolBox.

 

Então para praticar inseria dois controles Label , dois controles TextBox e três controles Button. A seguir ordene os controles no formulário conforme a figura 1.0 abaixo. Pela figura você pode notar que quando você inclui um controle no formulário ele exibe um texto padrão. Para alterar cada texto para algo mais legível altere a propriedade Text de cada controle para os nomes exibidos na figura 2.0.

Nota : Não existe mais o controle Command , o seu equivalente é o controle Button. Alguns controles como Label e Form não possuem mais a propriedade Caption ; no seu lugar temos a propriedade Text.

Figura 1.0 Figura 2.0

Você já deve ter percebido qual o objetivo do nosso projeto. É isso mesmo : copiar , mover e excluir arquivos usando o VB.NET. Parece simples , não é mesmo ! Na verdade é simples mas você vai aprender muita coisa com ele , pode apostar...

Outra coisa que você deve sempre fazer em seus projetos é alterar o nome dos controles. Quando você inclui um controle em um formulário ele vem com o nome padrão : label1 , Button1 , TextBox1 , etc.(O VB cria uma sequência de controles).Você deve atribuir um nome sugestivo e relacionado com a função do controle. Assim o controle Label -0rigem-  podemos chamar : lblOrigem a Label - Destino - podemos chamar: lblDestino.

Percebeu que no inicio do nome do controle eu usei um menmônico lbl para indicar que o controle é uma Label. Para TextBox seria txt , para Button seria btn , para formulário seria - frm . Você altera o nome de um controle atribuindo o novo nome a propriedade Name do controle na janela de propriedades.(Selecione o controle e pressione F4 para ativar a janela de propriedades do controle).

Uma convencão geralmente usada para dar nome a controles é acrescentar um prefixo em minúsculas aos nomes dos controles , sendo que  este prefixo seria um menemônico relativo ao controle como indicado acima.

Vamos dar os seguintes nomes para cada controle inserido no nosso projeto:

Nome anterior Name   Nome Anterior Name
label1 lblorigem   label2 lbldestino
TextBox1 txtorigem   TextBox2 txtdestino
Button1 btncopiar   Button2 btnmover
Button3 btnexcluir   form1 frmWinForm1

Nota: O nome do controle tem que ser iniciado com uma letra.(Não pode iniciar com um número).

Você deve ficar atento para salvar o seu projeto a cada momento , pois se houver uma queda de energia você perde tudo. Para salvar o projeto selecione no Menu File a opção Save All para salvar o seu projeto. Podemos continuar agora...

Se você esta começando a aprender o Visual Basic agora creio que não teve dificuldades de chegar até aqui , mas se executar o projeto neste momento , pressionando F5 o clicando na seta ao lado da caixa Debug. Vai perceber que o formulário será exibido , e , se você clicar nos botões nada vai acontecer. Esta faltando o código.

O código em aplicações Visual Basic geralmente esta associado a eventos , e os controles possuem eventos que podemos usar para associar o código. Como vê alguém já havia pensado nisto para ajudar você. Quando você olha para um botão em um formulário a primeira tentação é pressioná-lo ou clicá-lo . Bem este é um evento muito usado , e , se você clicar duas vezes no seu botão de comando - btncopiar - vai obter o seguinte resultado na janela de código:

Figura 3.0
O VB.NET abre a janela de código fonte já preparada para que possamos digitar o nosso código (você quer ser um programador ou não ??? ).

Perceba também que existem duas caixas de listagem no alto desta janela(figura 3.0).

 A da esquerda permite a você selecionar os objetos que compõem seu formulário, e da da direita os eventos suportados por cada um destes objetos.

O código que você inserir no evento Click do botão - btncopiar - será executado em resposta a ação de clicar no botão , ou seja , será a resposta ao evento Click do botão.  Vamos então adicionar código ao evento Click do botão - btncopiar - naturalmente o código deverá realizar a ação de copiar o arquivo que deverá ser informado na caixa de texto - txtorigem - para o local informado em - txtdestino.

O VB.NET disponibiliza centenas de classes que você pode usar para realizar as mais diversas tarefas. Para efetuar a copia de um arquivo usamos o namespace System.IO . Este namespace já foi referenciado quando você criou o projeto pois ele faz parte da da System.DLL ,  assim ,  se você for digitando na janela de código system.IO.File.Copy o VB.NET irá lhe indicando os métodos disponíveis em cada classe.

Para tornar mais legível o seu código você pode declarar o namespace System.IO no início do seu projeto usando uma declaração imports desta forma não vai precisar se referir mais a parte System.IO no seu código.

Como disse vamos copiar arquivos por meio dos métodos estáticos do objeto File. O método Copy faz exatamente o que seu nome sugere e utiliza dois argumentos : a origem e o destino. Sua sintaxe é :  Copy(Origem,Destino). O seu código então deve ser algo parecido com :

Nota: Um método estático pode ser usado diretamente sem ser necessário instanciar a classe a qual pertence para ser usado. No caso o método Copy é um método estático da classe File , por isto podemos fazer diretamente File.Copy.

- Note a declaração Imports no início do arquivo.

- Declarei duas variáveis chamadas : sOrigem e sDestino como sendo do tipo String.

- A seguir atribui o conteúdo das caixas de texto ás variáveis criadas. (No VB.NET você deve informar o nome do controle e o nome da propriedade)

- Finalmente usamos o método Copy passando os argumentos.

 

Se executar o código , informar a origem e o destino corretamente , o código vai funcionar. Mas a vida de um programador não é tão simples assim pois ele tem que prever as possíveis causas que possam impedir que o código não seja executado com sucesso. E se o arquivo origem ou destino não existirem ? E se não houver espaço para cópia ?

Neste caso dizemos que o programador tem que tratar o erro e pelo menos informar o que esta acontecendo. Felizmente o VB.NET possui uma classe para tratamento de erros estrutura : Try / Catch / Finally.  O código já com o tratamento de erros ficará assim :

Obs: Para maiores detalhes no tratamento de erro veja o artigo: VB.NET : tratamento de erros usando Try-Catch-Finally

Private Sub btncopiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btncopiar.Click

 

Dim sOrigem As String

Dim sDestino As String

 

sOrigem = txtorigem.

sDestino = txtdestino.Text

 

Try

    File.Copy(sOrigem, sDestino)

Catch oException As Exception

   MessageBox.Show(oException.Message)

End Try

 

End Sub

Dentro de Try eu coloco o trecho de código que vai ser executado ; em Catch eu capturo as possíveis exceções e faço o tratamento. No caso eu estou usando a classe MessageBox para exibir via método Show a mensagem de erro para o usuário. (Show é um método estático da classe MessageBox).

Como exemplo , se você tentar executar e informar um arquivo inexistente vai obter a seguinte mensagem de erro:

A instrução - Handles btncopiar.Click - colocada no final da declaração informa ao VB.NET que essa rotina é o manipulador desse evento. Podemos então ter um único procedimento manipulando diversos eventos ou um só evento com vários manipuladores. Vermos isto logo a seguir...

Vamos agora inserir o código nos demais botões. Para excluir um arquivo vamos usar o método Delete(nomeArquivo) da classe File e para mover um arquivo usamos o método Move(origem,destino) da mesma classe. O código fica então assim :

Private Sub btnexcluir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnexcluir.Click

Dim sOrigem As String

sOrigem = txtorigem.Text

Try

   File.Delete(sOrigem)

Catch oException As Exception

   MessageBox.Show(oException.Message)

End Try

End Sub

Código associando a botão Excluir

Private Sub btnmover_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnmover.Click

Dim sOrigem As String

Dim sDestino As String

 

sOrigem = txtorigem.Text

sDestino = txtdestino.Text

Try

    File.Move(sOrigem, sDestino)

Catch oException As Exception

   MessageBox.Show(oException.Message)

End Try

End Sub

Código associando a botão Mover

Vamos então manipular os três eventos Click por meio de um procedimento alterando a instrução Handles para incluir todos eles. Assim :

Private Sub ManipulaEventos(ByVal sender As Object, ByVal e As System.EventArgs) Handles btncopiar.Click, btnexcluir.Click, btnmover.Click

MessageBox.Show("Esta rotina manipula os três eventos Click do projeto.")

End Sub

Nota: Você pode incrementar o projeto incluindo código para verificar se o arquivo informado na caixa de texto existe. Basta usar o método Exists da mesma classe File. Abaixo o código onde eu fiz as seguintes verificações:

Obs:  o código ficou meio 'macarronico' mas eu usei apenas para ilustrar como fazer uma validação usando métodos da classe File.

Private Sub btnmover_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnmover.Click

 

Dim sOrigem As String

Dim sDestino As String

Dim resultado As DialogResult

 

sOrigem = txtorigem.Text

sDestino = txtdestino.Text

If sOrigem = sDestino Then

    MessageBox.Show("Origem não pode ser igual ao Destino !", "Origem igual ao destino", MessageBoxButtons.OK)

    Exit Sub

End If

 

Try

   If File.Exists(sOrigem) Then

      If File.Exists(sDestino) Then

          If (MessageBox.Show("O arquivo destino já existe, deseja sobrepor o arquivo ?", "Mover Arquivos", MessageBoxButtons.YesNo)) = DialogResult.Yes Then

              File.Delete(sDestino)

          Else

              Exit Sub

          End If

      End If

   Else

           MessageBox.Show("O arquivo origem não existe ! Verifique...", "Arquivo origem ja existe", MessageBoxButtons.OK)

   Exit Try

   End If

    File.Move(sOrigem, sDestino)

    MessageBox.Show("Operação realizada com sucesso !", "Operação processada", MessageBoxButtons.OK)

Catch oException As Exception

    MessageBox.Show(oException.Message)

End Try

 

End Sub

Para encerrar vou falar da classe Messagebox usada no projeto. Ela é responsável pelas mensagens que são exibidas ao usuário . A classe Messagebox exibe uma janela de diálogo do tipo modal e o usuário terá agir sobre ela para continuar sua interação com o formulário.

A classe Messagebox exibe textos em uma caixa de diálogo e um conjunto de botões.  Ela possui somente um método estático ; o método Show. Este método aceita 6 parâmetros principais diferentes e usar todos não é obrigatório.  Podemos ter até 12 tipos de sobreposições para as várias combinações de parâmetros. A seguir a lista de parâmetros:

Parâmetro Descrição
Text Representa a mensagem que você vai exibir. É obrigatório.
Caption Determina a barra de título que será exibida.
Buttons Controla os botões exibidos na caixa de mensagem. Seus valores podem ser:
Exemplo de uso: MessageBoxButtons.AbortRetryIgnore - exibe os botões : Anular , Repetir e Ignorar
Icon Controla qual figura será exibida junto a mensagem. O valores possíveis são :
Obs:Embora existam nove valores para os ícones nem todo o sistema operacional fornece valores para todos.
DefaultButton Define qual o botão padrão que irá receber a ação do usuário.Para o caso de três botões podemos escolher qual será o botão padrão : Ex:
Options Controla a aparência da caixa de mensagem. Temos opções para justificar o texto a direita , ser legível da direita para a esquerda e permitir que a caixa de mensagem apareça apenas na área principal. Os valores possíveis são :

Incrementando nossa caixa de mensagem com as opções acima podemos ter:

Private Sub ManipulaEventos(ByVal sender As Object, ByVal e As System.EventArgs) Handles btncopiar.Click, btnexcluir.Click, btnmover.Click

MessageBox.Show("Esta rotina manipula os três eventos Click do projeto", "Teste", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button2, MessageBoxOptions.ServiceNotification)

End Sub

O resultado exibido será:

Quero chamar a atenção para o código que usei no exemplo 'macarronico' da validação. A parte que quero comentar é a seguinte:

If (MessageBox.Show("O arquivo destino já existe, deseja sobrepor o arquivo ?", "Mover Arquivos", MessageBoxButtons.YesNo)) =  DialogResult.Yes Then

   File.Delete(sDestino)

Else

   Exit Sub

End If

Ele faz o seguinte:

A propriedade DialogResult - obtêm o valor que que foi escolhido dentre os definidos na classe MessageBox. Os valores possíveis são :

Você apenas define qual o resultado deseja tratar.

Este é um artigo básico com conceitos simples ; ajuda principalmente quem esta começando , e , também quem é iniciado...

Até mais ver  ...  


José Carlos Macoratti