C# - Trabalhando com instâncias de formulários


 O artigo de hoje vamos recordar alguns conceitos básicos sobre formulários Windows Forms usando a linguagem C#.

Se você está começando agora com a linguagem C# e já descobriu o poder das aplicações Windows Forms já sabe que a classe Form é um modelo para um objeto e que instâncias da classe Form são objetos que você usa em suas aplicações.

Apenas para nos situarmos abaixo vemos a hierarquia de herança da classe Form:

System.Object
  System.MarshalByRefObject
    System.ComponentModel.Component
      System.Windows.Forms.Control
        System.Windows.Forms.ScrollableControl
          System.Windows.Forms.ContainerControl
            System.Windows.Forms.Form

Onde Form é uma representação de qualquer janela exibida em seu aplicativo.

 

Recursos usados :

Criando a solução no VS 2013 Express Edition

Abra o VS 2013 Express for Windows desktop e clique em New Project;

A seguir selecione Visual C# -> Windows Forms Application;

Informe o nome Usando_Forms e clique no botão OK;

No formulário form1.cs do projeto vamos incluir os seguintes controles a partir da ToolBox:

Disponha os controles no formulário conforme o leiaute da figura abaixo:

No formulário Form1.cs vamos incluir o código abaixo no evento Click do botão de comando Exibir Texto:

   private void btnExibir_Click(object sender, EventArgs e)
   {
            lblmsg.Text = txtTexto.Text;
   }

Agora no evento Click do botão de comando - Ocultar Form1 e Exibir Form2 - inclua o código abaixo:

 private void btnOcultarExibirForm_Click(object sender, EventArgs e)
 {
      this.Hide();
      Form2 frm2 = new Form2();
      frm2.Show();
 }

Agora vamos incluir um novo formulário Form2.cs em nosso projeto;

No menu PROJECT Clique em Add Windows Forms e aceite o nome padrão Form2.cs;

No formulário form1.cs do projeto vamos incluir os seguintes controles a partir da ToolBox:

Disponha o controle no formulário conforme o leiaute da figura abaixo:

No Form2.cs no evento Click do botão Exibir Form1 inclua o código abaixo:

  private void btnExibirForm1_Click(object sender, EventArgs e)
  {
       Form1 form1 = new Form1();
       form1.Show();
  }

Agora executando o projeto e clicando no botão - Exibir Texto - teremos o resultado abaixo:

A seguir clicando no botão - Ocultar Form1 e Exibir Form2 - iremos obter o seguinte resultado:

E clicando no botão Exibir Form1 teremos o resultado a seguir:

Perceba que perdemos a informação que estava sendo exibida no controle Label1 - lblmsg.

É claro que em um formulário de uma aplicação real deverá existir um monte de informação na instância do formulário e tudo isso seria perdido.

Isso ocorre porque no formulário Form2, no botão de comando, o código cria uma nova instância do formulário Form1 ( Form1 form1 = new Form1() )

Como podemos então retornar para a instância atual do Form1 e manter a informação existente no formulário intacta ?

Uma forma elegante de fazer isso é criar uma propriedade no formulário Form2 que armazena a instância da classe Form.

Obs: Note que estamos criando uma instância da classe Form e não Form1, fazendo assim uma referência para uma instância de qualquer classe derivada da classe Form poderá ser armazenada na propriedade e não apenas uma instância de Form1.

O código do formulário Form2.cs deverá ficar assim:

  public partial class Form2 : Form
   {
        public Form2()
        {
            InitializeComponent();
        }
        public Form ReferenciaDaInstanciaDoForm { get; set; }
        private void btnExibirForm1_Click(object sender, EventArgs e)
        {
            //utiliza a referência atual de Form2 criada no Form1
            ReferenciaDaInstanciaDoForm.Show();
        }
  }

Precisamos alterar também o código do formulário Form1.cs no evento Click do botão Ocultar Form1 e Exibir Form2 conforme abaixo:

 private void btnOcultarExibirForm_Click(object sender, EventArgs e)
 {
      this.Hide();
      Form2 frm2 = new Form2();
      frm2.ReferenciaDaInstanciaDoForm = this;
      frm2.Show();
 }

Dessa forma se repetirmos a operação inicial iremos obter o seguinte resultado:

Ou seja, o formulário será exibido com os dados originais e nada será perdido.

Dessa forma você viu que utilizar propriedades é uma boa prática para comunicar instâncias de formulários entre módulos em aplicações Windows Forms.

Existe uma outra abordagem que utiliza variáveis estáticas públicas para armazenar a referência à instância do formulário.

Usando essa abordagem devemos alterar o código do formulário Form1 declarando uma variável estática do tipo Form1 e usando a palavra this para armazenar a referência da instância atual de Form1 na variável:

 public static Form1 staticVariavel = null;
 private void btnOcultarExibirForm_Click(object sender, EventArgs e)
 {
      staticVariavel = this;
      this.Hide();
      Form2 frm2 = new Form2();
      frm2.Show();
 }

E alterar também o código do botão no formulário Form2 onde basta usar a referência armazenada na variável estática exibindo a instância do formulário Form1:

  private void btnExibirForm1_Click(object sender, EventArgs e)
  {
       form1.staticVariavel.Show();
  }

Essa abordagem também funciona mas ele fere as boas práticas, pois usando variáveis públicas estamos ferindo o encapsulamento, um dos pilares da programação orientada a objetos.

Pegue o projeto completo aqui :  Usando_Forms.zip

Disse-lhes, pois, Jesus: Quando levantardes o Filho do homem, então conhecereis que EU SOU, e que nada faço por mim mesmo; mas isto falo como meu Pai me ensinou.
João 8:28

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

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti