msdn10_capa.JPG

Clique aqui para ler todos os artigos desta edição

 

Formulários com Herança Visual

por Thiago J. Mônaco

 

Quando desenvolvemos uma aplicação Desktop é muito comum (além de uma boa prática) trabalharmos com uma identificação visual para todas as aplicações desenvolvidas pela nossa empresa. Antigamente, quando necessitavamos realizar essa tarefa não era das mais simples e agradáveis, pois apesar de algumas ferramentas fornecerem algum tipo de recurso como a criação de um Template em versões anteriores do Visual Basic, sempre encontrávamos algum tipo de problema.

O objetivo deste artigo é mostrar as facilidades que o .NET proporciona ao trabalhar com herança visual nos formulários de uma Windows Application. Uma situação comum são os formulários de uma aplicação que deverão conter uma barra de ferramenta com botões padrão (Ex.: Salvar, Excluir), além de possuir ações pré-definidas (Ex.: Confirmar a exclusão de um registro).

Como citado anteriormente é possível criar um Template, mas e se precisar adicionar um novo botão a todos os formulários ou ainda modificar um código padrão? Como solução, a plataforma .NET fornece o recurso de Herança Visual.

 

O que é Herança Visual e as Vantagens

Herança Visual é uma maneira poderosa de reutilizarmos o código e a parte visual de um formulário base. Com ela definimos os controles, métodos e propriedades que serão utilizados como padrão para os demais formulários. Seus conceitos de utilização são os mesmos utilizados em uma herança tradicional.

Quando implementar a Herança Visual no desenvolvimento de uma aplicação, pode-se comprovar na prática a facilidade e os benefícios de sua utilização, sendo:

 

·         Utilização de um formulário como template

·         Padrão visual e comportamental

·         Herança de código e controles

·         Mudanças no formulário base são refletidas automaticamente aos formulários derivados

·         Funcionalidades e propriedades pré-definidas podem ou não ser alteradas

 

Criando o layout do formulário base

 

Abra o Visual Studio .NET, selecione File / New Project, selecione a liguagem de programação desejada e crie um projeto do tipo Windows Application chamado HerancaVisual. Defina o diretório onde o projeto será criado e clique em OK para criarmos a aplicação. Abra o Solution Explorer (CTRL + ALT + L) e exclua o formulário chamado Form1.aspx. Para incluir um novo formulário, clique com o botão direito no projeto e selecione a opção Add / Add Windows Form. Nomeie-o de frmBase.vb ou frmBase.cs de acordo com a linguagem escolhida e clique no botão Open.

Em uma primeira etapa estaremos definindo os controles que deverão ser exibidos nos demais formulários da aplicação. Abra a Toolbox (CTRL + ALT + X) e adicione um controle Panel e um controle StatusBar. Selecione o Panel e adicione um PictureBox, um Label e três Buttons. Exiba a Properties Window (F4) e defina as propriedades dos controles de acordo com a Tabela 1:

 

Tabela 1. Propriedades dos controles

Controle

Propriedade

Valor

frmBase

Size

432; 300

Panel1

(Name)

pnlTopo

 

Dock

Top

 

BackColor

White

 

Size - Height

64

PictureBox1

(Name)

picIcone

 

Image

Defina uma imagem de sua preferência

 

Location

16; 16

Label1

(Name)

lblTitulo

 

AutoSize

True

 

Font - Size

15

 

Font - Italic

True

 

Location

56; 16

Button1

(Name)

btnSalvar

 

Anchor

Top, Right

 

BackColor

Control

 

Image

Defina uma imagem de sua preferência

 

Location

328; 21

 

Modifiers

Protected

 

Size

24; 23

 

Text

 

Button2

(Name)

btnExcluir

 

Anchor

Top, Right

 

BackColor

Control

 

Image

Defina uma imagem de sua preferência

 

Location

360; 21

 

Modifiers

Protected

 

Size

24; 23

 

Text

 

Button3

(Name)

btnAtualizar

 

Anchor

Top, Right

 

BackColor

Control

 

Image

Defina uma imagem de sua preferência

 

Location

392; 21

 

Modifiers

Protected

 

Size

24; 23

 

Text

 

StatusBar1

(Name)

stsBar

 

Text

 

 

Note que a propriedade Modifiers dos três botões foi alterada para Protected. Assim evitamos possíveis problemas que possam ocorrer com a posição dos botões nos formulários derivados do formulário base. Essa informação pode ser encontrada no artigo número 316560 no site da Microsoft. Mais adiante explicaremos os conceitos dos Modifiers.

Salve o arquivo (CTRL + S) e defina o frmBase como ponto inicial de nossa aplicação. Para isso siga os seguintes passos: Caso esteja trabalhando com Visual Basic .NET, exiba o Solution Explorer, clique com o botão direito no projeto, selecione Properties e na opção Common Properties / Gerenal defina o Startup Object para frmBase. Caso esteja trabalhando com C#, insira o método Main() de acordo com a Listagem 1 em seu frmBase.

 

Listagem 1. Definição do método Main() – C#

[STAThread]

static void Main()

{

            Application.Run(new frmBase());

}

 

Execute a aplicação (F5). O resultado obtido deve ser semelhante a Figura 1.

 

image002.jpg

Figura 1. Execução do formulário base

 

Codificando o formulário base

Agora que já definimos o layout do formulário base, inclua alguns procedimentos básicos. Como o foco do artigo é trabalhar com Herança Visual não estaremos preocupados em criar procedimentos complexos, e sim em demonstrar as funcionalidades existentes.

Para inserir os códigos dos botões, dê um duplo clique em cada um e codifique de acordo com a Listagem 2.

 

Listagem 2. Codificando os botões

Visual Basic .NET

 

Private Sub btnSalvar_Click(_

  ByVal sender As System.Object, _

  ByVal e As System.EventArgs) _

  Handles btnSalvar.Click

  MessageBox.Show("Por favor, preencha todas as informações.", _

  "Atenção", MessageBoxButtons.OK, _

   MessageBoxIcon.Exclamation)

End Sub

 

Private Sub btnExcluir_Click(_

  ByVal sender As System.Object, _

  ByVal e As System.EventArgs) _

  Handles btnExcluir.Click

  If MessageBox.Show("Deseja realmente excluir as informações?", _

     "Atenção", MessageBoxButtons.YesNo, _

     MessageBoxIcon.Question) = DialogResult.No Then

     Exit Sub

  Else

     stsBar.Text = "Dados excluídos com sucesso."

  End If

End Sub

 

Private Sub btnAtualizar_Click(_

  ByVal sender As System.Object, _

  ByVal e As System.EventArgs) _

  Handles btnAtualizar.Click

  stsBar.Text = "Dados recarregados com sucesso."

End Sub

 

C#

 

private void btnSalvar_Click(object sender, System.EventArgs e)

{

            MessageBox.Show("Por favor, preencha todas as informações.", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

}

 

private void btnExcluir_Click(object sender, System.EventArgs e)

{

            if (MessageBox.Show("Deseja realmente excluir as informações?", "Atenção", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)

            {

                        return;

            }

            else

            {

                        stsBar.Text = "Dados excluídos com sucesso.";

            }

}

 

private void btnAtualizar_Click(object sender, System.EventArgs e)

{

            stsBar.Text = "Dados recarregados com sucesso.";

}

 

Execute a aplicação (F5) e teste os três botões. Como devem ter percebido a codificação é extremamente simples, mas por enquanto é o necessário.

 

Herdando o formulário base

Uma vez criado o formulário base, crie novos formulários a partir dele. Clique com o botão direito no projeto e selecione Add / Add Inherited Form, defina o nome do novo formulário como frmDerivado.vb ou frmDerivado.cs e clique em Open. Será exibida a janela Inheritance Picker (Figura 2) com todos os formulários existentes a ser usado como base. Selecione frmBase e OK.

 

image004.jpg

Figura 2. Inheritance Picker

 

Note na Figura 3 que quando trabalhamos com herança visual, no canto superior esquerdo do controle no formulário derivado é exibido um ícone responsável por informar que este controle foi herdado de um formulário base.

 

image006.jpg

Figura 3. Formulário derivado do  formulário base

 

No novo formulário (frmDerivado) exiba o Toolbox (CTRL + ALT + X) e adicione um Label e um TextBox. Exiba a Properties Window (F4) e defina as propriedades dos controles de acordo com a Tabela 2:

 

Tabela 2. Propriedades dos controles

Controle

Propriedade

Valor

Label1

(Name)

lblNome

 

AutoSize

True

 

Location

16; 80

 

Text

Nome

TextBox1

(Name)

txtNome

 

Location

16; 96

 

Size

392; 20

 

Text

 

 

Defina o frmDerivado como ponto inicial (Startup) da aplicação, salve o arquivo (CTRL + S), execute a aplicação (F5) e teste o formulário derivado.

 

Sofisticando o formulário base

 

Na seção onde apresentamos algumas das vantagens de utilizarmos a Herança Visual, comentamos que as funcionalidades e propriedades pré-definidas no formulário base podem ser alteradas. Por padrão, qualquer controle incluído no formulário não permite qualquer tipo de alteração. Caso queira permitir que algo possa ser modificado, altere a propriedade Modifiers do controle, evento ou método.

Antes de realizar qualquer alteração no formulário base para permitir possíveis modificações, entenda os conceitos dos Modifiers existentes:

 

·         Private – Elementos são acessíveis apenas no contexto atual

·         Protected – Elementos são acessíveis no contexto atual e pelas classes derivadas

·         Public – Elementos são acessíveis em qualquer contexto

·         Friend – Elementos são acessíveis apenas dentro do projeto em questão

 

Como visto anteriormente, a codificação do formulário base foi extremamente simples para demonstrar os conceitos iniciais da Herança Visual. O próximo passo será alterar o código base e deixá-lo um pouco mais sofisticado.

No Solution Explorer (CTRL + ALT + L), clique duas vezes no frmBase e altere a propriedade Modifiers dos controles picIcone e lblTitulo para Protected. Note que ao realizar essa mudança, é exibida uma mensagem no Task List informando que é necessário que o projeto seja recompilado para que essas alterações sejam refletidas nos formulários derivados.

Selecione a opção de View Code (F7) e efetue as alterações no código do formulário de acordo com a Listagem 3.

 

Listagem 3. Permitindo alterações nos formulários derivados

Visual Basic .NET

 

Protected Overridable Function validarDados() As Boolean

  Return False

End Function

Protected Overridable Sub salvarDados()

End Sub

Protected Overridable Sub excluirDados()

End Sub

 

Private Sub btnSalvar_Click( _

  ByVal sender As System.Object, _

  ByVal e As System.EventArgs) _

  Handles btnSalvar.Click

  If validarDados() Then

     salvarDados()

  End If

End Sub

 

Private Sub btnExcluir_Click( _

  ByVal sender As System.Object, _

  ByVal e As System.EventArgs) _

  Handles btnExcluir.Click

  If MessageBox.Show("Deseja realmente excluir as informações?", _

     "Atenção", MessageBoxButtons.YesNo, _

     MessageBoxIcon.Question) = DialogResult.No Then

     Exit Sub

  Else

     excluirDados()

  End If

End Sub

 

C#

 

protected virtual bool validarDados()

{

  return false;

}

protected virtual void salvarDados()

{

}

protected virtual void excluirDados()

{

}

 

private void btnSalvar_Click(object sender, System.EventArgs e)

{

  if (validarDados())

  {

     salvarDados();

  }

}

 

private void btnExcluir_Click(object sender, System.EventArgs e)

{

  if (MessageBox.Show("Deseja realmente excluir as informações?", "Atenção", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)

  {

     return;

  }

  else

  {

     excluirDados();

  }

}

 

Note neste código a utilização das instruções Overridable (Visual Basic .NET) e virtual (C#), sendo responsáveis por especificar que a propriedade ou método referenciado pode ser sobrescrito na classe derivada.

 

Alterando o formulário derivado

 

Abra o Solution Explorer (CTRL + ALT + L), clique duas vezes no formulário frmDerivado, defina a propriedade Text do lblTitulo para Cadastro e a propriedade Image do controle picIcone para uma imagem de sua preferência. Estas alterações são possíveis devido a mudança dos Modifiers dos controles no formulário base. Verifique que o controle pnlTopo não permite nenhum tipo de modificação.

Como último passo implemente as funcionalidades de validarDados(), salvarDados() e excluirDados() que foram pré-definidas no formulário base. Selecione View Code (F7) e digite o código da Listagem 4.

 

Listagem 4. Sobrescrita de métodos

Visual Basic .NET

 

Protected Overrides Function validarDados() As Boolean

  If txtNome.Text.Trim = "" Then

     MessageBox.Show("O campo nome não foi informado.", _

     "Atenção", MessageBoxButtons.OK, _

     MessageBoxIcon.Error)

     txtNome.Focus()

     Return False

  ElseIf txtNome.Text.Trim.IndexOf(" ") = -1 Then

     MessageBox.Show("Por favor, informe o nome e sobrenome do cliente.", _

     "Atenção", MessageBoxButtons.OK, _

     MessageBoxIcon.Error)

     txtNome.Focus()

     Return False

  End If

  Return True

End Function

 

Protected Overrides Sub salvarDados()

  'Nesse ponto realizaríamos alguma manipulação

  'com Banco de Dados

  MessageBox.Show("Cadastro realizado com sucesso.", _

  "Atenção", MessageBoxButtons.OK, _

  MessageBoxIcon.Information)

  txtNome.Clear()

End Sub

 

Protected Overrides Sub excluirDados()

  MessageBox.Show("Não é permitido excluir o registro desejado.", _

  "Atenção", MessageBoxButtons.OK, _

  MessageBoxIcon.Exclamation)

End Sub

 

C#

 

protected override bool validarDados()

{

  if (txtNome.Text.Trim() == "")

  {

     MessageBox.Show("O campo nome não foi informado.", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Error);

             txtNome.Focus();

             return false;

  }

  else if (txtNome.Text.Trim().IndexOf(" ") == -1)

  {

     MessageBox.Show("Por favor, informe o nome e sobrenome do cliente.", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Error);

     txtNome.Focus();

     return false;

  }

  return true;

}

           

protected override void salvarDados()

{

  //Nesse ponto realizaríamos alguma manipulação

  //com Banco de Dados

  MessageBox.Show("Cadastro realizado com sucesso.", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Information);

  txtNome.Clear();

}

           

protected override void excluirDados()

{

  MessageBox.Show("Não é permitido excluir o registro desejado.", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

}

 

Conclusão

A funcionalidade de Herança Visual em Windows Application é um recurso poderoso e fácil de ser utilizado. Como vimos no artigo, não é preciso conheçer nenhuma técnica especial para utilização, basta conhecer um pouco de Orientação a Objeto e definir a estrutura base do formulário. A partir daí é só trabalhar normalmente com os formulários derivados.

 

Referências:

http://support.microsoft.com/default.aspx?scid=kb;en-us;316560