Encapsulamento em C#

O “Encapsulamento vem de encapsular, que em programação orientada a objetos significa separar o programa em partes, as mais isoladas possíveis. A idéia é tornar o software mais flexível, fácil de modificar e de criar novas implementações”. (Fonte: Wikipedia.org).

Introdução:

Neste artigo você irá aprender a como criar um objeto encapsulado para tornar uma caixa de texto estendida com novas funcionalidades, no nosso exemplo este novo objeto irá trocar as cores quando ganhar ou perder o foco, facilitando a percepção da alternância de código por parte do usuário. Na prática esse controle quando ganhar o foco ficará azul e quando perder ficará branco.

Outra funcionalidade estendida será a opção de tornar a caixa de texto numérica, ou seja, o usuário poderá definir através de uma propriedade própria se a caixa será numérica ou não.

Pode parecer fácil (e, na verdade é), mas imagine se seu formulário ou projeto tiver várias Caixas de Texto ou se você pretende usar isso em outros projetos? Seria muito repetitivo programar eventos para cada uma delas e isso tornaria o código deselegante.

Uma solução para esse problema é criar uma classe derivada de uma Caixa de Texto e encapsular nela todo o código necessário para a operação. Neste artigo iremos mostrar como criar uma Caixa de Texto que só aceita números (dependendo de sua propriedade Numeric, que criaremos) e que a cor do fundo altera-se quando recebe e perde o foco respectivamente.


Mão na massa

Primeiro comece um projeto novo em C# do tipo WindowsApplication, dê o nome de Encapsulamento e clique no botão OK.

Agora, na caixa de diálogo SolutionExplorer clique com o botão direito do mouse sobre o nome do projeto (Encapsulamento) e selecione Add à New Item. Escolha o tipo Class, dê o nome de MyTextBox e clique no botão Add.

Sua classe deve estar parecida com esta:

using System;

using System.Collections.Generic;
using System.Text;
namespace Encapsulamento
{
    class MyTextBox
    {
    }
}

Você precisa adicionar duas refêrencias: System.Drawing e System.Windows.Forms.

A seguir todo código comentado da classe MyTextBox:

using System;

using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
 
namespace Encapsulamento
{
    class MyTextBox : TextBox
    {
        private Color Cor;     /* Variável utilizada para armazenar 
                                  a cor do fundo atual */
        private bool numeric;  /* Variável utilizada para determinar
                                  se a caixa de texto deve aceitar
                                 letras ou não */       

        /* Um Override do método OnKeyPress() responsável pelo

           tatamento das teclas pressionadas */
        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            if (!numeric)
            {
                base.OnKeyPress(e);
                return;
            }
            if (char.IsNumber(e.KeyChar) || e.KeyChar.ToString() == "\b")
            {
                base.OnKeyPress(e);
            }
            else
            {
                e.Handled = true;
            }
        } 

        protected override void OnGotFocus(EventArgs e)

        {
            base.OnGotFocus(e);
            Cor = this.BackColor;
            this.BackColor = Color.AliceBlue;
        } 

        protected override void OnLostFocus(EventArgs e)

        {
            base.OnLostFocus(e);
            this.BackColor = Cor;
        }
    }
}

Agora precisamos criar um método de acesso para a variável privada numeric. Um método de acesso é usado para obter ou definir o valor de uma varável privada. O método de acesso para numeric é declarado assim:

public bool Numeric

{
    get
    {
        return numeric;
    }
    set
    {
        numeric = value;
    }
}

Você pode inserir o método de acesso logo depois de declarar a variável numeric.

O nome da variável e do método de acesso devem ser diferentes, por isso uma é escrita totalmente em minúscula e a outra começa com maiúscula.

Dentro do método de acesso Numeric existem outros dois métodos: get e set.

Get è Obtem o valor da variável;

Set è Define a variável de acordo com o valor passado (value).

O método OnKeyPress() começa verificando o valor da variável numeric, se for false o método trata a tecla pressionada normalmente e retorna:

if (!numeric)

{
    base.OnKeyPress(e); // Executa a operação padrão para o
                        // tratamento da tecla
    return; // Encerra o método sem executar as instruçôes
             // restantes
}

Caso seja true impede a entrada de letras:

if (char.IsNumber(e.KeyChar) || e.KeyChar.ToString() == "\b")

                                         // “\b” = BackSpace
{
    base.OnKeyPress(e); // Se for número executa a operação
                        // padrão
}
else
{
    e.Handled = true; // Se for letra impede sua entrada através
                      // do manipulador (Handled)
}

 

O método OnGotFocus() recebe o controle quando a Caixa de Texto recebe o foco. Ele é bem simples:

 

protected override void OnGotFocus(EventArgs e)

{
    base.OnGotFocus(e); // Executa as operações padrão
    Cor = this.BackColor; // Define a variável Cor com a atual
                          // cor de fundo (BackColor)
    this.BackColor = Color.AliceBlue; // muda a cor do fundo para
                                     // azul-claro (AliceBlue)
}

 

O método OnLostFocus() é executado quando a Caixa de Texto perde o foco. Também é simples:

 

protected override void OnLostFocus(EventArgs e)

{
    base.OnLostFocus(e); // Executa as operações padrão
    this.BackColor = Cor; // Muda a cor do fundo de volta para
                          // a original
}

 Agora que o código está pronto falta adicionar nossa Caixa de Texto ao projeto. Para isso clique em Build Solution no menu Build:

Nossa Caixa de Texto aprecerá na janela ToolBox:

O método de acesso Numeric aparece como uma propriedade da Caixa de Texto:

Para interromper a entrada de letras é só definir a propriedade Numeric com True.

Conclusão:

Neste artigo foi explorado o conceito de encapsulamento e criação de componentes estendidos. Você poderá implementar novos componentes com base em componentes já existente de forma bem simple, como visto nesse artigo. Para distribuir o componente você poderá criá-lo como DLL, que veremos em breve. Artigo com base nas aulas do professor Marcos Roberto de Moraes.

Autor:

Pedro Henrique Lemes da Silva

Técnico em Informática – Etec Pedro Ferreira Alves