国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Delphi > 正文

制作用于日期時間型字段的DELPHI數據感知控件

2019-11-17 05:09:24
字體:
來源:轉載
供稿:網友
  用Delphi開發C/S應用方便而快速,因為它擁有大量易于使用的數據訪問和數據感知控件。然而萬事總是難以完美,DELPHI的DBEdit控件用于輸入日期時間型字段卻很不方便,為了改善這一缺點,筆者開發了一個DBDateTime數據感知控件,大大方便了時間和日期的輸入。
  創建一個構件時,最重要的一步是選擇正確的父類,這樣可以減少代碼的編寫。DELPHI的構件庫中已有一個TDateTimePicker構件,可以以下拉日歷或利用SpinButton遞增、遞減的方式方便地輸入和改變日期、時間,但它沒有數據感知的能力。因此,我們可以以它為父類,派生出一個新的控件,加上能與數據集通信的數據感知功能。   數據感知控件通過DataLink對象與DataSource進行交互,所以為控件增加數據感知能力需要創建一個TDataLink(或其派生類)對象作為控件的成員,并為控件創建公開的DataField和DataSource屬性;然后需響應TDataLink對象的OnDataChange和OnUpdateData事件。下面是控件的主要源代碼,并帶有相應的注釋: {定義從TDateTimePicker派生的TDBDateTime類。注重,在單元接口的Uses中應加入DB,DBCTRLS引用}type
TDBDateTime=class(TDateTimePicker)
PRivate
FDataLink:TFieldDataLink;
//TFieldDataLink是TDataLink的派生類,處理單個字段與DataSource的交互
procedureDataChange(sender:Tobject);
//當DataSet的記錄改變(如瀏覽記錄)時觸發OnDataChange事件,DataChange將作為該事件的事件處理句柄
procedureUpdateData(sender:Tobject);
//更新DataSet前觸發OnUpdateData事件,UpdateData將作為該事件的事件處理句柄
functionGetDataSource:TDataSource;
procedureSetdataSource(value:TDataSource);
FunctionGetDataField:String;
procedureSetdataField(Value:String);
procedureCMexit(varMessage:TCMExit);message CM_EXIT;//當控件失去焦點時觸發CM_EXIT消息
protected
procedureChange;override;//控件中日期、時間改變時觸發OnChange事件
procedureNotification(AComponent:TComponent;
Operation:Toperation);override;
//當某一控件從FORM上移走時DELPHI的IDE調用該方法通知其它控件
public
constrUCtorCreate(AOwner:Tcomponent);override;
destructorDestroy;override;
lished
propertyDataSource:TDataSourcereadGetDataSource
writeSetDataSource;//為控件增加DataSource屬性,使它能與DataSource構件連接
propertyDataField:StringreadGetDataField
writeSetDataField;
end;//為控件增加DataField屬性,
使它指向代表某一字段的TField對象

procedureRegister;//注冊構件

implementation

procedureTDBDateTime.CMExit;
begin
try
FDataLink.UpdateRecord;
//控件失去焦點時更新DataSet,這將觸發OnUpdateData事件
except
Setfocus;
raise;
end;
DoExit;
end;

constructorTDBDateTime.Create(Aowner:Tcomponent);
begin
inheritedCreate(Aowner);
//創建DataLink對象,掛接OnDataChange、
OnUpdateData事件處理句柄
FDataLink:=TFieldDataLInk.Create;
FDataLink.OnDataChange:=DataChange;
FDataLink.OnUpdateData:=Updatedata;
end;

DestructorTDBDateTime.Destroy;
begin
FDataLink.OnDataChange:=nil;
FDataLink.OnUpdateData:=nil;
FDataLink.Free;
inheritedDestroy;
end;

functionTDBDateTime.GetdataSource:TdataSource;
begin
result:=FDataLink.DataSource;
end;

ProcedureTDBDateTime.SetDataSource(Value:TDataSource);
begin
FDataLink.DataSource:=Value;
end;

functionTDBDateTime.GetDatafield:String;
begin
result:=FDataLink.FieldName;
end;

procedureTDBDateTime.SetDataField(value:String);
begin
FdataLink.FieldName:=value;
end;

procedureTDBDateTime.DataChange(Sender:Tobject);
begin
DateTime:=now;
//若控件連了活動的DataSet則數據集變動時
控件顯示當前記錄的相應字段值
ifFDataLink.Field nilthen
ifFDataLink.Field.Text then
DateTime:=FDatalink.Field.AsDateTime;
end;

ProcedureTDBDateTime.UpdateData(sender:Tobject);
begin
FDatalink.Field.AsDateTime:=DateTime;
//用控件中的日期、時間更新相應字段
end;

procedureTDBDateTime.Change;
begin
//當用戶改變了控件中的內容時將DataSet置為編輯狀態
FDataLink.Modified;
ifnotFDataLink.Editingthen
FdataLink.Edit;
inheritedChange;
end;

procedureTDBDateTime.Notification(AComponent:
TComponent;Operation:TOperation);
begin
inheritedNotification(Acomponent,Operation);
//當與控件相連的TdataSource
被刪除時將控件的DataSource屬性置為空
if(Operation=opRemove)and(FDataLink nil)
and(AComponent=Datasource)then
DataSource:=nil;
end;

procedureRegister;
begin
RegisterComponents(DataControls,
[TDBDateTime]);//控件注冊后安裝于DataControls頁
end;

end.
  本控件安裝后能以下拉日歷和遞 增遞減方式改變數據庫的日期時間型字段,并能以長、短兩種格式顯示日期,方便實用??丶贒ELPHI3、DELPHI4中使用安全可靠。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 晋城| 扎鲁特旗| 汾西县| 云林县| 奈曼旗| 伽师县| 同仁县| 梅河口市| 天长市| 商河县| 彰武县| 青龙| 武山县| 双柏县| 甘肃省| 绥滨县| 拉萨市| 连平县| 阳泉市| 富源县| 大洼县| 来安县| 日喀则市| 来凤县| 中江县| 中西区| 泌阳县| 河池市| 台北县| 阿拉善左旗| 大同市| 丘北县| 施甸县| 靖江市| 卢龙县| 隆安县| 福泉市| 延川县| 嵊州市| 黄平县| 儋州市|