创建一个构件时,最重要的一步是选择正确的父类,这样可以减少代码的编写。DELPHI的构件库中已有一个TDateTimePicker构件,可以以下拉日历或利用SpinButton递增、递减的方式方便地输入和改变日期、时间,但它没有数据感知的能力。因此,我们可以以它为父类,派生出一个新的控件,加上能与数据集通信的数据感知功能。
数据感知控件通过DataLink对象与DataSource进行交互,所以为控件增加数据感知能力需要创建一个TDataLink(或其派生类)对象作为控件的成员,并为控件创建公开的DataField和DataSource属性;然后需响应TDataLink对象的OnDataChange和OnUpdateData事件。下面是控件的主要源代码,并带有相应的注释:
{定义从TDateTimePicker派生的TDBDateTime类。注意,在单元接口的Uses中应加入DB,DBCTRLS引用}typeTDBDateTime=class(TDateTimePicker)privateFDataLink: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消息protectedprocedureChange;override;//控件中日期、时间改变时触发OnChange事件procedureNotification(AComponent:TComponent;Operation:Toperation);override;//当某一控件从FORM上移走时DELPHI的IDE调用该方法通知其它控件publicconstructorCreate(AOwner:Tcomponent);override;destructorDestroy;override;lishedpropertyDataSource:TDataSourcereadGetDataSourcewriteSetDataSource;//为控件增加DataSource属性,使它能与DataSource构件连接propertyDataField:StringreadGetDataFieldwriteSetDataField;end;//为控件增加DataField属性,使它指向代表某一字段的TField对象procedureRegister;//注册构件implementationprocedureTDBDateTime.CMExit;begintryFDataLink.UpdateRecord;//控件失去焦点时更新DataSet,这将触发OnUpdateData事件exceptSetfocus;raise;end;DoExit;end;constructorTDBDateTime.Create(Aowner:Tcomponent);begininheritedCreate(Aowner);//创建DataLink对象,挂接OnDataChange、OnUpdateData事件处理句柄FDataLink:=TFieldDataLInk.Create;FDataLink.OnDataChange:=DataChange;FDataLink.OnUpdateData:=Updatedata;end;DestructorTDBDateTime.Destroy;beginFDataLink.OnDataChange:=nil;FDataLink.OnUpdateData:=nil;FDataLink.Free;inheritedDestroy;end;functionTDBDateTime.GetdataSource:TdataSource;beginresult:=FDataLink.DataSource;end;ProcedureTDBDateTime.SetDataSource(Value:TDataSource);beginFDataLink.DataSource:=Value;end;functionTDBDateTime.GetDatafield:String;beginresult:=FDataLink.FieldName;end;procedureTDBDateTime.SetDataField(value:String);beginFdataLink.FieldName:=value;end;procedureTDBDateTime.DataChange(Sender:Tobject);beginDateTime:=now;//若控件连了活动的DataSet则数据集变动时控件显示当前记录的相应字段值ifFDataLink.Field nilthenifFDataLink.Field.Text thenDateTime:=FDatalink.Field.AsDateTime;end;ProcedureTDBDateTime.UpdateData(sender:Tobject);beginFDatalink.Field.AsDateTime:=DateTime;//用控件中的日期、时间更新相应字段end;procedureTDBDateTime.Change;begin//当用户改变了控件中的内容时将DataSet置为编辑状态FDataLink.Modified;ifnotFDataLink.EditingthenFdataLink.Edit;inheritedChange;end;procedureTDBDateTime.Notification(AComponent:TComponent;Operation:TOperation);begininheritedNotification(Acomponent,Operation);//当与控件相连的TdataSource被删除时将控件的DataSource属性置为空if(Operation=opRemove)and(FDataLink nil)and(AComponent=Datasource)thenDataSource:=nil;end;procedureRegister;beginRegisterComponents(DataControls,[TDBDateTime]);//控件注册后安装于DataControls页end;end.
本控件安装后能以下拉日历和递 增递减方式改变数据库的日期时间型字段,并能以长、短两种格式显示日期,方便实用。控件在DELPHI3、DELPHI4中使用安全可靠。
Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved. 闵涛 E_mail:admin@mintao.net(欢迎提供学习资源)
鄂公网安备 42011102001154号
站长:MinTao ICP备案号:鄂ICP备11006601号-18