Problemas para fechar form.

Delphi

02/06/2010

Sou novo nesse fantástico mundo da programação, estou usando o Delphi 2010, mas estou enfrentando alguns problemas, um deles é quando programo um botão para fechar um determinado form, coloco  o comando para fechar (close;)para um determinado botão e no evento Formclose do formulário digito o seguinte: begin
 if application.MessageBox ('Deseja Realmente Sair?','Sair do Sistema', Mb_YesNo+MB_iconQuestion) <> IdYes then
 application.Run;
end; Mas em tempo de execução, quando se pede para fechar, ao clicar no botão ‘’Não’’ da tela de confirmação de fechamento, o programa continua rodando, até ai tudo bem,  mas se pedir para fechar novamente o programa, mensagem alguma e mostrada e não se consegue fechar o mesmo.
Alguém poderia me dar uma luz...
Desde já agradeço a ajuda.
Reinaldo M.

Reinaldo M.

Curtidas 0

Respostas

Marco Salles

Marco Salles

02/06/2010

O problema pode estar na criação desses formulários ???   Como vc esta istanciando esses formulários ??   São Craidos Automaticamente ou vc os Esta Craindo ???   ps: O Codigo que vc esta usando não é muito usual  
 if application.MessageBox ('Deseja Realmente Sair?','Sair do Sistema', Mb_YesNo+MB_iconQuestion) <> IdYes then
 application.Run;
  Geralmente se faz assim  
 if application.MessageBox ('Deseja Realmente Sair?','Sair do Sistema', Mb_YesNo+MB_iconQuestion) <> IdYes then
  Acction:=cafree
else
 Action:=caNone;
  Mas pode ser problema na Instanciação
GOSTEI 0
Marco Salles

Marco Salles

02/06/2010

O problema pode estar na criação desses formulários ???   Como vc esta istanciando esses formulários ??   São Craidos Automaticamente ou vc os Esta Craindo ???   ps: O Codigo que vc esta usando não é muito usual  
 if application.MessageBox ('Deseja Realmente Sair?','Sair do Sistema', Mb_YesNo+MB_iconQuestion) <> IdYes then
 application.Run;
  Geralmente se faz assim  
 if application.MessageBox ('Deseja Realmente Sair?','Sair do Sistema', Mb_YesNo+MB_iconQuestion) <> IdYes then
  Acction:=cafree
else
 Action:=caNone;
  Mas pode ser problema na Instanciação
GOSTEI 0
Marco Salles

Marco Salles

02/06/2010

O problema pode estar na criação desses formulários ???   Como vc esta istanciando esses formulários ??   São Craidos Automaticamente ou vc os Esta Craindo ???   ps: O Codigo que vc esta usando não é muito usual  
 if application.MessageBox ('Deseja Realmente Sair?','Sair do Sistema', Mb_YesNo+MB_iconQuestion) <> IdYes then
 application.Run;
  Geralmente se faz assim  
 if application.MessageBox ('Deseja Realmente Sair?','Sair do Sistema', Mb_YesNo+MB_iconQuestion) <> IdYes then
  Acction:=cafree
else
 Action:=caNone;
  Mas pode ser problema na Instanciação
GOSTEI 0
Marco Salles

Marco Salles

02/06/2010

O problema pode estar na criação desses formulários ???   Como vc esta istanciando esses formulários ??   São Craidos Automaticamente ou vc os Esta Craindo ???   ps: O Codigo que vc esta usando não é muito usual      if application.MessageBox ('Deseja Realmente Sair?','Sair do Sistema', Mb_YesNo+MB_iconQuestion) <> IdYes then
 application.Run;
  Geralmente se faz assim      if application.MessageBox ('Deseja Realmente Sair?','Sair do Sistema', Mb_YesNo+MB_iconQuestion) <> IdYes then
  Acction:=cafree else  Action:=caNone;     Mas pode ser problema na Instanciação
GOSTEI 0
Marco Salles

Marco Salles

02/06/2010

Podiam Resolver este perrengue
GOSTEI 0
Rafael Ribeiro

Rafael Ribeiro

02/06/2010

VOCÊ JÁ TENTOU FAZER O INVERSO?

[CODE]
begin
 if application.MessageBox ('Deseja Realmente Sair?','Sair do Sistema', Mb_YesNo+MB_iconQuestion) = IdYes then
 application.terminate;
end;
GOSTEI 0
Rafael Ribeiro

Rafael Ribeiro

02/06/2010

CARA, NO EVENTO ONCLICK DO PRÓPRIO BOTÃO VOCÊ DIGITA O CÓDIGO:

begin
 if MessageDlg('Deseja sair do Sistema?', mtconfirmation, [mbYes, mbNo], 0)
    = mrYes then
begin
 application.terminate;
end;


NÃO SERÁ NECESSÁRIO COLOCAR A PERGUNTA NO FORMCLOSE.

ESPERO TER AJUDADO.
GOSTEI 0
Eduardo

Eduardo

02/06/2010

Olha eu uso assim, precisa ver em realação ao banco de dados. Não sei se tem à ver (Firebird, DBExpress).. Para abrir o formulário e tirar ele da memória uso assim:   procedure TformPrincipal.opcVendasClick(Sender: TObject);
var
 formulario:tformPedidos;
 begin
    if (Application.FindComponent('formPedidos')=nil) then
begin
     Formulario:=tformPedidos.Create(Application);
    
end;
     end;   E para fechar com a pergunta é mais ou menos assim: Você faz a pergunta,  se for verdadeira você usa .........Application.Terminate;   end else begin Abort; end; end; Acho que é mais ou menos isto. Tenta aí
GOSTEI 0
Reinaldo M.

Reinaldo M.

02/06/2010

valew! muito obrigado.....
GOSTEI 0
Alberto

Alberto

02/06/2010

tente colocar
  Application.Terminate; ou
  Halt;

isso ira força fechar a tela.

GOSTEI 0
Lartedesign

Lartedesign

02/06/2010

voce quer fechar a tela ou continuar a aplicação  ??

se for fechar a aplicação..  utilize

if MessageDlg('Deseja realmete finalizar esta sessão ?',mtConfirmation,[mbYes,mbNo],0) = mrNo then
exit
else
application.terminate;
end;

GOSTEI 0
Lartedesign

Lartedesign

02/06/2010

voce quer fechar a tela ou continuar a aplicação  ??

se for fechar a aplicação..  utilize

if MessageDlg('Deseja realmete finalizar esta sessão ?',mtConfirmation,[mbYes,mbNo],0) = mrNo then
exit
else
application.terminate;
end;

GOSTEI 0
Marco Salles

Marco Salles

02/06/2010

Danou-se
GOSTEI 0
Marco Salles

Marco Salles

02/06/2010

Não vai não vai ne a pau
GOSTEI 0
Elton Ésqui

Elton Ésqui

02/06/2010

Antes tarde do que nunca!

begin
case MessageDlg('Deseja mesmo encerrar o programa?',  mtConfirmation, [mbYes,  mbNo], 0) of
  mrYes:
    begin
      Close;
    end;
  mrNo:
    begin
      Action := caNone;
    end;
end;
end;
GOSTEI 0
Deivison Melo

Deivison Melo

02/06/2010

Elton Ésqui,

Vamos lá!

Nunca utilize o Halt, ele fecha o aplicativo de forma anormal, encerrando a aplicação de forma desordenada (sem retirar da memória a instância dos objetos). O correto é utilizar o Close (que internamente chama o comando Terminate), ou Terminate (Fecha a aplicação de forma ordenada, garantindo assim que eventos sejam respeitados, mensagens pendentes executadas e etc).

sempre utilizei no formulário principal da aplicação, no evento "OnCloseQuery" o seguinte comando:

  if Application.MessageBox('Tem certeza que deseja sair?', 'Confirmação',
    MB_IconQuestion + MB_YesNO) = idNO then
    CanClose := false;

Qualquer coisa estou à disposição!!!

Emanoel Deivison
Recife - PE


GOSTEI 0
Marco Salles

Marco Salles

02/06/2010

Elton Ésqui,

Nunca utilize o Halt, ele fecha o aplicativo de forma anormal, encerrando a aplicação de forma desordenada (sem retirar da memória a instância dos objetos). O correto é utilizar o Close (que internamente chama o comando Terminate), ou Terminate (Fecha a aplicação de forma ordenada, garantindo assim que eventos sejam respeitados, mensagens pendentes executadas e etc).

  Esta afirmação não esta 100%   O que se pensa ..... " Halt fecha a aplicação de forma anormal, não liberando a memória alocada pelos objetos, recursos consumidos, etc. (...)
"   Mas lendo a documentação do Delphi e após umas "olhadas" no código fonte da VCL.  
Halt respeita os objetos criados pela aplicação, que tenha sido inicializados com o parâmetro Owner apontando para algo gerenciado pelo aplicativo, como o formulário principal. Desta forma chamar Halt não irá deixar memória desalocada desnecessariamente. É claro que o sistema operacional pode não repor totalmente a memória consumida, mas isso tbm poderia ocorrer com Terminate. 
GOSTEI 0
Carlos Mazzi

Carlos Mazzi

02/06/2010

Só pra entender o problema ainda persiste?
GOSTEI 0
Pedro Saraiva.

Pedro Saraiva.

02/06/2010

Programa com códigos fontes Ola pessoal, você programador que quer um aplicativo exemplo para fins comerciais, tenho uma dica, compre o WinPhar que vem com todos os códigos fontes e faça um programa baseado nele, sim ele também vêm com todos os componentes para instalar, voce além de ganhar um programa complidao, ganha tb os seus códigos fontes e seus componentes. O programa foi desenvolvido em Delphi 7 com banco de dados paradox, e custa apenas 20,00 reais
deem uma olhadinha ai no produto
http://produto.mercadolivre.com.br/MLB-149256966-winphar-2008-sistema-para-farmacias-e-drogarias-_JM
e ente em contato pelo e-mail pedroluissaraiva@yahoo.com.br.!  
GOSTEI 0
POSTAR