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..3] of 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(); |