เมื่อใช้ Delphi สำหรับการออกแบบฐานข้อมูล จะต้องป้อนข้อมูลในฟิลด์วันที่อย่างหลีกเลี่ยงไม่ได้ อย่างไรก็ตาม เมื่อเปรียบเทียบกับ Access 97 เวอร์ชันภาษาจีนของ Microsoft แล้ว การแสดงและการป้อนข้อมูลของฟิลด์วันที่ที่ Delphi มอบให้นั้นไม่เหมาะกับนิสัยของชาวจีน ดังนั้นจึงมีการเสนอวิธีแก้ปัญหาหลายอย่างสำหรับการประมวลผลฟิลด์วันที่ แต่ผลการประมวลผลไม่เหมือนกันในการแสดงผลและการป้อนข้อมูล ตัวอย่างเช่น รูปแบบของ "ปปปป เดือน วว วัน" สามารถรับรู้ได้เมื่อแสดง แต่ก็ยังต้องการ ที่จะป้อนข้อมูลเมื่อป้อนข้อมูล ใช้ "yyyy-mm-dd" ตามธรรมเนียมของต่างประเทศ อินพุตในแบบฟอร์ม เป็นเรื่องยากเสมอที่จะใช้ TdateTimePicker สำหรับอินพุตที่เลือก นอกจากนี้ วิธีการบางอย่างยังจำเป็นต้องแก้ไขคุณสมบัติการตั้งค่าบางอย่างของระบบ ดังนั้นจึงต้องปรับคุณสมบัติของระบบเมื่อเผยแพร่ซอฟต์แวร์โดยใช้การควบคุมของบุคคลที่สามด้วย ถูกบรรจุและปล่อย นอกจากนี้ รูปแบบวันที่ที่ใช้กันทั่วไป เช่น "1999" และ "พฤศจิกายน 1999" จะไม่ถูกประมวลผลตามนั้น จากการปฏิบัติของฉันเอง ฉันใช้การผสมผสานระหว่างเหตุการณ์ OnGetText และ OnSetText ของ TField เพื่อให้เกิดการรวมการแสดงผลและการป้อนข้อมูลของฟิลด์วันที่ และสามารถจัดการวันที่ทั่วไปของเรา เช่น "1999" และ "พฤศจิกายน 1999" การแสดงผล และการป้อนแบบฟอร์มทั้งหมดจะถูกนำมาใช้โดยใช้เหตุการณ์ที่ Delphi จัดให้ และไม่จำเป็นต้องแก้ไขการตั้งค่าระบบใดๆ หลังจากการขยายที่สอดคล้องกันแล้ว ยังใช้สำหรับการแสดงเวลาและการป้อนข้อมูล เช่น "hh จุด mm นาที" เป็นต้น ในเวลาเดียวกัน เนื่องจากเหตุการณ์ของ TField ได้รับการควบคุมโดยตรง ไม่ว่าจะใช้ TDBGrid หรือ TDBEdit ก็สามารถประมวลผลในลักษณะที่เป็นหนึ่งเดียวโดยไม่ต้องพิจารณาแยกกัน วิธีการที่คล้ายกันนี้สามารถนำไปใช้กับการป้อนข้อมูลวันที่ในแอปพลิเคชันที่ไม่ใช่ฐานข้อมูลได้
1 แนวคิดพื้นฐาน
ใช้คุณสมบัติ EditMask ของ TField เพื่อทำหน้าที่เป็นทั้งรูปแบบการแสดงผลและอินพุต การแสดงฟิลด์วันที่จะถูกประมวลผลในเหตุการณ์ OnGetText ของ TField และการตัดสินความถูกต้องของค่าอินพุตจะถูกประมวลผลในเหตุการณ์ OnSetText หากต้องการนำโค้ดไปใช้ใหม่ ให้วางขั้นตอนและฟังก์ชันที่เรียกโดยตัวจัดการเหตุการณ์ OnGetText และ OnSetText ลงในหน่วยที่แยกต่างหาก
2 รหัสการใช้งานเฉพาะ
{หน่วยแสดงผลและการตัดสิน}
หน่วย DBDateEditMaskTrans;
อินเตอร์เฟซ
การใช้งาน
Windows, SysUtils, การควบคุม, แบบฟอร์ม, Db;
{กระบวนการแสดงฟิลด์วันที่เรียกว่าในเหตุการณ์ OnGetText}
PROcedure DateFieldGetText (ผู้ส่ง: TField; var ข้อความ: สตริง);
{ฟังก์ชันการตัดสินอินพุตฟิลด์วันที่ เรียกว่าในเหตุการณ์ OnSetText}
ฟังก์ชั่น DateFieldSetText (ผู้ส่ง: TField; const ข้อความ: สตริง): บูลีน;
การดำเนินการ
ขั้นตอน DateFieldGetText (ผู้ส่ง: TField; var Text: String);
var
วันที่:TDate;
wYear,wMonth,wDay:Word;
aryTestYMD:อาร์เรย์ [1..2] ของ Char;{อาร์เรย์ชั่วคราวสำหรับมาสก์อินพุตทดสอบ}
iYMD:จำนวนเต็ม;
เริ่ม
dDate:=Sender.AsDateTime;
DecodeDate(dDate,wYear,wMonth,wDay);
{ทดสอบรูปแบบที่มีอยู่ในรูปแบบการป้อนข้อมูล}
aryTestYMD:='ปี';
ถ้า StrScan(PChar(Sender.EditMask))
aryTestYMD[1])< >ไม่มีเลย
iYMD:=1;
aryTestYMD:='เดือน';
ถ้า StrScan(PChar(Sender.EditMask))
aryTestYMD[1])< >ไม่มีเลย
iYMD:=2;
aryTestYMD:='วัน';
ถ้า StrScan(PChar(Sender.EditMask))
aryTestYMD[1])< >ไม่มีเลย
iYMD:=3;
กรณี iYMD ของ
1:{รูปแบบการป้อนข้อมูลอยู่ในรูปแบบ "ปีปปปป"}
ข้อความ:=IntToStr(wYear)+'ปี';
2: {รูปแบบการป้อนข้อมูลอยู่ในรูปแบบ "ปปปป ปี มม. เดือน"}
ข้อความ:=IntToStr(wYear)+'year'+IntToStr(wMonth)+'month';
3: {รูปแบบการป้อนข้อมูลอยู่ในรูปแบบ "ปปปป ปี มม. เดือน วว วัน"}
ข้อความ:=IntToStr(wYear)+'year'+IntToStr(wMonth)+'month' +IntToStr(wDay)+'day';
else {ค่าเริ่มต้นคือ: รูปแบบ "yyyy ปี mm เดือน dd วัน"}
ข้อความ:=IntToStr(wYear)+'year'+IntToStr(wMonth)+'month' +IntToStr(wDay)+'day';
จบ;
จบ;
ฟังก์ชั่น DateFieldSetText (ผู้ส่ง: TField; const ข้อความ: สตริง): บูลีน;
var
วันที่:TDate;
ปี,sเดือน,sวัน:สตริง;
aryTestYMD: อาร์เรย์ [1..2] ของ Char;
iYMD:จำนวนเต็ม;
เริ่ม
{รับวันที่ที่ผู้ใช้ป้อน}
sYear:=Copy(ข้อความ,1,4);
sMonth:=คัดลอก(ข้อความ,7,2);
SDay:=คัดลอก(ข้อความ,11,2);
{ทดสอบรูปแบบที่มีอยู่ในรูปแบบการป้อนข้อมูล}
aryTestYMD:='ปี';
ถ้า StrScan(PChar(Sender.EditMask))
aryTestYMD[1])< >ไม่มีเลย
iYMD:=1;
aryTestYMD:='เดือน';
ถ้า StrScan(PChar(Sender.EditMask))
aryTestYMD[1])< >ไม่มีเลย
iYMD:=2;
aryTestYMD:='วัน';
ถ้า StrScan(PChar(Sender.EditMask))
aryTestYMD[1])< >ไม่มีเลย
iYMD:=3;
{ใช้ลอง...ยกเว้นการแปลงวันที่อินพุต}
พยายาม
เริ่ม
กรณี iYMD ของ
1: {รูปแบบการป้อนข้อมูลอยู่ในรูปแบบ "ปีปปปป"}
เริ่ม
dDate:=StrToDate(sYear+'-01-01') ;{รูปแบบวันที่เริ่มต้นของ Windows ภาษาจีนคือ: yyyy-mm-dd เหมือนกันด้านล่าง}
ผู้ส่งAsDateTime:=dDate;
จบ;
2: {รูปแบบการป้อนข้อมูลอยู่ในรูปแบบ "ปปปป ปี มม. เดือน"}
เริ่ม
dDate:=StrToDate(sYear+'-'+sMonth+'-01');
ผู้ส่งAsDateTime:=dDate;
จบ;
3: {รูปแบบการป้อนข้อมูลอยู่ในรูปแบบ "ปปปป ปี มม. เดือน วว วัน"}
เริ่ม
dDate:=StrToDate(sYear+'-'+sMonth+'-'+sDay);
ผู้ส่งAsDateTime:=dDate;
จบ;
else {ค่าเริ่มต้นคือ: รูปแบบ "yyyy ปี mm เดือน dd วัน"}
เริ่ม
dDate:=StrToDate(sYear+'-'+sMonth+'-'+sDay);
ผู้ส่งAsDateTime:=dDate;
จบ;
จบ;
DateFieldSetText:=จริง;
จบ;
ยกเว้น
{ข้อผิดพลาดในการแปลงวันที่}
เริ่ม
application.MessageBox(PChar(ข้อความ+'ไม่ใช่วันที่ที่ถูกต้อง!'), 'ข้อผิดพลาด',mb_Ok+mb_IconError);
DateFieldSetText:=เท็จ;
จบ;
จบ;
จบ;
จบ.
{หน่วยหน้าต่างหลัก}
หน่วยหลัก;
อินเตอร์เฟซ
การใช้งาน
…{ละเว้นเนื้อหาอื่น}
ขั้นตอน Table1BirthdayGetText (ผู้ส่ง: TField; var Text: String; DisplayText: Boolean);
ขั้นตอน Table1BirthdaySetText (ผู้ส่ง: TField; const ข้อความ: สตริง);
ส่วนตัว
{ประกาศส่วนตัว}
สาธารณะ
{ประกาศสาธารณะ}
……{เล็กน้อย}
การดำเนินการ
{รวมหน่วยที่กำหนดเอง}
ใช้ DBDateEditMaskTrans;
{$R *.DFM}
...{ละเว้นกระบวนการอื่น ๆ}
ขั้นตอน TForm1.FormActivate (ผู้ส่ง: TObject);
{ตั้งค่ารูปแบบการป้อนข้อมูลของช่องวันที่ ซึ่งสามารถวางไว้ในคำจำกัดความของช่อง TField -
เริ่ม
Table1.FieldByName('วันเกิด').EditMask:= '99-99-99;1;_';
จบ;
ขั้นตอน TForm1.Table1BirthdayGetText (ผู้ส่ง: TField; var Text: String; DisplayText: Boolean);
เริ่ม
DateFieldGetText(ผู้ส่ง,ข้อความ);
จบ;
ขั้นตอน TForm1.Table1BirthdaySetText (ผู้ส่ง: TField; const ข้อความ: String);
เริ่ม
ถ้า DateFieldSetText(Sender,Text)=False แล้ว
ยกเลิก {การแปลงล้มเหลว วันที่ไม่ถูกต้อง}
จบ;
จบ.