erro com Showmessage e Aplication.Messagebox
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:
e no evento OnActivate este codigo:
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.
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
Curtidas 0
Respostas
Alessandro Yamasaki
22/10/2013
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
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
GOSTEI 0
Gilvanio Gonçalves
22/10/2013
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
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.
GOSTEI 0
Marcos Iwazaki
22/10/2013
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.
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.
GOSTEI 0
Thiago Irrazabal
22/10/2013
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
no OnShow
no OnActive tu faz um teste
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.
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.
GOSTEI 0
Gilvanio Gonçalves
22/10/2013
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.
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.
GOSTEI 0
Marcos Iwazaki
22/10/2013
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.
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.
GOSTEI 0
Gustavo Bretas
22/10/2013
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
Declare a procedure no private ou public do formulário.
Implemente a procedure, no meu caso ela fica no formulário principal.
No Evento OnShow, nas última linha vc coloca o PostMessage, como no exemplo.
Só testar!
Espero ter ajudado!
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!
GOSTEI 0
Thiago Irrazabal
22/10/2013
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.
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.
GOSTEI 0
Gilvanio Gonçalves
22/10/2013
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:
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.
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.
GOSTEI 0
José
22/10/2013
Que bom que conseguiu solucionar sua duvida Gilvanio, e obrigado por compartilhar a solução.
Tópico concluído.
Tópico concluído.
GOSTEI 0