Desenvolvimento - C/C++

Gerenciamento de janelas em Cpp Builder - parte 4

Esta é a quarta parte da série sobre C++ Builder.

por Wanderley Caloni Jr



Abra o Builder. Um projeto padrão é criado. Agora no menu File, vá em New, Form. Isso adicionará um novo formulário ao projeto padrão. Pronto! Temos dois formulários. Agora se formos dar uma passeada no WinMain(), vemos que o código para iniciar a VCL se alterou conforme a música:

//...
   try
   {
      Application->Initialize();
      Application->CreateForm(__classid(TForm1), &Form1);
      Application->CreateForm(__classid(TForm2), &Form2);
      Application->Run();
   }
//...

Porém, se rodarmos a aplicação nesse momento, podemos notar que o programa exibe apenas a janela correspondente ao primeiro formulário. De fato, ao chamar o método Application->Run(), apenas o primeiro form criado é exibido. Isso não significa, é claro, que o segundo form não tenha sido criado. Para demonstrar como ele está lá, coloque o seguinte evento no clique de um botão do Form1:

#include "Unit2.h" // extern PACKAGE TForm2 *Form2;

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   Form2->Show();
}

Agora ao clicar do botão a janela correspondente ao formulário número 2 também aparece. Mas podemos fechá-la e abri-la quantas vezes quisermos que o aplicativo continua rodando. Apenas ao fechar a janela no. 1 o aplicativo realmente encerra. Esse comportamento segue o mesmo padrão da função main() na forma clássica das linguagens C/C++:

ShowMessage("O MainForm de Application é o primeiro TForm criado. "
            "É o princípio e o fim, o Alfa e o Ômega. Nele tudo começa e tudo termina");

Podemos, também como em C/C++ padrão, finalizar explicitamente a aplicação chamando o método Application->Terminate(). O MainForm em tempo de execução é uma propriedade de somente leitura de Application. Em tempo de design, ele pode ser alterado pela ordem de criação dos formulários no código ou pela IDE em Project, Options, Forms. Lá você também escolhe quais forms serão criados automaticamente.

Esse funcionamento e automação na criação de janelas da VCL foi feita para facilitar a vida do programador. Contudo, nunca estamos presos a somente isso. As maneiras das coisas funcionarem apenas refletem o uso mais comum no ambiente e não tem como função limitar a criatividade do desenvolvedor.

Para exemplificar, vamos inverter as coisas. Coloque um botão no segundo formulário que finalize o programa de maneira explítica:

void __fastcall TForm2::Button1Click(TObject *Sender)
{
   Application->Terminate();
}

Agora, no evento de OnClose (acho que você conhece o Object Inspector, não? Bom, se não conhece, talvez isso merece um artigo à parte) do TForm1 insira o seguinte código:

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
   Action = caNone;
}

Pronto! Agora você decide onde termina e onde acaba sua aplicação.

Artigo original retirado de "Gerenciamento de janelas em C++ Builder", por Wanderley Caloni.

Wanderley Caloni Jr

Wanderley Caloni Jr