delphi里的dbgrid能实现行的拖动吗?

hibird 2002-11-06 04:17:42
好象没法拖动啊?我在dbgrid的dragdrop,over,begindrag之类的时间里面都写了showmessage,结果在我选中行然后拖,毫无反应
我是想把选中某行,然后可以把它拖到指定的行数。
...全文
795 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
oop80 2002-11-07
  • 打赏
  • 举报
回复
把dbgrid的DragMode改成dmAutomatic后,dbgrid开始接受drag消息。
开始的位置你肯定知道的了,dbgrid的selectindex属性
在dragend事件中你可以用sendmessage发送WM_LBUTTONDOWN 和 WM_LBUTTONUP消息,这样不就是模拟了一次鼠标click?然后你再读取selectindex属性,就可以得到结束时在哪条记录上。
满意了吗?
wanderung 2002-11-07
  • 打赏
  • 举报
回复
uo
hibird 2002-11-07
  • 打赏
  • 举报
回复
表是按哪个field排序的我是知道的,我只要把表的该field直改成相应数值就好了。
但我不知道行拖动事件何时触发和结束的,触发和结束时各在哪条记录上。
oop80 2002-11-07
  • 打赏
  • 举报
回复
不行的啊,你要知道,表中的记录是没有顺序的。你对一个记录进行修改后不一定能确保它还在原来的位置,即使不修改它的位置也有可能改变。
hibird 2002-11-07
  • 打赏
  • 举报
回复
我是想改table的内容啊
我是想点中行然后拖动开始时得到点中行的记录号,然后释放时得到当时鼠标所在行的记录号,然后根据这两个不就可以修改记录和相应的次序吗
这样做也不行吗?
oop80 2002-11-07
  • 打赏
  • 举报
回复
dbgrid和table或者query相联,它里面的顺序也就是query和table里的顺序,也就是select出来的顺序,数据库原理里有一条是元组没有顺序的说。
所以用简单的方法好象是不能实现的了。
hibird 2002-11-07
  • 打赏
  • 举报
回复
你说的不还是重写控件吗?
我的是一个程序里用到了很多个dbgrid,只有一个需要实现行记录的拖动
所以我想当触发行拖动时,在相应的事件代码中修改记录,然后就实现了行的拖动
这样能行吗?
F1OnEverest 2002-11-07
  • 打赏
  • 举报
回复
不改控件,通过程序代码实现可以啊,哈哈,不过你还是要继承dbgrid ,然后写代码实现之,很少见过有这样需求的,列的拖动是有
hibird 2002-11-07
  • 打赏
  • 举报
回复
谢谢,虽然运行结果和我想得不太一样,但我知道怎么回事了
马上结贴。
伯猿虫 2002-11-07
  • 打赏
  • 举报
回复
unit GridU1;

interface

uses
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.

hibird 2002-11-07
  • 打赏
  • 举报
回复
不行的
首先,selectedindex取的是列号,不过这没关系,我取tabel.recno就好了
但要命的是,dragmode改成dmAutomatic后,dbgrid开始接受drag消息,但是这时鼠标点击后无法选中行了,所以虽然sendmessage了,记录还是在原来的位置上。
hibird 2002-11-06
  • 打赏
  • 举报
回复
能不改控件,通过程序代码实现吗?
我想通过dbgrid拖动时触发的事件,再修改记录集的index field值来实现
但是找不到相应的事件
pdbird 2002-11-06
  • 打赏
  • 举报
回复
同意楼上,你可以自己改写Tdbgrid
那就完全可以实现了
jiaclassmate 2002-11-06
  • 打赏
  • 举报
回复
用STringGrid写吧。
ddvboy 2002-11-06
  • 打赏
  • 举报
回复
不可以的!
除非你在程序中用代码实现!
或去找找有没有这类型的控件

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧