Süresi içinde hiç işlem yapılmayan programı sonlandırmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
muttalip
Üye
Mesajlar: 71
Kayıt: 18 Haz 2003 08:58
Konum: İstanbul
İletişim:

Süresi içinde hiç işlem yapılmayan programı sonlandırmak

Mesaj gönderen muttalip »

Bir uygulama çalıştırıyorum. Bu uygulamanın herhangi bir yerinde 5 dakikalık bir süre içinde herhangi bir işlem yapılmadıysa programın otomatik sonlandırılmasını istiyorum. Eğer bu zaman süresi içinde harhangi bir işlem yapıldıysa o zaman bu sürenin sıfırlanıp yeniden 5 dakikalık bir süre verdirmek istiyorum.

Bu işlemi nasıl yapabiliriz. Önerileriniz için şimdiden teşekkür ederim.
Muttalip TOPTAŞ

Yıldız Teknik Üniversitesi
Bilgi İşlem Dairesi Başkanlığı

Tel: 0212-3832134
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

Mouse ve Keyboard olaylarını takip etmen lazım, her hangi bir hareket oldugunda timer sıfırlanmalı,
yalnız yazdıgın program simge durumunda iken bu takibi yapamayacaksın,
o yuzden bu tarz bir uygulama icin genel keyboard ve mouse mesajlarını yakalaman gerekmekte
forumda hook diye arattıgın vakit bir kac baslık bulacaksın bu konu hakkında
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7604
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Additional Sayfasında TApplicationEvents bleşeni var. Onun OnIdle kısmı kullanılabilir sanıyorum. Program çalışmadığı zaman devreye giriyor. Ama detaylı bakmak lazım.

Kolay gelsin.
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

S.A.

Öncelikle ve tahmin edebileceğin gibi formuna bir Timer koymalisin.

Kod: Tümünü seç

procedure TForm1.Timer1Timer(Sender:TObject);
begin
   Close;
end;
Bu 5 dk sonra formun başına gelecek akibeti gösterecektir.

Şimdi esas can alıcı nokta, tabi bu soruda ben kullanıcın form üzerinde mouse ya da klavye ile bir işlem yapmadığnı var sayıyorum. 5 dk. içinde kalvye ya da mouse işlemi olmaz ise Form kapanacak. Ya da program sonlanacak.

Öncelikle Mouse formun üstünde hareket ediyorsa, demek ki kullanıcı form ile ilgileniyor, ya da form üstünde bişiler okuyor diye düşünebilirsiz. Bu şekilde bir yaklaşım ile MOUSE, Formun üstünde hareket ettikçe Timer'ı sıfırlayabiliriz.

Kod: Tümünü seç

type
  TForm4 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Timer1 : TTimer;
    procedure FormCreate(Sender: TObject);
    .
    .
    .
  private
    procedure WMNCHitTest(var Msg: TMessage); message WM_NCHITTEST;
  public
    { Public declarations }
  end;
.
.
.
implementation
.
.
.
procedure TForm4.WMNCHitTest(var Msg: TMessage);
begin
  inherited;
  //Mouse form üstünde dolanıyor..
  Timer1.Enabled := False;
  Timer1.Enabled := True;
end;
.
.
.
Bu kod sadece mouse'un form üstüdeki hareketini algılıyor. Bu yöntem sayesinde, çok şeyler yapılabilir, benim çok kullandığım bir şey ise, Formun Border'unu NONE yaptığımda üstteki bir resmi tıklarayak formu taşıtmaktadır. http://www.musonya.com/setup/JFs_Setup.exe bu adreste yazmış olduğum uygulamada bunu görebilirsiniz. Ayrıca bu ürünüde test etmiş olursunuz.

Yani formun herhangi bir yerinden değilde sadece belli bir yerindeyken mouse ile tutulursa taşıma yapmak istiyorsak şöyle tapabiliriz.

Kod: Tümünü seç

procedure TForm4.WMNCHitTest(var Msg: TMessage);
var X, Y : Integer;
begin
  inherited;
  X := ScreenToClient(Mouse.CursorPos).X;
  Y := ScreenToClient(Mouse.CursorPos).Y;
  if (X > 0) And (X < Width) And
     (Y > 0) And (Y < 100) Then Msg.Result := HTCAPTION;
end;
Bunu bilgi olsun diye veriyorum sizlere. Bu yukarıdaki kod, mouse formun belirtilen alanı içine girerse o alanı CAPTION bar gibi algılamasını sağlıyor. Ve mouse ile basılı tutup taşırsanız formunuzda taşınır.

Aslında teorik olarak mouse hareketi ile formun kullanılıp kullanılmadığını anlıyabiliriz. Fakat bu yetmez, ayrıca klavye tıklamalarınıda algılamak isteyebilirsiniz. Bu durumda;

Kod: Tümünü seç

    .
    .
  private
    { Private declarations }
    procedure WMNCHitTest(var Msg: TMessage); message WM_NCHITTEST;
    procedure DoAppMessage(var Msg: TMsg; var Handled: Boolean);
  public
.
.
.
implementation
.
.
.
procedure TForm4.FormCreate(Sender: TObject);
begin
   Application.OnMessage := DoAppMessage;
end;
.
.
.
procedure TForm4.DoAppMessage(var Msg: TMsg; var Handled: Boolean);
begin
   //Herhangi bir tuşa basılıp kaldırılınca 
   if Msg.message = WM_KEYUP then
      begin
         Timer1.Enabled := False;
         Timer1.Enabled := True;
      end;

   //Fare'nin sol düğmesi kalkınca.. (tıklanınca)
   if Msg.message = WM_LBUTTONUP then messagebeep(0);
end;
.
.
.
Umarım faydalı olabilmişimdir.
Hepinize iyi çalışmalar dilerim.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Eline emeğine sağlık, katkılarının devamını esirgemezsin umarım :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Süresi içinde hiç işlem yapılmayan programı sonlandırmak

Mesaj gönderen Lord_Ares »

sayın murat dicle hocam yukarıdaki kodunuz ile ilgili şunu sormak istiyorum yardımcı olursanız sevinirim.
kullanıcı benim programım dışında herhangi bir yere double click yaptığında o pencerenin handle nosunu almak isitiyorum.vermiş olduğunuz şu kod ile bunu yapabilirmiyiim. kodu şu şöyle değiştirdim fakat hatlar aldım.
procedure TForm4.DoAppMessage(var Msg: TMsg; var Handled: Boolean);
begin
//Fare'nin sol düğmesi kalkınca.. (tıklanınca)
if Msg.message = WM_LBUTTONUP then messagebeep(0);
end;

bu kodu timer1.timera ekledim.

procedure TForm1.Timer1Timer(Sender: TObject);
begin
mouseMessage(WM_LBUTTONUP);
end;
şu hatayı aldım

Type of actual and formal var parameters must be identical

teşekkurler
Cevapla