Delphi Can

Orjinalini görmek için tıklayınız: Personel Yıllık İzin Hakediş Hesaplama Hakkında
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Hayırlı akşamlar aşağıdaki kodlar ile personel yıllık izin hakedişini hesaplatabiliyorum. Bunun daha kolay ve kısa bir yolu varmı acaba ?

edit1.text = işe giriş tarihi

procedure TForm1.Button1Click(Sender: TObject);
var
 tarih, tarih1,tarih2  : TDate;
 GYil, GAy, GGun       : Word;
 GYil1, GAy1, GGun1    : Word;
 GYil2, GAy2, GGun2    : Word;
begin
 tarih1  :=  Now;
 tarih2  :=  StrToDate(edit1.text);
 DecodeDate(tarih1, GYil1, GAy1, GGun1);
 DecodeDate(tarih2, GYil2, GAy2, GGun2);
 kidem       :=  GYil1 - GYil2;
 sedit4.text :=  inttostr(kidem);
 case kidem of
   1..5    : ilkkademe;
   6..15   : ikincikademe;
   16..90  : ücüncükademe;
 end;
end;

procedure TForm1.ilkkademe;
var
 tarih                       : TDate;
 GYilb,GYila, GAya, GGuna    : Word;
begin
 if (kidem >= 1) and (kidem <= 5) then
   begin
     for i := 1 to kidem do
     begin
       Memo1.Lines.Add('14');
       tarih  :=  StrToDate(edit1.text);
       DecodeDate(tarih, GYila, GAya, GGuna);
       GYilb  :=  GYila + i;
       Memo1.Lines.Add(DateToStr(EncodeDate (GYilb, GAya, GGuna)));
     end;
   end;
end;

procedure TForm1.ikincikademe;
var
 kad1 ,kad2,sayi             : Integer;
 tarih                       : TDate;
 GYilb,GYila, GAya, GGuna    : Word;
begin
 if (kidem >= 6) and (kidem <= 15) then
   begin
     for i := 6 to kidem do
     begin
       Memo1.Lines.Add('20');
       tarih  :=  StrToDate(edit1.text);
       DecodeDate(tarih, GYila, GAya, GGuna);
       GYilb  :=  GYila + i;
       Memo1.Lines.Add(DateToStr(EncodeDate (GYilb, GAya, GGuna)));
     end;
     sayi  :=  memo1.Lines.Count;
     kad1  :=  Trunc(sayi/2);
     kad2 :=  kidem - kad1;
     for k := 1 to kad2 do
     begin
       Memo1.Lines.Add('14');
       tarih  :=  StrToDate(edit1.text);
       DecodeDate(tarih, GYila, GAya, GGuna);
       GYilb  :=  GYila + k;
       Memo1.Lines.Add(DateToStr(EncodeDate (GYilb, GAya, GGuna)));
     end;
   end;
end;

procedure TForm1.ücüncükademe;
var
 kad1 ,kad2,kad3,kad4,sayi,sayi1 : Integer;
 tarih                           : TDate;
 GYilb,GYila, GAya, GGuna        : Word;
begin
 if (kidem >= 16) and (kidem <= 90) then
   begin
     for i := 16 to kidem do
     begin
       Memo1.Lines.Add('26');
       tarih  :=  StrToDate(edit1.text);
       DecodeDate(tarih, GYila, GAya, GGuna);
       GYilb  :=  GYila + i;
       Memo1.Lines.Add(DateToStr(EncodeDate (GYilb, GAya, GGuna)));
     end;
     sayi  :=  memo1.Lines.Count;
     kad1  :=  Trunc(sayi/2);
     kad2 :=  kidem - kad1;

     for k := 6 to kad2 do
     begin
       Memo1.Lines.Add('20');
       tarih  :=  StrToDate(edit1.text);
       DecodeDate(tarih, GYila, GAya, GGuna);
       GYilb  :=  GYila + k;
       Memo1.Lines.Add(DateToStr(EncodeDate (GYilb, GAya, GGuna)));
     end;
     sayi1  :=  memo1.Lines.Count;
     kad4  :=  Trunc(sayi1/2);
     kad3  :=  kidem - kad4;
     for j := 1 to kad3 do
     begin
       Memo1.Lines.Add('14');
       tarih  :=  StrToDate(edit1.text);
       DecodeDate(tarih, GYila, GAya, GGuna);
       GYilb  :=  GYila + j;
       Memo1.Lines.Add(DateToStr(EncodeDate (GYilb, GAya, GGuna)));
     end;
   end;
end;
@bkantur 
Eğer bu yaptığın bir ödev ise çok sorun değil fakat bir şirkette çalışacak ise bir personel uzmanından destek almanı öneririm
çünkü parametre aralıkların ve kurallar yanlış en basitinden 16 yaş altı ve 50 yaş üstü kişiler izin hakkı farklıdır

Gelelim kodu daha kısa yazma konusuna
1. Her procedure içinde kidemi tekrar kontrol etmene gerek yok zaten şart oluştu ise bu procedure geliyorsun
2. her procedure edit alanlarından gelen değerleri her seferinde parçalamak yerine procedure gitmeden parçala ya parametre kullan yada ortak değişken kullan
3. her procedure içinde kullandığın ortak yapıyı farklı bir yerde ortak procedure olarak yap

daha başka şeylerde yapılabilir fakat önemli olan senin hangi kurallarla hangi sonuca ulaşmak istediğin önemli
Kolay gelsin
Bir sınıf veya bir record tanımla. Parametreleri nesneye işlerken (Setterler aracılığıyla) kurallara uygunluğunu kontrol et. Bu tarz bir nesne yapısı kurduktan sonra sonuçları okurken çoğu değer zaten sana hesaplanmış olarak geri dönecektir.