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.