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
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:
1 Label - lblmsg
1 TextBox - txtTexto
2 Buttons - btnExibir e btnOcultarExibirForm
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:
1 Button - btnExibirForm1
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: