VB.NET - Criando Controles Personalizados


Você lembra como criar um controle personalizado no VB ? Tempos atrás eu escrevi dois artigos sobre o assunto:

  1. Criando Controles Activex no VB
  2. Criando Controles Activex no VB II

Com o VB .NET as coisas ficaram mais fáceis , para variar , e , a para criar um controle customizado você vai ter mais que abraçar o modelo ActiveX . Isto já é uma grande vantagem : controles ActiveX  tendem a ser difíceis de distribuir pois cada versão precisa ser registrada.

Com o VB .NET criar um controle personalizado é tão fácil como criar uma classe. Você simplesmente utiliza a herança para herdar de um controle já existente e adiciona as características desejadas ao seu controle. Além disto você pode também criar uma classe de controle customizado como parte do projeto existente e então mais tarde colocá-la em uma assembly separado que pode ser compartilhado com outros programadores.

Podemos fazer distinção entre três  de controles personalizados :

  1. Controles de Usuários - Users Controls : São os tipos mais simples de controles. Eles herdam da classe System.Windows.Forms.UserControl e seguem o modelo da composição.
  2. Controles herdados - Inherited Controls : São controles com mais recursos ; Para criá-los você escolhe um controle que mais se aproxima de suas características e então deriva uma classe personalizada que sobrescreve ou inclui propriedades e métodos.
  3. Controles Criados - São controles criados usando as rotinas da GDI+ e que geram toda a interface com o usuário; geralmente  tendem a herdar da classe System.Windows.Forms.Control.

Nota: Naturalmente você pode combinar os tipos descritos acima criando um controle que usa a GDI+ com controles que herdam de outros controles.

Controles de Usuário - User Controls

Os controles de usuário são o tipo mais comum de projeto , e embora sejam simples de criar possuem algumas limitações :

  1. Tendem a combinar a regra de negócios com a interface de usuário.
  2. Tendem a esconder todas as propriedades e métodos de seus controles filhos.(Similar a um controle ActiveX).

Criando o seu primeiro controle

1- Para incluir um controle personalizado a um projeto .NET , primeiro você deve abrir o projeto e a seguir clicar com o botão direito do mouse sobre o nome do projeto selecionando a seguir a Add e Add User Control. (fig 1.0)

2- A seguir na janela Add New Item você pode dar um nome específico ao controle e clicar no botão OK. (fig 2.0)

fig 2.0
 

fig 1.0

3- O resultado final da inclusão mostrado no projeto em  tempo de desenho e na janela Solution Explorer e mostrado na figura 3.0.

fig 3.0

Olhando para o controle inserido ele parece um formulário , na verdade , temos uma mistura entre um controle e um formulário , ou , uma porção reutilizável de um formulário. Os controles de usuário realmente herdam de todas as mesmas classes base de um formulário:

- Para incluir um controle apenas desenhe-o sobre a área de projeto da mesma forma que você faria com um formulário.

-Você pode usar a ancoragem (anchoring) e o atracamento (docking) com os controles usados no seu controle personalizado.

- Se você incluir um formulário e um controle de usuário no mesmo projeto o VS.NET inclui o seu controle de usuário na barra de ferramentas de maneira que você pode arrastar e soltar o controle no formulário

- Se você alterar o seu controle personalizado terá que recompilar o projeto para que as mudanças sejam visíveis nos formulários que contém o controle.

Nosso primeiro controle será uma mistura de uma barra de progresso e de um controle Label (etiqueta). O objetivo e incluir uma funcionalidade que não existe no controle ProgressBar : Ele não exibe o percentual de progresso na forma de um texto que indique a porcentagem de progresso da operação.

Para contornar esta limitação do controle ProgressBar vamos criar um controle personalizado que vai usar o próprio controle e  mais um controle Label onde pretendemos exibir em texto o percentual da operação sincronizando os dois controles.

Vamos então incluir um controle ProgressBar (ProgressBar1) e um controle Label (Label1) ao nosso controle de usuário. Após alterar a propriedade Text da label para indicar o início da operação em percentual teremos o projeto conforme a figura 4.0 abaixo.

Do jeito que está , se você tentar usar o controle diretamente em um projeto não vai pode acessar a Label nem a ProgressBar. As únicas propriedades e métodos que estão disponíveis são a do próprio controle que permitem alterar a fonte padrão a cor de fundo.

Para tornar nosso controle personalizado funcional precisamos replicar os métodos e propriedades dos controles Label e Progressbar . Podemos fazer isto criando procedimentos para o controle de forma que para cada método ou propriedade do procedimento do controle fazemos uma chamada ao método ou propriedade correspondente do controle Label ou ProgressBar.

Este modelo de delegação pode levar a uma quantidade grande de código , dependendo da complexidade do seu controle personalizado. Para o nosso controle vamos ser o mais objetivos possíveis tratamento somente dos métodos e propriedades essenciais ao funcionamento do nosso controle. Para isto vamos definir 3 propriedades básicas e um método que será usado pelo nosso controle personalizado :

Vamos agora criar o código que dará vida ao nosso controle personalizado. Clique com o botão direito do mouse sobre o controle e selecione a opção View Code. A seguir inclua o código abaixo na janela de código:

Public Class UserControl1

 

Inherits System.Windows.Forms.UserControl

 

Friend WithEvents Barra As System.Windows.Forms.ProgressBar

Friend WithEvents Etiqueta As System.Windows.Forms.Label

 

Property valor() As Integer

  Get

     Return Barra.Value

  End Get
 

  Set(ByVal Value As Integer)

     Barra.Value = Value

     atualizaEtiqueta()

End Set

End Property
 

Property maximo() As Integer

   Get

     Return Barra.Maximum

   End Get


  
Set(ByVal Value As Integer)

     Barra.Maximum = Value

   End Set

End Property
 

Property passo() As Integer

   Get

      Return Barra.Step

   End Get

 

   Set(ByVal Value As Integer)

     Barra.Step = Value

   End Set

End Property


Public
Sub
executaPasso()

   Barra.PerformStep()

   atualizaEtiqueta()

End Sub
 

Private Sub atualizaEtiqueta()

   Etiqueta.Text = ((Barra.Value * 100) \ barra.Maximum).ToString

   Etiqueta.Text &= " % Concluído"

End Sub
 

End Class

código do controle personalizado. Arquivo UserControl1.vb

Como funciona:

- Eu estou definindo as propriedades:  valor, maximo e passo usando Property Get/Set

- A cada mudança de valor da barra de progresso ou pela chamada do método público  executaPasso() fazemos a chamada do método privado - atualizaEtiqueta que sincroniza os controles label e progressbar.

- O método privado atualizaEtiqueta faz o cálculo do progresso e retorna na forma de texto o valor para a etiqueta do controle

Agora basta compilar o projeto e pronto nosso primeiro controle personalizado esta pronto para ser usado. Vamos testar o bichinho ?

Para testar o nosso controle basta incluir o controle em formulário e incrementar o valor da barra de progresso. Para fazer isto de forma simples vou usar um controle Timer . Cada vez que o Timer for disparado o método executaPasso() irá incrementar o contador através do seu valor Setp.

No formulário do projeto inclua o controle - UserControl1 - (você pode dar um nome mais sugestivo) pegando da toolbox e arrastando-o para o formulário.

Insira um controle Timer e um botão de comando no formulário de forma a obter o seguinte resultado :

- Vou dar o nome de pgTeste ao controle personalizada incluido no formulário

- Para o Timer vou usar o nome padrão - Timer1

Agora basta definir o código do evento Tick do Timer . Cada vez que o Timer for disparado iremos chamar o método executaPasso e verificar se o valor máximo permitido para o controle foi alcançado. Em caso positivo iremos desabilitar o Timer.

Obs: Vamos definir a propriedade Interval do Timer1 igual a 1000 ( 1000 = 1 segundo )

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

pbTeste.executaPasso()

If pbTeste.Maximo = pbTeste.Valor Then

    Timer1.Enabled = False

End If

End Sub

Finalmente o código do evento Click do botão - Iniciar Operação - apenas irá exibir os valores no controle

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Timer1.Enabled = False

   pbTeste.Valor = 0

   pbTeste.Maximo = 20

   pbTeste.Passo = 1

Timer1.Enabled = True

End Sub

Ao clicar no botão - Inicia operação - iremos definir os valores para o controle e a cada 1s o método executaPasso() será invocado atualizando o controle.

Até o próximo artigo...

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti