Delphiは、使いやすいデータアクセスとデータ認識コントロールが多数あるため、C/Sアプリケーションを開発するのに便利で速いです。しかし、すべてが完璧になるのは難しいです。ウィジェットを作成するとき、最も重要なステップは、正しい親クラスを選択することです。これにより、コードの書き込みが減少します。 Delphiのコンポーネントライブラリには、既にTDateTimePickerコンポーネントがあります。これは、カレンダーをプルするか、Spinbuttonの増分と減少を使用して日付と時間を簡単に入力および変更できますが、データを感知する機能はありません。したがって、それを親クラスとして受け取り、新しいコントロールに加えて、データセットと通信できるデータ認識関数を導き出すことができます。 データ認識コントロールは、DataSourceを介してDataSourceと対話するため、コントロールにデータ認識を追加するには、コントロールのメンバーとしてTDATALINK(またはその派生クラス)オブジェクトを作成し、コントロールのパブリックデータフィールドとDataSourceプロパティを作成する必要がありますTdatalinkオブジェクトOndatachangeおよびOnupdatedataイベントに。以下は、対応するコメントを含むコントロールの主要なソースコードです。{tdatetimepickerから派生したtdbdateTimeクラスを定義します。 DBはユニットインターフェイスの使用に追加する必要があることに注意してください、DBCTRLSリファレンス}タイプ
tdbdateTime = class(tdatetimepicker)
プライベート
fdatalink:tfielddatalink;
// TfieldDatalinkは、単一のフィールドとDataSourceとの相互作用を処理するtdatalinkの派生クラスです
procesturedatachange(sender:tobject);
//データセットのレコードが変更されたときにオンダタチャンゲイベントがトリガーされると(閲覧履歴など)、Datachangeはイベントのイベント処理ハンドルとして使用されます
procedureUpdatedata(sender:tobject);
//データセットを更新する前にOnupdatedataイベントがトリガーされ、updatedataはイベントのイベント処理ハンドルとして使用されます
functiongetDataSource:tdatasource;
procedureSetDataSource(Value:TDataSource);
functiongetDatafield:string;
procedureSetDatafield(Value:String);
procedurecmexit(varmessage:tcmexit); message cm_exit; //コントロールが焦点を失ったときにcm_exitメッセージをフラッシュします
保護されています
ProcedureChange; Override; // OnChangeイベントは、制御の日付と時刻が変更されたときにトリガーされます。
手続き測定(acomponent:tcomponent;
操作:トッテレーション);オーバーライド;
// Delphi's IDEは、フォームからコントロールが削除されたときに他のコントロールに通知するためにこの方法を呼び出します
公共
constructorcreate(aowner:tcomponent); override;
Destructordestroy;オーバーライド;
暮らした
PropertyDataSource:tdatasoureadgetdatasource
writeSetDataSource; //データソースコンポーネントに接続できるように、データソースプロパティをコントロールに追加する
PropertyDatafield:StringReadGetDataField
writeetdatafield;
終了; //データフィールド属性をコントロールに追加し、
フィールドを表すTfieldオブジェクトを指すようにします
procedureregister; //登録コンポーネント
実装
proceduretdbdatetime.cmexit;
始める
試す
fdatalink.updaterecord;
//コントロールがフォーカスを失ったときにデータセットを更新してください。
を除外する
setfocus;
上げる;
終わり;
doexit;
終わり;
ConstructortdbdateTime.create(aowner:tcomponent);
始める
相続財産(aowner);
// Datalinkオブジェクトを作成し、Ondatachangeをマウントし、
Onupdatedataイベント処理ハンドル
fdatalink:= tfielddatalink.create;
fdatalink.ondatachange:= datachange;
fdatalink.onupdatedata:= updatedata;
終わり;
DestructortdbdateTime.destroy;
始める
fdatalink.ondatachange:= nil;
fdatalink.onupdatedata:= nil;
fdatalink.free;
継承されたdestroy;
終わり;
functiontdbdatetime.getDataSource:tdatasource;
始める
結果:= fdatalink.datasource;
終わり;
proceduretdbdateTime.setDataSource(value:tdatasource);
始める
fdatalink.datasource:= value;
終わり;
functiontdbdatime.getDatafield:string;
始める
結果:= fdatalink.fieldname;
終わり;
proceduretdbdateTime.setDatafield(value:string);
始める
fdatalink.fieldname:= value;
終わり;
proceduretdbdatetime.datachange(sender:tobject);
始める
DateTime:= Now;
//コントロールがアクティブなデータセットに接続されている場合、データセットは変更されます
コントロールは、現在のレコードの対応するフィールド値を表示します
iffdatalink.field nilthen
iffdatalink.field.text then
DateTime:= fdatalink.field.asdateTime;
終わり;
proceduretdbdatetime.updatedata(sender:tobject);
始める
fdatalink.field.asdatetime:= datetime;
//コントロール内の日付と時刻で対応するフィールドを更新します
終わり;
proceduretdbdateTime.change;
始める
//ユーザーがコントロール内のコンテンツを変更したときに状態を編集するためにデータセットを設定します
fdatalink.modified;
ifnotfdatalink.editingthen
fdatalink.edit;
相続型チェンジ;
終わり;
proceduretdbdatetime.notification(acomponent:
tomponent;操作:トッテレーション);
始める
継承されたnotification(acomponent、操作);
//コントロールに接続されたtdatasourceがある場合
削除されたときに、コントロールのDataSourceプロパティを空に設定します
if(operation = opremove)および(fdatalink nil)
および(acomponent = dataSource)次に
DataSource:= nil;
終わり;
procedureregister;
始める
RegisterComponents(datacontrols、
[tdbdatetime]); //コントロールが登録された後、DataControlsページにインストールされます
終わり;
終わり。
インストール後、このコントロールはカレンダーを引き下げ、データベースの日付フィールドを増やしたり減らしたりすることができ、2つの形式で日付を表示できます。これは便利で実用的です。コントロールは、Delphi3とDelphi4で安全で信頼性があります。