我们在做程序中发现,如果能够让用户将一个Edit的内容直接拖放到一个DBGrid里,会显得很方便,但在程序编制过程中发现,似乎拖放只能拖放到当前的记录上,那假如要拖放到其他记录又怎么办呢,总不能让用户先选择记录,然后再拖放吧。
后来,通过研究发现,当用鼠标点DBGrid时,DBGrid会自动将记录指针移动到所点击的记录上,这就给了我一个思路,让程序模拟在DBGrid上的一次点击先让光标移动到那条记录上,然后就可以将拖放的数据写入DBgrid里面了。
通过事实证明这个思路是可行的。下面,我就告诉大家我的做法:
1) 首先在Form上放一个DBGrid,并它能够显示记录,(这比较简单,就不用多说了)
2) 在Form上放一个Edit
3) 修改Edit的属性,把DragMode改为dmAutoMatic, 让用户能够拖放
4) 在Dbgrid的DragOver事件中增加如下代码: 让它能够接收 Drag & drop
procedure TForm1.DBGrid1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
accept:=true;
end;
5) 在Dbgrid的DragDrop事件中增加如下代码: 让它能够自动跳到光标所指定的记录上
procedure TForm1.DBGrid1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if Source<>Edit1 then exit;
with Sender as TDbGrid do begin
Perform(wm_LButtonDown,0,MakeLong(x,y));
PerForm(WM_LButtonUp, 0,MakeLong(x,y));
SelectedField.Dataset.edit;
SelectedField.AsString:=Edit1.text;
end;
end;
至此,我们就实现了想要的功能,其中PerForm是TControl的一个通用方法目的是绕过Windows本身的消息循环,而将消息直接发给要发的Control,其具体使用方法请参考Delphi的帮助。