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.
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.
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.
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