Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Didiron

Problema ao fechar aplicação

Recommended Posts

Boa tarde pessoal, tudo certo?

 

Tenho um problema que está acontecendo a um certo tempo que eu julgo ser muito estranho.

Tenho uma aplicação que estou criando que está funcionando perfeitamente, mas, tenho um problema na hora que eu saio do meu programa, pois ele fecha todos os forms corretamente, mas ele continua com o icone do programa na barra iniciar e se eu entrar no Gerenciador de Tarefas, lá mostra que o meu programa não está funcionando corretamente, então sou obrigado a fechá-lo manualmente. O mais estranho é quando eu abro o meu projeto dentro do próprio delphi, até o delphi tem este problema e sou obrigado a fechá-lo através do gerenciador de tarefas. Já testei com outros projetos esse problema não acontece. Alguem sabe o que poderia ser? Testei meu programa no WIndows 7 e Windows XP e em todos aconteceu este problema. Estou utilizando Delphi 7, Firebird 2.0.

 

O que eu acredito que possa estar cirando este problema é que eu estou trabalhando com um form Modelo que eu utilizo em muitos outros forms(exceto no principal). Vou postar os códigos do Form Principal e Form Modelo. Quem puder me ajudar eu agradeço.

 

FORM Principal

unit UPrincipal;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, jpeg, ExtCtrls, Menus, Grids, StdCtrls, UDmPrincipal, UCadastroClientes,
 DB, DBClient, Provider, RpCon, RpConDS, RpBase, RpSystem, RpDefine,
 RpRave, RpRenderText, RpRenderHTML, RpRender, RpRenderPDF, URelatorioOrcamento,
 UCadastroOrcamento;

type
 TFrmPrncipal = class(TForm)
   MainMenu1: TMainMenu;
   Cadastro1: TMenuItem;
   Clientes1: TMenuItem;
   Pagamentos1: TMenuItem;
   Visualizao1: TMenuItem;
   Clientes2: TMenuItem;
   Pagamentos2: TMenuItem;
   Relatrios1: TMenuItem;
   Sair1: TMenuItem;
   GroupBox1: TGroupBox;
   SgConsulta: TStringGrid;
   Contas1: TMenuItem;
   Contas2: TMenuItem;
   Image1: TImage;
   DataSetProvider1: TDataSetProvider;
   ClientDataSet1: TClientDataSet;
   RvProjetoClientes: TRvProject;
   RvSistemaClientes: TRvSystem;
   RvDataSetConnection1: TRvDataSetConnection;
   BtnRelatorioClientes: TMenuItem;
   RvRenderPDF1: TRvRenderPDF;
   RvRenderHTML1: TRvRenderHTML;
   RvRenderText1: TRvRenderText;
   DataSetProvider2: TDataSetProvider;
   ClientDataSet2: TClientDataSet;
   RvProjetoPagamentos: TRvProject;
   RvSistemaPagamentos: TRvSystem;
   RvDataSetConnection2: TRvDataSetConnection;
   BtnRelatorioPagamentos: TMenuItem;
   ClientDataSet3: TClientDataSet;
   DataSetProvider3: TDataSetProvider;
   RvProjetoContas: TRvProject;
   RvSistemaContas: TRvSystem;
   RvDataSetConnection3: TRvDataSetConnection;
   BtnRelatorioContas: TMenuItem;
   BtnRelatorioOrcamento: TMenuItem;
   BtnCadastroorcamento: TMenuItem;
   RvDataSetConnection4: TRvDataSetConnection;
   RvSistemaOrcamentos: TRvSystem;
   RvOrcamento: TRvProject;
   ClientDataSet4: TClientDataSet;
   DataSetProvider4: TDataSetProvider;
   BackupBancodeDados1: TMenuItem;
   SaveDialog1: TSaveDialog;
   procedure FormShow(Sender: TObject);
   procedure Sair1Click(Sender: TObject);
   procedure Clientes1Click(Sender: TObject);
   procedure Pagamentos1Click(Sender: TObject);
   procedure Contas1Click(Sender: TObject);
   procedure Clientes2Click(Sender: TObject);
   procedure Contas2Click(Sender: TObject);
   procedure Pagamentos2Click(Sender: TObject);
   procedure BtnRelatorioClientesClick(Sender: TObject);
   procedure BtnRelatorioPagamentosClick(Sender: TObject);
   procedure BtnRelatorioContasClick(Sender: TObject);
   procedure BtnRelatorioOrcamentoClick(Sender: TObject);
   procedure BtnCadastroorcamentoClick(Sender: TObject);
   procedure BackupBancodeDados1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 FrmPrncipal: TFrmPrncipal;

implementation

uses ULogin, UCadastroPagamentos, UCadastroContas, UConsultaClientes, UConsultaContas, UConsultaPagamentos;

{$R *.dfm}

procedure TFrmPrncipal.FormShow(Sender: TObject);
begin
 SgConsulta.Cells[0,0] := 'Status Atual';
 SgConsulta.Cells[1,0] := 'Cliente';
 SgConsulta.Cells[2,0] := 'Nota Fiscal';
 SgConsulta.Cells[3,0] := 'Data';
 SgConsulta.Cells[4,0] := 'Forma de Pagamento';
 SgConsulta.Cells[5,0] := 'Valor (R$)';
 SgConsulta.Cells[6,0] := 'Vencimento';
 SgConsulta.Cells[7,0] := 'Ordem de Compra';
 SgConsulta.cells[0,1] := '';

       with DM.SQLQuery1 do
        begin
               SQL.Clear;
               SQL.Add('SELECT * FROM PAGAMENTOS ORDER BY COD_PAGAMENTO DESC;');
               Open;
               While not EOF do
                  begin
                     IF SgConsulta.Cells[0,1] <> '' then
                     SgConsulta.RowCount := SgConsulta.RowCount + 1;
                     SgConsulta.Cells[0,SgConsulta.RowCount-1] := FieldByName ('STATUS_PAGAMENTO').AsString;
                     SgConsulta.Cells[1,SgConsulta.RowCount-1] := FieldByName ('CLIENTE_PAGAMENTO').AsString;
                     SgConsulta.Cells[2,SgConsulta.RowCount-1] := FieldByName ('NF_PAGAMENTO').AsString;
                     SgConsulta.Cells[3,SgConsulta.RowCount-1] := FieldByName ('DATA_PAGAMENTO').AsString;
                     SgConsulta.Cells[4,SgConsulta.RowCount-1] := FieldByName ('FORMA_PAGAMENTO').AsString;
                     SgConsulta.Cells[5,SgConsulta.RowCount-1] := FieldByName('VALOR_PAGAMENTO').AsString;
                     SgConsulta.Cells[6,SgConsulta.RowCount-1] := FieldByName ('VENCIMENTO_PAGAMENTO').AsString;
                     SgConsulta.Cells[7,SgConsulta.RowCount-1] := FieldByName ('OC_PAGAMENTO').AsString;
                  Next;
             End;
         end;
end;

procedure TFrmPrncipal.Sair1Click(Sender: TObject);
begin
  Close;
end;

procedure TFrmPrncipal.Clientes1Click(Sender: TObject);
var
FrmCadastroClientes:TFrmCadastroClientes;
begin
 FrmCadastroClientes:=TFrmCadastroClientes.Create(Self);
 Try
   FrmCadastroClientes.ShowModal;
 Finally
   FrmCadastroClientes.Free;
 end;
 FrmPrncipal.Close;
end;

procedure TFrmPrncipal.Pagamentos1Click(Sender: TObject);
var
FrmCadastroPagamentos:TFrmCadastroPagamentos;
begin
 FrmCadastroPagamentos:=TFrmCadastroPagamentos.Create(Self);
 Try
   FrmCadastroPagamentos.ShowModal;
 Finally
   FrmCadastroPagamentos.Free;
 end;
 FrmPrncipal.Close;
end;


procedure TFrmPrncipal.Contas1Click(Sender: TObject);
var
 FrmCadastroContas:TFrmCadastroContas;
begin
 FrmCadastroContas := TFrmCadastroContas.Create(Self);
 Try
   FrmCadastroContas.ShowModal;
 Finally
   FrmCadastroContas.Free;
 end;
 FrmPrncipal.Close;
end;

procedure TFrmPrncipal.Clientes2Click(Sender: TObject);
var
 FrmCOnsultaClientes:TFrmCOnsultaClientes;
begin
 FrmCOnsultaClientes := TFrmCOnsultaClientes.Create(Self);
 Try
    FrmCOnsultaClientes.ShowModal;
 Finally
   FrmCOnsultaClientes.Free;
 end;
 FrmPrncipal.Close;
end;

procedure TFrmPrncipal.Contas2Click(Sender: TObject);
var
 FrmCOnsultaContas:TFrmCOnsultaContas;
begin
 FrmCOnsultaContas := TFrmCOnsultaContas.Create(Self);
 Try
    FrmCOnsultaContas.ShowModal;
 Finally
   FrmCOnsultaContas.Free;
 end;
 FrmPrncipal.Close;
end;

procedure TFrmPrncipal.Pagamentos2Click(Sender: TObject);
var
 FrmConsultaPagamentos:TFrmConsultaPagamentos;
begin
 FrmConsultaPagamentos := TFrmConsultaPagamentos.Create(Self);
 Try
    FrmConsultaPagamentos.ShowModal;
 Finally
   FrmConsultaPagamentos.Free;
 end;
 FrmPrncipal.Close;
end;

procedure TFrmPrncipal.BtnRelatorioClientesClick(Sender: TObject);
begin
 RvProjetoClientes.Execute;
end;

procedure TFrmPrncipal.BtnRelatorioPagamentosClick(Sender: TObject);
begin
 RvProjetoPagamentos.Execute;
end;

procedure TFrmPrncipal.BtnRelatorioContasClick(Sender: TObject);
begin
 RvProjetoContas.Execute;
end;

procedure TFrmPrncipal.BtnRelatorioOrcamentoClick(Sender: TObject);
begin
 RvOrcamento.Execute;
end;

procedure TFrmPrncipal.BtnCadastroorcamentoClick(Sender: TObject);
var
 FrmCadastroorcamentos:TFrmCadastroorcamentos;
begin
 FrmCadastroorcamentos := TFrmCadastroorcamentos.Create(Self);
 Try
    FrmCadastroorcamentos.ShowModal;
 Finally
   FrmCadastroorcamentos.Free;
 end;
 FrmPrncipal.Close;

end;

procedure TFrmPrncipal.BackupBancodeDados1Click(Sender: TObject);
var
Origem, Destino, Arquivo: string;
begin
 if MESSAGEBOX(Application.Handle, 'Deseja Fazer o Backup do Banco de Dados?', 'Por favor, confirme:', MB_ICONQUESTION + MB_YESNOCANCEL + MB_DEFBUTTON2) = ID_YES then
   Origem := 'C:\Smart Business\db\SMART.FDB';
   SaveDialog1.FileName := Arquivo;
   SaveDialog1.InitialDir := Origem;
   SaveDialog1.Filter := '.fdb';
   if SaveDialog1.Execute then
     begin
        Arquivo := SaveDialog1.FileName+SaveDialog1.Filter;
           if not CopyFile(PChar(Origem), PChar(SaveDialog1.FileName+'.FDB'), false) then
             ShowMessage('Erro ao copiar ' + Origem + ' para ' + Destino)
           Else
             ShowMessage('Backup efetuado com sucesso.');
     end;
 end;

end.

 

Form Modelo

unit UMODELO;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, jpeg, ExtCtrls, Menus, Grids, StdCtrls, UDmPrincipal, RpRave,
 RpCon, RpConDS, RpDefine, RpBase, RpSystem, RpRenderText, RpRenderHTML,
 RpRender, RpRenderPDF, DB, DBClient, Provider;

type
 TFrmModelo = class(TForm)
   Image1: TImage;
   MainMenu1: TMainMenu;
   Cadastro1: TMenuItem;
   Clientes1: TMenuItem;
   Pagamentos1: TMenuItem;
   Visualizao1: TMenuItem;
   Clientes2: TMenuItem;
   Pagamentos2: TMenuItem;
   Relatrios1: TMenuItem;
   Sair1: TMenuItem;
   Contas1: TMenuItem;
   Contas2: TMenuItem;
   RvSistemaClientes: TRvSystem;
   RvDataSetConnection1: TRvDataSetConnection;
   RvProjetoClientes: TRvProject;
   BtnRelatorioClientes: TMenuItem;
   RvRenderPDF1: TRvRenderPDF;
   RvRenderHTML1: TRvRenderHTML;
   RvRenderText1: TRvRenderText;
   DataSetProvider1: TDataSetProvider;
   ClientDataSet1: TClientDataSet;
   DataSetProvider2: TDataSetProvider;
   ClientDataSet2: TClientDataSet;
   RvProjetoPagamentos: TRvProject;
   RvSistemaPagamentos: TRvSystem;
   RvDataSetConnection2: TRvDataSetConnection;
   BtnRelatorioPagamentos: TMenuItem;
   DataSetProvider3: TDataSetProvider;
   ClientDataSet3: TClientDataSet;
   RvProjetoContas: TRvProject;
   RvSistemaContas: TRvSystem;
   RvDataSetConnection3: TRvDataSetConnection;
   BtnRelatorioContas: TMenuItem;
   RvDataSetConnection4: TRvDataSetConnection;
   RvSistemaOrcamentos: TRvSystem;
   Rvorcamento: TRvProject;
   ClientDataSet4: TClientDataSet;
   DataSetProvider4: TDataSetProvider;
   CriarRelatriodeOramento1: TMenuItem;
   GerarBackupBancodeDados1: TMenuItem;
   SaveDialog1: TSaveDialog;
   Oramentos1: TMenuItem;
   procedure Sair1Click(Sender: TObject);
   procedure Clientes1Click(Sender: TObject);
   procedure Pagamentos1Click(Sender: TObject);
   procedure Contas1Click(Sender: TObject);
   procedure Clientes2Click(Sender: TObject);
   procedure Contas2Click(Sender: TObject);
   procedure Pagamentos2Click(Sender: TObject);
   procedure BtnRelatorioClientesClick(Sender: TObject);
   procedure BtnRelatorioPagamentosClick(Sender: TObject);
   procedure BtnRelatorioContasClick(Sender: TObject);
   procedure CriarRelatriodeOramento1Click(Sender: TObject);
   procedure GerarBackupBancodeDados1Click(Sender: TObject);
   procedure Oramentos1Click(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 FrmModelo: TFrmModelo;

implementation

uses UCadastroClientes, UPrincipal, UCadastroPagamentos, UCadastroContas, UConsultaClientes, UConsultaContas, UConsultaPagamentos, UCadastroOrcamento;

{$R *.dfm}

procedure TFrmModelo.Sair1Click(Sender: TObject);
begin
  Halt(2);
  Application.Terminate;
end;

procedure TFrmModelo.Clientes1Click(Sender: TObject);
var
FrmCadastroClientes:TFrmCadastroClientes;
begin
 FrmCadastroClientes:=TFrmCadastroClientes.Create(Self);
 Try
   FrmCadastroClientes.ShowModal;
 Finally
   FrmCadastroClientes.Free;
 end;
end;

procedure TFrmModelo.Pagamentos1Click(Sender: TObject);
var
FrmCadastroPagamentos:TFrmCadastroPagamentos;
begin
 FrmCadastroPagamentos:=TFrmCadastroPagamentos.Create(Self);
 Try
   FrmCadastroPagamentos.ShowModal;
 Finally
   FrmCadastroPagamentos.Free;
 end;
end;

procedure TFrmModelo.Contas1Click(Sender: TObject);
var
 FrmCadastroContas:TFrmCadastroContas;
begin
 FrmCadastroContas := TFrmCadastroContas.Create(Self);
 Try
   FrmCadastroContas.ShowModal;
 Finally
   FrmCadastroContas.Free;
 end;
end;

procedure TFrmModelo.Clientes2Click(Sender: TObject);
var
 FrmCOnsultaClientes:TFrmCOnsultaClientes;
begin
 FrmCOnsultaClientes := TFrmCOnsultaClientes.Create(Self);
 Try
    FrmCOnsultaClientes.ShowModal;
 Finally
   FrmCOnsultaClientes.Free;
 end;
end;

procedure TFrmModelo.Contas2Click(Sender: TObject);
var
 FrmCOnsultaContas:TFrmCOnsultaContas;
begin
 FrmCOnsultaContas := TFrmCOnsultaContas.Create(Self);
 Try
    FrmCOnsultaContas.ShowModal;
 Finally
   FrmCOnsultaContas.Free;
 end;
end;

procedure TFrmModelo.Pagamentos2Click(Sender: TObject);
var
 FrmConsultaPagamentos:TFrmConsultaPagamentos;
begin
 FrmConsultaPagamentos := TFrmConsultaPagamentos.Create(Self);
 Try
    FrmConsultaPagamentos.ShowModal;
 Finally
   FrmConsultaPagamentos.Free;
 end;

end;

procedure TFrmModelo.BtnRelatorioClientesClick(Sender: TObject);
begin
 RvProjetoClientes.Execute;
end;

procedure TFrmModelo.BtnRelatorioPagamentosClick(Sender: TObject);
begin
 RvProjetoPagamentos.Execute;
end;

procedure TFrmModelo.BtnRelatorioContasClick(Sender: TObject);
begin
 RvProjetoContas.Execute;
end;

procedure TFrmModelo.CriarRelatriodeOramento1Click(Sender: TObject);
begin
 Rvorcamento.Execute;
end;

procedure TFrmModelo.GerarBackupBancodeDados1Click(Sender: TObject);
var
Origem, Destino, Arquivo: string;
begin
 if MESSAGEBOX(Application.Handle, 'Deseja Fazer o Backup do Banco de Dados?', 'Por favor, confirme:', MB_ICONQUESTION + MB_YESNOCANCEL + MB_DEFBUTTON2) = ID_YES then
   Origem := 'C:\Smart Business\db\SMART.FDB';
   SaveDialog1.FileName := Arquivo;
   SaveDialog1.InitialDir := Origem;
   SaveDialog1.Filter := '.fdb';
   if SaveDialog1.Execute then
     begin
        Arquivo := SaveDialog1.FileName+SaveDialog1.Filter;
           if not CopyFile(PChar(Origem), PChar(SaveDialog1.FileName+'.FDB'), false) then
             ShowMessage('Erro ao copiar ' + Origem + ' para ' + Destino)
           Else
             ShowMessage('Backup efetuado com sucesso.');
     end;
 end;


procedure TFrmModelo.Oramentos1Click(Sender: TObject);
var
 FrmCadastroorcamentos:TFrmCadastroorcamentos;
begin
 FrmCadastroorcamentos := TFrmCadastroorcamentos.Create(Self);
 Try
    FrmCadastroorcamentos.ShowModal;
 Finally
   FrmCadastroorcamentos.Free;
 end;
 FrmPrncipal.Close;

end;

procedure TFrmModelo.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := CaFree; 
end;

end.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta colocar no Evento OnClose e nos botões Fechar de todos os formulários o Código:

 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// Caso o Formulário for fechado pelo X finaliza a aplicação inteira
Application.Terminate;
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega Didiron, alguns dia atrás postaram uma dúvida muito semelhante com a sua, vamos eliminar possíveis causas, supondo que a FormPrincipal seja o que finaliza a aplicação então como o colega acima postou:

 

Pode até ser no evento OnClose ou no Menu Sair caso exista;

//Application.Terminate;

 

Nos Forms derivados

Caso exista um botão fechar:

//FormTal.close;

 

No evento OnClose do FormTal;

//Action := caFree;

//FormTal := nil;

 

Bom desse modo eliminamos alguns problemas de Forms mau destruídos, existem outros modos também como a função FreeAndNil(), não gosta muito dessa costuma dar uns bugs.

 

Agora quando você estiver trabalhando com os Forms derivados de uma debugada no sistema pra ver se não está chamando alguma função que pede retorno, as vezes solicitamos algum serviço via API do Windows e não obtemos repostas, algum componente ativo.

 

Outra situação, supondo que você trabalhe com orientação a objetos, as vezes o sistema fica com aqueles resíduos de MemoryLeeks, objetos que não foram descarregados muito parecido com a primeira situação dos Forms que pode estar setados ainda.

 

Bom acho que é isso tudo o que posso imaginar no seu caso, qualquer avanço post aí ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigo, eu descobri uma função chamada ExitProcess(0);

Eu a utilizei e fez exatamente o que eu queria. Você sabe se existe algum problema em utilizá-la?

Agradeço desde já pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Essa API é usada para finalizar processos, em que ponto do seu sistema você usa esse comando ?

 

Até onde eu conheço esse comando não é um dos mais indicados para finalizar um aplicação se for o seu caso, pois ele finaliza mas não libera memória alocada para possíveis objetos.

 

Ou seja sempre resta uma memória suja.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é Didiron, é o que o wllf falou. Esse comando não libera a memória, deixando o programa "aberto" e ocupando memória do PC. Meu professor falou que os dois comandos já citados aqui são os melhores. São eles o Application.Teminate; ou o FormX.Close;. Boa sorte com o programa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então eu estou usando este comando no click do botão sair.

Eu acabei optando pelo ExitProcess pois ele encerra a aplicação na hora, já o Application.Terminate demora muito para fechar os forms, se eu abri 5 forms, ele demora uns 3 segundo para fechar cada form.

EU optei pelo ExitProcess pois ele encerra a aplicação no exato momento em que cliquei no botão sair.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O application.Terminate não pode demorar 3 segundos para fechar cada form não. Verifique seu código, use BreakPoints e Steps para descobrir em qual trecho de código está retardando a execução da rotina.

 

 

 

sinto cheiro de macarrão....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega como mencionei acima não é aconselhavel usar ExitProcess(), esse comando finaliza bruscamente a aplicação, imagino que no seu sistema exista um FormPrincipal, finalize o sistema nesse form, usando o Application.Terminate.

 

Escreva uma rotina para verificar se existem forms filhos carregados na memória e feche os antes de finalizar o sistema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.