因为delphi提供了重新绘制网络的机制,所以可以使用tcustomdbgrid.ondrawdatacell事件书写句柄来绘制你的数据。
 delphi对dbgrid处理的内部机制可以这样来理解,当通过dbgrid进行数据输入时,便会在网络上浮动一个dbedit组件。你输入数据的网络其实是浮动的dbedit组件,而其他位获得焦点网络的地方不过是绘制的图象罢了。因此,为了能在网络中绘制自己的组件。可以通过在网格上浮动一个可视组件 来实现。这样的话,从简单的dbcheckbox到复杂的对话框,都可以在dbgrid中插入,下面就是如何在dbgrid中插入tdblookupcombobox组件的步骤,采用同样的办法可以插入其他组件。
第一步:创建应用程序,然后将两个tdatasource、两个ttable、一个tdbgrid、一个tdblookupcombobox以及一个tdbnavigator组件放置到form1上
第二步:为组件放置属性。
table1
databasename:='MYDATA';
tablename:='book.db';
table2
databasenmae:='mydata;;
tablename:='author.db';
datasource1.dataset:=table1;
datasource2.dataset:=table2;
dbnavigator.dataset:=table1;
dbgrid1.dataset:=table1;
dblookupcombobox1
   datasource:=datasource1;
   datafield:='作者编号';
listsource:=datasource2;
keyfield:='作者‘;
listfield:='作者编号';
第三步:书写drawdatacell事件例程。drawdatacell事件用来重新绘制单元格。当获得焦点的网格所对应的字段与dblookupcombobox1所对应的字段一致时,便移动dblookupcombobox1到获得焦点的网格上,并且使组合框可视,从而实现在dbgrid的指定列上显示dblookupcombobox1的功能。设置dbgrid1的drawdatacell1事件如下:
procedure tform1.dbgrid1.drawdatacell
(sender:tobject;const rect:trect;datacol:integer;column:tcolumn;state:tgriddrawstate);
begin
if (gdfocused in state)then
begin
with dblookupcombobox1 do
 if(field.fieldname=datafield)then
 begin
  left:=rect.left+dbgrid1.left;
 top:=rect.top+dbgrid1.top;
 width:=rect.right-rect.left;
 height:=rect.bottom-rect.top;
 visible:=true;
end;
end;
end;
第四步:书写dbgrid1的oncolexit事件例程。规定单元格在未获得焦点时不显示dblookupcombobox1,设置dbgrid1的oncolexit事件如下:
procedure tform1.dbgrid1colexit(sender:tobject);
begin
 if dbgrid1.selectedfield.fieldname
=dblookupcombobox1.datafield then
 begin
  dblookupcombobox1.visible:=false;
  end;
end;
第五步:书写dbgrid1的keypress例程。当dbgrid的指定列获得焦点时,drawdatacell事件只是绘制单元格,并显示dblookupcombobox1,此时,dblookupcombobox1并没有获得焦点,于是数据的输入还是在单元格上进行。但这时可以在dbgrid1的keypress事件中调用sendmessage这个windows api函数将数据输入传输到dblookupcombobox1上,从而达到在dblookupcombobox1上进行数据输入的目的。因此要设置keypress事件如下:
procedure tform1.dbgrid1keypress (sender:tobject;var key:char);
begin
  if(key<>char(9))then
   begin
   if (dbgrid1.selectedfield.fieldname=dblookupcombobox1.datafield) then
     begin
       dblookupcombobox1.setfocus;
       sendmessage(dblookupcombobox1.handle,wm_char,word(key),0);
    end;
  end;
end;
第六步:在form1.show事件中加入以下代码,以将dblookupcombobox1初始化为隐藏状态。
procedure tform1.formshow(sender:tobject);
begin
dblookupcombobox1.visible:=false;
end;
第七步:激活table1和table2,运行程序。