delphi里的dbgrid能实现行的拖动吗? 好象没法拖动啊?我在dbgrid的dragdrop,over,begindrag之类的时间里面都写了showmessage,结果在我选中行然后拖,毫无反应我是想把选中某行,然后可以把它拖到指定的行数。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 同意楼上,你可以自己改写Tdbgrid那就完全可以实现了 能不改控件,通过程序代码实现吗?我想通过dbgrid拖动时触发的事件,再修改记录集的index field值来实现但是找不到相应的事件 不改控件,通过程序代码实现可以啊,哈哈,不过你还是要继承dbgrid ,然后写代码实现之,很少见过有这样需求的,列的拖动是有 你说的不还是重写控件吗?我的是一个程序里用到了很多个dbgrid,只有一个需要实现行记录的拖动所以我想当触发行拖动时,在相应的事件代码中修改记录,然后就实现了行的拖动这样能行吗? dbgrid和table或者query相联,它里面的顺序也就是query和table里的顺序,也就是select出来的顺序,数据库原理里有一条是元组没有顺序的说。所以用简单的方法好象是不能实现的了。 我是想改table的内容啊我是想点中行然后拖动开始时得到点中行的记录号,然后释放时得到当时鼠标所在行的记录号,然后根据这两个不就可以修改记录和相应的次序吗这样做也不行吗? 表是按哪个field排序的我是知道的,我只要把表的该field直改成相应数值就好了。但我不知道行拖动事件何时触发和结束的,触发和结束时各在哪条记录上。 把dbgrid的DragMode改成dmAutomatic后,dbgrid开始接受drag消息。开始的位置你肯定知道的了,dbgrid的selectindex属性在dragend事件中你可以用sendmessage发送WM_LBUTTONDOWN 和 WM_LBUTTONUP消息,这样不就是模拟了一次鼠标click?然后你再读取selectindex属性,就可以得到结束时在哪条记录上。满意了吗? 不行的首先,selectedindex取的是列号,不过这没关系,我取tabel.recno就好了但要命的是,dragmode改成dmAutomatic后,dbgrid开始接受drag消息,但是这时鼠标点击后无法选中行了,所以虽然sendmessage了,记录还是在原来的位置上。 unit GridU1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Db, DBTables, Grids, DBGrids, StdCtrls;type TForm1 = class(TForm) MyDBGrid1: TDBGrid; Table1: TTable; DataSource1: TDataSource; Table2: TTable; DataSource2: TDataSource; MyDBGrid2: TDBGrid; procedure MyDBGrid1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure MyDBGrid1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure MyDBGrid1DragDrop(Sender, Source: TObject; X, Y: Integer); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.DFM}var SGC : TGridCoord;procedure TForm1.MyDBGrid1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);var DG : TDBGrid;begin DG := Sender as TDBGrid; SGC := DG.MouseCoord(X,Y); if (SGC.X > 0) and (SGC.Y > 0) then (Sender as TDBGrid).BeginDrag(False);end;procedure TForm1.MyDBGrid1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);var GC : TGridCoord;begin GC := (Sender as TDBGrid).MouseCoord(X,Y); Accept := Source is TDBGrid and (GC.X > 0) and (GC.Y > 0);end;procedure TForm1.MyDBGrid1DragDrop(Sender, Source: TObject; X, Y: Integer);var DG : TDBGrid; GC : TGridCoord; CurRow : Integer;begin DG := Sender as TDBGrid; GC := DG.MouseCoord(X,Y); with DG.DataSource.DataSet do begin with (Source as TDBGrid).DataSource.DataSet do Caption := 'You dragged "'+Fields[SGC.X-1].AsString+'"'; DisableControls; CurRow := DG.Row; MoveBy(GC.Y-CurRow); Caption := Caption+' to "'+Fields[GC.X-1].AsString+'"'; MoveBy(CurRow-GC.Y); EnableControls; end;end;end. delphi7 Richedit 颜色是不是有BUG 各位高手帮帮忙,谢了,在线等答 如何动态改变QReport做的报表的格式 我要找:Hank(星星农场) 怎么调用自己做的.chm文件 使用delphi7的Rave做报表,如何使用 RvRenderRTF 来生成RTF文件,谢谢! 请教reportbuild报表格式问题 IWTemplateProcessorHTML无法显示HTML布局内容 如何增加一个字段? 关于建个人主页 ▲▲▲关于dbgrid的中某一列值可以象combobox一样可以选择值的?在线等!!! 给点意见吧??
那就完全可以实现了
我想通过dbgrid拖动时触发的事件,再修改记录集的index field值来实现
但是找不到相应的事件
我的是一个程序里用到了很多个dbgrid,只有一个需要实现行记录的拖动
所以我想当触发行拖动时,在相应的事件代码中修改记录,然后就实现了行的拖动
这样能行吗?
所以用简单的方法好象是不能实现的了。
我是想点中行然后拖动开始时得到点中行的记录号,然后释放时得到当时鼠标所在行的记录号,然后根据这两个不就可以修改记录和相应的次序吗
这样做也不行吗?
但我不知道行拖动事件何时触发和结束的,触发和结束时各在哪条记录上。
开始的位置你肯定知道的了,dbgrid的selectindex属性
在dragend事件中你可以用sendmessage发送WM_LBUTTONDOWN 和 WM_LBUTTONUP消息,这样不就是模拟了一次鼠标click?然后你再读取selectindex属性,就可以得到结束时在哪条记录上。
满意了吗?
首先,selectedindex取的是列号,不过这没关系,我取tabel.recno就好了
但要命的是,dragmode改成dmAutomatic后,dbgrid开始接受drag消息,但是这时鼠标点击后无法选中行了,所以虽然sendmessage了,记录还是在原来的位置上。
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, Db, DBTables, Grids, DBGrids, StdCtrls;type
TForm1 = class(TForm)
MyDBGrid1: TDBGrid;
Table1: TTable;
DataSource1: TDataSource;
Table2: TTable;
DataSource2: TDataSource;
MyDBGrid2: TDBGrid;
procedure MyDBGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure MyDBGrid1DragOver(Sender, Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean);
procedure MyDBGrid1DragDrop(Sender, Source: TObject;
X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}var
SGC : TGridCoord;procedure TForm1.MyDBGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
DG : TDBGrid;
begin
DG := Sender as TDBGrid;
SGC := DG.MouseCoord(X,Y);
if (SGC.X > 0) and (SGC.Y > 0) then
(Sender as TDBGrid).BeginDrag(False);
end;procedure TForm1.MyDBGrid1DragOver(Sender, Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean);
var
GC : TGridCoord;
begin
GC := (Sender as TDBGrid).MouseCoord(X,Y);
Accept := Source is TDBGrid and (GC.X > 0) and (GC.Y > 0);
end;procedure TForm1.MyDBGrid1DragDrop(Sender, Source: TObject;
X, Y: Integer);
var
DG : TDBGrid;
GC : TGridCoord;
CurRow : Integer;
begin
DG := Sender as TDBGrid;
GC := DG.MouseCoord(X,Y);
with DG.DataSource.DataSet do begin
with (Source as TDBGrid).DataSource.DataSet do
Caption := 'You dragged "'+Fields[SGC.X-1].AsString+'"';
DisableControls;
CurRow := DG.Row;
MoveBy(GC.Y-CurRow);
Caption := Caption+' to "'+Fields[GC.X-1].AsString+'"';
MoveBy(CurRow-GC.Y);
EnableControls;
end;
end;end.