Controlando abertura de janelas com Windows Forms

Uma das questões que tenho visto muito no Fórum MSDN é que vários usuários tem dúvidas é de como controlar corretamente a abertura de janelas em suas aplicações Windows Forms. Claro, abrir uma janela é algo bem simples, mas falo em gerenciar o ciclo de vidas das janelas, permitindo que somente uma delas fique possa ser aberta e também capturando valores das janelas abertas.

1. Form MDI

Vamos ao primeiro exemplo, uma janela MDI(multiple document interface) que irá comportar todas as janelas da nossa aplicação e controlar a abertura das janelas de modo que somente uma instância de cada janela possa existir durante a execução da aplicação.

Para começar, vamos criar um projeto Windows Forms, por padrão o Visual Studio irá criar um Form de nome Form1.cs, Ele será nossa janela MDI, para isso vamos alterar a propriedade do Form IsMdiContainer p/ TRUE conforme a imagem abaixo:

Agora iremos criar um novo Form. Para o exemplo, irei criar uma janela com um formulário para cadastrar usuários, algo bem simples, pedindo apenas o nome  e a data de nascimento do usuário, segue abaixo o layout da janela.

Criado a janela que deverá ser aberta, agora é será definido como isto será feito. Para o exemplo vamos criar um pequeno menu utilizando o controle MenuStrip, definindo apenas um Item e um Sub-Item.

Agora vamos digitar o código que irá controlar a abertura do nosso form, deixando que apenas uma instância da janela exista durante a execução e eliminando a janela da memória quando ela não for mais necessária. Se você prestar atenção essa descrição lembra uma Pattern (Padrão de projeto) conhecido como Singleton. Basicamente utilizaremos o principio deste padrão no nosso código, conforme pode ser visto no código abaixo:

/// <summary>
/// Declaração da váriavel do Form
/// </summary>
private CadUsu frmCadUsu = null;

/// <summary>
/// Abertura da Janela de Cadastro de Usuário
/// Baseado no pattern Singleton
/// Verificando se a janela já existe
/// Instânciando o form caso ela não exista
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void usuárToolStripMenuItem_Click(object sender, EventArgs e)
{
 if (frmCadUsu == null)
 {
   frmCadUsu = new CadUsu();
   frmCadUsu.MdiParent = this;
   frmCadUsu.Disposed += new EventHandler(frmCadUsu_Disposed);
   frmCadUsu.Show();
 }
}
/// <summary>
/// Evento que será disparado quando a janela for fechada
/// Eliminando o objeto da memória
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void frmCadUsu_Disposed(object sender, EventArgs e)
{
   frmCadUsu = null;
}

Veja que o código é bem simples, basicamente controlamos a variável que recebe a janela em questão. Se ela for nula, instanciamos a janela, informando qual o FormMdi Pai e criando o evento que será disparado quando a janela for fechada. Este evento limpa a variável da janela, para que então, ela possa ser aberta novamente.

2. Recuperando um valor digitado no Form aberto
Agora que criamos o Form e já estamos controlando a sua criação, vamos retornar um valor do Form Instanciado. Para isso, vamos inserir o seguinte código na nossa janela CadUsu:

/// <summary>
/// Retorna o valor digitado no controle txtNome
/// </summary>
public string NomeUsuario
{
   get { return txtNome.Text; }
}

/// <summary>
/// Retorna a data selecionada no DtpDatNasc
/// </summary>
public DateTime DataNascimento
{
   get { return dtpDatNasc.Value; }
}

private void btnFechar_Click(object sender, EventArgs e)
{
   this.Close();
}

Para finalizar nosso pequeno exemplo, vamos capturar os valores quando a janela for fechada. Para isso teremos que utilizar outro evento da janela aberta, o FormClosing. Este evento é disparado durante o fechamento da janela, mas antes do dispose dos controles em memória. O código ficará assim:


/// <summary>
/// Declaração da váriavel do Form
/// </summary>
private CadUsu frmCadUsu = null;

/// <summary>
/// Abertura da Janela de Cadastro de Usuário
/// Baseado no pattern Singleton
/// Verificando se a janela já existe
/// Instânciando o form caso ela não exista
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void usuárToolStripMenuItem_Click(object sender, EventArgs e)
{
  if (frmCadUsu == null)
  {
      frmCadUsu = new CadUsu();
      frmCadUsu.MdiParent = this;
      frmCadUsu.FormClosing += new FormClosingEventHandler(frmCadUsu_FormClosing);
      frmCadUsu.Disposed += new EventHandler(frmCadUsu_Disposed);
      frmCadUsu.Show();
   }
}

/// <summary>
/// Evento que será disparado durante o fechamento da janela
/// aonde iremos capturar os valores das propriedades
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void frmCadUsu_FormClosing(object sender, FormClosingEventArgs e)
{
   //Verifica se algum valor foi digitado
   if (frmCadUsu.NomeUsuario.Length > 0)
      this.mostraDadosUsuarios(frmCadUsu.NomeUsuario,
   frmCadUsu.DataNascimento);
}

/// <summary>
/// Mostra os dados do usuário
/// </summary>
/// <param name="p"></param>
/// <param name="dateTime"></param>
private void mostraDadosUsuarios(string _Nome, DateTime _DatNasc)
{
   int idadeUsu = DateTime.Now.Subtract(_DatNasc).Days / 360;
   MessageBox.Show(string.Format("Olá {0}, \r\n Você tem: {1} Anos", _Nome, idadeUsu));
}

/// <summary>
/// Evento que será disparado quando a janela for fechada
/// Eliminando o objeto da memória
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void frmCadUsu_Disposed(object sender, EventArgs e)
{
   frmCadUsu = null;
}

Ao final, teremos uma tela mostrando o resultado dos dados digitados:

Bom, é isso. Eu sei que não foi um post de assuntos novos, nem nada de muito complicado, mas espero que ele ajude a quem precisa 🙂


Anúncios
Esse post foi publicado em C#, Windows Forms. Bookmark o link permanente.

Uma resposta para Controlando abertura de janelas com Windows Forms

  1. Abina disse:

    Abina :
    muito bom neto postei no meu site desssa e outra bem legais

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s