如何在dbgrid中置类似于DateTimePicker的控件 如何在dbgrid中置类似于DateTimePicker的控件由于在时间填写的时候,老是格式不正确导致错误,可否在dbgrid中置DateTimePicker控件。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 绑定罢了在delphi5编程指南中有一个例子,你可以看一看在delphi的demo目录里也有, 供参考:如何在数据网格(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;interfaceusessysUtile, wintypes,winprocs,messages,classes,graphics,controls,forms,dialogs,stdctrls,db,dbtables,dblookup,mask,dbctrls,extctrls,grids,dbgrids,buttons,calendar;typetforml=class(tform)tablegriddata:ttable;datasourcegriddata:tdatasource;dbnavigator1:tdbnavigator;dbgrid1:tdbgrid;tablegriddataorderno:tfloatfield;tablegriddatacustno:tfloatfield;tablegriddatashipVIA:tstringfield;tablegridatacheckbox:tbooleanfield;dbcheckbox1:tdbcheckbox;imagetrue:timageimagefalse: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);begindatabase1.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);beginif(gdfocused in state)then{当数据网格处于编辑状态时}beginif (field.fieldname=dbcheckbox1.datafield)then {当数据焦点处于checkbox字段时,在dbgirddbcheckbox上画}begindbcheckbox1.left:=rect.left+dbgrid1.left+1;{设置dbcheckbox的位置}dbcheckbox1.top:=rect.top+dbgrid1.top+1dbcheckbox1.width:=rect.right-rect.left{-1}dbcheckbox1.height:=rect.botton-rect.top{-1}dbcheckbox1.visible:=true{将dbcheckbox变为可视的}endendelse(在dbgrid处于其他状态时,画图)beginif(field.fieldname=dbcheckbox1.datafield)thenbeginif tablegridatacheckbox.asboolenan then{根据数据不同,画不同的图}dbgrid1.canvas.draw(rect.left.rect.top,imagetrue.picture.bitmap)elsedbgrid1.canvas.draw(rect.left,rect.top,imagefalse.picture.bitmap)endend;end;procedure tform1.dbgrid 1 colexit(sender:tobject);beginif dbgrid.selectedfield.fieldname=dbcheckbox1.datafiele then{网格离开时,更改dbcheckbox的可视属性}dbcheckbox1.visible:=falese;endprocedure tform1.dbgrid1 keypress(sender:tobject;var key:char)beginif(key<>chr(9))thenbeginif(dbgrid1.selectedfield.field name=dbcheckbox1.datafield)then{如果是checkbox字段得到焦点,将按键消息发给dbcheckbox控件}begindbcheckbox1.setf9ocus;sendmessage(dbcheckbox1.handle,wm_char,word(cey),0);endend;end;proc4edure tform1.dbcheckbox1 click(sender:tobject);beginif sendmessage(Dbcheckbox1.handle,bm_getcheck,0,0)=0 then[根据消息结果判断dbcheckbox标题]dbcheckbox1.caption:=+未选elsedbcheckbox1.caption:=+选中end;end; 上面说的基本可行,但是当设置了Datagrid的column editer后,ondrawdatacell将不会被触发,请问如何解决 建议使用EHLIB 里面就支持这个,不用编程就可以实现 DBGrideh中PickList属性设置的下拉列表 求从FTP服务器上复制文件/文件夹的程序 请教精通DELPHI组合查询的高手!! 这个波我抓不到,你抓得到?不可能吧? 如何把Edit框中的竖线脱字符改成横线呢? 谁有DELPHI的关于网络拨号的源代码?高分相送! Delphi中如何实现托盘图标 怎样设置delphi的日期字段为系统的当前日期??? 单层BOM,如何作MRP运算(不用递归)? 你好各位大神们啊!! 嵌入到窗口! 请问怎样操作注册表。要详细的介绍。 关于button
在delphi5编程指南中有一个例子,你可以看一看
在delphi的demo目录里也有,
事实上,在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;