如何在dbgrid中置类似于DateTimePicker的控件
由于在时间填写的时候,老是格式不正确导致错误,可否在dbgrid中置DateTimePicker控件。

解决方案 »

  1.   

    绑定罢了
    在delphi5编程指南中有一个例子,你可以看一看
    在delphi的demo目录里也有,
      

  2.   

    供参考:如何在数据网格(DBGRID)中插入其他的可视控件在DELPHI的数据库应用程序设计中,DBGRID是一个非常实用的控件。它不仅可以以网格的形式输入显示一组数据,对于每一个单元格还提供了不同的属性,使单元格具有了更丰富的能力(例如下拉查询框、单击按钮等),但是,对于一个比较复杂的应用而言,我们希望而DBGRID还能具备更多的功能,比如在单元格中是否可以显示图形、单选形、检查框等,从而使DBGRID的功能更强大,在为其他可视控件的包容器。
    事实上,在DELPHI中的DBGRID中并不具备以上功能。我们可以通过以下的方法使DBGRID具有这些功能。
    (1) 使用DELPHI的控件开发技术;
    (2) 把其他控件叠加在DBGRID上;
    我们先来讨论第一种方法。DELPHI作为可视开发工具(RAD)中的佼佼者,它的最大的过人之处就在于其完备的面向对象技术,其中控件的开发功能更是吸引大批的程序开发人员。
    事实上DBGRID控件,就是从GRID继承而来在GRID中加入一个TDBEDIT的对象,使GRID具备了数据感知能力。具体实现可参阅DELPHI中的VCL库中DBGRID.PAS文件。
    同样的道理,我们可以从DBGRID中继承下来,再生成一个新的控件,使它个备显示图形、检查框等能力,但这需要对DELPHI有比较深刻的理解,有比较强的编程能力才能实现。
    下面讨论第二种实现方法。这种方法实现起来比较容易,也比较直观。本文所给出的程序实例也就是用这种方法实现的。下面介绍该方法的实现原理。
    前面我们已经说到,DBGRID实际就 是GRID和DBEDIT的一个组合,在DBGRID内部是一个可以在网格中移动的DBEDIT,可以在这个活动的DBEDIT中键入数据,未获得该点的部分仅仅是些图形。同时DBGRID提供了画布CANVAS属性,这样就使我们有可能把其他控件画到DBGRID上,从效果上看,DBGRID就包含了其他的可视控件。
    同样,可以用其他控件覆盖DBGRID的输入部分,只要从其他可视控件上的输入能够被DBGRID感知,这样就可以同步完成对DBGRID的输入更新。这里有两种方法实现两个控件输入的同步更新。
    第一、 可视控件采用数据感知控件。这样,在对数据库存更新的同时,也完成对DBGRID的更新(本例采用这一方法)。
    第二、 利用各控件的消息循环机制,在某一控件得到输入时,同DBGRID中发送一个消息,达到数据的更新。
    下面是该方法的程序实现实例(在WINDOWS 95 DELPHI3。0-下实现。)
    //主程序单元文件
    unit main;
    interface
    uses
    sysUtile, wintypes,winprocs,messages,classes,graphics,controls,
    forms,dialogs,stdctrls,db,dbtables,dblookup,mask,dbctrls,
    extctrls,grids,dbgrids,buttons,calendar;
    type
    tforml=class(tform)
    tablegriddata:ttable;
    datasourcegriddata:tdatasource;
    dbnavigator1:tdbnavigator;
    dbgrid1:tdbgrid;
    tablegriddataorderno:tfloatfield;
    tablegriddatacustno:tfloatfield;
    tablegriddatashipVIA:tstringfield;
    tablegridatacheckbox:tbooleanfield;
    dbcheckbox1:tdbcheckbox;
    imagetrue:timage
    imagefalse:timage;
    database1:tdatabase;
    bitbtn1:tbitbtn;
    procedure formcreate(sender:tobject);
    procedure dbgrid 1 drawdatacell(sender:tobject;const rect:trect;)
    field:tfield;state;tgriddrawstate);
    procedure dbgrid 1 keypress (sender:tobject; var key:char);
    procedure dbcheckbox 1 click (sender:tobject);
    procedure dbgrid 1 colexit (sender:tobject);
    private
    {private declarations}
    public
    {public declarations}
    end;
    var 
    form 1:tform1;
    implementation
    {$r*.dfm}
    procedure tform1.formcreate9sender:tobject);
    begin
    database1.params.add('Path=+extractfiledir(Application.exename));{数据库存指向应用程序路径}
    database1.openk;{打开数据库}
    tablegriddata.open{打开表}
    dbcheckbox1.visible:=false;{将各控件设为不可视}
    imagetrue.visible:=false;
    imagefalse.visible:=false;
    end;
    procedure tforma1.dbgrid 1 drawdatacell(sender:tobject;const rect:trect;
    field:tfield:state:tcriddrawstate);
    begin
    if(gdfocused in state)then{当数据网格处于编辑状态时}
    begin
    if (field.fieldname=dbcheckbox1.datafield)then {当数据焦点处于checkbox字段时,在dbgirddbcheckbox上画}
    begin
    dbcheckbox1.left:=rect.left+dbgrid1.left+1;{设置dbcheckbox的位置}
    dbcheckbox1.top:=rect.top+dbgrid1.top+1
    dbcheckbox1.width:=rect.right-rect.left{-1}
    dbcheckbox1.height:=rect.botton-rect.top{-1}
    dbcheckbox1.visible:=true{将dbcheckbox变为可视的}
    end
    end
    else(在dbgrid处于其他状态时,画图)
    begin
    if(field.fieldname=dbcheckbox1.datafield)then
    begin
    if tablegridatacheckbox.asboolenan then{根据数据不同,画不同的图}
    dbgrid1.canvas.draw(rect.left.rect.top,imagetrue.picture.bitmap)
    else
    dbgrid1.canvas.draw(rect.left,rect.top,imagefalse.picture.bitmap)
    end
    end;
    end;
    procedure tform1.dbgrid 1 colexit(sender:tobject);
    begin
    if dbgrid.selectedfield.fieldname=dbcheckbox1.datafiele then{网格离开时,更改dbcheckbox的可视属性}
    dbcheckbox1.visible:=falese;
    end
    procedure tform1.dbgrid1 keypress(sender:tobject;var key:char)
    begin
    if(key<>chr(9))then
    begin
    if(dbgrid1.selectedfield.field name=dbcheckbox1.datafield)then{如果是checkbox字段得到焦点,将按键消息发给dbcheckbox控件}
    begin
    dbcheckbox1.setf9ocus;
    sendmessage(dbcheckbox1.handle,wm_char,word(cey),0);
    end
    end;
    end;
    proc4edure tform1.dbcheckbox1 click(sender:tobject);
    begin
    if sendmessage(Dbcheckbox1.handle,bm_getcheck,0,0)=0 then[根据消息结果判断dbcheckbox标题]
    dbcheckbox1.caption:=+未选
    else
    dbcheckbox1.caption:=+选中
    end;
    end;
      

  3.   

    上面说的基本可行,但是当设置了Datagrid的column editer后,ondrawdatacell将不会被触发,请问如何解决
      

  4.   

    建议使用EHLIB 里面就支持这个,不用编程就可以实现