12-05-2008, 01:09 AM
merouane كتب :السلام عليكم
قبل أن تحكم جرب جميع الحالات الممكنة، ثم راجع القواعد التي ذكرتها وقارنها مع الكود
سأحاول أن أشرح ما كتبته:
لدينا: وجبة الغذاء تبدأ من الساعة 11:01 وتنتهي على الساعة 14:00
أي إذا كانت بداية المهمة أصغر تماما (إذا جاء قبل) من وقت انتهاء فترة وجبة العذاء يكون له الحق في وجبة
و إذا كانت نهاية المهمة أكبر أو تساوي (إذا وجد بعد) وقت بداية فترة وجبة الغذاء يكون له الحق في وجبة
لدينا: وجبة العشاء تبدأ من الساعة 18:00 وتنتهي على الساعة 21:00
أي إذا كانت بداية المهمة أصغر تماما (إذا جاء قبل) من وقت انتهاء فترة وجبة العشاء يكون له الحق في وجبة
و إذا كانت نهاية المهمة أكبر أو تساوي (إذا وجد بعد) وقت بداية فترة وجبة العشاء يكون له الحق في وجبة
لدينا: المبيت يبدأ من الساعة 00:00 وينتهي على الساعة 05:00
أي إذا كانت بداية المهمة أصغر تماما (إذا جاء قبل) من وقت انتهاء فترة المبيت يكون له الحق في المبيت
و إذا كانت نهاية المهمة أكبر أو تساوي (إذا وجد بعد) وقت بداية فترة المبيت يكون له الحق المبيت
وهناك أمر آخر عليك أن تدركه وهو أنك عندما تقوم بالآتي : ('t1:=strtotime('11:00:00
النتيجة تكون وقت يوم 30/12/1899 (البداية التي يحسب بها النظام) لأن الاوقات تحول إلى أرقام (Double) أي النتيجة تكون مختلفة عن الوقت 11:00 ليوم 09/07/2008
ملاحظة : لتتأكد قم بالأتي :
كود :uses . . . . ,DateUtils ; . . . . . . procedure TForm1.Button1Click(Sender: TObject); var t1:TDatetime; V: double; S: string; AYear,AMonth,Aday: word; begin t1:=strtotime('11:00:00'); label1.Caption := datetostr(t1); V:=t1; Str(V:0:8, s); label2.caption:=S; DecodeDate(DateTimePicker1.Date,AYear,AMonth,Aday) ; t1:=EncodeDateTime(AYear,AMonth,Aday,11,00,00,00) ; label3.Caption := datetostr(t1); V:=t1; Str(V:0:8, s); label4.caption:=S; end;
وعليه t1 دائما أصغر
الحل هو العمل مع DecodeDate و EncodeDateTime أنظر السورس ثم انظر Help الخاص بالدلفي
هذه الطريقة في نظري أحسن و أثبت
كود :Uses . . . . DateUtils ; . . . . . . . . . . . procedure TForm1.Button1Click(Sender: Tobject) ; var t1,t2: TdateTime ; i,j: integer ; AYear,AMonth,ADay: word ; begin [color=Blue]// عدد الأيام[/color] i:=DaysBetween(DateTimePicker1.date,DateTimePicker2.date) ; [color=Blue]// نتأكد من أنها نفس اليوم بالنسبة ليوم الوقت [/color] DateTimePicker3.Date:=DateTimePicker1.Date; DateTimePicker4.Date:=DateTimePicker2.Date; [color=Blue]// بداية حساب عدد وجبات الغذاء [/color] DecodeDate(DateTimePicker1.Date,AYear,AMonth,Aday) ; t1:=EncodeDateTime(AYear,AMonth,Aday,14,00,00,00) ; DecodeDate(DateTimePicker2.Date,AYear,AMonth,Aday) ; t2:=EncodeDateTime(AYear,AMonth,Aday, 11,01,00,0) ; j:=0 ; if (DateTimePicker3.Time<t1) then j:=j+1 ; if DateTimePicker4.Time>=t2 then j:=j+1 ; dbedit5.text:=inttostr(i-1+j) ; [color=Blue]// بداية حساب عدد وجبات العشاء[/color] DecodeDate(DateTimePicker1.Date,AYear,AMonth,Aday) ; t1:=EncodeDateTime(AYear,AMonth,Aday , 21,00,00,00) ; DecodeDate(DateTimePicker2.Date,AYear,AMonth,Aday) ; t2:=EncodeDateTime(AYear,AMonth,Aday,18,00,00,00) ; j:=0; if (DateTimePicker3.Time<t1) then j:=j+1; if DateTimePicker4.Time>=t2 then j:=j+1; dbedit6.text:=inttostr(i-1+j) ; [color=Blue]// بداية حساب عدد مرات المبيت[/color] DecodeDate(DateTimePicker1.Date,AYear,AMonth,Aday) ; t1:=EncodeDateTime(AYear,AMonth,Aday,05,00,00,00) ; DecodeDate(DateTimePicker2.Date,AYear,AMonth,Aday) ; t2:=EncodeDateTime(AYear,AMonth,Aday, 00,00,00,00) ; j:=0 ; if (DateTimePicker3.Time<t1) then j:=j+1 ; if (DateTimePicker4.Time>t2) then j:=j+1 ; dbedit7.text:=inttostr(i-1+j) ; end ;
قد اكون مخطئا .. لكن ما يهمني ان النتائج تطابقت مع ما ذكرته سابقا
أي شيء آخر فيعود لك و كيف وصفته
بالتوفيق و ننتظر النتيجة
شكرًا جزيلاً
لكن هنا خطأ يظهر عندي
علما انني استعمل في مكان DateTimePicker الستعمل DBEdit
وبدلاً من السطر
i:=DaysBetween(DateTimePicker1.date,DateTimePicker2.date) ;
استعمل
i:=DaysBetween(table3.fieldByName('DT_DEP1').asdateTime,table3.fieldByName('DT_ARV1').asdateTime) ;
عندما احاول التنفيذ يعطيني هذا التحذير
[Erreur]Unit1.pas(773):Identificateur non déclaré:'table3'
**** اظهار اين يكمن الخطأ

