التعامل مع التاريخ في الدلفي - الفرق بين تاريخين يوم شهر سنة
اليوم سنرى درس مهم جدا و هو استعمال الدوال الخاصة بالتاريخ في الدلفي هذه المرة سنرى الفرق بين تاريخين
بصيغة متتالية يوم شهر سنة اي كم يوجد بين تاريخين من يوم شهر سنة و هذه الدوال مهمة جدا حيث تساعد مثلا على حساب العمر بين تاريخين او حساب عدد ايام العطل في تسيير الموظفين طبعا نستطيع ان نضع هذا في قواعد البيانات لنعود اليها كمعطيات
خاصة بالموظفين مثلا
المهم طبعا نستعمل الدلفي نفتح مشروع جديد و نضع المكونات الخاصة بــ Dynamique Skin Form
و نغير الإعدادات طبعا الخاصة بالخط ووضعية المكونات على الفورم كما في الصورة
(spSkinDateEdit (2
(3) spSkinEdit
spSkinButton
الأن وبعد ما قمنا بوضع المكونات التي نحتاجها في التطبيق نبدأ في برمجتها اولا ندهب الى تعريف المتغيرات في البداية و نعرف
حيث تستعمل لتعريف كل دوال التواريخ في الدلفي و تعتبر مهمة جدا و الا سيظهر خطاء في البرنامج DateUtils,
اولا يجب علينا ان نعرف المتغيرات الآتية تحت implementation
type
TJJMMAA = record
JJ,
MM,
AA : word;
end;
ثم نضع الدالة الخاصة بالتاريخ الآتية
function DatetoJJMMAA(const CDate1, CDate2 : TDate) : TJJMMAA;
var
Date1,
Date2,
WDate : TDate;
begin
if CompareDate(CDate1, CDate2) > 0 then begin
Date1 := CDate2;
Date2 := CDate1;
end
else
begin
Date1 := CDate1;
Date2 := CDate2;
end;
with result do begin
AA := 0;
repeat
inc(AA);
WDate := Date1;
Date1 := incyear(Date1);
until comparedate(Date1, Date2) > 0;
dec(AA);
Date1 := WDate;
MM := 0;
repeat
inc(MM);
WDate := Date1;
Date1 := incmonth(Date1);
until comparedate(Date1, Date2) > 0;
dec(MM);
Date1 := WDate;
JJ := 0;
repeat
inc(JJ);
Date1 := incday(Date1);
until comparedate(Date1, Date2) > 0;
dec(JJ);
end;
end;
لقد اسمينا الدالة الفرق بين التواريخ من نوع يوم شهر سنة و بالتالي نحتاج الى تاريخين ثم نقوم بعملية مقرنة فإذا كان التاريخ الثاني اكبر من التاريخ الأول فاننا سنقلب النتيجة مهما كانت الوضعية
ثم نقوم بوضع حلقة تكرارية تبدا بعداد السنوات تضيف له في كل مرة سنة
وذلك حين انتهاء عدد الشهور 12 و هكذا حتى نحسب الفرق في الأشهر ثم في الأيام
الأن نذهب الى الزر الخاص بحساب الفرق و نضع الأكواد الخاصة بالحساب
procedure TForm1.spSkinButton1Click(Sender: TObject);
var
texte0 : string;
texte1 : string;
texte2 : string;
Delta0 : TJJMMAA;
begin
Delta0 := DatetoJJMMAA(spSkinDateEdit1.date, spSkinDateEdit2.date);
texte0 := '';
with Delta0 do begin
case JJ of
0 : texte0 := '0';
1 : texte0 := '1 ';
else
texte0 := format('%2d ', [JJ]);
end;
if MM >= 0 then
if texte1 = '' then
texte1 := format('%2d ', [MM])
else
texte1 := format('%2d ', [MM]) + texte1;
if (AA > 0) and
(Texte2 <> '0') then
Texte2 := '' + Texte2;
case AA of
0 :texte2 := '0' ;
1 : texte2 := '1' + Texte2;
else
texte2 := format('%2d ', [AA]) + Texte2;
end;
spSkinEdit1.Text := texte0;
spSkinEdit2.Text := texte1;
spSkinEdit3.Text := texte2;
end;
end;
F9 بعد ذلك نقوم بتنفيذ البرنامج عن طريق
سنجرب تاريخين و الصورة خير دليل على ظهور الفرق بينهما
الأن رغم تغييرنا للتاريخين من حيث القيمة فإن البرنامج يعمل بكفاءة
نتمنى ان يكون الشرح وافيا تقبلوا تحياتنا و الى درس قادم ان شاء الله
قد يعجبك ايضا