Entendendo o ciclo de vida de um Form (Windows Forms)

Neste post iremos aprender como é o ciclo de vida de um Form na plataforma descktop, ou seja Windows Forms, trabalharemos com delegates, EventHandler, objetos e eventos da classe System.ComponetModel, veremos em que momento são disparados eventos em tempo de vida de um Form como Closed, Closing, Activated, e Deactivated.

Uma breve explicação sobre o que é um “delegate”

Essencialmente um delegate é um objeto com segurança de tipo, ou seja, ele aponta para um método ou possivelmente uma lista de métodos, na aplicação, e que pode ser chamado no futuro, especificadamente um objeto delegate mantem três informações importantes:

O endereço do método no qual ele faz a chamada.
Os argumentos, se houver deste método.
O valor de retorno, se houver deste método.

Observação: Os delegates na plataforma .NET pode apontar para métodos estáticos e instancias.

Um delegate em .NET possui a capacidade de chamar método de maneira sincronizada ou assíncrona. Este fato simplifica e muito as tarefas de programação, já que podemos chamar um método de uma cadeia de execução dentro de nossa aplicação (Thread = Cadeia). Breve estarei publicando um post neste blog abrangendo mais a fundo o termo delegate e thread.

Criando a Aplicação para ver o ciclo de vida do Form

Se você programou interfaces de usuário utilizando o kit de ferramentas GUI, como Java Swing, Mac OS-X, ou API bruta Win32, você esta ciente que tipos “tipo janelas” possuem uma quantidade de eventos que disparam durante seu tempo de vida. O mesmo acontece com Windows Form. Como você viu a vida útil de um formulário começa quando o construtor de tipo é chamando antes de ser passado ao método Application.Run().  Assim que o objeto é alocado na Heap gerenciado, o framework dispara o evento Load. Dentro de um manipulador de evento Load, você é livre para configurar a aparência e funcionalidade do Form, preparar quaisquer controles filhos contidos (como ListBox, Treeviews e qualquer outro), ou simplesmente alocar recursos utilizados durante a operação Form, (conexões de banco, proxys para objetos remotos como Client-Server).

Uma vez disparado o evento Load, o próximo evento a ser disparado é o Activated (Ativado), esse evento será ativado quando o formulário receber o foco com a janela ativa na área de trabalho. A parte contraria digamos assim desse evento é o Deactivate (Desativado) que disparara varias vezes pelo tempo de vida de um Form qualquer, assim que o usuário navegar entre os aplicativos ativos. Suponha que o usuário escolheu fechar o formulário em questão, dois disparos em eventos focados em fechar: Closing e Closed. O evento Closing é disparado primeiro e é um lugar ideal para mostrar ao usuário final uma mensagem muito odiada (mas util): Voce tem certeza que deseja fechar este aplicativo. Esse passo adaptável é extremamente útil para assegurar que o usuário tenha uma chance de salvar quaisquer dados focados em aplicativo, antes de terminar o programa.

O evento Closing funciona como um delegado CancelEventHandler definido no namespace System.ComponetModel. Se você ajustar a propriedade CancelEventArgs.Cancel para true, você evitara que a janela seja destruída e a instruirá para retornar para a operação normal. Se você ajustar o CancelEventArgs.Cancel para false, o evento Closed disparará, o aplicativos Windows Form descarregara o AppDomain e p processo terminara. Para solidificar a sequencia de eventos que tomam lugar durante o tempo de vida do formulário, suponha que você tenha um novo projeto Windows Form chamando FormLifeTime e tenha renomeado o formulário inicial para MainWindow.cs (Através do Solution Explorer) agora dentro do seu construtor de formulário manipule o evento Load,

Activated
Deactivate
Closing
Closed

Observação: Para gerar automático o evento do delegado correto basta pressionar TAB duas vezes depois digitar +=

public MainWindow()
 {
 InitializeComponent();
// Delegados apontados para os Eventos do Formulario
 Closing += new CancelEventHandler(MainWindow_FormClosing);
 Load += new EventHandler(MainWindow_Load);
 Closed += new EventHandler(MainWindow_FormClosed);
 Activated += new EventHandler(MainWindow_Activated);
 Deactivate += new EventHandler(MainWindow_Deactivate);
 }

Dentro dos manipuladores de eventos Load, Closed, Activated, Deactivated, você estará atualizando o valor de uma nova variável membro string de nível de Form, que acaba de ser interceptada. Assim note que dentro do manipulador de evento Closed, você mostrara o valor dessa string dentro de uma caixa de mensagem:

// Evento ao carregar formulario
private void MainWindow_Load(object sender, EventArgs e)
{
lifeTimeInfo += ">>> Carregando \n";
}

// Evento quando o formulario é ativo
private void MainWindow_Activated(object sender, EventArgs e)
{
lifeTimeInfo += ">>> Ativado \n";
}

// Evento quando o formulario é desativado
private void MainWindow_Deactivate(object sender, EventArgs e)
{
lifeTimeInfo += ">>> Desativado \n";
}

// Evento quando o formulario é fechado
private void MainWindow_FormClosed(object sender, EventArgs e)
{
lifeTimeInfo += ">>> Fechado \n";
MessageBox.Show(lifeTimeInfo);
}

Dentro do manipulador de evento Closing, você induzira o usuário para assegurar que ele ou ela terminem o aplicativo utilizando o CancelEventArgs de chagada. No código seguinte, note que o método MessageBox.Show() retornará um tipo DialogResult, que contem um valor que representa qual o botão oi selecionado pelo usuário final. Dessa forma, produziremos  uma caixa de mensagem que mostrara Yes (Sim) e No (Não)  então, estamos interessados em descobri r se o valor de retorno de Show() será DialogResult.No.

// Evento quando o formulario esta sendo fechado ele é chamando antes do evento Closed
private void MainWindow_FormClosing(object sender, CancelEventArgs e)
{
lifeTimeInfo += "Fechando \n";
DialogResult dr = MessageBox.Show(this, "Você deseja realmente fechar esta janela", "Evento Fechando (Closing) deste Form", MessageBoxButtons.YesNo, MessageBoxIcon.Information);

// Qual dos Botoes foi clicado ?
if (dr == DialogResult.No)
e.Cancel = true;
else
e.Cancel = false;
}

Agora rode o aplicativo e mova o formulário para fora de foco algumas vezes (não dispare os eventos Activated e Deactivated). Uma vez desligado o aplicativo você vera uma caixa de mensagem que se parece como a figura a baixo:

Espero que tenham entendido os eventos em tempo de vida de um Form ou seja quando ele esta ativo na area de trabalho do usuario, varias coisas podem acontecer ao ativar, inativar, fechar um form, minimizar etc.

Abraços.
Até o próximo post.

Deixe um comentário