Fórum erro com Showmessage e Aplication.Messagebox #459203

22/10/2013

0

uso o delphi 7, as mensagens Showmessage e Aplication.Messagebox, esta aparecendo novamente apos fechar o form, como resolver?
no evento onShow do form principal do meu aplicativo tenho este codigo:
procedure TFrmPrincipal.FormShow(Sender: TObject); 
begin 
QueryTroca.Close; 
QueryTroca.SQL.Clear; 
QueryTroca.SQL.Text := 'select * from Item_Pedidos where Data_troca = :Hoje'; 
QueryTroca.ParamByName('Hoje').AsDate := Date +3; 
QueryTroca.Open; 
end;


e no evento OnActivate este codigo:

procedure TFrmPrincipal.FormActivate(Sender: TObject); 
var DataAtu, DataTroq : TDate; 
begin 
DataAtu := now +3; 
DataTroq := DataAtu ; 

if QueryTroca.RecordCount >= 1 then 
   begin 
  showmessage('Veiculos com Proxima Troca de Oléo Para : ' + datetostr(DataTroq)); 
  If Application.MessageBox('Deseja Visualizar a Lista de Veiculos?', 
    'Confirmação',mb_yesno+mb_iconquestion)= idyes then 
    begin 
     FrmListaTrocaOleo := TfrmListaTrocaOleo.create(self); 
     FrmListaTrocaOleo.show end else 
   begin 
   end; 
 end; 
end;


como podem ver ao clicar em sim para visualizar abre o form que contém um grid onde exibe os dados, até ai tudo bém.

o que acontece é que quando clico no x deste form para fechar, o showmessage aparece e logo apos em clicar no sim do showmessage aparece o Application.MessageBox?
so fecha quando clico em não do Application.MessageBox, ficando na tela que deve ficar que é a tela principal do programa.

o que devo fazer para isto não acontecer, que quando eu clicar no x do form para fechar, apenas fecha o form com a grid e fica na tela formprincipal do programa( tela Principal).

aguardo ajuda de vcs.
Gilvanio Gonçalves

Gilvanio Gonçalves

Responder

Posts

23/10/2013

Alessandro Yamasaki

Bom Dia

Fiz um teste num Form com mensagens nos respectivos eventos
- onShow
- onActive
- onClose

Todos respeitaram a ordem. Faça este teste e verifique o mesmo.
Acredito que vc algum evento q vc não postou relacionado aos componentes de BD (TQuery, TDataSource, etc) trabalha diretamente na query e ativa o mesmo conforme seu fonte que solicita a mensagem qdo > 0

[]´s
Responder

Gostei + 0

23/10/2013

Gilvanio Gonçalves

Bom Dia

Fiz um teste num Form com mensagens nos respectivos eventos
- onShow
- onActive
- onClose

Todos respeitaram a ordem. Faça este teste e verifique o mesmo.
Acredito que vc algum evento q vc não postou relacionado aos componentes de BD (TQuery, TDataSource, etc) trabalha diretamente na query e ativa o mesmo conforme seu fonte que solicita a mensagem qdo > 0

[]´s


minha questão não é só mensagem veja o meu codigo no evento onshow do formprincipal mando carregar a query, no evento onActivate do mesmo form o principal, é vericado se minha query tem 1 ou mais registros, ai aparece a mensagem tem blab blá para dia tal ok, e ao clicar em ok vem a mensagen do Application.MessageBox perguntando se deseja visualizar, sim ou não ao clicar em sim abre o form onde tem uma grid com os dados conforme data no codigo da query. porém a fechar este form no x, ele fecha, aparece de novo as mensagem na mesma sequencia e só fecha e para de aparecer se clicar na ultima na opção não que não deseja visualizar.

assim o form principal fica para o usuario utilizar o sistema.

o dbgrid do form que exibe os dados, esta ligado a um datasource no form principal onde a query liga a esta datasource. todos dois no form principal.

pode me ajudar a fazer esta rotina funcionar corretamente aparecendoas mensagens somente quando o sistema for iniciado e se houver dados na data.
Responder

Gostei + 0

24/10/2013

Marcos Iwazaki

se eu entendi certo...
Qdo vc aperta o X ele fecha o form e volta p o FormPrincipal.. e vai disparar o OnActive do formPrincipal.
Pois toda vez q vc fechar o outro form vc volta p o formPrincipal.. e o active sempre vai ser disparado qdo isso acontecer.

Acho que tem um erro na logica de como esta aplicando as coisas ae.
Por exemplo.. usar outro evento.

Se o problema for esse que eu descrevi.. de mais detalhe do q exatamente é a ideia deste evento OnAcitve, do pq vc usou ele.
Pois entendendo o pq, poderemos sugerir um outro evento. Ou outra forma de fazer isso.
Responder

Gostei + 0

24/10/2013

Thiago Irrazabal

Bom dia,
Qual a necessidade desse código no OnActive? Se ele for mostrar apenas uma vez, na primeira vez que tu abre o form poderia usar outro evento ou mesmo uma variável que recebesse um valor no show por exemplo:


declara no private
X: Boolean;


no OnShow
X := True;


no OnActive tu faz um teste
if X then
  try
    //TEU CÓDIGO AQUI
  finally
    X := False;
  end;



Nesse caso o teu OnActive só vai funcionar na primeira vez que o form for ativado.... não acho a melhor solução mas pode te ajudar.



Att,
Thiago Irrazabal de Oliveira.
Responder

Gostei + 0

24/10/2013

Gilvanio Gonçalves

Amigos a Questão do codigo estar no onActivate é porque a mensagem tem que abrir em cima do form principal, se eu colocar o codigo no evento onShow a mensagem surge antes do form , como se fosse um splash, e não é isto que desejo, desejo que ao abrir o programa ele avise o usuario que tem veiculos com datas para proxima troca de oléo, se o usuario deseja visualizar quais veiculos, ele clica em sim, e é aberto um outro form com uma grid que mostra os dados, é so para visulização do usuario, ele visualizou e deseja sair, clica no X do form, e volta para a tela principal do programa, o que não esta acontecendo.
quando clica no X exibe as duas mensagens e só para de exibir clicando em Não da ultima mensagen que pergunta se deseja visualizar.,
uso somente estes codigo que postei, onde ele deve ser usado para funcionar corretamente?

como vcs fariam esta rotina?

conto com a ajuda de vcs, obrigado.

Responder

Gostei + 0

24/10/2013

Marcos Iwazaki

Amigos a Questão do codigo estar no onActivate é porque a mensagem tem que abrir em cima do form principal, se eu colocar o codigo no evento onShow a mensagem surge antes do form , como se fosse um splash, e não é isto que desejo, desejo que ao abrir o programa ele avise o usuario que tem veiculos com datas para proxima troca de oléo, se o usuario deseja visualizar quais veiculos, ele clica em sim, e é aberto um outro form com uma grid que mostra os dados, é so para visulização do usuario, ele visualizou e deseja sair, clica no X do form, e volta para a tela principal do programa, o que não esta acontecendo.
quando clica no X exibe as duas mensagens e só para de exibir clicando em Não da ultima mensagen que pergunta se deseja visualizar.,
uso somente estes codigo que postei, onde ele deve ser usado para funcionar corretamente?

como vcs fariam esta rotina?

conto com a ajuda de vcs, obrigado.


Agora ficou claro a sua necessidade, bom o que o thiago passou deve funcionar,
Tenho outra sugestão p vc,
Em vez de fazer aparecer um showmessage e depois outra mensagem onde o usuario tem q escolher sim ou não.
Eu faria o seguinte. colocaria um Statusbar no form principal. E no OnActive eu faria a verificação de qtos carros tem p fazer a troca de oleo. E colocaria a qtd de carro no statuso bar
tipo assim Carros para Troca de Oleo: 4. E para abrir a tela o usuario daria 2 clicks la no panel do status bar onde esta escrito sobre a troca de oleo.
Assim o sistema não vai ficar travando o usuario com 2 msgs.
Ao sair de qq tela que foi chamada pelo FormPrincipal vc vai ter a qtd de carros atualizada.
Eu diria que assim deixaria o sistema mais amigavel.
Mas se vc precisa obrigar o usuario a tomar uma decisão qdo abre o sistema, dae então é so fazer o que o Thiago flw em cima.
Responder

Gostei + 0

24/10/2013

Gustavo Bretas

Gilvanio, seu problema realmente esta na lógica do seu evento, assim como socram disse, sempre que voltar para o formulário o evento OnActivate é disparado.

Pelo que eu entendi, você precisa disparar seu evento somente quando o sistema é aberto, correto?

Vc tem algumas opções.

1ª) Coloque um Timer no principal, 1000 milissegundo basta, no OnShow vc Ativa ele, e no OnTimer vc desabilita para ele não executar novamente, coloque seu código em seguida.
2ª) Crie um evento AfterShow, é simples.

Declare a constante pra identificar o evento, esta fora ter o contexto pública, o formulário principal, ou uma biblioteca são boas opções para declara-la
const
  WM_AFTERSHOW = WM_USER + 1000;


Declare a procedure no private ou public do formulário.
procedure AppAfterShow(var Msg: TMessage); message WM_AFTERSHOW;


Implemente a procedure, no meu caso ela fica no formulário principal.
procedure TfrmPrincipal.AppAfterShow(var Msg: TMessage);
begin
  if (Msg.Msg = WM_AFTERSHOW) then
  begin
    // Seu código
  end;
end;


No Evento OnShow, nas última linha vc coloca o PostMessage, como no exemplo.
procedure TfrmPrincipal.FormShow(Sender: TObject);
begin
  // ->
  PostMessage(Self.Handle, WM_AFTERSHOW, 0, 0);
end;


Só testar!

Espero ter ajudado!
Responder

Gostei + 0

24/10/2013

Thiago Irrazabal

Amigos a Questão do codigo estar no onActivate é porque a mensagem tem que abrir em cima do form principal, se eu colocar o codigo no evento onShow a mensagem surge antes do form , como se fosse um splash, e não é isto que desejo, desejo que ao abrir o programa ele avise o usuario que tem veiculos com datas para proxima troca de oléo, se o usuario deseja visualizar quais veiculos, ele clica em sim, e é aberto um outro form com uma grid que mostra os dados, é so para visulização do usuario, ele visualizou e deseja sair, clica no X do form, e volta para a tela principal do programa, o que não esta acontecendo.
quando clica no X exibe as duas mensagens e só para de exibir clicando em Não da ultima mensagen que pergunta se deseja visualizar.,
uso somente estes codigo que postei, onde ele deve ser usado para funcionar corretamente?

como vcs fariam esta rotina?

conto com a ajuda de vcs, obrigado.




Primeiramente declare X como Boolean no teu Private

X: Boolean;


depois coloque esses códigos no lugar dos teus
OnShow
procedure TFrmPrincipal.FormShow(Sender: TObject); 
begin 
  QueryTroca.Close; 
  QueryTroca.SQL.Clear; 
  QueryTroca.SQL.Text := 'select * from Item_Pedidos where Data_troca = :Hoje'; 
  QueryTroca.ParamByName('Hoje').AsDate := Date +3; 
  QueryTroca.Open;
  X := True; 
end;


No OnActive
procedure TFrmPrincipal.FormActivate(Sender: TObject); 
var DataAtu, DataTroq : TDate; 
begin 
DataAtu := now +3; 
DataTroq := DataAtu ; 

if X then
  try
    if QueryTroca.RecordCount >= 1 then 
      begin 
        showmessage('Veiculos com Proxima Troca de Oléo Para : ' + datetostr(DataTroq)); 
        If Application.MessageBox('Deseja Visualizar a Lista de Veiculos?', 
        'Confirmação',mb_yesno+mb_iconquestion)= idyes then 
          begin 
            FrmListaTrocaOleo := TfrmListaTrocaOleo.create(self); 
            FrmListaTrocaOleo.show 
          end; 
      end;
  finally
    X := False;
  end; 
end;



Att,
Thiago Irrazabal de Oliveira.
Responder

Gostei + 0

24/10/2013

Gilvanio Gonçalves

Amigos eu postei a duvida devido não lembrar a logica desta rotina, mas visto que a perrgunta deixou foi todos mais confusos ainda.

posto aqui como se resolve este problema, assim se alguém tiver tendo um problema como este, deve ajudar.


como disse o codigo tem que ser no OnAvticate, e para evitar que ao fechar o form onde tem a grid é simples, depois que a gente raciocina a logica.

no evento OnClose do form onde esta a grid, coloquei o codigo que solucionou tudo.

codigo:

 FrmPrincipal.OnActivate := OnDeactivate;


como podem ver , solicito no form ao fechar que não execute o onActivate, e sim que desative o mesmo.
só isto
valeu ai, pela força de vcs.
Responder

Gostei + 0

24/10/2013

José

Que bom que conseguiu solucionar sua duvida Gilvanio, e obrigado por compartilhar a solução.

Tópico concluído.
Responder

Gostei + 0

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

Aceitar