Função Abrir Form
07/02/2010
0
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
Rogerio Merlotti
Posts
08/02/2010
Marcos Iwazaki
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.
08/02/2010
Marco Salles
begin
Application.CreateForm(aClasseForm,aForm);
try
Tform(aForm).ShowModal;
finally
FreeAndNil(Tform(aForm));
end;
end;
08/02/2010
Rogerio Merlotti
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.
Clique aqui para fazer login e interagir na Comunidade :)