GARANTIR DESCONTO

Fórum uso correto de funções genéricas #288898

20/07/2005

0

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?


Mazzi

Mazzi

Responder

Posts

20/07/2005

Beppe

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
if Formulario <> Nil then
begin
formulaRIO.Destroy;
formulario :=Nil;
end;

use apenas FreeAndNil(formulaRIO), que é a msm coisa.


Responder

Gostei + 0

20/07/2005

Mazzi

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


Responder

Gostei + 0

21/07/2005

Beppe

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;



Responder

Gostei + 0

21/07/2005

Mazzi

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


Responder

Gostei + 0

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

Aceitar