Zamanlı exe çalıştırmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
loxka
Üye
Mesajlar: 214
Kayıt: 18 Ağu 2003 01:10

Zamanlı exe çalıştırmak

Mesaj gönderen loxka »

Hazırladığım programda kullanıcım şunu istedi benden. 02 Şubatta "kumasPik.exe" dosyasının çalışmasını istedi. Tıkandım kaldım nasıl yapacağıma dairen ufak fikrim yok, Timer bileşenini bu anlamda nasıl kullanacağımı bilmiyorum, Yardımlarınız için teşekkür ederim.
Bu muazzam programın içinde ben neyim?, sadece bir label..
mero
Üye
Mesajlar: 109
Kayıt: 04 Mar 2005 04:54

Mesaj gönderen mero »

bu iş için ikinci bir exe yapsanda arka planda çalışsa, tarih geldiğinde programı otomatik çalıştırsa olmaz mı?
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Mesaj gönderen comfort »

windowsun zamanlanmış görevler seçeneğini kullanabilirsiniz
Kullanıcı avatarı
baypipox
Üye
Mesajlar: 122
Kayıt: 16 Eki 2006 04:23
İletişim:

Mesaj gönderen baypipox »

kardeş tam olarak bilmiyorum ama bir fikrim geldi! exe yi registere kaydetsen daha sonrada senin belirliyeceğin tarihle exe çalışsa olmazmı arka planda, forumda ben gezerken görmüştün windows apileri diye bir başlıkta orda exe nasıl registere kaydetceğini yazıyosu bir bak istersen işine yaraya bilir... hatta şimdi ben buldum windows her açıldığında çalışsın diyor isen exe tarih kontrol edecek şekilde düzen le sonra alttaki kodla registere kaydet

Kod: Tümünü seç

uses kısmına Registry unitini ekleyin. 
{$IFNDEF WIN32}
const MAX_PATH = 144;
{$ENDIF}

procedure TForm1.Button1Click(Sender: TObject);
var
  reg: TRegistry;
begin
  reg := TRegistry.Create;
  reg.RootKey := HKEY_LOCAL_MACHINE;
  reg.LazyWrite := false;
  reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',false);
  reg.WriteString('Uygulamam', uygulamanızın_yolu_ve_adı); 
  reg.CloseKey;
  reg.free;
end;
[/code]
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

TTimer kullanıp;

if Date = EncodeDate(2007, 2, 2) then
begin
WinExec('C:\Kumaspik.exe');
Timer1.Enabled := FALSE;
end;

gibi bir kontrol yapabilirsin.

Tabi iki ayrı program falan olması lazım.

Tabi bir de ben kesinlikle windowsun zamanlanmış görevlerini kullanmam demen lazım.

İyi çalışmalar.
loxka
Üye
Mesajlar: 214
Kayıt: 18 Ağu 2003 01:10

Mesaj gönderen loxka »

Üstatlar cevaplarınız için teşekür ederim,
Bu muazzam programın içinde ben neyim?, sadece bir label..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@baypipox doğru yaklaşımda bulunarak hazırladığın tetikçi :wink: programın her daim Windows açılışında çalıştırılması için gerekli kodu yazmış.

@Hakan Can da sana tmer ile nasıl kontrol edeceğini yazmış.

- Ben ise @Hakan Can'ın kodunda minik bir müdahale yapıcam. Çünkü tarih kontrollerinde eşitlik 1 saniyenin 1000'de birinde rastlanır. Şaka yapmıyorum bu gerçek. :oops: Bu nedenle > veya < gibi büyüklük küçüklük kontrolü yapılır. :idea:

- Eşitlik durumunda hiç tetiklenememe ihtimalinin yanında bu bahsettiğim yeni durumda da program her çalıştığında; tarih büyüklük veya küçüklük kontrolüne yakalanıp gereksiz tetiklenme ihtimali doğar. Bu olumsuzluğu ise basit bir INI dosyası ile çözebilirsin.

- Bir de BONUS kontrol edeceğin tarihi de INI dosyasında tutar, OnCreate olayında global bir tarih değişkene alır o değişkeni kontrol ettirerek dinamizm atabilirsin.

- Örnek kodda, INI dosyası yoksa veya TETIK isimli anahtar yoksa varsayılan olarak TRUE kabul edilir ve zamanı geklince çalıştırılır.

- Çalıştıktan sonra INI dosyasına FALSE değeri yazılır. Bir sonraki kontrolde bu değer FALSE okunacağından yanlışlıkla mükerrer çalışma engellenir.

Kod: Tümünü seç

// Uses INIFiles
procedure TForm1.Timer1Timer(Sender: TObject);
Var
  INI : TINIFile;
begin
  if Date > EncodeDate(2007, 2, 1) then
  begin
    INI := TINIFile.Create(ChangeFileExt(Application.ExeName, '.INI'));
    If INI.ReadBool('TETIK', 'CALISTIR', True ) then begin
      TTimer(Sender).Enabled := FALSE;
      WinExec('C:\Kumaspik.exe', SW_SHOW);
      INI.WriteBool('TETIK', 'CALISTIR', False );
    end;
    INI.Free;
  end;
end;
- Başarılar...
En son mrmarman tarafından 27 Oca 2007 12:35 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Resim
Resim ....Resim
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Hocam gözünüzden kaçtı galiba.

NOW kullansaydım dediğiniz doğruydu. Ancak ben DATE kullandım.

DATE ve ENCODEDATE sadece gün bilgisi döndürüyor. Bu da bu eşitlik 24 saat için geçerli demek oluyor.

Zaten sizinkisi 3 Şubat'ta çalışacaktır bu durumda.

İyi çalışmalar.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@Hakan Can

- Gözümden kaçan bişey yok, delphi help'e bakarsanız siz DATE demiş olabilirsiniz eşitliğin bir değil iki tarafı vardır. :idea: EncodeDate fonksiyonu TDateTime tipinde döner.

- Bu örnek için çalışmaz demiyorum zaten hatalı şeklinde de bir ifadem olmadı. Sadece tarih eşitliklerinde eşitlik tarzından kaçınmanızı önerdim. Bunu sana da öneriyorum. :wink:

- ve evet eşitliğe odaklanınca büyük dediğimdeki 2 şubat yerine 1 demem gerekiyordu bu gözümden kaçmış..
Resim
Resim ....Resim
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

ENCODEDATE ile DATE sonuçta ikisi de aynı tipteler. İkisi de saat bilgisi döndürmüyorlar. Yani tamsayı döndürüyorlar (Double fakat küsüratı yok).

Ben daha ziyade bunu vurgulamak istemiştim.

Tabi birde verdiğin örnekte sonuç bir sonraki güne denk geliyordu. Onu düzeltmek amacıyla da söylemiştim.

Yoksa verdiğin bilgiler gerçekten yazılımcıların başını devamlı ağrıtan bilgilerin tashihi şeklinde çok değerli bilgiler.

Eleştiri olarak algılamayın.

İyi çalışmalar.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Rica ederim eleştiri önemli bir olgudur. Yapılmalıdır. Doğru nokaları yakalamak için vazgeçilmezdir. :o

- Bunun anlayış dahilinde olmasına gayret gösteriyoruz. Tespitiniz doğru ve gerekli düzeltme yapıldı.
Resim
Resim ....Resim
Kullanıcı avatarı
baypipox
Üye
Mesajlar: 122
Kayıt: 16 Eki 2006 04:23
İletişim:

Mesaj gönderen baypipox »

yaa arkadaş yeni bir konu açmadım benim merak ettiği birşey varda firebird de gbak ile backup aldırdıktan sonra direk oluşan gbk dosyasının tekrar ReStore yapmak istiyorum bunun için de programdan o dosyanı oraya oluşup oluşmadığını bilmem lazım yani yazağım kod misal backup yaptıktan sonra

" c:\yedek\tamer.gbk " oluşturuluyor.

oluşmuşmu diye bakacak bunu nasıl yapabilirim.
ilgilenenlere çok tşkr ederim kolay gelsin.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

FileExists() fonksiyonu bu işi yapıyor. Yan var mı yok mu

Kod: Tümünü seç

If FileExists('c:\yedek\tamer.gbk') then ShowMessage('Dosya Var') else ShowMessage('YOK');
Resim
Resim ....Resim
Erd_turkmen
Üye
Mesajlar: 38
Kayıt: 27 Ara 2006 03:13

Mesaj gönderen Erd_turkmen »

baypipox yazdı:yaa arkadaş yeni bir konu açmadım benim merak ettiği birşey varda firebird de gbak ile backup aldırdıktan sonra direk oluşan gbk dosyasının tekrar ReStore yapmak istiyorum bunun için de programdan o dosyanı oraya oluşup oluşmadığını bilmem lazım yani yazağım kod misal backup yaptıktan sonra

" c:\yedek\tamer.gbk " oluşturuluyor.

oluşmuşmu diye bakacak bunu nasıl yapabilirim.
ilgilenenlere çok tşkr ederim kolay gelsin.
Eğer sorunuzu yanlış anladıysam Fileexist fonksiyonu ile yapabilirsiniz. Geçenlerde bende sormuştım aynı soruyu :P
Kullanıcı avatarı
baypipox
Üye
Mesajlar: 122
Kayıt: 16 Eki 2006 04:23
İletişim:

Mesaj gönderen baypipox »

arkadaşlar çok teşekkür ederim saolun varalun, forumumuzun ve destekleyenlerin ömrü solar gibi uzun olsun...
Cevapla