请问如何使用DateTimePicker,实现与数据库中日期的关联?谢谢

解决方案 »

  1.   

    我这里有现成的 TDBDateTimePicker
    type
      TDBDateTimePicker = class(TDateTimePicker)
      private
        { Private declarations }
        FAllowChange: Boolean;
        FDataLink: TFieldDataLink;
        FCanvas: TControlCanvas;
        FReadOnly: Boolean;
        function GetDataField: string;
        function GetDataSource: TDataSource;
        procedure SetDataField(const Value: string);
        procedure SetDataSource(Value: TDataSource);
        procedure DataChange(Sender: TObject);
        procedure EditingChange(Sender: TObject);
        procedure CMExit(var Message: TWMNoParams); message CM_EXIT;
        procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
        procedure Enter(var Message: TMessage); message CM_ENTER;
        procedure SetReadOnly(const Value: Boolean);
      protected
        procedure Change; override;
      public
        { Public declarations }
        constructor Create(Aowner: TComponent); override;
        destructor Destroy; override;
      published
        { Published declarations }
        property DataField: string read GetDataField write SetDataField;
        property DataSource: TDataSource read GetDataSource write SetDataSource;
        property ReadOnly: Boolean read FReadOnly write SetReadOnly;    //未处理
      end;implementationconstructor TDBDateTimePicker.Create(AOwner: TComponent);
    begin
       inherited Create(AOwner);
       FDataLink:=TFieldDataLink.Create;
       FDataLink.OnDataChange:=DataChange;
       FDataLink.OnEditingChange := EditingChange;
       FAllowChange:=True;
       FCanvas := TControlCanvas.Create;
       FCanvas.Control := Self;
    end;destructor TDBDateTimePicker.Destroy;
    begin
       FDataLink.OnDataChange:=nil;
       FDataLink.Free;
       FCanvas.Free;
       inherited Destroy;
    end;procedure TDBDateTimePicker.DataChange(Sender: TObject);
    begin
       if FDataLink.Field=nil then Self.DateTime:=1
       else
          if FAllowChange then
          begin
            try
              if FDataLink.Field.AsDateTime=0 then Self.DateTime :=1
              else self.DateTime :=FDataLink.Field.AsDateTime;
            except
              Self.DateTime := 0;
            end;
          end;
    end;procedure TDBDateTimePicker.Change;
    begin
       inherited;
       with FDataLink do begin
          FAllowChange:=False;
          if not editing then Edit;
       end;
       FDatalink.Field.AsDateTime:=self.DateTime;
       FAllowChange:=True;
    end;procedure TDBDateTimePicker.CMExit(var Message: TWMNoParams);
    begin
       try
          FDataLink.UpdateRecord;
       except
          on Exception do SetFocus;
       end;
       inherited;
    end;function TDBDateTimePicker.GetDataField: string;
    begin
       Result:=FDataLink.FieldName;
    end;function TDBDateTimePicker.GetDataSource: TDataSource;
    begin
       Result:=FDataLink.DataSource;
    end;procedure TDBDateTimePicker.SetDataField(const Value: string);
    begin
       FDataLink.FieldName:=Value;
    end;procedure TDBDateTimePicker.SetDataSource(Value: TDataSource);
    begin
       FDataLink.DataSource := Value;
    end;procedure TDBDateTimePicker.WMPaint(var Message: TWMPaint);
    begin
      inherited;
      if csDesigning in ComponentState then Exit;
      if (DataSource = nil) or
         (DataSource.DataSet = nil) or
         (not DataSource.DataSet.Active) or
         (DataField = '') or
         (DataSource.DataSet.FieldByName(DataField).IsNull) and (not Focused) then
      begin
        FCanvas.Brush.Color := Color;
        FCanvas.FillRect(Rect(0, 0, Width - GetSystemMetrics(SM_CXVSCROLL) - 4, Height));
    //    FCanvas.TextOut(1, 1, '空')
      end;
    end;procedure TDBDateTimePicker.EditingChange(Sender: TObject);
    begin
      Invalidate;
    end;procedure TDBDateTimePicker.Enter(var Message: TMessage);
    begin
      inherited;
      Invalidate;
    end;procedure TDBDateTimePicker.SetReadOnly(const Value: Boolean);
    begin
      FReadOnly := Value;
    end;
      

  2.   

    IP4000里有一个wwDBDateTimePicker控件.如果自已写。dbedit1.Field.AsString:=datetostr(datetimepicker.date);
      

  3.   

    建议使用Elib中的TDBDateTimeEditEh控件,可以跟数据库相联
      

  4.   

    雪夜:我是新手,请问如何添加你的代码为控件?谢谢。磕睡:你说得Elib,我也没有找到阿。chinaandys:添加了你的代码,程序报错。很奇怪。