عند تطوير التطبيقات، غالبًا ما يكون من الضروري الحصول على وقت النظام الحالي. على الرغم من أن عام 2000 قد أصبح وراءنا، إلا أننا لا نزال بحاجة إلى توخي الحذر بشأن كيفية تعاملنا مع التوقيت في تطبيقاتنا المطورة حديثًا.
تقدم الصفحة 89 من "التكامل - دلفي 4.0 المهارات العملية" (المشار إليه فيما يلي باسم "الكتاب") طريقتين على وجه التحديد للحصول على وقت النظام الحالي، ولكن كلتا الطريقتين بها عيوب أو أخطاء، والتي سيتم مناقشتها أدناه.
الطريقة الأولى في هذا الكتاب هي استخدام الدالة Time() للحصول على وقت النظام الحالي، وتكون نتيجة الإرجاع متغيرًا من نوع بنية TDateTime. على سبيل المثال:
الإجراء TForm1.Button2Click(Sender: TObject);
فار
التاريخ والوقت: TDateTime؛
يبدأ
DateTime:=Time();
التسمية التوضيحية:=DateToStr(DateTime)+' '+TimeToStr(DateTime);
نهاية؛
ولكن بغض النظر عن التاريخ، فإن النتيجة هي 30-12-99 xx:xx:xx ومن الواضح أن التاريخ خاطئ. من خلال تحليل مساعدة دلفي، يتم استخدام Time() لإرجاع "الوقت - الساعات والدقائق والثواني" الصحيح، أي TimeToStr (DateTime)، ولا ينبغي استخدامه لإرجاع "التاريخ". في الواقع، وظيفة النظام الوحيدة المستخدمة لإرجاع التواريخ هي التاريخ.
إذن ما الذي يمكنه إرجاع "الساعة، الدقيقة، الثانية" الصحيحة و"السنة، الشهر، اليوم" الصحيحة؟ يمكنك استخدام وظيفة Now، على سبيل المثال:
الإجراء TForm1.Button1Click(Sender: TObject);
فار
وقتي: TDateTime؛
يبدأ
وقتي:=الآن؛
تسمية توضيحية:=DateToStr(mytime)+' '+TimeToStr(mytime);
// أو استخدم التسمية التوضيحية مباشرة := DateTimeToStr(Now);
نهاية؛
يحتوي تنسيق التاريخ الذي يتم إرجاعه بواسطة Now على رقمين فقط للسنة، أي أن عام 2000 يتم عرضه على أنه 00، وهو ما يبدو غير مرضٍ، بالإضافة إلى ذلك، يمكن لكل من Now وTime الحصول على وقت بدقة تصل إلى ثوانٍ فقط وقت دقيق على مستوى المللي ثانية، يمكنك استخدام وظيفة API GetSystemTime، ويتم تعريف نوع TSystemTime المقابل لها على النحو التالي:
TSystemTime = السجل
السنة: كلمة؛
wMonth: كلمة؛
wDayOfWeek: كلمة؛
اليوم: كلمة؛
ساعة: كلمة؛
دقيقة: كلمة؛
الثاني: الكلمة؛
ميلي ثانية: كلمة؛
نهاية؛
من الواضح أنه يمكن أيضًا استخدام بنيتها بشكل ملائم في منطق البرنامج لتكوين قيم زمنية مختلفة، لذا فإن استخدام الوظيفة GetSystemTime له مزايا رائعة. ومع ذلك، فإن استخدام هذه الوظيفة في الكتاب خاطئ من خلال استشارة تعليمات Windows SDK، يمكننا أن نرى أن النموذج الأولي لهذه الوظيفة هو:
VOID GetSystemTime(LPSYSTEMTIME lpst)، يحصل مؤشر المعلمة lpst على وقت النظام، لذلك يمكن تنفيذه كمقطع البرنامج التالي:
الإجراء TForm1.Button3Click(Sender: TObject);
فار
سيستيمي: تسيستيمي؛
يبدأ
GetSystemTime(SysTime);
Caption:=IntToStr(SysTime.wYear)+' '+IntToStr(SysTime.wMonth);
//إذا كان SysTime.wYear>2000 إذن
//...استخدم القيم الزمنية المختلفة التي تم الحصول عليها في منطق البرنامج
نهاية؛
بناءً على المناقشة أعلاه، يعد الحصول على وقت النظام الحالي باستخدام الوظيفة GetSystemTime أكثر ملاءمة ومرونة.