GARANTIR DESCONTO

Fórum meu programa não deixa o windows ser encerrado #236402

07/06/2004

0

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?


Thaleshcv

Thaleshcv

Responder

Posts

07/06/2004

Dedi

Amigo,
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]


Responder

Gostei + 0

07/06/2004

Thaleshcv

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???


Responder

Gostei + 0

07/06/2004

Dedi

// na clausula [b:21bb83e74d]var[/b:21bb83e74d] declare a variavel cancel
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....


Responder

Gostei + 0

09/06/2004

Thaleshcv

// na clausula [b:8829e8cefd]var[/b:8829e8cefd] declare a variavel cancel
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....



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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar