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文件并添加到你的控件中
复制代码

 

posted on   癫狂编程  阅读(200)  评论(0编辑  收藏  举报

编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
好的代码像粥一样,都是用时间熬出来的
点击右上角即可分享
微信分享提示