Jump to content
Fórum Script Brasil
  • 0

Fechamento de Formulário


Renato Reis

Question

Galera, é o seguinte.

Dentro de um form1 eu chamo outro form99 dependendo de alguma condição. Acontece que este form99, poderá ser chamado por outros forms do sistema.

Antes de criar uma função para isso, eu chamava o form99 dentro de cada um dos forms do sistema e funcionava perfeito.

Para melhorar a funcionalidade da coisa eu criei uma função para executar este form99.

Acontece que quando ao fechar o form99 o 'close' não está funcionando.

Pra adiantar, já usei close, form99.close, tudo, e o form99 não fecha, nem retorna ao anterior, simplesmente reexibe o form99.

Faço assim:

Ao sair de um determinado formulario, executo a função para verificar se o form99 será aberto ou não.

procedure TfrmDestino.FormClose(Sender: TObject; var Action: TCloseAction);

begin

dataModule1.qrUsuario.Close;

dataModule2.qrDestino.Close;

Action := CaFree;

frmDestino:= NIL;

LerComunicados(StrUsuario);

end;

No programa de funções faço o seguinte:

Function LerComunicados(vUsuario: String): String;

begin

with dataModule2.qrDestino do

begin

close;

sql.Clear;

sql.Text:='Select * from SCCAENC where USUARIO=:xUsuario and DTLEITURA is Null';

parameters.ParamByName('xUsuario').value:=vUsuario;

open;

end;

if dataModule2.qrDestino.RecordCount <> 0 then

begin

ShowMessage('Você tem comunicado(s) a ser(em) lido(s)!');

dataModule2.qrDestino.First;

while not dataModule2.qrDestino.Eof do

begin

strCodigo:=dataModule2.qrDestinoCODIGO.AsString;

try

Application.CreateForm(tfrmReadNews,frmReadNews); // AQUI é ONDE EXECUTO o QUE CHAMEI DE FORM99, NA VERDADE É O FRMREADNEWS

frmReadNews.showmodal;

finally

frmReadNews.free;

end;

dataModule2.qrDestino.Edit;

dataModule2.qrDestinoDTLEITURA.AsDateTime:=date();

dataModule2.qrDestino.Post;

end;

end;

end;

No Form99(ReadNews) faço o Seguinte:

procedure TfrmReadnews.FormCreate(Sender: TObject);

begin

with dataModule2.qrNews do

begin

close;

SQL.Clear;

SQL.Text:='Select * from SCCANEWS where CODIGO=:xCodigo';

Parameters.ParamByName('xCodigo').value:=strCodigo;

Open;

end;

Label2.Caption:=strCodigo;

mmDescr.Text:=datamodule2.qrNewsDESCRICAO.AsString;

label7.Caption:=datamodule2.qrNewsDATA.AsString;

Label6.Caption:=datamodule2.qrNewsAUTOR.AsString;

end;

procedure TfrmReadnews.dxButton1Click(Sender: TObject);

begin

close;

end;

Já tive um evento onclose do form99 com frmReadNews.free e frmReadNews.NIL

...E não consigo fechar o form.

Alguém sabe o que posso fazer?

Abc

Link to comment
Share on other sites

5 answers to this question

Recommended Posts

  • 0
Antes de criar uma função para isso, eu chamava o form99 dentro de cada um dos forms do sistema e funcionava perfeito.

então voce já tem uma ideia onde esta o erro ( na função )

ao invés de usar uma função, porque não usa uma procedure para isso ( mude e veja o resultado )

abraço

Link to comment
Share on other sites

  • 0

Jhonas,

Entrão não posso fazer a chamada de um form por uma função?

Na verdade criei um registro de comunicados através do sistema, ou seja, se alguém deseja deixar um comunicado a todos ou a alguém especificamente registra o comunicado.

No close de todos os forms, executo a função para verificar se tem algum comunicado para o usuário em questão e se tiver chamo o form para exibir o comunicado.

Se isso for real, vou ter que criar a procedure dentro de todos os forms para verificar se tem comunicado e chamar o form.

É isso mesmo ou você teria alguma sugestão?

Abc.

Link to comment
Share on other sites

  • 0

Jhonas,

Coloquei a procedure dentro do form, MAS mesmo assim não resolveu, ou seja, o form é chamado mas ao close, não fecha nem retorna ao form chamador.

procedure TfrmDestino.FormClose(Sender: TObject; var Action: TCloseAction);

begin

dataModule1.qrUsuario.Close;

dataModule2.qrDestino.Close;

LeioComunicados;

Action := CaFree;

frmDestino:= NIL;

end;

procedure TfrmDestino.LeioComunicados;

begin

with dataModule2.qrDestino do

begin

close;

sql.Clear;

sql.Text:='Select * from SCCAENC where USUARIO=:xUsuario and DTLEITURA is Null';

parameters.ParamByName('xUsuario').value:=strUsuario;

open;

end;

if dataModule2.qrDestino.RecordCount <> 0 then

begin

ShowMessage('Você tem comunicado(s) a ser(em) lido(s)!');

dataModule2.qrDestino.First;

while not dataModule2.qrDestino.Eof do

begin

strCodigo:=dataModule2.qrDestinoCODIGO.AsString;

try

Application.CreateForm(tfrmReadNews,frmReadNews);

frmReadNews.showmodal;

finally

frmReadNews.free;

end;

dataModule2.qrDestino.Edit;

dataModule2.qrDestinoDTLEITURA.AsDateTime:=date();

dataModule2.qrDestino.Post;

end;

end;

end;

Acho que o problema esta no forma que é chamado e não fecha e retorna por algum motivo.

Help!

Abc

Link to comment
Share on other sites

  • 0

Jhonas,

Fiz outro teste aqui e no form chamado coloquei:

procedure TfrmReadnews.dxButton1Click(Sender: TObject);

begin

frmReadNews.close;

end;

procedure TfrmReadnews.FormClose(Sender: TObject;

var Action: TCloseAction);

begin

frmReadNews.Free;

frmReadNews:= NIL;

end;

Fizz o evento onClose liberar da memoria o form. Isso eu faço no retorno deste form ao chamador. Fazendo este evento dentro do form dá erro de access violation Address 000000000

e agora irmão? (rsrs)

Link to comment
Share on other sites

  • 0

experimente assim:

procedure TfrmDestino.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   dataModule1.qrUsuario.Close;
   dataModule2.qrDestino.Close;
   //LeioComunicados;
   //Action := CaFree;
   frmDestino:= NIL;
end;

procedure TfrmDestino.LeioComunicados;
begin
   with dataModule2.qrDestino do
   begin
      close;
      sql.Clear;
      sql.Text:='Select * from SCCAENC where USUARIO=:xUsuario and DTLEITURA is Null';
      parameters.ParamByName('xUsuario').value:=strUsuario;
      open;
   end;

   if dataModule2.qrDestino.RecordCount <> 0 then
   begin
      ShowMessage('Você tem comunicado(s) a ser(em) lido(s)!');
      dataModule2.qrDestino.First;
      while not dataModule2.qrDestino.Eof do
      begin
         strCodigo:=dataModule2.qrDestinoCODIGO.AsString;
         try
            if frmReadNews = nil then
               frmReadNews := TfrmReadNews.Create(self);
         except
            ShowMessage('Erro na criação do formulário !!');
            exit;
         end;

         frmReadNews.showmodal;

      dataModule2.qrDestino.Edit;
      dataModule2.qrDestinoDTLEITURA.AsDateTime:=date();
      dataModule2.qrDestino.Post;
      end;
   end;
end;

abraço

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.8k
×
×
  • Create New...