عند استخدام دلفي لتصميم قاعدة البيانات، فمن المحتم أن تتضمن إدخال حقول التاريخ. ومع ذلك، بالمقارنة مع الإصدار الصيني Access 97 من Microsoft، فإن طرق العرض والإدخال لحقول التاريخ التي توفرها دلفي نفسها ليست مناسبة لعادات الشعب الصيني. لذلك، تم اقتراح العديد من الحلول لمعالجة حقول التاريخ، ولكن نتائج المعالجة ليست موحدة في العرض والإدخال، على سبيل المثال، يمكن تحقيق تنسيق "yyyy year mm Month dd day" عند العرض، لكنه لا يزال بحاجة. ليتم إدخالها عند الإدخال استخدم "yyyy-mm-dd" وفقًا للعادات الأجنبية يعد استخدام TdateTimePicker لتحديد الإدخال أمرًا مزعجًا دائمًا ؛ تحتاج بعض الطرق أيضًا إلى تعديل بعض خصائص الإعداد في النظام ، لذلك تحتاج خصائص النظام إلى التعديل عند استخدام برامج التحكم التابعة لجهات خارجية ؛ يتم تعبئتها وإصدارها. علاوة على ذلك، لا تتم معالجة تنسيقات التاريخ الشائعة الاستخدام مثل "1999" و"نوفمبر 1999" وفقًا لذلك. هنا، بناءً على ممارستي الخاصة، أستخدم مجموعة أحداث TField's OnGetText وOnSetText لتحقيق توحيد العرض وإدخال حقول التاريخ، ويمكنني التعامل مع التواريخ المشتركة مثل "1999" و"نوفمبر 1999" ويتم تنفيذ جميع إدخالات النماذج باستخدام الأحداث التي توفرها دلفي، وليست هناك حاجة لتعديل أي إعدادات للنظام. بعد التوسيع المقابل، يمكن استخدامه أيضًا لعرض الوقت وإدخاله، مثل "hh point mm min" وما إلى ذلك. وفي الوقت نفسه، نظرًا لأن أحداث TField يتم التحكم فيها بشكل مباشر، سواء باستخدام TDBGrid أو TDBEdit، فيمكن معالجتها بطريقة موحدة دون الحاجة إلى النظر فيها بشكل منفصل. يمكن أيضًا تطبيق نهج مماثل على إدخال التاريخ في التطبيقات غير المتعلقة بقواعد البيانات.
1 الفكرة الأساسية
استخدم خاصية EditMask الخاصة بـ TField لتكون بمثابة قناع العرض والإدخال. تتم معالجة عرض حقل التاريخ في حدث OnGetText الخاص بـ TField، وتتم معالجة حكم صحة قيمة الإدخال في حدث OnSetText. لإعادة استخدام التعليمات البرمجية، ضع الإجراءات والوظائف التي يتم استدعاؤها بواسطة معالجات الأحداث OnGetText وOnSetText في وحدة منفصلة.
2 كود التنفيذ المحدد
{وحدة العرض والحكم}
وحدة DBDateEditMaskTrans؛
واجهة
الاستخدامات
ويندوز، سيسوتيلس، عناصر التحكم، النماذج، ديسيبل؛
{يتم استدعاء عملية عرض حقل التاريخ في حدث OnGetText}
PROcedure DateFieldGetText(Sender: TField; var Text: String);
{وظيفة الحكم على إدخال حقل التاريخ، والتي يتم استدعاؤها في حدث OnSetText}
وظيفة DateFieldSetText(Sender: TField; const Text: String):Boolean;
تطبيق
الإجراء DateFieldGetText(Sender: TField; var Text: String);
فار
dDate:TDate;
سنة، شهر، يوم: كلمة؛
aryTestYMD:صفيف [1..2] من Char؛{صفيف مؤقت لقناع إدخال الاختبار}
iYMD: عدد صحيح؛
يبدأ
dDate:=Sender.AsDateTime;
DecodeDate(dDate,wYear,wMonth,wDay);
{اختبر التنسيق الموجود في قناع الإدخال.}
aryTestYMD:='year';
إذا كان StrScan(PChar(Sender.EditMask)،
aryTestYMD[1])< >لا شيء إذن
iYMD:=1;
aryTestYMD:='month';
إذا كان StrScan(PChar(Sender.EditMask)،
aryTestYMD[1])< >لا شيء إذن
iYMD:=2;
aryTestYMD:='Day';
إذا كان StrScan(PChar(Sender.EditMask)،
aryTestYMD[1])< >لا شيء إذن
iYMD:=3;
حالة iYMD من
1:{قناع الإدخال بتنسيق "yyyy year".}
Text:=IntToStr(wYear)+'year';
2: {قناع الإدخال بتنسيق "yyyy year mm Month".}
Text:=IntToStr(wYear)+'year'+IntToStr(wMonth)+'month';
3: {قناع الإدخال بتنسيق "yyyy year mm Month dd day".}
Text:=IntToStr(wYear)+'year'+IntToStr(wMonth)+'month' +IntToStr(wDay)+'day';
آخر {الافتراضي هو: التنسيق "yyyy year mm Month dd day".}
Text:=IntToStr(wYear)+'year'+IntToStr(wMonth)+'month' +IntToStr(wDay)+'day';
نهاية؛
نهاية؛
وظيفة DateFieldSetText(Sender: TField; const Text: String):Boolean;
فار
dDate:TDate;
سنة، شهر، يوم: سلسلة؛
aryTestYMD:Array [1..2] من Char؛
iYMD: عدد صحيح؛
يبدأ
{احصل على التاريخ الذي أدخله المستخدم}
sYear:=Copy(Text,1,4);
sMonth:=Copy(Text,7,2);
SDay:=نسخ(نص,11,2);
{اختبر التنسيق الموجود في قناع الإدخال.}
aryTestYMD:='year';
إذا كان StrScan(PChar(Sender.EditMask)،
aryTestYMD[1])< >لا شيء إذن
iYMD:=1;
aryTestYMD:='month';
إذا كان StrScan(PChar(Sender.EditMask)،
aryTestYMD[1])< >لا شيء إذن
iYMD:=2;
aryTestYMD:='Day';
إذا كان StrScan(PChar(Sender.EditMask)،
aryTestYMD[1])< >لا شيء إذن
iYMD:=3;
{استخدم حاول...إلا لتحويل تاريخ الإدخال}
يحاول
يبدأ
حالة iYMD من
1: {قناع الإدخال بتنسيق "yyyy year".}
يبدأ
dDate:=StrToDate(sYear+'-01-01') ;{تنسيق التاريخ الافتراضي لنظام التشغيل Windows الصيني هو: yyyy-mm-dd.
Sender.AsDateTime:=dDate;
نهاية؛
2: {قناع الإدخال بتنسيق "yyyy year mm Month".}
يبدأ
dDate:=StrToDate(sYear+'-'+sMonth+'-01');
Sender.AsDateTime:=dDate;
نهاية؛
3: {قناع الإدخال بتنسيق "yyyy year mm Month dd day".}
يبدأ
dDate:=StrToDate(sYear+'-'+sMonth+'-'+sDay);
Sender.AsDateTime:=dDate;
نهاية؛
آخر {الافتراضي هو: التنسيق "yyyy year mm Month dd day".}
يبدأ
dDate:=StrToDate(sYear+'-'+sMonth+'-'+sDay);
Sender.AsDateTime:=dDate;
نهاية؛
نهاية؛
DateFieldSetText:=True;
نهاية؛
يستثني
{خطأ في تحويل التاريخ}
يبدأ
application.MessageBox(PChar(Text+'ليس تاريخًا صالحًا!'), 'Error',mb_Ok+mb_IconError);
DateFieldSetText:=False;
نهاية؛
نهاية؛
نهاية؛
نهاية.
{وحدة النافذة الرئيسية}
الوحدة الرئيسية؛
واجهة
الاستخدامات
…{حذف محتوى آخر}
الإجراء Table1BirthdayGetText(Sender: TField; var Text: String;DisplayText: Boolean);
الإجراء Table1BirthdaySetText(Sender: TField; const Text: String);
خاص
{تصريحات خاصة}
عام
{التصريحات العامة}
……{طفيف}
تطبيق
{تضمين الوحدات المخصصة}
يستخدم DBDateEditMaskTrans؛
{$R *.DFM}
...{تم حذف العمليات الأخرى}
الإجراء TForm1.FormActivate(Sender: TObject);
{قم بتعيين قناع الإدخال لحقل التاريخ، والذي يمكن وضعه في تعريف حقل TField. }
يبدأ
Table1.FieldByName('Birthday').EditMask:= '99-99-99;1;_';
نهاية؛
الإجراء TForm1.Table1BirthdayGetText(Sender: TField; var Text: String;DisplayText: Boolean);
يبدأ
DateFieldGetText(Sender,Text);
نهاية؛
الإجراء TForm1.Table1BirthdaySetText(Sender: TField; const Text: String);
يبدأ
إذا كان DateFieldSetText(Sender,Text)=False إذن
إحباط {فشل التحويل، التاريخ غير قانوني}
نهاية؛
نهاية.