Função FindClass
Centralizando a chamada aos formulários da aplicação
Neste artigo veremos como centralizar em um único método a criação e a chamada a todos os formulários da aplicação. Normalmente utilizamos um componente TMainMenu, onde em cada TMenuItem implementamos a chamada a um formulário da aplicação. Imagine que você precise adicionar alguma regra antes ou depois das chamadas aos formulários de sua aplicação; neste caso você terá que adicionar a nova regra em todos os eventos OnClick dos TMenuItem. O objetivo neste artigo é mostrar, de forma simples, o uso da função FindClass para localizar a classe referente ao formulário da aplicação, onde a partir dela podemos instanciar e chamar o formulário.
Exemplo
Neste exemplo implementaremos uma procedure para centralizar a criação e a chamada a todos os formulários de uma aplicação.
Nota. Este exemplo será criado no formato SDI, porém funciona também em aplicações no formato MDI. Neste caso, não há a necessidade de utilizar o método ShowModal para fazer a chamada ao formulário.
Crie uma nova aplicação Delphi (File/New/Application). Altere o nome do Form1 para FrmPrincipal e salve a unit como untFrmPrincipal. Para o arquivo de projeto de o nome de clubedelphi.dpr. Adicione mais três formulários (File|New|Form) a aplicação e altere a propriedade name dos formulários para FrmClientes, FrmFornecedores e FrmPedidos respectivamente. Salve as unit’s referente a cada formulário criado. Adicione um componente Label (paleta Standard) em cada formulário criado e altere sua propriedade caption para “Cadastro de Clientes”, “Cadastro de Fornecedores” e “Cadastro de Pedidos” respectivamente. Veja os formulários em tempo de design na Figura 1.
Figura 1. Formulários de exemplo em tempo de design
Selecione a opção Project|Options... a partir do menu principal do Delphi e selecione a página Forms da janela. Mova os formulários FrmClientes, FrmFornecedores e FrmPedidos para a seção Available forms (Veja a Figura 2). Desta forma os formulários não serão criados ao carregar a aplicação; nós precisaremos criá-los antes de fazer a chamada a eles.
Figura 2. Configurando a forma de criação dos formulários através da janela Project Options
Clique no botão OK para fechar a janela. Selecione o formulário FrmPrincipal e adicione um componente TMainMenu a partir da paleta de componentes Standard. Configure o componente TMainMenu de acordo com a Figura 3.
Figura 3. Adicionando as opções do menu principal da aplicação
Para o evento OnClick da opção Sair digite o seguinte código:
Application.Terminate;
Antes de implementarmos o evento OnClick dos demais TMenuItem vamos criar a procedure que fará a criação e a chamada aos formulários da aplicação a partir do nome da classe. Digite o seguinte código dentro da seção implementation da unit untFrmPrincipal:
procedure TFrmPrincipal.CriarForm(const ClasseForm : String);
var
Classe : TFormClass;
Objeto : TObject;
begin
Objeto := nil;
Classe := TFormClass(FindClass(ClasseForm));
if not Assigned(Objeto) then
Objeto := Classe.Create(nil);
try
if (Objeto is TForm) then
(Objeto as TForm).ShowModal;
finally
FreeAndNil(Objeto);
end;
end;
Selecione a opção Complete class at cursor a partir do menu de contexto do Editor do Delphi ou segure as teclas Shift+Ctrl+C para declarar o método CriarForm na seção Private da unit untFrmPrincipal.
Nota: Menu de contexto refere-se ao menu de opções que aparece ao clicar com o botão direito do mouse sobre um determinado componente ou área.
No método CriarForm definimos um parâmetro de entrada do tipo String onde passaremos o nome da classe do formulário que queremos criar e chamar. Utilizamos o método FindClass para procurar dentro do projeto pela classe em questão. Caso a classe especificada exista, nós a instanciamos. Após criada uma instância da classe, nós testamos se o objeto em questão é do tipo TForm, onde, caso seja nós fazemos a chamada ao método ShowModal para mostrar o formulário na tela.
Antes de utilizarmos o método para criar e chamar nossos formulários, nós devemos executar mais duas tarefas. Para que possamos utilizar o método FindClass para localizar as classes contidas no projeto nós devemos registrá-las dentro da unit que fará a pesquisa. Entre com o seguinte código nas seções initialization e finalization da unit untFrmPrincipal:
initialization
RegisterClasses([TFrmClientes, TFrmFornecedores, TFrmPedidos]);
finalization
UnRegisterClasses([TFrmClientes, TFrmFornecedores, TFrmPedidos]);
Utilizamos o método RegisterClasses para especificar dentro de um array de classes todas as classes referente aos formulários que iremos fazer a pesquisa através do método FindClass. Ao fechar a aplicação acionamos o método UnRegisterClasses para retirar o registros das classes dos formulários.
Nota: Se as classes não forem registradas dentro da unit, ao chamar o método FindClass o Delphi retornará uma exceção do tipo EClassNotFound.
Selecione a opção File|Use Unit... a partir do menu principal do Delphi ou pressione as teclas Alt+F11 para adicionar as unit’s dos formulários FrmClientes, FrmFornecedores e FrmPedidos a cláusula uses da unit untFrmPrincipal. Voltando as opções do menu principal da aplicação, adicione o seguinte código ao evento OnClick dos TMenuItem Cadastro de Clientes, Fornecedores e Pedidos:
procedure TFrmPrincipal.CadastrodeClientes1Click(Sender: TObject);
begin
CriarForm('TFrmClientes');
end;
procedureTFrmPrincipal.CadastrodeFornecedores1Click(Sender: TObject);
begin
CriarForm('TFrmFornecedores');
end;
procedure TFrmPrincipal.CadastrodePedidos1Click(Sender: TObject);
begin
CriarForm('TFrmPedidos');
end;
Salve e compile a aplicação. Não havendo erros execute (F9) e teste a aplicação
fazendo a chamada aos formulários a partir das opções do menu principal. Veja a aplicação em tempo de execução na Figura 4.
Figura 4. Centralizando a criação e a chamada aos formulários da aplicação
Código fonte completo da unit untFrmPrincipal:
unit untFrmPrincipal;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus;
type
TFrmPrincipal = class(TForm)
MainMenu1: TMainMenu;
Cadatro1: TMenuItem;
CadastrodeClientes1: TMenuItem;
CadastrodeFornecedores1: TMenuItem;
N1: TMenuItem;
CadastrodePedidos1: TMenuItem;
Sair1: TMenuItem;
procedure Sair1Click(Sender: TObject);
procedure CadastrodeClientes1Click(Sender: TObject);
procedure CadastrodeFornecedores1Click(Sender: TObject);
procedure CadastrodePedidos1Click(Sender: TObject);
private
procedure CriarForm(const ClasseForm: String);
{ Private declarations }
public
{ Public declarations }
end;
var
FrmPrincipal: TFrmPrincipal;
implementation
uses untFrmClientes, untFrmFornecedores, untFrmPedidos;
{$R *.dfm}
procedure TFrmPrincipal.Sair1Click(Sender: TObject);
begin
Application.Terminate;
end;
procedure TFrmPrincipal.CriarForm(const ClasseForm : String);
var
Classe : TFormClass;
Objeto : TObject;
begin
Objeto := nil;
Classe := TFormClass(FindClass(ClasseForm));
if not Assigned(Objeto) then
Objeto := Classe.Create(nil);
try
if (Objeto is TForm) then
(Objeto as TForm).ShowModal;
finally
FreeAndNil(Objeto);
end;
end;
procedure TFrmPrincipal.CadastrodeClientes1Click(Sender: TObject);
begin
CriarForm('TFrmClientes');
end;
procedure TFrmPrincipal.CadastrodeFornecedores1Click(Sender: TObject);
begin
CriarForm('TFrmFornecedores');
end;
procedure TFrmPrincipal.CadastrodePedidos1Click(Sender: TObject);
begin
CriarForm('TFrmPedidos');
end;
initialization
RegisterClasses([TFrmClientes, TFrmFornecedores, TFrmPedidos]);
finalization
UnRegisterClasses([TFrmClientes, TFrmFornecedores, TFrmPedidos]);
end.
Conclusões
Vimos neste artigo que a centralização das chamadas aos formulários de nossa aplicação em um único ponto reduzem a quantidade de código a ser implementado, como também facilita a manutenção em torno do procedimento de criação e chamada de formulários.
Clique aqui para fazer o download do arquivo.