Tarih tatil mi?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
underwater
Üye
Mesajlar: 86
Kayıt: 27 May 2014 04:27

Tarih tatil mi?

Mesaj gönderen underwater »

Arkadaşlar merhaba;

Forumda ararken iki tarih arasındaki iş günlerini hesaplayan fonksiyonu buldum.
Ben ise vereceğim tarihin tatil günü olup olmadığını hesaplamasını ve true false cinsinden döndürmesini istiyorum fakat beceremedim.
Not:Tatil günlerini array şeklinde aşağıdaki gibi ben vereceğim.

Yardımcı olursanız sevinirim.

iş günlerinin sayısını hesaplayan fonksiyon şöyle ;

Kod: Tümünü seç

Function Hesapla (Baslangic,Bitis : TDateTime;
                         OzelGunler:Array of TDateTime):Integer;

var
  tmpTarih : TDateTime;
  iTemp : Integer;
  inDate : Boolean;
Begin
  Result :=0;
  tmpTarih:=Min(Baslangic,Bitis);
  while tmpTarih<=Max(Baslangic,Bitis) do
  Begin
    if not (DayOfTheWeek(tmpTarih) in [6,7]) then
     Begin
      if Length(OzelGunler)=0 then Inc(Result)
      else
      Begin
        inDate := False;
        for iTemp := Low(OzelGunler) to High(OzelGunler) do
        Begin
          if  tmpTarih=OzelGunler[iTemp] then
          Begin
            inDate:=True;
            Break;
          End;
        End;
        if not inDate then inc(Result);
      End;
    End;
    tmpTarih := IncDay(tmpTarih,1);
  End;
End;

Kullanımı ise şöyle ;

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage
  (
    InttoStr
      (
        Hesapla(cxDateEdit1.Date,cxDateEdit2.Date,
        [ StrToDate('01.01.2018'),
          StrToDate('23.04.2018'),
          StrToDate('01.05.2018'),
          StrToDate('19.05.2018'),
          StrToDate('15.07.2018'),
          StrToDate('30.08.2018'),
          StrToDate('29.10.2018'),
          StrToDate('14.06.2018'),   //ramazan bayramı arefe
          StrToDate('15.06.2018'),   //ramazan bayramı 1
          StrToDate('16.06.2018'),   //ramazan bayramı 2
          StrToDate('17.06.2018'),   //ramazan bayramı 3
          StrToDate('20.08.2018'),   //kurban bayramı arefe
          StrToDate('21.08.2018'),   //kurban bayramı 1
          StrToDate('22.08.2018'),   //kurban bayramı 2
          StrToDate('23.08.2018'),   //kurban bayramı 3
          StrToDate('24.08.2018')   //kurban bayramı 4
      ])

            )
             );

end;
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: Tarih tatil mi?

Mesaj gönderen ertank »

Merhaba,

Kod okunabilirliği ve anlaşılabilirliği açısından tek fonksiyon yerine iki fonksiyona bölünerek hazırlandı. Örnek kod aşağıdaki gibidir:

Kod: Tümünü seç

uses
  DateUtils;

function AmongDates(const ADate: TDateTime; const Dates: Array of TDateTime): Boolean;
var
  I: Integer;
begin
  if Length(Dates) = 0 then
  begin
    Result := False;
    Exit;
  end;

  for I := Low(Dates) to High(Dates) do
  begin
    if Dates[I] = ADate then
    begin
      Result := True;
      Exit;
    end;
  end;

  Result := False;
end;

function Hesapla(const Start, Finish: TDateTime; const Dates: Array of TDateTime): Boolean;
var
  I: Integer;
  TempDate: TDateTime;
begin
  if Length(Dates) = 0 then
  begin
    Result := False;
    Exit;
  end;

  if Start > Finish then
  begin
    ShowMessage('Başlangıç tarihi bitiş tarihinden büyük olamaz');
    Result := False;
    Exit;
  end;

  for I := 0 to DaysBetween(Start, Finish) do
  begin
    TempDate := IncDay(Start, I);

    if DayOfTheWeek(TempDate) in [6,7] then
    begin
      Result := True;
      Exit;
    end;

    Result := AmongDates(TempDate, Dates);
    if Result then Exit;
  end;

  Result := False;
end;
Kullanımı ise aşağıdaki gibidir:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  Dates: Array of TDateTime;
begin
  SetLength(Dates, 16);
  Dates[0] := EncodeDate(2018, 1, 1);
  Dates[0] := EncodeDate(2018, 4, 23);
  Dates[0] := EncodeDate(2018, 5, 1);
  Dates[0] := EncodeDate(2018, 5, 19);
  Dates[0] := EncodeDate(2018, 7, 15);
  Dates[0] := EncodeDate(2018, 8, 30);
  Dates[0] := EncodeDate(2018, 10, 29);
  Dates[0] := EncodeDate(2018, 6, 14);   //ramazan bayramı arefe
  Dates[0] := EncodeDate(2018, 6, 15);   //ramazan bayramı 1
  Dates[0] := EncodeDate(2018, 6, 16);   //ramazan bayramı 2
  Dates[0] := EncodeDate(2018, 6, 17);   //ramazan bayramı 3
  Dates[0] := EncodeDate(2018, 8, 20);   //kurban bayramı arefe
  Dates[0] := EncodeDate(2018, 8, 21);   //kurban bayramı 1
  Dates[0] := EncodeDate(2018, 8, 22);   //kurban bayramı 2
  Dates[0] := EncodeDate(2018, 8, 23);   //kurban bayramı 3
  Dates[0] := EncodeDate(2018, 8, 24);   //kurban bayramı 4

  ShowMessage(BoolToStr(Hesapla(EncodeDate(2018, 4, 2), EncodeDate(2018, 6, 30), Dates), True));  // True 
  ShowMessage(BoolToStr(Hesapla(EncodeDate(2018, 4, 1), EncodeDate(2018, 4, 3), Dates), True));  // True
  ShowMessage(BoolToStr(Hesapla(EncodeDate(2018, 4, 2), EncodeDate(2018, 4, 3), Dates), True));  // False
end;
Kodlar Delphi 7'de de çalışacak şekilde hazırlanmıştır. Yeni Delphi sürümlerinde birkaç satır daha kısa yazmak mümkündür.
underwater
Üye
Mesajlar: 86
Kayıt: 27 May 2014 04:27

Re: Tarih tatil mi?

Mesaj gönderen underwater »

Ertan kardeşim hızlı cevabın için teşekkür ederim öncelikle.
Dün yoğunluktan mesaj yazamadım.
Verdiğin fonksiyon işime yaradı. Senin fonksiyon 2 tarih aralığında tatil var mı? bunu hesaplıyor.

Ben tek bir tarihi kontrol edeceğim için aşağıdaki şekilde sadeleştirdim :

Kod: Tümünü seç

function Tatilmi(const ADate: TDateTime): Boolean;
var
  I: Integer;
  Dates: Array of TDateTime;
begin
  SetLength(Dates, 16);
  Dates[0] := EncodeDate(2018, 1, 1);
  Dates[1] := EncodeDate(2018, 4, 23);
  Dates[2] := EncodeDate(2018, 5, 1);
  Dates[3] := EncodeDate(2018, 5, 19);
  Dates[4] := EncodeDate(2018, 7, 15);
  Dates[5] := EncodeDate(2018, 8, 30);
  Dates[6] := EncodeDate(2018, 10, 29);
  Dates[7] := EncodeDate(2018, 6, 14);   //ramazan bayramı arefe
  Dates[8] := EncodeDate(2018, 6, 15);   //ramazan bayramı 1
  Dates[9] := EncodeDate(2018, 6, 16);   //ramazan bayramı 2
  Dates[10] := EncodeDate(2018, 6, 17);   //ramazan bayramı 3
  Dates[11] := EncodeDate(2018, 8, 20);   //kurban bayramı arefe
  Dates[12] := EncodeDate(2018, 8, 21);   //kurban bayramı 1
  Dates[13] := EncodeDate(2018, 8, 22);   //kurban bayramı 2
  Dates[14] := EncodeDate(2018, 8, 23);   //kurban bayramı 3
  Dates[15] := EncodeDate(2018, 8, 24);   //kurban bayramı 4

  if Length(Dates) = 0 then
  begin
    Result := False;
    Exit;
  end;

  if DayOfTheWeek(ADate) in [7] then
    begin
      Result := True;
      Exit;
    end;

  for I := Low(Dates) to High(Dates) do
  begin
    if Dates[I] = ADate then
    begin
      Result := True;
      Exit;
    end;
  end;

  Result := False;
end;
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Tarih tatil mi?

Mesaj gönderen freeman35 »

StringList.Add('14.06.2018=ramazan bayramı arefe');
if StringList.Inexof('14.06.2018')>0then tatil else mesai
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Cevapla