2 tarih arasında kalan zamanı öğrenmek istiyorum.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
Shou
Üye
Mesajlar: 260
Kayıt: 26 Ağu 2011 02:00

2 tarih arasında kalan zamanı öğrenmek istiyorum.

Mesaj gönderen Shou »

Merhaba arkadaşlar ben program başlarken zamanı kaydediyorum timer ile 10 dakika geçtimi bir fonksiyon çalıştırmasını istiyorum ama bir türlü başaramadım kaydettiğim kısım,

Kod: Tümünü seç

ilkzaman := FormatDateTime('yymmddhhnnss', Now);

Kod: Tümünü seç

simdikizaman := FormatDateTime('yymmddhhnnss', Now);
Buraya kadar herşey güzel ama çıkartma işlemine gelince olmuyor,

Kod: Tümünü seç

cikart=simdikizaman-ilkzaman
diyorum ama olmuyor bir türlü nasıl yapabilirim?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: 2 tarih arasında kalan zamanı öğrenmek istiyorum.

Mesaj gönderen mrmarman »

USES'a DateUtils unitini ekleyin.
Aşağıdaki örnek üzerinden kendinize uygun bir yapı oluşturmayı deneyin.

Bu örnek 5 dakika bekleyip, süre sonunda bir mesaj ile bunu bildiren basit ama işlevsiz :) bir yapı. Sadece örnek olsun diye kurdum.

Kod: Tümünü seç

USES DateUtils;

procedure TForm1.BitBtn1Click(Sender: TObject);
Const
{$j+}
  boolSayac : Boolean = False;
{$j-}
Var
  T1, T2 : TDateTime;
  SureDk : Integer;
begin
  SureDk := 5;
  T1 := Now;
  T2 := T1;
  boolSayac := NOT boolSayac;
  While (MinutesBetween( T1, T2 ) < SureDk) and boolSayac do
  begin
    T2 := Now;
    TBitBtn(Sender).Caption := Format('Sürenin bitmesine %d saniye kaldı..', [ SecondsBetween(T2, IncMinute(T1, SureDk) )]);
    Application.ProcessMessages;
    Sleep(1);
  end;
  if boolSayac
  then ShowMessageFmt( '%d dakika oldu...', [SureDk])
  else begin
    TBitBtn(Sender).Caption := 'Başlat';
  end;
  boolSayac := False;
end;
En son mrmarman tarafından 29 Nis 2015 10:38 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Resim
Resim ....Resim
Kullanıcı avatarı
Shou
Üye
Mesajlar: 260
Kayıt: 26 Ağu 2011 02:00

Re: 2 tarih arasında kalan zamanı öğrenmek istiyorum.

Mesaj gönderen Shou »

Hocam create kısmını örnek verdım benim bir timer var onunla kontrol edip zaman vermek istiyorum burada nasıl zaman veriliyor anlamadım.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: 2 tarih arasında kalan zamanı öğrenmek istiyorum.

Mesaj gönderen mrmarman »

O zaman timer'in OnTimer eventine bunu kuracaksın. Şöyle örnekleyeyim...

Kod: Tümünü seç

Var
  xboolSayac : Boolean = False;
  xSureDk  : Integer;
  xT1      : TDateTime;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  if xboolSayac then
  begin
    xboolSayac := False;
    TBitBtn(Sender).Caption := 'Başlat';
  end
  else begin
    TBitBtn(Sender).Caption := 'Durdur';
    xT1        := Now;
    xSureDk    := 1;
    xboolSayac := True;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if xboolSayac then
  begin
    if MinutesBetween(xT1, Now) >= xSureDk then
    begin
      xboolSayac := False;
      ShowMessageFmt('%d dakikalık Zaman doldu...', [xSureDk]);
    end else
    begin
      Caption := Format('%d dk. bitmesine %d sn.kaldı..', [ xSureDk, SecondsBetween(Now, IncMinute(xT1, xSureDk) )]);
    end;
  end;
end;
Resim
Resim ....Resim
Kullanıcı avatarı
Shou
Üye
Mesajlar: 260
Kayıt: 26 Ağu 2011 02:00

Re: 2 tarih arasında kalan zamanı öğrenmek istiyorum.

Mesaj gönderen Shou »

Hocam o verdiğinizi bir türlü benimki gibi yapamadım mesela örnek vereyim ben bir button koydum.

Kod: Tümünü seç

ilkzaman := FormatDateTime('yymmddhhnnss', Now);
button basınca şu değer veriyor "150429230852" ve 2 ci bir buttonum var ona tıklayınca,

Kod: Tümünü seç

simdikizaman := FormatDateTime('yymmddhhnnss', Now);
Buna basınca veren değer örnek veriyim "150429230858" ve bunları çıkarttığımda.

150429230852 - 150429230858 = 6 - aradaki fark 6 saniye oluyor ben bunu bulmak istiyorum.

yani,

Kod: Tümünü seç

sonuc=ilkzaman-simdikizaman;
çalışmıyor.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: 2 tarih arasında kalan zamanı öğrenmek istiyorum.

Mesaj gönderen mrmarman »

FormatDateTime sana String sonuç döndürür, bunu Integer'e dönüştürmeden çıkartma yapamazsın zaten.

ilk zaman ve ikinci zamanı neden TDateTime tanımlamaktan imtina ediyorsun ?

Kod: Tümünü seç

Var
  ilkzaman, simdikizaman : tDateTime;
  sonuc : Integer;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ilkzaman := now; //FormatDateTime('yymmddhhnnss', Now);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  simdikizaman := now; //FormatDateTime('yymmddhhnnss', Now);
  sonuc := SecondsBetween( ilkzaman, simdikizaman );
  ShowMessageFmt('%d saniye geçmiş...', [sonuc]);
end;
Resim
Resim ....Resim
Kullanıcı avatarı
Shou
Üye
Mesajlar: 260
Kayıt: 26 Ağu 2011 02:00

Re: 2 tarih arasında kalan zamanı öğrenmek istiyorum.

Mesaj gönderen Shou »

@mrmarman

çok teşekkür ederim sabahtan beri bunu yapmaya çalışıyodum :)

+

Hocam birde (now) = tarih ay gun saat dakika saniye - veriyor ben ise, tarih ay gun saat dakika almak istiyorum tek.

Abi bir sorun oldu bunu if de okutmam için ilk zamanı string yapmam lazım nasıl yapabilirim bir türlü beceremedim?

Kod: Tümünü seç

ilkzaman := now;
olarak kaydediyoruz ama if de string okuması lazım.

Kod: Tümünü seç

if ilkzaman = '32324324' then begin
bir türlü beceremedim ve şöyle deniyorum,

Kod: Tümünü seç

w:string;

w:=ilkzaman;
gene olmuyor. (inttostr vs olmadı yani)
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: 2 tarih arasında kalan zamanı öğrenmek istiyorum.

Mesaj gönderen mrmarman »

if'de string okumak zorunda değilsin ki, neyse istediğine odaklanalım konu kapansın, zaten DateTime yaptığına göre şöyle yapabilirsin.

Örneğin :

Kod: Tümünü seç

w := FormatDateTime('yymmddhhnnss', ilkzaman);

Aslında tam olarak ne yapmak istediğin tarihi gelince alarm verdirmek ise = kullanırsan, ilgili tarihi bir şekilde geçersen döngü durmaz. Bunun için > veya < işaretlerini kullanmanı öneririm.
Resim
Resim ....Resim
Kullanıcı avatarı
Shou
Üye
Mesajlar: 260
Kayıt: 26 Ağu 2011 02:00

Re: 2 tarih arasında kalan zamanı öğrenmek istiyorum.

Mesaj gönderen Shou »

Hocam gene if de okumuyor neden bir türlü çözemedim gitti.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: 2 tarih arasında kalan zamanı öğrenmek istiyorum.

Mesaj gönderen mrmarman »

Baştan iki tarih arasındaki dakika farkını istedin yazdım. Şimdi bunu string'e çevirip karşılaştırmak istemen konusu benim kafamı karıştırdı.
Bana tam olarak ne yapmak istediğini yazar mısın ?
Bir de kodunu yaz ki, timer içerisinde neyi nasıl karşılaştırdığını göreyim.
Resim
Resim ....Resim
Kullanıcı avatarı
Shou
Üye
Mesajlar: 260
Kayıt: 26 Ağu 2011 02:00

Re: 2 tarih arasında kalan zamanı öğrenmek istiyorum.

Mesaj gönderen Shou »

if kere = 1 then begin q := Now; end; // (ilk)
if kere = 9 then begin w := now; end; // (son)
if kere = 9 then // (9 giriş)
begin
if CompareTime(q, w) = 0 then // Denetliyo aynimi
begin
Yaz(ip, TimeToStr(w)); // Ini yaziyo
kere := 0;
end;
end;
Burada ilk giriş kısmında 1 cide zamanı alıp kaydediyoruz ondan sora aynı dakkada 9 kere giriş yaparsa onuda alıcaz ve if ile = karşılaştırıcaz aynı ise banlist.ini dosyasına yazıcaz ve banlist.ini dekini ilk baştaki kısımda alıp okumak istiyorum 10 dk geçtiyse banlist.ini sildirtmek istiyorum.

örnek vereyim banlist.ini

içinde yazan,

Kod: Tümünü seç

1504300107

Kod: Tümünü seç

ilkzaman:=1504300107;
// gibi okuyoruz banlist.ini yani.

Kod: Tümünü seç

if zaman > '1504300107' then begin showmessage('Banlist.ini silebilirsin.'); end;
gibi ama bir türlü olmuyor.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: 2 tarih arasında kalan zamanı öğrenmek istiyorum.

Mesaj gönderen mrmarman »

Hiç stringe bulaşma bence.

Şöyle bir yapı kurdum, dene beğenirsen kullanırsın. Açıklamaları satır satır ekledim.

Kod: Tümünü seç

USES INIFiles, DateUtils;

function IPKontrol( strIP: String ):Boolean;
Var
  INI    : TINIFile;
  dtSaat : TDateTime;
begin
  INI    := TINIFile.Create( ChangeFileExt(Application.Exename, '.ini' ) );
  dtSaat := INI.ReadDateTime( 'IP', strIP, 0 ); // kayıtlarda IP varsa giriş saatini okuyoruz...
  if dtSaat = 0 then
  begin // bu IP ilk defa giriş yapmış...
    Result := True;
    // Zaman Aşımı Saatini INI'ye yazıyoruz...(5dk sonrası)
    INI.WriteDateTime( 'IP', strIP, IncMinute(Now, 5) );
  end else
  begin // INI'de kayıtlı, yani zaten giriş yapmış.
    if dtSaat <= now
    then // zaman aşımı olmuş... yeniden giriş serbest.
    begin
      Result := True;
      // Yeni zaman aşımını INI'ye yazıyoruz..
      INI.WriteDateTime( 'IP', strIP, IncMinute(Now, 5) );
    end
    else // 5 dakika içinde yeniden giriş denemesi yapılıyor... Engellenecek...
      Result := False;
  end;
  INI.Free;
end;
Kullanımı

Kod: Tümünü seç

  if NOT IPKontrol( '192.168.1.10' ) then BaglantiyiKopar();
Edit :
Aynı zaman diliminde 9 kere olayını unutmuşum, onu da INI'ye yaz, her defasında bir arttır, 9 olunca false'e düşür banlansın
Resim
Resim ....Resim
Kullanıcı avatarı
Shou
Üye
Mesajlar: 260
Kayıt: 26 Ağu 2011 02:00

Re: 2 tarih arasında kalan zamanı öğrenmek istiyorum.

Mesaj gönderen Shou »

Ama diyelim adam 10 dakika sonra girdimi ini dosyasını silmek istiyorum yani sağdece 10 dakika engel yemesini istiyorum.

Pardon yeni gördüm o kısımı yapmışsın zaten deniyorum hemen çok teşekkür ediyorum :)

Abi çok teşekkür ediyorum bu tam istediğim ama aynı dakkada 9 kere giriş yaparsa engellemesini istiyorum o kısımı beceremedim senin burada nasıl yapıcam onu örnek verebilirsen sevinirim.
En son Shou tarafından 30 Nis 2015 01:46 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: 2 tarih arasında kalan zamanı öğrenmek istiyorum.

Mesaj gönderen mrmarman »

Kod: Tümünü seç

USES INIFiles, DateUtils;

function IPKontrol( strIP: String ):Boolean;
Const
  iZamanAsimi   = 5; // dakika
  iErisimSiniri = 10;
Var
  INI    : TINIFile;
  dtSaat : TDateTime;
  iErisim: Integer;
begin
  INI    := TINIFile.Create( ChangeFileExt(Application.Exename, '.ini' ) );
  dtSaat := INI.ReadDateTime( 'IP', strIP, 0 ); // kayıtlarda IP varsa giriş saatini okuyoruz...
  iErisim:= INI.ReadInteger ( 'ErisimSay', strIP, 0 );
  if dtSaat = 0 then
  begin // bu IP ilk defa giriş yapmış...
    Result := True;
    // Zaman Aşımı Saatini INI'ye yazıyoruz...(5dk sonrası)
    INI.WriteDateTime( 'IP', strIP, IncMinute(Now, iZamanAsimi) );
    INI.WriteInteger ( 'ErisimSay', strIP, 1 );
  end else
  begin // INI'de kayıtlı, yani zaten giriş yapmış.
    if dtSaat <= now
    then // zaman aşımı olmuş... yeniden giriş serbest.
    begin
      Result := True;
      // Yeni zaman aşımını INI'ye yazıyoruz..
      INI.WriteDateTime( 'IP', strIP, IncMinute(Now, iZamanAsimi) );
      INI.WriteInteger ( 'ErisimSay', strIP, 1 );
    end
    else // 5 dakika içinde yeniden giriş denemesi yapılıyor... Engellenecek...
    begin
      Inc(iErisim);
      if iErisim >= iErisimSiniri //10. defayı gelmiş veya aşmış... Banlanacak..
      then Result := False
      else begin // 9 kere aynı IP zaman içerisinde yeniden erişim yaparsa serbest
        INI.WriteInteger ( 'ErisimSay', strIP, iErisim ); // aynı IP bir artmış yeni erişim sayısı kayıt altına alınıyor.
        Result := True;
      end;
    end;
  end;
  INI.Free;
end;
Bu da yeni hali...

Kod: Tümünü seç

Const
  iZamanAsimi   = 5; // dakika
  iErisimSiniri = 10;
olanl yerlere istediğini yazarsın. zaman aşımı içerisinde erisim sınırı kadar kereye kadar izin verir. Sonrası FALSE döner sen de gereğini yaparsın. INI kayıt ve güncelleme işlemlerini aynı fonksiyon yapıyor. Ayrıca yaz boz yapmana gerek yok.

gelen IP'ler içinde kalsınlar silmeye lüzum yok, zaten süre sonunda geleceklerinden tazelenerek aynı kayıt kullanılacaktır.
Resim
Resim ....Resim
Kullanıcı avatarı
Shou
Üye
Mesajlar: 260
Kayıt: 26 Ağu 2011 02:00

Re: 2 tarih arasında kalan zamanı öğrenmek istiyorum.

Mesaj gönderen Shou »

Abi çok teşekkür ettim tam istediğim buydu çok sağolasın.
Cevapla