我用dbgrid作输入界面,请问DateTimePicker控件怎么嵌入dbgrid中,我有一个日期型字段date,它的数据通过DateTimePicker输入,注不用第三方控作如EBLIB和dxdbgrid等!

解决方案 »

  1.   

    在DBGrid 的DBGridDrawDataCell(...)过程中设置
    DateTimePicker.left:=rect.left+DBGrid.left;
    DateTimePicker.top:=rect.left+DBGrid.top;
    DateTimePicker.width:=rect.left+DBGrid.rect-DBGrid.left;
      

  2.   

    这其实就是我们常说的在grid上做浮动控件,道理上很简单,正确放置控件位置,并能正确反映当前字段的内容,与数据表自然交互;关键在于如何适时的控制它.//这段程序示范了如何在dbgrid的单元格使用Tdatetimepicker控件事编辑日期.
    //同样这可是别的可视控件,对于不同类型的字段需改变
    //if column.Field.DataType in [ftDate, ftTime, ftDateTime] 的条件
    //并改变保存类型;有一点不爽的是单击日期型栏时有闪烁感
    //哪位大大帮我改改,解决这个问题后email:[email protected] Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, Grids, DBGrids, DB, DBTables;type
      Tfakegrid=class(Tdbgrid);
      TForm1 = class(TForm)
        Table1: TTable;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        dp1: TDateTimePicker; //设计属性visible=false
        procedure DBGrid1CellClick(Column: TColumn);
        procedure editdatetime(dbgrid:Tdbgrid;fieldname:string;datetime:Tdatetime);  private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      tempcol:Tcolumn;//记录上次单的日期栏
      temprecno:integer;//记录上次单的记录号
    implementation{$R *.dfm}procedure TForm1.DBGrid1CellClick(Column: TColumn);
    var rect:Trect; //当前单元格区域
        book:Tbook;
    begin
      if (dp1.Visible) then //表示上次单击是日期栏
        if (table1.RecNo=temprecno) then  //单击同一记录的别的栏
            editdatetime(dbgrid1,tempcol.FieldName,dp1.DateTime)//修改tempcol对应的值
        else begin //单击另一记录
          book:=table1.GetBook; //当前记录
          table1.recno:=temprecno;      //回到上次点了日期栏的那条记录
          editdatetime(dbgrid1,tempcol.FieldName,dp1.DateTime);//改tempcol对应的值
          table1.GotoBook(book);//回到当前记录
        end;
      if column.Field.DataType in [ftDate, ftTime, ftDateTime] then  //点了日期栏
      begin
        //点击的单元格区域rect
        rect:=Tfakegrid(dbgrid1).CellRect(Tfakegrid(dbgrid1).col,Tfakegrid(dbgrid1).Row);
        dp1.Visible:=true;//显示dp1
        //设dp1的属性
        dp1.DateTime:=Column.Field.AsDateTime;
        dp1.Left:=rect.Left+dbgrid1.Left;
        dp1.Top:=rect.top+dbgrid1.top;
        dp1.Width:=rect.Right-rect.Left;
        dp1.Height:=rect.Bottom-rect.Top;
        tempcol:=column;  //记住这个栏
        temprecno:=table1.RecNo; //记住这个记录号
      end
      else begin //没有单击日期型栏
        tempcol:=nil;
        dp1.Visible:=false; //隐去dp1
      end;
    end;//修改日期值
    procedure TForm1.editdatetime(dbgrid:Tdbgrid;fieldname:string;datetime:Tdatetime);
    var dataset:Tdataset;
    begin
      dataset:=dbgrid.DataSource.DataSet;
      if not(dataset.State in [dsedit,dsinsert]) then
        dataset.Edit;
      dataset.FieldByName(fieldname).AsDateTime:=datetime;
    end;
    end.