Form em Tempo de Execução

Delphi

16/05/2005

Boa tarde galera... Estou com uma duvida
Estou tentando criar um formulário em tempo de execução.

sei que isto é possivel assim:

Application.CreateForm(TForm_Fornecedores, Form_Fornecedores);

Só que eu criei uma função pra poder criar os formularios e eu passo pra essa função apenas o nome do formulario como parametro.
Entao eu quero criar um formulário a partir de uma String que contém o nome dele.
Como ficaria o Codigo pra isso.....
Obrigado pela atenção....
[/b]


Davicarrano

Davicarrano

Curtidas 0

Respostas

Ericlemes

Ericlemes

16/05/2005

Bom,

Se você está falando em instanciar alguma coisa por nome, está falando em RTTI.

Na prática.

var
Form: TForm;
begin
Form := TForm(FindClass(´Form_Fornecedores´));
end;

Verifique se o otimizador do delphi, em tempo de compilação, não vai acabar arrancando esse form do teu executável. Se não tiver nenhuma referência direta à classe TForm_Fornecedores, ele vai fazer isso, aí vc precisa colocar um ´RegisterClass´ em algum lugar.

A unit ´Classes´ contém essas funções, que existem desde o nível ´TPersistent´ na VCL. Nâo dá pra fazer nada parecido com isso diretamente de ´TObject´.

Boa sorte.


[]´s

Eric Lemes


GOSTEI 0
Marco Salles

Marco Salles

16/05/2005

Veja , ha duas situações distintas:

1) Estes forms não foram declarados em tempo de Projeto
:arrow:
Se você está falando em instanciar alguma coisa por nome, está falando em RTTI.


Para o esquema usando FindClass funcionar OK, em cada unit que declara um form que poderá ser criado pelo nome, inclua o seguinte:Código:
initialization 
  RegisterClass(TSeuForm); 
no final da unit, antes do "end." Isso garante que o Delphi conseguirá encontrar a classe pelo nome. 


:arrow: Outra
2) estes forms que voce quer cria-los estão na Secção Available Forms e não na secção Auto_Create_Form. Portando a declaração de Classe ja existe e voce so quer cria-los em tempo de execução.. Para não sobrecarregar o Aplicativo na inicialização

[b:38af5e2c10]Nesta segunda opção , ja é um outro modo :[/b:38af5e2c10]
procedure CriarFormPeloNome(TFormulario:TComponentClass; var Formulario); 
begin 
      Application.CreateForm(TFormulario,Formulario); 
      Tform(Formulario).ShowModal; 
      Freeandnil(TForm(formulario)); 
 end; 

Para Chamar O método basta: 

CriarFormPeloNome(TNomeDoForm,NomeDoForm);


Ou ainda pode usar o FindComponent e tentar assim Para chamar a Procedure.. Esta segunda parte eu nunca testei :lol: :lol:
CriarFormPeloNome(FindComponet(´NomeDoForm´),NomeDoForm);



GOSTEI 0
Davicarrano

Davicarrano

16/05/2005

eu tentei utilizar esse procedimento
CriarFormPeloNome(TFormulario:TComponentClass...
so que o parametro é do tipo TComponentClass e quando eu utilizo o comando FindComponent(NomedoForm) ele retorna um Component, ai da msg de erro falando dos tipos incompativeis TComponentClass e TComponent...
se tiver uma solução vai ajudar muito..
Desde já muito obrigado pela atenção de vcs....


GOSTEI 0
Massuda

Massuda

16/05/2005

Outras formas de criar forms...

...criar o form a partir da classe do form:
function CriarFormPelaClasse(const AClasse: TFormClass): TForm;
begin
  Result := AClasse.Create(Application);
end;

// use assim: MeuForm := CriarFormPelaClasse(TMeuForm);


...criar um form a partir do nome da classe do form:
function CriarFormPeloNomeDaClasse(const ONomeDaClasse: TFormClass): TForm;
var
  Classe: TFormClass;
begin
  Classe := TFormClass(FindClass(ONomeDaClasse));
  Result := Classe.Create(Application);
end;

// use assim: MeuForm := CriarFormPeloNomeDaClasse(´TMeuForm´);
Para isso funcionar direito, inclua o seguinte no final de cada unit que implementa o form a ser criado através da função:
initialization
  RegisterClass(...classe do seu form...);
Um efeito colateral disso é que, dependendo do caso, você não precisa mais incluir as units que implementam seus forms no uses para poder criar seus forms.

Para poder criar um form a partir de um nome (propriedade TForm.Name), o form cujo nome será referenciado precisa ter sido criado previamente. Nesse caso, faça assim:
function CriarFormPeloNome(const ONome: string): TForm;
var
  Classe: TFormClass;
  I: Integer;
begin
  Result := nil;
  for I := 0 to Screen.FormCount - 1 do begin
    if Screen.Forms[I].Name = ONome then begin
      Classe := TFormClass(Screen.Forms[I].ClassType);
      Result := Classe.Create(Application);
      Break;
    end;
  end;
end;

// use assim: MeuForm := CriarFormPeloNome(´NomeDoMeuForm´);



GOSTEI 0
POSTAR