unit L_DBDateTime;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,db,dbtables,dbctrls,Dialogs,
  ComCtrls;

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]);
end;

end.
