Delphi nyaman dan cepat untuk mengembangkan aplikasi C/S karena memiliki sejumlah besar akses data yang mudah digunakan dan kontrol yang sadar data. Namun, semuanya selalu sulit untuk disempurnakan. Saat membuat widget, langkah yang paling penting adalah memilih kelas induk yang benar, yang dapat mengurangi penulisan kode. Perpustakaan Komponen Delphi sudah memiliki komponen TDATETIMEPICKER, yang dapat dengan mudah masuk dan mengubah tanggal dan waktu dengan menarik kalender atau menggunakan peningkatan dan penurunan spinbutton, tetapi tidak memiliki kemampuan untuk merasakan data. Oleh karena itu, kita dapat menganggapnya sebagai kelas induk dan memperoleh kontrol baru, ditambah fungsi sadar data yang dapat berkomunikasi dengan set data. Kontrol yang sadar data berinteraksi dengan sumber data melalui objek DataLink, jadi menambahkan kesadaran data ke kontrol memerlukan pembuatan objek TDataLink (atau kelas turunannya) sebagai anggota kontrol, dan membuat properti Datafield dan DataSource publik untuk kontrol; ke objek tdataLink ondatachange dan peristiwa onupdatedata. Di bawah ini adalah kode sumber utama kontrol, dengan komentar yang sesuai: {Tentukan kelas TDBDATETIME yang berasal dari tdateTimePicker. Perhatikan bahwa db harus ditambahkan ke penggunaan antarmuka unit, referensi dbctrls} tipe
TdbDateTime = class (tdateTimePicker)
Pribadi
FdataLink: tfieldDataLink;
// tfieldDataLink adalah kelas tdatalink yang diturunkan yang menangani interaksi satu bidang dengan sumber data
Proseduredatachange (pengirim: TOBJEKS);
// Ketika acara ondatachange dipicu ketika catatan dataset berubah (seperti riwayat penjelajahan), datachange akan digunakan sebagai pegangan penanganan acara untuk acara tersebut
ProsedureupDatedata (pengirim: TOBJEK);
// Acara OnUpdatedata dipicu sebelum memperbarui dataset, UpdateData akan digunakan sebagai pegangan pemrosesan acara untuk acara tersebut
functionGetDataSource: tDataSource;
ProsedurureSetDataSource (Nilai: TDataSource);
FunctionGetDataField: string;
ProsedurureSetDataField (nilai: string);
ProsedurecMexit (varmessage: tcmexit); pesan cm_exit; // flash pesan cm_exit saat kontrol kehilangan fokus
terlindung
ProsedureChange; override; // peristiwa onchange dipicu ketika tanggal dan waktu dalam perubahan kontrol.
Prosedurenotifikasi (Acomponent: TComponent;
Operasi: Toperasi); override;
// IDE Delphi memanggil metode ini untuk memberi tahu kontrol lain saat kontrol dihapus dari formulir
publik
ConstructorCreate (Aowner: TComponent); override;
Destructordestroy; override;
lished
PropertyDataSource: tdatasourcereadgetDataSource
writeSetDataSource; // Tambahkan properti DataSource ke kontrol sehingga dapat dihubungkan ke komponen DataSource
PropertyDataField: StringReadGetDataField
WriteSetDataField;
end; // Tambahkan atribut DataField ke kontrol,
Jadikan itu menunjuk ke objek TField yang mewakili bidang
Prosedureregister; // Daftarkan Komponen
Pelaksanaan
ProcedureTdBDateTime.cMexit;
Mulai
mencoba
FdataLink.updaterecord;
// Perbarui dataset saat kontrol kehilangan fokus, yang akan memicu acara onupdatedata
kecuali
SetFocus;
mengangkat;
akhir;
Doexit;
akhir;
constructordbdateTime.create (Aowner: tComponent);
Mulai
diwaritedCreate (Aowner);
// Buat objek Datalink, mount ondatachange,
Onupdatedata Acara Pemrosesan Pegangan
FdataLink: = tfieldDataLink.create;
FdataLink.ondatachange: = datachange;
FdataLink.onupdatedata: = updateData;
akhir;
DestructortdbdateTime.destroy;
Mulai
FdataLink.ondatachange: = nil;
FdataLink.onupdatedata: = nil;
FdataLink.Free;
diwariteddestroy;
akhir;
functionTdBDateTime.getDataSource: tDataSource;
Mulai
Hasil: = fdataLink.datasource;
akhir;
ProcedureTdBDateTime.SetDataSource (Nilai: TDataSource);
Mulai
FdataLink.datasource: = nilai;
akhir;
functionTdBDateTime.getDataField: string;
Mulai
Hasil: = fDataLink.FieldName;
akhir;
ProcedureTdBDateTime.SetDataField (nilai: string);
Mulai
FDataLink.FieldName: = nilai;
akhir;
ProcedureTdBDateTime.DataChange (pengirim: TOBJEKS);
Mulai
Datetime: = sekarang;
// Jika kontrol terhubung ke dataset aktif, dataset akan berubah
Kontrol menampilkan nilai bidang yang sesuai dari catatan saat ini
iffdataLink.field nilthen
iffdataLink.field.text lalu
Datetime: = fdataLink.field.asdateTime;
akhir;
ProcedureTdBDateTime.updatedata (pengirim: TOBJEKS);
Mulai
FdataLink.field.asdateTime: = datetime;
// Perbarui bidang yang sesuai dengan tanggal dan waktu di kontrol
akhir;
ProseduretDbDateTime.change;
Mulai
// Atur dataset untuk mengedit status saat pengguna mengubah konten di kontrol
FdataLink.modified;
IfNotfDataLink.EditingTHen
FdataLink.Edit;
diwaritedchange;
akhir;
ProseduretDbDateTime.Notification (Acomponent:
Tcomponent; operasi: toperasi);
Mulai
diwaritedNotification (Acomponent, Operation);
// Saat tdataSource terhubung ke kontrol
Atur properti sumber data kontrol menjadi kosong saat dihapus
if (operasi = opremove) dan (fdataLink nil)
dan (acomponent = dataSource) kemudian
DataSource: = nil;
akhir;
Prosedureregister;
Mulai
RegisterComponents (DataControls,
[TdbdateTime]); // Setelah kontrol terdaftar, diinstal pada halaman DataControls
akhir;
akhir.
Setelah instalasi, kontrol ini dapat menurunkan kalender dan meningkatkan atau mengurangi bidang tanggal dan waktu database, dan dapat menampilkan tanggal dalam dua format, yang nyaman dan praktis. Kontrol aman dan dapat diandalkan di Delphi3 dan Delphi4.