Didiron 0 Denunciar post Postado Julho 2, 2011 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
Ace Stryker™ 0 Denunciar post Postado Julho 4, 2011 Se eu fosse voce colocaria em todos os Forms secundarios, no evento OnClose ou no OnDestroy isto: Application.Terminate //ou Application.Destroy Compartilhar este post Link para o post Compartilhar em outros sites
Didiron 0 Denunciar post Postado Julho 4, 2011 Fiz desta forma, mas continua o mesmo problema... Agradeço pela ajuda. Compartilhar este post Link para o post Compartilhar em outros sites
Spoock 0 Denunciar post Postado Julho 5, 2011 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
wllf 2 Denunciar post Postado Julho 6, 2011 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
Didiron 0 Denunciar post Postado Julho 6, 2011 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
wllf 2 Denunciar post Postado Julho 6, 2011 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
Spoock 0 Denunciar post Postado Julho 6, 2011 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
Didiron 0 Denunciar post Postado Julho 6, 2011 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
bdexterholland 0 Denunciar post Postado Julho 6, 2011 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
wllf 2 Denunciar post Postado Julho 6, 2011 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