Ajuda com Fechamento de Tela

Delphi

01/10/2012

Olá pessoal!

Estou com um probleminha básico e não gostaria de fazer gambiarras para resolver, então estou recorrendo aqui ao forum para saber se alguém poderia me ajudar ou me dar algumas dicas de como eu poderia resolver o seguinte problema:

Ao abrir uma tela de pagamento que eu montei, preciso que ele execute o código abaixo. Se a condição do vReceber for verdadeira será executado o FecharPedido em seguida será apresentada a mensagem "MsgDlg" e, após o usuário clicar OK na mensagem a tela terá de ser fechada "SairClick(Self)" - é um botão com um Close.

Está tudo funcionando, exceto o comando para fechar a tela "SairClick(Self)" que já substitui por close, mas não adiantou.

O comando abaixo eu testens no OnShow, mas não ficou legal porque ele executa tudo e nem mostra a tela.
Então coloquei no OnActive, que funcionou do jeito que eu queria, mas não esta fechando a tela.

 if (not dm.qCupomfpopsolic.IsNull) and (dm.qCupomfpopsolic.AsInteger > 0) then 
 begin
    EfetuarPagamentoFPopular(fpopValor, fpopCPFSolic, fpopNomeSolic, fpopNumAut, opCXdt);
    if vReceber <= 0 then begin
       FecharPedido;
       MsgDlg('Pagamento conluido com sucesso!',mtInformation,[mbOK]);
       SairClick(Self);
    end
    else
       dbgFormas.SetFocus;
 end;


Agradeço desde já qulauqer ajuda
Vagner Almeida

Vagner Almeida

Curtidas 0

Respostas

Deivison Melo

Deivison Melo

01/10/2012

Veja o exemplo abaixo:

procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;

Onde na procedure abaixo eu uso o mesmo comando inserido no primeiro botão.
procedure TForm1.Button2Click(Sender: TObject);
begin
Button1Click(Sender);
end;
GOSTEI 0
Marcos Iwazaki

Marcos Iwazaki

01/10/2012

amigo.. fiz um teste aqui e funcionou no OnActive.

Será que vc não tem algum outra função ae que esta causando o problema?
tenta fazer um teste em uma aplicação nova...
GOSTEI 0
Vagner Almeida

Vagner Almeida

01/10/2012

Vou fazer mais testes aqui, qualquer coisa postarei novamente.

Obrigado pela atenção de vocês. ;)
GOSTEI 0
Alisson Santos

Alisson Santos

01/10/2012

Conseguiu resolver o seu problema??
GOSTEI 0
Deivison Melo

Deivison Melo

01/10/2012

Estamos aqui apra ajudá-lo, caso não conseguir solucionar, por favor, sinalizar para ajudarmos vc da melhor forma possível...

Forte abraço e bons códigos!
GOSTEI 0
Vagner Almeida

Vagner Almeida

01/10/2012

Olá pessoal voltei.

Fiz os teste como abrindo a janela como Show e funcionou, ou seja, no onShow e no onActive da janela que eu abro coloco o comando Close; e funciona. abre a ajanela e em seguida é fechada.

Mas quando abro a janela como ShowModal, não funciona.

Inicio o formulário/janela da seguinte forma
Application.CreateForm(Tfrm_venda,frm_venda);
try
  frm_venda.ShowModal; //Se eu abrir assim frm_venda.Show; - o close no onShow funciona
except
  FreeAndNil(frm_venda);
end;


E no evento onShow faço o seguinte:
procedure Tfrm_venda.FormShow(Sender: TObject);
begin
 Close;
end;


Não precisa necessariamente ser um close, mas qualquer outra coisa que feche essa janela resolve, dentro do onShow ou onActive.
GOSTEI 0
Gilvanio Gonçalves

Gilvanio Gonçalves

01/10/2012

depois de tantas perguntas pra vc e nem um resulatado positivo
vou te ajudar, mas também preciso que me responda:

vamos basear na nova aplicação ok.

este codigo vc esta aplicando ele onde?
Application.CreateForm(Tfrm_venda,frm_venda);
try
frm_venda.ShowModal; 
except
FreeAndNil(frm_venda);
end;


para abrir este frm_venda é por um outro form( um form principal de aplicativo no caso por um menu, ou por um botão)?


o outro codigo já li que esta no onshow do form Frm_venda

vc quer que o frm_venda.showmodal, seja fechado no evento onshow dele, e que seja showmodal e não modal, certo?

mas na sua explicação acima vc se refere a dois forms?

e na nova aplicação esta se referindo somente a um form, o frm_venda?.

se o que vc deseja é apenas que o frm_venda.showmodal seja fechado dentro do evento dele onshow, só me diga

a aplicação do primeiro codigo acima, e acabamos com este lemga lemga, ok.

GOSTEI 0
Vagner Almeida

Vagner Almeida

01/10/2012

depois de tantas perguntas pra vc e nem um resulatado positivo
vou te ajudar, mas também preciso que me responda:

vamos basear na nova aplicação ok.

este codigo vc esta aplicando ele onde?
Application.CreateForm(Tfrm_venda,frm_venda);
try
frm_venda.ShowModal; 
except
FreeAndNil(frm_venda);
end;


para abrir este frm_venda é por um outro form( um form principal de aplicativo no caso por um menu, ou por um botão)?


o outro codigo já li que esta no onshow do form Frm_venda

vc quer que o frm_venda.showmodal, seja fechado no evento onshow dele, e que seja showmodal e não modal, certo?

mas na sua explicação acima vc se refere a dois forms?

e na nova aplicação esta se referindo somente a um form, o frm_venda?.

se o que vc deseja é apenas que o frm_venda.showmodal seja fechado dentro do evento dele onshow, só me diga

a aplicação do primeiro codigo acima, e acabamos com este lemga lemga, ok.



Sim, tenho a seguinte estrutura: frm_principal (que possui o menu onde tenho o menu VENDA) através dele é que eu chamo a tela de vendas (frm_vendas) e da tela de vendas eu chamo a tela de pagamento (frm_pagamento).

Existe um tipo de venda em específico, Venda Farmácia Popular, que quando se trata desse tipo de venda, e o valor coberto pelo MS (Ministério da Saúde) for o valor total da venda, então é preciso executar um procedimento e em seguida fechar a tela, pois não há mais valor a ser pago, devido ao MS ter pago o valor total da venda.

Esse procedimento eu posso colocar no evendo onShow, mas no onShow (da tela de pagamento) a tela não é visualizada. Os procedimentos são executados, mas a tela não fica visível para o usuário. Só vem aparecer quando termina toda execução.
Já no onActive, os procedimentos são executados somente quando a tela fica visível para o usuário, do jeito que eu quero, mas em ambos os eventos o close não funciona.

O que eu observei nos testes que eu fiz é que quando abro a tela frm_pagamento como SHOW, se eu colocar um close dentro do onShow ou onCreate, ele funcionará.

Mas se eu abro a tela frm_pagamento como SHOWMODAL, e colocar um close dentro do onShow ou onCreate, ele não funcionará.

O que eu fiz: coloquei um TIMER com um comando "close" que será executado assim que o procedimento de pagamento é finalizado. Resolveu o problema. Mas isso é uma gambiarra!

Eu falei somente com relação a tela de venda porque qualquer formulário que vocâ abrir como showmodal irá se comportar, com relaçãoao Close, da forma como eu descrevi acima.

Obs.: o stilo dos formulários é NORMAL.

Abraços e muito obrigado pela ajuda
GOSTEI 0
Vagner Almeida

Vagner Almeida

01/10/2012

CONSIDERE ESSE POST, POIS O ANTERIOR ESTÁ COM ALGUNS ERROS (DESCULPE)

Sim, tenho a seguinte estrutura: frm_principal (que possui o menu onde tenho o menu VENDA) através dele é que eu chamo a tela de vendas (frm_vendas) e da tela de vendas eu chamo a tela de pagamento (frm_pagamento).

Existe um tipo de venda em específico, Venda Farmácia Popular, que quando se trata desse tipo de venda, e o valor coberto pelo MS (Ministério da Saúde) for o valor total da venda, então é preciso executar um procedimento e em seguida fechar a tela, pois não há mais valor a ser pago, devido ao MS ter pago o valor total da venda.

Esse procedimento é executado na tela de pagamento (frm_pagamento) e eu posso colocar no evendo onShow, mas no onShow a tela não é visualizada. Os procedimentos são executados, mas a tela não fica visível para o usuário. Só vem aparecer quando termina toda execução.
Já no onActive, os procedimentos são executados somente quando a tela fica visível para o usuário, do jeito que eu quero, mas em ambos os eventos o close não funciona.

O que eu observei nos testes que eu fiz é que quando abro a tela frm_pagamento como SHOW, se eu colocar um close dentro do onShow ou onActive, ele funcionará.
Mas se eu abro a tela frm_pagamento como SHOWMODAL, e colocar um close dentro do onShow ou onActive, ele não funcionará.

O que eu fiz: coloquei um TIMER com um comando "close" que será executado assim que o procedimento de pagamento é finalizado. Resolveu o problema. Mas isso é uma gambiarra!

Eu falei, anteriormente, somente com relação a tela de venda porque qualquer formulário que você abrir como showmodal irá se comportar, com relaçãoao Close, da forma como eu descrevi acima.

Obs.: o estilo dos formulários é NORMAL.

Abraços e muito obrigado pela ajuda
GOSTEI 0
Alisson Santos

Alisson Santos

01/10/2012

if (not dm.qCupomfpopsolic.IsNull) and (dm.qCupomfpopsolic.AsInteger > 0) then
begin
EfetuarPagamentoFPopular(fpopValor, fpopCPFSolic, fpopNomeSolic, fpopNumAut, opCXdt);
if vReceber <= 0 then begin
FecharPedido;
MsgDlg('Pagamento conluido com sucesso!',mtInformation,[mbOK]);
SairClick(Self);
end
else
dbgFormas.SetFocus;
end;


Amigo basta você dar um Self.close no lugar do SairClick, pois vai estar falando para fechar o formulário ativo no momento.
GOSTEI 0
Gilvanio Gonçalves

Gilvanio Gonçalves

01/10/2012

CONSIDERE ESSE POST, POIS O ANTERIOR ESTÁ COM ALGUNS ERROS (DESCULPE)

Sim, tenho a seguinte estrutura: frm_principal (que possui o menu onde tenho o menu VENDA) através dele é que eu chamo a tela de vendas (frm_vendas) e da tela de vendas eu chamo a tela de pagamento (frm_pagamento).//OK

Existe um tipo de venda em específico, Venda Farmácia Popular, que quando se trata desse tipo de venda, e o valor coberto pelo MS (Ministério da Saúde) for o valor total da venda, então é preciso executar um procedimento e em seguida fechar a tela, pois não há mais valor a ser pago, devido ao MS ter pago o valor total da venda.

Esse procedimento é executado na tela de pagamento (frm_pagamento) e eu posso colocar no evendo onShow, mas no onShow a tela não é visualizada. Os procedimentos são executados, mas a tela não fica visível para o usuário. Só vem aparecer quando termina toda execução.
Já no onActive, os procedimentos são executados somente quando a tela fica visível para o usuário, do jeito que eu quero, mas em ambos os eventos o close não funciona.

vamos lá o procedimento que vc diz é este Abaixo:

 if (not dm.qCupomfpopsolic.IsNull) and (dm.qCupomfpopsolic.AsInteger > 0) then 
 begin
    EfetuarPagamentoFPopular(fpopValor, fpopCPFSolic, fpopNomeSolic, fpopNumAut, opCXdt);
    if vReceber <= 0 then begin
       FecharPedido;
       MsgDlg('Pagamento conluido com sucesso!',mtInformation,[mbOK]);
       SairClick(Self);
    end
    else
       dbgFormas.SetFocus;
 end;

este procedimento faz uma verificação com valores de tabelas se vreceber é <= 0 ele chama uma function qué para fecharPedido; ( um form) que deve ser frm_vendas,ok?
e logo abaixo envia uma mensagem para o usuario que o pagamento foi concluido, ok.
vc apos a mensagem colocou SairClick(self), se refere a algum botão não sei, o que o sairclick(self) tem que fazer?

ai se foi maior ou diferente de 0, dbgforma.setfocus// é um dbedit acredito eu, de qual form?


depois da mensagem é que vc quer que feche um formulario é isto?

qual formulario, o nome dele?

me responda esta coisas que te passo o comando de facahar sendo showmodal.

o cologa ai disse para mudar de SairClick(self) para self.close, nem um dos dois ira funcionar se vc não disser qual form tera que ser fechado, apos a mensagem!

GOSTEI 0
Vagner Almeida

Vagner Almeida

01/10/2012

Faça um teste ai, veja se vai funcionar;
Lembre-se de chamara o formulário como showmodal, e no evendo onshow desse form que você abriu como showmodal, coloque um close, veja se vai fechar!
GOSTEI 0
Vagner Almeida

Vagner Almeida

01/10/2012

A função fechar pedido, conclui o pagamento dentro da própria tela de pagamento (que quero fechar quando executa o SairClick(Self)) enviando comandos para ECF. Nada de mais.

Quando é executado e concluido todo o procedimento de pagamento, é apresentado a mensagem "Pagamento conluido com sucesso!".

O SairClick é um menu e eu utilizo o codigo dele para fechar a tela de pagamento após ter concluido o pagamento.

Ou seja, Abro a tela de pagamento, executo procedimento de pagamento, e fecho a tela de pagamento, tudo de forma automática.

Então o problema é esse, ele faz tudo direitinho, mas na hora de fechar.... não fecha.
GOSTEI 0
Gilvanio Gonçalves

Gilvanio Gonçalves

01/10/2012

Faça um teste ai, veja se vai funcionar;
Lembre-se de chamara o formulário como showmodal, e no evendo onshow desse form que você abriu como showmodal, coloque um close, veja se vai fechar!


se entendi, vc chama o frm_vendas no estilo sowmodal e deseja que no evento onshow deste mesmo form o frm_vendas ele seja
fechado?

assim ele nem vai abrir, se esta sendo chamado por um botão ou um menu, ou por outro form, modal ou showmodal, e no evento onshow que é o evento para uso de rotinas de verificação etc.

se for para fechar no onshow somente close, não funcionará.
se vc que chamar um form showmodal e ao mesmo tempo ele seja fechado no evento on show do mesmo, vamos usar o handle.

no on show do form coloque esta codigo:

PostMessage(FrmVendas.Handle, WM_CLOSE, 0, 0);



como disse, ele antes de abrir sera fechado, dai basta vc determinar um tempo para ele ser fechado.


tai então o codigo que fecha o mesmo form no evento onshow sendo modal ou showmdal.


GOSTEI 0
Gilvanio Gonçalves

Gilvanio Gonçalves

01/10/2012

A função fechar pedido, conclui o pagamento dentro da própria tela de pagamento (que quero fechar quando executa o SairClick(Self)) enviando comandos para ECF. Nada de mais.

Quando é executado e concluido todo o procedimento de pagamento, é apresentado a mensagem "Pagamento conluido com sucesso!".

O SairClick é um menu e eu utilizo o codigo dele para fechar a tela de pagamento após ter concluido o pagamento.

Ou seja, Abro a tela de pagamento, executo procedimento de pagamento, e fecho a tela de pagamento, tudo de forma automática.

Então o problema é esse, ele faz tudo direitinho, mas na hora de fechar.... não fecha.


veja como se usa o handle:

se for fechar o proprio formulario :
PostMessage(Handle, WM_CLOSE, 0, 0);


Passe como parâmetro o Handle do form que você deseja fechar.
vamos supor assim, vc esta no form FrMvendas e você está criando o form Frmpagamento, então ficaria assim:
Código:
PostMessage(Frmpagamento.Handle, WM_CLOSE, 0, 0);


e é isto.


GOSTEI 0
Vagner Almeida

Vagner Almeida

01/10/2012

Obrigado
GOSTEI 0
Gilvanio Gonçalves

Gilvanio Gonçalves

01/10/2012

por nada amigo, o importante é que solucionou.
GOSTEI 0
Alisson Santos

Alisson Santos

01/10/2012

Tópico está fechado. Qualquer coisa nos informar.
GOSTEI 0
POSTAR