Saat menggunakan Delphi untuk desain database, tidak dapat dihindari untuk melibatkan input kolom tanggal. Namun dibandingkan dengan Microsoft Access 97 versi China, tampilan dan metode input kolom tanggal yang disediakan oleh Delphi sendiri tidak sesuai dengan kebiasaan masyarakat China. Oleh karena itu, banyak solusi yang diusulkan untuk pengolahan field tanggal, namun hasil pengolahannya tidak seragam dalam tampilan dan input, misalnya format "yyyy tahun mm bulan dd hari" dapat direalisasikan saat ditampilkan, namun masih perlu. untuk dimasukkan saat memasukkan. Gunakan "yyyy-mm-dd" sesuai dengan kebiasaan asing Masukan dalam formulir; selalu merepotkan menggunakan TdateTimePicker untuk masukan pilihan; beberapa metode juga perlu mengubah beberapa properti pengaturan sistem, sehingga properti sistem perlu disesuaikan saat menerbitkan perangkat lunak menggunakan kontrol pihak ketiga juga memerlukan kontrol dikemas dan dilepaskan. Selain itu, format tanggal yang umum digunakan seperti "1999" dan "November 1999" tidak diproses sebagaimana mestinya. Di sini, berdasarkan praktik saya sendiri, saya menggunakan kombinasi acara OnGetText dan OnSetText TField untuk mencapai penyatuan tampilan dan input bidang tanggal, dan dapat menangani tanggal umum seperti "1999" dan "November 1999" Tampilan dan input formulir semuanya diimplementasikan menggunakan event yang disediakan oleh Delphi, dan tidak perlu mengubah pengaturan sistem apa pun. Setelah perluasan yang sesuai, ini juga dapat digunakan untuk tampilan dan input waktu, seperti "hh point mm menit" dll. Pada saat yang sama, karena peristiwa TField dikontrol secara langsung, baik menggunakan TDBGrid atau TDBEdit, peristiwa tersebut dapat diproses secara terpadu tanpa harus mempertimbangkannya secara terpisah. Pendekatan serupa juga dapat diterapkan pada input tanggal di aplikasi non-database.
1 Ide dasar
Gunakan properti EditMask dari TField untuk berfungsi sebagai tampilan dan masker masukan. Tampilan bidang tanggal diproses dalam acara OnGetText di TField, dan penilaian validitas nilai input diproses dalam acara OnSetText. Untuk menggunakan kembali kode, letakkan prosedur dan fungsi yang dipanggil oleh event handler OnGetText dan OnSetText ke dalam unit terpisah.
2 Kode implementasi khusus
{Unit tampilan dan penilaian}
unit DBDateEditMaskTrans;
antarmuka
kegunaan
Windows, SysUtils, Kontrol, Formulir, Db;
{Proses tampilan kolom tanggal, dipanggil dalam acara OnGetText}
Prosedur DateFieldGetText(Pengirim: TField; var Teks: String);
{Fungsi penilaian masukan kolom tanggal, dipanggil dalam acara OnSetText}
fungsi DateFieldSetText(Pengirim: TField; const Teks: String):Boolean;
pelaksanaan
prosedur DateFieldGetText(Pengirim: TField; var Teks: String);
var
tanggal:Tanggal;
wTahun,wBulan,wHari:Kata;
aryTestYMD:Array [1..2] dari Char;{Array sementara untuk masker input pengujian}
iYMD:Bilangan Bulat;
mulai
dDate:=Pengirim.AsDateTime;
DecodeDate(tanggal,tahun,wbulan,hari);
{Uji format yang terdapat dalam masker masukan.}
aryTestYMD:='tahun';
jika StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nihil kemudian
iYMD:=1;
aryTestYMD:='bulan';
jika StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nihil kemudian
iYMD:=2;
aryTestYMD:='Hari';
jika StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nihil kemudian
iYMD:=3;
kasus iYMD dari
1:{Masker masukan dalam format "tahun ttt".}
Teks:=IntToStr(wTahun)+'tahun';
2: {Masker masukan dalam format "yyyy tahun mm bulan".}
Teks:=IntToStr(wTahun)+'tahun'+IntToStr(wBulan)+'bulan';
3: {Masker masukan dalam format "yyyy tahun mm bulan hari hh".}
Teks:=IntToStr(wYear)+'year'+IntToStr(wMonth)+'month' +IntToStr(wDay)+'day';
else {Defaultnya adalah: format "yyyy tahun mm bulan hari hh".}
Teks:=IntToStr(wYear)+'year'+IntToStr(wMonth)+'month' +IntToStr(wDay)+'day';
akhir;
akhir;
fungsi DateFieldSetText(Pengirim: TField; const Teks: String):Boolean;
var
tanggal:Tanggal;
sTahun,sBulan,sHari:String;
aryTestYMD:Array [1..2] dari Char;
iYMD:Bilangan Bulat;
mulai
{Dapatkan tanggal yang dimasukkan oleh pengguna}
sTahun:=Salin(Teks,1,4);
sBulan:=Salin(Teks,7,2);
SDay:=Salin(Teks,11,2);
{Uji format yang terdapat dalam masker masukan.}
aryTestYMD:='tahun';
jika StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nihil kemudian
iYMD:=1;
aryTestYMD:='bulan';
jika StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nihil kemudian
iYMD:=2;
aryTestYMD:='Hari';
jika StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nihil kemudian
iYMD:=3;
{Gunakan Coba...Kecuali untuk mengonversi tanggal masukan}
mencoba
mulai
kasus iYMD dari
1: {Input mask dalam format "yyyy year".}
mulai
dDate:=StrToDate(sYear+'-01-01') ;{Format tanggal default Windows Cina adalah: yyyy-mm-dd.Sama di bawah}
Pengirim.AsDateTime:=dDate;
akhir;
2: {Masker masukan dalam format "yyyy tahun mm bulan".}
mulai
tanggaltanggal:=StrToDate(tahun+'-'+sbulan+'-01');
Pengirim.AsDateTime:=dDate;
akhir;
3: {Masker masukan dalam format "yyyy tahun mm bulan hari hh".}
mulai
tanggaltanggal:=StrToDate(tahun+'-'+sbulan+'-'+hari);
Pengirim.AsDateTime:=dDate;
akhir;
else {Defaultnya adalah: format "yyyy tahun mm bulan hari hh".}
mulai
tanggaltanggal:=StrToDate(tahun+'-'+sbulan+'-'+hari);
Pengirim.AsDateTime:=dDate;
akhir;
akhir;
DateFieldSetText:=Benar;
akhir;
kecuali
{Kesalahan konversi tanggal}
mulai
application.MessageBox(PChar(Teks+'Bukan tanggal yang valid!'), 'Error',mb_Ok+mb_IconError);
DateFieldSetText:=Salah;
akhir;
akhir;
akhir;
akhir.
{unit jendela utama}
satuan Utama;
antarmuka
kegunaan
…{hilangkan konten lainnya}
prosedur Table1BirthdayGetText(Pengirim: TField; var Teks: String;DisplayText: Boolean);
procedure Table1BirthdaySetText(Pengirim: TField; const Teks: String);
pribadi
{Deklarasi pribadi}
publik
{Pernyataan publik}
……{agak}
pelaksanaan
{Sertakan unit khusus}
menggunakan DBDateEditMaskTrans;
{$R *.DFM}
...{Proses lain dihilangkan}
procedure TForm1.FormActivate(Pengirim: TObject);
{Atur topeng masukan bidang tanggal, yang dapat ditempatkan dalam definisi bidang TField. }
mulai
Table1.FieldByName('Ulang Tahun').EditMask:= '99-99-99;1;_';
akhir;
prosedur TForm1.Table1BirthdayGetText(Pengirim: TField; var Teks: String;DisplayText: Boolean);
mulai
DateFieldGetText(Pengirim,Teks);
akhir;
procedure TForm1.Table1BirthdaySetText(Pengirim: TField; const Teks: String);
mulai
jika DateFieldSetText(Sender,Text)=False maka
Batalkan; {Konversi gagal, tanggal ilegal}
akhir;
akhir.