Fórum erro com Showmessage e Aplication.Messagebox #459203
22/10/2013
0
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
Curtir tópico
+ 0Posts
23/10/2013
Alessandro Yamasaki
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
23/10/2013
Gilvanio Gonçalves
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
24/10/2013
Marcos Iwazaki
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
24/10/2013
Thiago Irrazabal
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
24/10/2013
Gilvanio Gonçalves
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
24/10/2013
Marcos Iwazaki
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
24/10/2013
Gustavo Bretas
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
24/10/2013
Thiago Irrazabal
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
24/10/2013
Gilvanio Gonçalves
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
24/10/2013
José
Tópico concluído.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)