Função para criar formulário

Delphi

13/12/2012

Boa tarde,

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

Nícolas Braz

Curtidas 0

Respostas

Deivison Melo

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;
GOSTEI 0
Claudia Nogueira

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.

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

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.
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

13/12/2012

Pra abrir sem ser modal com a minha, chame assim:

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.
GOSTEI 0
Nícolas Braz

Nícolas Braz

13/12/2012

Eu coloquei.

AbrirForm('TFrm_clientes', false);


Ele diz que a classe não foi encontrada.

Class Tfrm_clientes not found.
GOSTEI 0
Claudia Nogueira

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]);


Eu coloquei.

AbrirForm('TFrm_clientes', false);


Ele diz que a classe não foi encontrada.

Class Tfrm_clientes not found.

GOSTEI 0
Nícolas Braz

Nícolas Braz

13/12/2012

Bom dia Cláudia.

Desculpa minha falta de atenção :(

O código funcionou perfeitamente muito obrigado.
GOSTEI 0
Nícolas Braz

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

Nícolas Braz

13/12/2012

Ninguém?
GOSTEI 0
Joao Silva

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);

GOSTEI 0
Nícolas Braz

Nícolas Braz

13/12/2012

Eu usei o seu código.

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

Marco Salles

13/12/2012

amigo qual o seu delphi ???
GOSTEI 0
Nícolas Braz

Nícolas Braz

13/12/2012

Delphi XE
GOSTEI 0
Marco Salles

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







GOSTEI 0
POSTAR