Fórum Form em Tempo de Execução #281824
16/05/2005
0
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
Curtir tópico
+ 0Posts
17/05/2005
Ericlemes
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
17/05/2005
Marco Salles
1) Estes forms não foram declarados em tempo de Projeto
:arrow:
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
18/05/2005
Davicarrano
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
18/05/2005
Massuda
...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´);
initialization RegisterClass(...classe do seu form...);
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
Clique aqui para fazer login e interagir na Comunidade :)