Mantendo uma única instância de um Windows Form

Pois é pessoal… A semana de provas me fez atrasar um pouco o início das postagens, sem falar que eu fiquei um pouco atrapalhado com o tutorial de simulação de um Full Adder. Enquanto ele não sai, resolvi postar uma rotina que eu encontrei no blog theSpoke.net, postado pelo Francisco Benedito de Cerqueira Junior, que ensina como manter uma única instância de um Form em uma aplicativo MDI. Em seguida, estarei comentando algumas alterações que fiz no código apresentado.



bool open = false; 
foreach (Form frm in this.MdiChildren) 

      if (frm is TipoForm) //Comentário 1 
      { 
            frm.BringToFront(); 
            open = true; //Comentário 2 
      } 

if (!open) 

      Form frm = new TipoForm(); //Comentário 3 
      frm.MdiParent = this; //Comentário 4 
      frm.Show(); 
}


Essa rotina é aplicada no Form Pai, no momento em que ele chama um Form Filho. No momento em que é chamada, a rotina varre o Form Pai atrás de todos os Forms Filhos ativos. Enquanto é feita a varredura, a rotina verifica se encontrou o Form Filho do tipo desejado (Comentário 1). O tipo TipoForm indica qual Form você deseja exibir. Em C#, quando se deseja exibir um Form, você deve instanciá-lo para depois exibí-lo. Por exemplo, se você possui um Form chamado "frmUsuario", primeiro, você deve instanciá-lo (frmUsuario Usuario = new frmUsuario();), para depois exibí-lo (Usuario.Show();). Ao encontrar o Form Filho desejado, a rotina o traz para o primeiro plano da Área de Trabalho e seta a flag open como true (Comentário 2). Essa flag serve para que a rotina não abra novamente o mesmo Form Filho.

O próximo passo da rotina é executado quando o Form Filho desejado não é encontrado. O processo é básicamente o que eu expliquei no parágrafo anterior. Mas notem que, não apenas nesse trecho da rotina (Comentário 3), mas em toda a rotina, nós não trabalhamos com um Form frm definido, mas sim com um Form frm genérico. Isso é feito para que a rotina verifique todos os Forms Filhos que estejam abertos, sem distinção. O Form que será aberto é definido no momento em que é feita a instância. Como observação, se você analisar o código original, você verá que quando é gerada a instância, é utilizado o comando Activator.CreateInstance(). Eu tentei implementar dessa maneira, mas ocorreram erros de compilação, e eu optei por utilizar o método convencional. Não esqueça de informar qual é o Form Pai para o Form Filho que será exibido (Comentário 4).

Da maneira como é apresentada, essa rotina funciona perfeitamente no evento onClick() de um Button ou de um ToolStripMenuItem. Caso você queira ver a rotina original e outras maneiras de executar o mesmo processo, você poderá encontrá-las neste endereço.

Até o próximo post!


Revisão – 06/novembro/2009: Os links do theSpoke.net não estão mais disponíveis.

, ,

  1. Os números de 2010 « C# Developers

Deixe uma resposta

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

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.