DBDateTimePicker;
unit DBDateTimePicker; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls,DB,DBCTRLS; type TDBDateTime = class(TDateTimePicker) private FDataLink:TFieldDataLink; //TFieldDataLink是TDataLink的派生类, 处理单个字段与DataSource的交互 procedure DataChange(sender:Tobject); //当DataSet的记录改变(如浏览记录) 时触发OnDataChange 事件,DataChange将作为该事件的事件处理句柄 procedure UpdateData(sender:Tobject); //更新DataSet前触发OnUpdateData事件, UpdateData将作为该事件的事件处理句柄 function GetDataSource:TDataSource; procedure SetdataSource(value:TDataSource); Function GetDataField:String; procedure SetdataField(Value:String); procedure CMexit(var Message:TCMExit); message CM_EXIT;//当控件失去焦点时触发CM_EXIT消息 protected procedure Change;override;//控件中日期、 时间改变时触发OnChange事件 procedure Notification(AComponent:TComponent; Operation:Toperation);override; //当某一控件从FORM上移走时DELPHI的IDE调用该方法通知其它控件 public constructor Create(AOwner:Tcomponent);override; destructor Destroy;override; published property DataSource:TDataSource read GetDataSource write SetDataSource;//为控件增加DataSource属性,使它能与DataSource构件连接 property DataField:String read GetDataField write SetDataField; end;//为控件增加DataField属性, 使它指向代表某一字段的TField对象 procedure Register;//注册构件 implementation procedure TDBDateTime.CMExit; begin try FDataLink.UpdateRecord; //控件失去焦点时更新DataSet, 这将触发OnUpdateData事件 except Setfocus; raise; end; DoExit; end; constructor TDBDateTime.Create(Aowner:Tcomponent); begin inherited Create(Aowner); //创建DataLink对象,挂接OnDataChange、 OnUpdateData事件处理句柄 FDataLink:=TFieldDataLInk.Create; FDataLink.OnDataChange:=DataChange; FDataLink.OnUpdateData:=Updatedata; end; Destructor TDBDateTime.Destroy; begin FDataLink.OnDataChange:=nil; FDataLink.OnUpdateData:=nil; FDataLink.Free; inherited Destroy; end; function TDBDateTime.GetdataSource:TdataSource; begin result:=FDataLink.DataSource; end; Procedure TDBDateTime.SetDataSource (Value:TDataSource); begin FDataLink.DataSource:=Value; end; function TDBDateTime.GetDatafield:String; begin result:=FDataLink.FieldName; end; procedure TDBDateTime.SetDataField(value:String); begin FdataLink.FieldName:=value; end; procedure TDBDateTime.DataChange(Sender:Tobject); begin DateTime:=now; //若控件连了活动的DataSet则数据集变动时控件显示当前记录的相应字段值 if FDataLink.Field<>nil then if FDataLink.Field.Text<>'' then DateTime:=FDatalink.Field.AsDateTime; end; Procedure TDBDateTime.UpdateData(sender:Tobject); begin FDatalink.Field.AsDateTime:=DateTime; //用控件中的日期、时间更新相应字段 end; procedure TDBDateTime.Change; begin //当用户改变了控件中的内容时将DataSet置为编辑状态 FDataLink.Modified; if not FDataLink.Editing then FdataLink.Edit; inherited Change; end; procedure TDBDateTime.Notification (AComponent:TComponent;Operation:TOperation); begin inherited Notification(Acomponent,Operation); //当与控件相连的TdataSource 被删除时将控件的DataSource属性置为空 if (Operation=opRemove) and (FDataLink<>nil) and (AComponent=Datasource) then DataSource:=nil; end; procedure Register; begin RegisterComponents('Data Controls', [TDBDateTime]);//控件注册后安装于DataControls页 end; end. //保存为pas文件并添加到你的控件中
好的代码像粥一样,都是用时间熬出来的
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)