Ir para conteúdo
Fórum Script Brasil
  • 0

Fechamento de Formulário


Renato Reis

Pergunta

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 para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...