Fórum Função para criar formulário #430954
13/12/2012
0
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
Curtir tópico
+ 0Posts
13/12/2012
Deivison Melo
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
13/12/2012
Claudia Nogueira
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
13/12/2012
Nícolas Braz
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
13/12/2012
Claudia Nogueira
AbrirForm('TForm2',False);TForm2 é o nome da classe do form que você tem que abrir.
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
13/12/2012
Nícolas Braz
AbrirForm('TFrm_clientes', false);Ele diz que a classe não foi encontrada.
Class Tfrm_clientes not found.
Gostei + 0
13/12/2012
Claudia Nogueira
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]);
AbrirForm('TFrm_clientes', false);Ele diz que a classe não foi encontrada.
Class Tfrm_clientes not found.
Gostei + 0
14/12/2012
Nícolas Braz
Desculpa minha falta de atenção :(
O código funcionou perfeitamente muito obrigado.
Gostei + 0
18/12/2012
Nícolas Braz
if (Frm_ObraFinalizada<>Nil) then
begin
QrCliente.Caption := Frm_ObraFinalizada.DbCliente.Text;
end;Gostei + 0
26/12/2012
Nícolas Braz
Gostei + 0
27/12/2012
Joao Silva
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
16/01/2013
Nícolas Braz
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
16/01/2013
Marco Salles
Gostei + 0
16/01/2013
Nícolas Braz
Gostei + 0
17/01/2013
Marco Salles
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
Clique aqui para fazer login e interagir na Comunidade :)