meu programa não deixa o windows ser encerrado
Criei um programa que no evento OnClose do form principal cancela o encerramento do mesmo(Cancel:= true) e o oculta(form1.hide).
Porém quando tento encerrar o windows com o programa rodando, essa ação é cancelada e o windows só é desligado depois que fecho o programa. Como corrijo isso?
Porém quando tento encerrar o windows com o programa rodando, essa ação é cancelada e o windows só é desligado depois que fecho o programa. Como corrijo isso?
Thaleshcv
Curtidas 0
Respostas
Dedi
07/06/2004
Amigo,
Faça o seguinte: detecte a finalização do windows e feche seu aplicativo ai o windows vai desligar sem problemas.
[i:d252343a1e]Retirado do 800 dicas[/i:d252343a1e]
Faça o seguinte: detecte a finalização do windows e feche seu aplicativo ai o windows vai desligar sem problemas.
154 - Detectando a finalização do Windows
Para detectar a finalização do Windows, deve-se capturar a mensagem WM_ENDSESSION. Estes passos devem ser tomados:
Declarar uma rotina de manipulação de mensagens na sessao private de sua form:
procedure WMEndSession(var Msg : TWMEndSession); message WM_ENDSESSION;
Adicionar a procedure à seção implementation de sua unit:
procedure TForm1.WMEndSession(var Msg : TWMEndSession);
begin
if Msg.EndSession = TRUE then
ShowMessage(´O Windows está finalizando ´ + #13 + ´às ´ +
FormatDateTime(´c´, Now));
inherited;
end;
[i:d252343a1e]Retirado do 800 dicas[/i:d252343a1e]
GOSTEI 0
Thaleshcv
07/06/2004
Amigo,
Faça o seguinte: detecte a finalização do windows e feche seu aplicativo ai o windows vai desligar sem problemas.
[quote:9bcfda695f]
154 - Detectando a finalização do Windows
Para detectar a finalização do Windows, deve-se capturar a mensagem WM_ENDSESSION. Estes passos devem ser tomados:
Declarar uma rotina de manipulação de mensagens na sessao private de sua form:
procedure WMEndSession(var Msg : TWMEndSession); message WM_ENDSESSION;
Adicionar a procedure à seção implementation de sua unit:
procedure TForm1.WMEndSession(var Msg : TWMEndSession);
begin
if Msg.EndSession = TRUE then
ShowMessage(´O Windows está finalizando ´ + #13 + ´às ´ +
FormatDateTime(´c´, Now));
inherited;
end;
[i:9bcfda695f]Retirado do 800 dicas[/i:9bcfda695f][/quote:9bcfda695f]
JÁ TENTEI USAR ESSA ROTINA COLOCANDO APPLICATION.TERMINATE NO CÓDIGO. MAS NAO DEU CERTO. É PRECISO COLOCÁ-LA EM ALGUMA EVENTO ESPECÍFICO??OU SÓ BASTA COLOCÁ-LA NO CÓDIGO???
GOSTEI 0
Dedi
07/06/2004
// na clausula [b:21bb83e74d]var[/b:21bb83e74d] declare a variavel cancel
//No evento onclose do form
Caso ainda não consiga poste o erro....
var Form1: TForm1; cancel:boolean;
procedure TForm1.WMEndSession(var Msg : TWMEndSession); begin if Msg.EndSession = TRUE then gravatexto(false,´Fechando´); Cancel := true; Close; inherited; end;
//No evento onclose do form
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin If Not cancel Then Action := caNone Else Action := caFree end;
Caso ainda não consiga poste o erro....
GOSTEI 0
Thaleshcv
07/06/2004
// na clausula [b:8829e8cefd]var[/b:8829e8cefd] declare a variavel cancel
//No evento onclose do form
Caso ainda não consiga poste o erro....
var Form1: TForm1; cancel:boolean;
procedure TForm1.WMEndSession(var Msg : TWMEndSession); begin if Msg.EndSession = TRUE then gravatexto(false,´Fechando´); Cancel := true; Close; inherited; end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin If Not cancel Then Action := caNone Else Action := caFree end;
Continuo empancado... Não aprece nenhuma mensagem de erro. O Windows apenas não é finalizado. Aí vai partes do programa q podem estar causando isso:
{ Private declarations }
procedure FinalizandoWindows(var Msg: TWMEndSession);message WM_ENDSESSION;
{...}
var
frmFormPrinc : TfrmFormPrinc; {form principal}
{...}
Cancelar : Boolean;
implementation
{$R *.DFM\}
procedure TfrmFormPrinc.FinalizandoWindows(var Msg: TWMEndSession);
begin
if Msg.EndSession= true then
Cancelar:= true;
Close;
inherited;
end;
procedure TfrmFormPrinc.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if not Cancelar then
begin
//anima a janela
AnimateWindow(frmFormPrinc.Handle,500,AW_VER_POSITIVE Or AW_HOR_NEGATIVE Or AW_HIDE);
//impede o encerramento do programa e oculta a janela principal
CanClose:= false;
frmFormPrinc.Hide;
end
else
//deveria dar continuidade ao encerramento do form
CanClose:= true;
end;
procedure TfrmFormPrinc.FormClose(Sender: TObject; var Action: TCloseAction);
begin
{ tentei o seguinte mas também não funcionou
if not Cancelar then
Action:= caNone
else
Action:= caFree;}
end;
procedure TfrmFormPrinc.FormDestroy(Sender: TObject);
var
i: Integer;
F: TextFile;
begin
//atualiza a lista de arquivos
AssignFile(F,ArqLst);
Rewrite(F);
for i:=0 to TotImg-1 do
begin
//elimina os componentes criados durante a execu\´e7\´e3o
//e escreve os nomes das imagens em uso
Lbl[I].Free;
Img[I].Free;
Panel[I].Free;
if Imagem[i]<>´´ then
Writeln(F,Imagem[i]);
end;
CloseFile(F);
//limpa o objeto registro
Registro.Free;
end;
A idéia do programa é que fique rodando oculto, mas com um ícone adicionado na bandeija de sistema(próximo ao relógio).
A partir desse ícone, o usuário pode exibir a janela ou encerrar o programa.
Esse ícone é adicionado através de um componente (Tanis Notification Icon).
Quando é dado OK na janela de finalizar o windows nada acontece.
GOSTEI 0