Form - Carregar a partir de string

Top  Previous  Next

Criando um Formulário a Partir de uma String

 

Você já se deparou com a necessidade de criar um objeto 

onde o nome da classe somente será definido em tempo de 

execução da aplicação? 

 

Essa dica apresenta uma solução bastante simples para 

implementar uma função genérica para criação de formulários 

a partir de um parâmetro recebido do tipo string com o nome 

da classe do formulário a ser criado. 

 

Apesar do código exemplo criar formulários, o método descrito 

pode ser utilizado para qualquer tipo de objeto descendente da 

classe TPersistent. 

 

O primeiro procedimento para implementação deste método é o 

registro da classe que se deseja acessar a partir do nome da 

mesma. Isso é necessário para que a classe seja incorporada a 

lista de classes do Delphi e com isso seja encontrada pela 

função FindClass. Tal procedimento deve ser realizado em 

tempo de execução com a função RegisterClass (conforme podemos 

verificar no código abaixo).

 

No exemplo foi criado um procedimento denominado CriaForm 

que implementa a criação do formulário baseado no nome da 

classe do mesmo. Nela está descrita a chamada à função 

FindClass que retorna um ponteiro par a classe desejada. 

A partir deste ponteiro, criaremos nosso formulário.

 

Este exemplo foi desenvolvido no Delphi 3, todavia, as 

funções utilizadas aqui estão presentes na ferramenta deste 

sua primeira versão, o que não impede seu funcionamento nas 

versões anteriores do Delphi. Boa diversão.

 

//Cláusula Uses para acessar as Units dos demais Forms

 

uses

 

U_Form2,U_Form3, U_Form4;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

     {Chamada da função RegisterClass para registrar

      cada uma das classes de formulários que podem

      ser criados. Esse procedimento é imprescindível

      para que a função FindClass encontre a classe.}

 

    RegisterClass(TForm2);

    RegisterClass(TForm3);

    RegisterClass(TForm4);

end;

 

{ Procedimento CriaForm que implementa a Criação

  do Formulário baseado no nome da classe do

  mesmo recebida como parâmetro. }

 

procedure CriaForm(const Nome : string);

var

   Tela : TForm;

 Classe : TFormClass;

 

Begin

     // Chamada da função FindClass do Delphi que procura uma classe registrada.

 

     Classe := TFormClass(FindClass(Nome));

     Tela := Classe.Create(Application);

     Tela.Show;

end;

 

procedure TForm1.ListBox1Click(Sender: TObject);

Begin

     {Chamada da função CriaForm passando como parâmetro

      o nome da classe clicada dentro do ListBox.}

 

    CriaForm(ListBox1.Items[ListBox1.ItemIndex]);

end

 

 

===================================================================================

MANEIRA 2

===================================================================================

Abrindo Forms a partir do tag e um array de strings

 

procedure TForm1.Button1Click(Sender: TObject);

Const 

    Nomes : Array[1..3of string = ('Form2','Form3','Form4');

Var   

   Obj : TButton;

   FormExec : TForm;

begin

  Obj := (sender as tbutton);

 

  // Tenta localizar o form atraves da funcao findcomponent. Caso

  //  encontre-a retorna um ponteiro para ela, que deve ser convertido

  //  para TForm

 

  FormExec := TForm(Application.FindComponent(Nomes[Obj.Tag]));

 

  // Se achou entao o ponteiro sera diferente de NIL

 

  If FormExec <> nil Then FormExec.Show;

end;

 

===================================================================================

MANEIRA 3

===================================================================================

Criando forms a partir de strings

 

FrmExemplo := TForm( GetClass( 'TFRMEXEMPLO' ) ).Create();