2014-08-29 29 views

cevap

18

VCL zaten WM_ENDSESSION (gizli uygulama penceresi) için dinler ve oturumun ne zaman olduğunu sonlandırır. bitirme. Mümkün diğer sonlandırmak prosedürler arasında çağrılacak olan (başka yerde ya) .dpr içinde add a terminate procedure edebilirsiniz: inşaat büyük

program Project1; 

uses 
    Vcl.Forms, 
    sysutils, 
    Unit2 in 'Unit2.pas' {Form2}; 

{$R *.res} 

function OnTerminate: Boolean; 
begin 
    Result := True; 
    // do some short work 
end; 

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TForm2, Form2); 
    AddTerminateProc(OnTerminate); 
    Application.Run; 
end. 
+1

, teşekkür ederim! – hikari

+0

Bu yöntem aslında bazı kötü sonuçları vardır .. Herhangi bir nedenle bir form "sıkışmış" ise, formlar yok edilmeden önce OnTerminate çağrılabilir, yani, örneğin, bir formun yakın olayı bazı nesnelere erişiyorum OnTerminate proc, bir istisna alacak. (yani, birkaç saniye içinde zaman aşımına bağlı bir engelleme soketinde bir GET yapıyorum, sonra uygulamayı kapatmak için X'i tıklıyorum, herhangi bir form kapatılmadan ve yok edilmeden önce OnTerminate çağrılacak). İdeal olarak, kodu .Run'dan sonra bırakabilmeliyiz; Bir sistem kapatma durumunda neden yapılmaz? – hikari

+1

@Hikari - Formlardan ayrılan bir yer arıyor gibiydiniz. Eğer durum bu değilse, neden kodunuzu bu formdaki bir mesaj işleyicisine koymuyorsunuz? TApplication bir WM_ENDSESSION aldığında, WM_QUIT mesajının sonlanmasını beklemez, bu nedenle Run'dan sonraki ifadeler çalışmaz. –