Fórum Função para criar formulário #430954

13/12/2012

0

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

Responder

Posts

13/12/2012

Deivison Melo

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

Gostei + 0

13/12/2012

Claudia Nogueira

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.
Responder

Gostei + 0

13/12/2012

Nícolas Braz

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.
Responder

Gostei + 0

13/12/2012

Claudia Nogueira

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.
Responder

Gostei + 0

13/12/2012

Nícolas Braz

Eu coloquei.

AbrirForm('TFrm_clientes', false);


Ele diz que a classe não foi encontrada.

Class Tfrm_clientes not found.
Responder

Gostei + 0

13/12/2012

Claudia Nogueira

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.

Responder

Gostei + 0

14/12/2012

Nícolas Braz

Bom dia Cláudia.

Desculpa minha falta de atenção :(

O código funcionou perfeitamente muito obrigado.
Responder

Gostei + 0

18/12/2012

Nícolas Braz

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

Gostei + 0

26/12/2012

Nícolas Braz

Ninguém?
Responder

Gostei + 0

27/12/2012

Joao Silva

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

Responder

Gostei + 0

16/01/2013

Nícolas Braz

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?
Responder

Gostei + 0

16/01/2013

Marco Salles

amigo qual o seu delphi ???
Responder

Gostei + 0

16/01/2013

Nícolas Braz

Delphi XE
Responder

Gostei + 0

17/01/2013

Marco Salles

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







Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar