uso correto de funções genéricas
Estou com o seguinte problema:
tenho uma unit chamada uFuncoes a qual coloco todas as funcoes que uso frequentemente (valores extenso, controle de datas, checagens, etc...)
só que no momento quero criar forms, passando os tipos e nomes por parametro, ex:
[b]function CriarForm(TipoForm:TComponentClass ; NomeForm:TForm) :Boolean ;[/b]
e fechar form da mesma maneira...
[b]
function FecharForm(NomeForm:TForm);[/b]
entao para isso implementei da seguinte forma :
[b]//**********************CRIAR FORMS[/b]
function TfrmMenu.CriarFormulario(TFormulario:TComponentclass;NomeForm:TForm):Boolean;
begin
try
NomeForm :=Nomeform.Create(self);
Nomeform.showmodal;
finally
NomeForm.Release;
NomeForm :=Nil;
end;
end;
[b]//********************FECHAR FORMS[/b]
function TfrmFUNCOES.FecharFormulario(Formulario:tform):Boolean;
begin
if Formulario <> Nil then
begin
formulaRIO.Destroy;
formulario :=Nil;
end;
end;
O problema é o seguinte :
CRIA OS FORMS CORRETAMENTE;
AO USAR PROCEDURES E FUNCOES INTERNAS (JÁ NO FORM CRIADO), ESTE ME RETORNA FORM = NIL !!!!, assim não consigo trabalhar com [b]funcoes internas [/b]do form criado pela funcao acima,
para ser mais claro,
eu crio normalmente pela funcao acima,
quando uso funcoes internas dá erro,
ao fechar o form, já é NIL!!! , portanto fica em memória... e não consigo descarrega-lo (a nao ser manualmente)
Alguem pode me ajudar?
tenho uma unit chamada uFuncoes a qual coloco todas as funcoes que uso frequentemente (valores extenso, controle de datas, checagens, etc...)
só que no momento quero criar forms, passando os tipos e nomes por parametro, ex:
[b]function CriarForm(TipoForm:TComponentClass ; NomeForm:TForm) :Boolean ;[/b]
e fechar form da mesma maneira...
[b]
function FecharForm(NomeForm:TForm);[/b]
entao para isso implementei da seguinte forma :
[b]//**********************CRIAR FORMS[/b]
function TfrmMenu.CriarFormulario(TFormulario:TComponentclass;NomeForm:TForm):Boolean;
begin
try
NomeForm :=Nomeform.Create(self);
Nomeform.showmodal;
finally
NomeForm.Release;
NomeForm :=Nil;
end;
end;
[b]//********************FECHAR FORMS[/b]
function TfrmFUNCOES.FecharFormulario(Formulario:tform):Boolean;
begin
if Formulario <> Nil then
begin
formulaRIO.Destroy;
formulario :=Nil;
end;
end;
O problema é o seguinte :
CRIA OS FORMS CORRETAMENTE;
AO USAR PROCEDURES E FUNCOES INTERNAS (JÁ NO FORM CRIADO), ESTE ME RETORNA FORM = NIL !!!!, assim não consigo trabalhar com [b]funcoes internas [/b]do form criado pela funcao acima,
para ser mais claro,
eu crio normalmente pela funcao acima,
quando uso funcoes internas dá erro,
ao fechar o form, já é NIL!!! , portanto fica em memória... e não consigo descarrega-lo (a nao ser manualmente)
Alguem pode me ajudar?
Mazzi
Curtidas 0
Respostas
Beppe
20/07/2005
Simples, remova o ´NomeForm.Release; NomeForm :=Nil; ´ então! Deixe ele ser liberado apenas com Fechar formulário, ou use o evento OnClose para isso.
Em vez de
use apenas FreeAndNil(formulaRIO), que é a msm coisa.
Em vez de
if Formulario <> Nil then begin formulaRIO.Destroy; formulario :=Nil; end;
use apenas FreeAndNil(formulaRIO), que é a msm coisa.
GOSTEI 0
Mazzi
20/07/2005
O FreeAndNil(Formulario), funcionou OK!
retirei tbm o .Destroy ; e o Nil ; como vc me falou,
Agora eles criaram form, e fecham o form perfeitamente!
porem , as funcoes internas do form criado,ainda nao funcionam..., é como se o form criado, após sua criação, fica imediatamente em NIL, e mesmo depurando-o não consigo achar uma solução.
Ex: No formulario criado, tenho procedures e funcoes que controlam os focos de botoes, e edits (ligaeDesligaCampos), esses por sua vez, ao executarem dão erro por não acessar o form (erro comum em Access Violation, quando algo faz referencia a um form que nao foi criado, ou nao se encontra na memoria)...
ou Seja a causa do erro encontrei nesse Access Violation, mas ñão encontrei a forma dinamica de controlar essas funcoes...
retirei tbm o .Destroy ; e o Nil ; como vc me falou,
Agora eles criaram form, e fecham o form perfeitamente!
porem , as funcoes internas do form criado,ainda nao funcionam..., é como se o form criado, após sua criação, fica imediatamente em NIL, e mesmo depurando-o não consigo achar uma solução.
Ex: No formulario criado, tenho procedures e funcoes que controlam os focos de botoes, e edits (ligaeDesligaCampos), esses por sua vez, ao executarem dão erro por não acessar o form (erro comum em Access Violation, quando algo faz referencia a um form que nao foi criado, ou nao se encontra na memoria)...
ou Seja a causa do erro encontrei nesse Access Violation, mas ñão encontrei a forma dinamica de controlar essas funcoes...
GOSTEI 0
Beppe
20/07/2005
Tem algumas coisas erradas na tua função de criação, por exemplo, vc não passa a variável do form como referência, mas por valor. Tbm não tava criando o formulário com uma classe, mas com uma instância(provavelmente nil).
function TfrmMenu.CriarFormulario(TFormulario: TComponentclass; var NomeForm): Boolean; var F: TForm begin try F := TFormulario.Create(nil); TForm(NomeForm) := F; F.ShowModal; finally F.Release; TForm(NomeForm) := nil; end; end;
GOSTEI 0
Mazzi
20/07/2005
Muito obrigado ao Amigo Beep
deu certinho
as criações os fechamentos, e as funções geradas !
Obrigado pela atenção e que isso possa ajudar a quem precisar
Deus abençoe a todos
deu certinho
as criações os fechamentos, e as funções geradas !
Obrigado pela atenção e que isso possa ajudar a quem precisar
Deus abençoe a todos
GOSTEI 0