Função para criar formulário
Boa tarde,
Eu crio formulários com o seguinte código.
E gostaria de passar ele para uma procedure para que eu só precise informar o nome do formulário.
Ex.:
Eu crio formulários com o seguinte código.
if not assigned (Frm_clientes) then
begin
Screen.Cursor := crHourGlass;
Application.CreateForm(TFrm_clientes, Frm_clientes);
Frm_clientes.Show;
Screen.Cursor := crDefault;
end
else
Frm_clientes.Show;E gostaria de passar ele para uma procedure para que eu só precise informar o nome do formulário.
Ex.:
CriaFormularios(frm_clientes);
Nícolas Braz
Curtidas 0
Respostas
Deivison Melo
13/12/2012
Segue:
procedure ChamaForm(aClasseForm: TComponentClass; aForm: TForm);
//Chamar formulário
procedure ChamaForm(aClasseForm: TComponentClass; aForm: TForm);
begin
{método para chamar form}
Application.CreateForm(aClasseForm, aForm);
try
aForm.ShowModal;
finally
FreeAndNil(aForm);
end;
end;
procedure ChamaForm(aClasseForm: TComponentClass; aForm: TForm);
//Chamar formulário
procedure ChamaForm(aClasseForm: TComponentClass; aForm: TForm);
begin
{método para chamar form}
Application.CreateForm(aClasseForm, aForm);
try
aForm.ShowModal;
finally
FreeAndNil(aForm);
end;
end;
GOSTEI 0
Claudia Nogueira
13/12/2012
Já usei da forma que o Deivison passou, e hoje em dia eu fiz uma outra procedure, pois tive a necessidade de não referenciar todos os forms que eu teria que abrir no form que chamaria a função, passando somente a string.
Pra chamar:
Se for Modal o segundo parâmetro tem que ser True.
Aí em todos os Forms do seu projeto no final do form, apenas antes de "end." você tem que fazer isso:
Ali onde tá TForm2 em cada form você troca pelo nome da classe do form.
Se não fizer isso, quando for chamar a função vai dar o erro: Class TForm2 not found.
procedure TForm1.AbrirForm(sFormP: String; bModalP: Boolean);
Var
FormClasse : TFormClass;
FormTela : TForm;
i : Integer;
bCriado : Boolean;
begin
bCriado := False;
FormClasse := TFormClass(FindClass(sFormP));
for i := 0 to Application.ComponentCount - 1 do
begin
if (Application.Components[i] is TForm) and
(Application.Components[i].ClassName = sFormP) then
begin
FormTela := TForm(Application.Components[i]);
bCriado := True;
Break;
end;
end;
if not bCriado then
Application.CreateForm(FormClasse, FormTela);
if bModalP then
begin
FormTela.ShowModal;
FormTela.Free;
end
else
FormTela.Show;
end;
Pra chamar:
AbrirForm('TForm2',False);
Se for Modal o segundo parâmetro tem que ser True.
Aí em todos os Forms do seu projeto no final do form, apenas antes de "end." você tem que fazer isso:
initialization RegisterClass(TForm2); finalization UnRegisterClasses([TForm2]);
Ali onde tá TForm2 em cada form você troca pelo nome da classe do form.
Se não fizer isso, quando for chamar a função vai dar o erro: Class TForm2 not found.
GOSTEI 0
Nícolas Braz
13/12/2012
Obrigado pelo Feedback dos dois!
Os meus formulários são MDI então eles não podem ser modal! Essas procedures que vocês me passaram vão funcionar com os meus formulários? Eu testei algumas outras funções e elas deixavam meus formulários "bugados" eles tinha problemas ao fechar.
Os meus formulários são MDI então eles não podem ser modal! Essas procedures que vocês me passaram vão funcionar com os meus formulários? Eu testei algumas outras funções e elas deixavam meus formulários "bugados" eles tinha problemas ao fechar.
GOSTEI 0
Claudia Nogueira
13/12/2012
Pra abrir sem ser modal com a minha, chame assim:
TForm2 é o nome da classe do form que você tem que abrir.
AbrirForm('TForm2',False);TForm2 é o nome da classe do form que você tem que abrir.
Obrigado pelo Feedback dos dois!
Os meus formulários são MDI então eles não podem ser modal! Essas procedures que vocês me passaram vão funcionar com os meus formulários? Eu testei algumas outras funções e elas deixavam meus formulários "bugados" eles tinha problemas ao fechar.
Os meus formulários são MDI então eles não podem ser modal! Essas procedures que vocês me passaram vão funcionar com os meus formulários? Eu testei algumas outras funções e elas deixavam meus formulários "bugados" eles tinha problemas ao fechar.
GOSTEI 0
Nícolas Braz
13/12/2012
Eu coloquei.
Ele diz que a classe não foi encontrada.
Class Tfrm_clientes not found.
AbrirForm('TFrm_clientes', false);Ele diz que a classe não foi encontrada.
Class Tfrm_clientes not found.
GOSTEI 0
Claudia Nogueira
13/12/2012
Você leu essa parte da minha resposta:
Aí em todos os Forms do seu projeto no final do form, apenas antes de "end." você tem que fazer isso:
#Código
initialization
RegisterClass(TForm2);
finalization
UnRegisterClasses([TForm2]);
Ali onde tá TForm2 em cada form você troca pelo nome da classe do form.
Se não fizer isso, quando for chamar a função vai dar o erro: Class TForm2 not found.
Você tem que ir no form Frm_clientes e fazer o seguinte antes do end final do form:
initialization
RegisterClass(TFrm_clientes);
finalization
UnRegisterClasses([TFrm_clientes]);
Aí em todos os Forms do seu projeto no final do form, apenas antes de "end." você tem que fazer isso:
#Código
initialization
RegisterClass(TForm2);
finalization
UnRegisterClasses([TForm2]);
Ali onde tá TForm2 em cada form você troca pelo nome da classe do form.
Se não fizer isso, quando for chamar a função vai dar o erro: Class TForm2 not found.
Você tem que ir no form Frm_clientes e fazer o seguinte antes do end final do form:
initialization
RegisterClass(TFrm_clientes);
finalization
UnRegisterClasses([TFrm_clientes]);
Eu coloquei.
Ele diz que a classe não foi encontrada.
Class Tfrm_clientes not found.
AbrirForm('TFrm_clientes', false);Ele diz que a classe não foi encontrada.
Class Tfrm_clientes not found.
GOSTEI 0
Nícolas Braz
13/12/2012
Bom dia Cláudia.
Desculpa minha falta de atenção :(
O código funcionou perfeitamente muito obrigado.
Desculpa minha falta de atenção :(
O código funcionou perfeitamente muito obrigado.
GOSTEI 0
Nícolas Braz
13/12/2012
Eu usava esse código para saber se o formulário de obras estava criado porém com a função para criar formulários ela não funciona mais.
if (Frm_ObraFinalizada<>Nil) then
begin
QrCliente.Caption := Frm_ObraFinalizada.DbCliente.Text;
end;GOSTEI 0
Nícolas Braz
13/12/2012
Ninguém?
GOSTEI 0
Joao Silva
13/12/2012
procedure CarregaForm(AOwner: TComponent);
var
Form: TForm;
AForm: TForm;
begin
try
AForm := TForm(GetClass('T' + 'NomedoForm'));
if Assigned(AForm) then
begin
Form := AForm.Create(AOwner);
Form.Show;
end;
finally
AForm := nil;
end;
end;
//Nota: Não esquece de colocar em cada formulario este codigo
initialization
RegisterClass(TNomedoform);
var
Form: TForm;
AForm: TForm;
begin
try
AForm := TForm(GetClass('T' + 'NomedoForm'));
if Assigned(AForm) then
begin
Form := AForm.Create(AOwner);
Form.Show;
end;
finally
AForm := nil;
end;
end;
//Nota: Não esquece de colocar em cada formulario este codigo
initialization
RegisterClass(TNomedoform);
GOSTEI 0
Nícolas Braz
13/12/2012
Eu usei o seu código.
E chamei meu formulário assim.
As classes já estão registradas porque estou utilizando o exemplo que a Cláudia postou, mas não acontece nada com o seu código.
Alguém tem a solução do porque com o código da Cláudia não consigo pegar dados de outro formulário e passar para variáveis?
procedure CarregaForm(AOwner: TComponent);
var
Form: TForm;
AForm: TForm;
begin
try
AForm := TForm(GetClass('T' + 'NomedoForm'));
if Assigned(AForm) then
begin
Form := AForm.Create(AOwner);
Form.Show;
end;
finally
AForm := nil;
end;
end;
//Nota: Não esquece de colocar em cada formulario este codigo
initialization
RegisterClass(TNomedoform);E chamei meu formulário assim.
CarregaForm(frmclientes);
As classes já estão registradas porque estou utilizando o exemplo que a Cláudia postou, mas não acontece nada com o seu código.
Alguém tem a solução do porque com o código da Cláudia não consigo pegar dados de outro formulário e passar para variáveis?
GOSTEI 0
Marco Salles
13/12/2012
amigo qual o seu delphi ???
GOSTEI 0
Nícolas Braz
13/12/2012
Delphi XE
GOSTEI 0
Marco Salles
13/12/2012
Bem amigo nicolasbraz tudo bem ?
particularmente eu não gosto da interface MDI ..
olhando o seu tópico na minha opinião o que esta pegando é o conceito
veja bem se eu entendi
1) foi lhe passado uma função
procedure ChamaForm(aClasseForm: TComponentClass; aForm: TForm);
em seguida a menina questionou a necessidade de referenciar todos os forms ... Pois onde for escrever a function voce terá
que dar Uses a toda a classe ...E ela lhe propos outra solução baseado no laço for
for i := 0 to Application.ComponentCount - 1 do
Onde varre acha ou não
so que existem Padrões de projeto (abstract Factoring) que tira a necessiadade do laço e tb o For ... é o que eu prefiro
so que o que esta pegando ha meu ver no seu caso como eu disse é o conceito
vc testa
if (Frm_ObraFinalizada<>Nil) then
begin
QrCliente.Caption := Frm_ObraFinalizada.DbCliente.Text;
end;
mas quem é este Frm_ObraFinalizada ???
È uma variavel que o delphi define automaticamente para nos no seu mod RAD de fazer as coisas...
var
Frm_ObraFinalizada:TFrm_ObraFinalizada;
implementation
{$R *.dfm}
o seu código esta perguntando se esta variavel foi instanciada ....
Não ela não foi instanciada....
qual a saida ?
uma delas ,vai depender do Proprietário desse Formulário
pelo código que a menina lhe propos o proprietário é a Application
veja
Application.CreateForm(FormClasse, FormTela);
outra coisa que eu não gosto ... Mas seguimos
vamos ao inves te testar se a variavel Frm_ObraFinalizada foi instanciada vamos fazer outra pergunta
vamos perguntar se existe um Componente de nome Frm_ObraFinalizada , cujo o proprietário é a Application
if not (application.FindComponent('Frm_ObraFinalizada') = nil) then
QrCliente.Caption := Frm_ObraFinalizada.DbCliente.Text
else
caso não , Instancie este formulario com o nome Frm_ObraFinalizada(ai entra um código ou um Padrão de Projeto , enfim..)
Olha se vc ler com calma , acredito que possa resolver pq conceitualemte esta correto . espero que tenha ajudado
[]sds
particularmente eu não gosto da interface MDI ..
olhando o seu tópico na minha opinião o que esta pegando é o conceito
veja bem se eu entendi
1) foi lhe passado uma função
procedure ChamaForm(aClasseForm: TComponentClass; aForm: TForm);
em seguida a menina questionou a necessidade de referenciar todos os forms ... Pois onde for escrever a function voce terá
que dar Uses a toda a classe ...E ela lhe propos outra solução baseado no laço for
for i := 0 to Application.ComponentCount - 1 do
Onde varre acha ou não
so que existem Padrões de projeto (abstract Factoring) que tira a necessiadade do laço e tb o For ... é o que eu prefiro
so que o que esta pegando ha meu ver no seu caso como eu disse é o conceito
vc testa
if (Frm_ObraFinalizada<>Nil) then
begin
QrCliente.Caption := Frm_ObraFinalizada.DbCliente.Text;
end;
mas quem é este Frm_ObraFinalizada ???
È uma variavel que o delphi define automaticamente para nos no seu mod RAD de fazer as coisas...
var
Frm_ObraFinalizada:TFrm_ObraFinalizada;
implementation
{$R *.dfm}
o seu código esta perguntando se esta variavel foi instanciada ....
Não ela não foi instanciada....
qual a saida ?
uma delas ,vai depender do Proprietário desse Formulário
pelo código que a menina lhe propos o proprietário é a Application
veja
Application.CreateForm(FormClasse, FormTela);
outra coisa que eu não gosto ... Mas seguimos
vamos ao inves te testar se a variavel Frm_ObraFinalizada foi instanciada vamos fazer outra pergunta
vamos perguntar se existe um Componente de nome Frm_ObraFinalizada , cujo o proprietário é a Application
if not (application.FindComponent('Frm_ObraFinalizada') = nil) then
QrCliente.Caption := Frm_ObraFinalizada.DbCliente.Text
else
caso não , Instancie este formulario com o nome Frm_ObraFinalizada(ai entra um código ou um Padrão de Projeto , enfim..)
Olha se vc ler com calma , acredito que possa resolver pq conceitualemte esta correto . espero que tenha ajudado
[]sds
GOSTEI 0