Função Abrir Form

07/02/2010

9

Boa tarde a todos!   Há uma função para criar forms, que achei muito interessante, que está disponível na vídeo-aula da locadora, do Marcelo Pimenta.   procedure AbreForm(aClasseForm: TComponentClass; aForm: TForm);
begin
  Application.CreateForm(aClasseForm, aForm);
  try
    aForm.ShowModal;
  finally
    FreeAndNil(aForm);
  end;
end;     No form principal, para abrir uma tela de clientes:   AbrirForm(tfrmClientes, frmClientes);     Quando uso alguma função onde passo o formulário como parâmetro, dá erro de access violation. Então, resolvi verificar em um botão que eu coloquei no form de clientes se este está criado em memória. Eu a fiz também dentro da procedure AbreForm:   No form clientes (dentro de um botão):   if not Assigned(frmClientes) then   showmessage('Form não criado') else   showmessage('Form criado')   Dentro da procedure:   Application.CreateForm(aClasseForm, aForm);
try   if not Assigned(aForm) then     showmessage('Form não criado') else   showmessage('Form criado')
   aForm.ShowModal;
finally
   FreeAndNil(aForm);
end;
  Fazendo o debug, ao passar pela procedure, ele dá a mensagem de 'Form criado', agora quando clico no botão, dá a mensagem 'Form não criado', e o interessante é que a tela está sendo visualizada, mas por algum motivo está perdendo a referência na memória. Se eu escrever o código sem usar procedure, por exemplo:     Application.CreateForm(tfrmClientes, frmClientes);
  try
    frmClientes.ShowModal;
  finally
    FreeAndNil(frmClientes);
  end;     Da forma acima funciona numa boa. Eu sei que a procedure facilita muito principalmente se tiver que mudar algum detalhe, mas eu não consigo utilizá-la.   Eu até fiz uma uma gambiarra pra fazer a coisa funcionar na marra. No evento onshow do form de clientes, coloquei este código:     if not Assigned(frmClientes) then Application.CreateForm(tfrmClientes, frmClientes);   Funcionar, funciona, mas ter que colocar essas verificações nos outros forms é dose pra leão, sem falar que fica um código esquesito, não sei o que vocês acham.   Gostaria de saber se já passaram por esta situação e se há uma solução para este caso.   Agradeço a todos pela atenção.   Abraços.   Rogério
   
Responder

Posts

08/02/2010

Marcos Iwazaki

O que acontece é o seguinte
Qdo se faz a criação manual.
-----------
frmClientes := tfrmClientes.Create(nil); 
-----------
Qdo se faz isso vc atribui o "tfrmClientes.Create" na variavel. Por isso vc usar a variavel frmClientes para acessar as propriedades.

Agora qdo vc usar essa função vc não atribui o create a lugar nenhum. A classe foi instanciada, mas não foi atribuida a nenhum objeto p vc poder ter acesso.

Uma forma que vc pode fazer para resolver seria no OnCreate do form vc faz frmClientes := self;

Não é a melhor maneira. Mas funciona.
Responder

08/02/2010

Marco Salles

Rogerio Merloti   Acho que vc é o mesmo que o rogerm em :::::   http://www.activedelphi.com.br/forum/viewtopic.php?t=53558     procedure AbreForm(aClasseForm: TComponentClass;var aForm);
begin
Application.CreateForm(aClasseForm,aForm);
try
Tform(aForm).ShowModal;
finally
FreeAndNil(Tform(aForm));
end;
end;    
Responder
Amigo socram, eu testei a sua sugestão e funcionou muito bem. Um amigo em outro forum deu uma outra sugestão: procedure CriaForm(aClasseForm: TComponentClass; var aForm);
begin   Application.CreateForm(aClasseForm, aForm);
  try
    TForm(aForm).ShowModal;
  finally
    FreeAndNil(TForm(aForm));
  end;
end; Agradeço muito pela sua ajuda, são duas soluções interessantes, é isso aí, vlw kra. Marco Antonio Salles, rogerm sou eu mesmo kra.
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira