好象没法拖动啊?我在dbgrid的dragdrop,over,begindrag之类的时间里面都写了showmessage,结果在我选中行然后拖,毫无反应
我是想把选中某行,然后可以把它拖到指定的行数。

解决方案 »

  1.   

    同意楼上,你可以自己改写Tdbgrid
    那就完全可以实现了
      

  2.   

    能不改控件,通过程序代码实现吗?
    我想通过dbgrid拖动时触发的事件,再修改记录集的index field值来实现
    但是找不到相应的事件
      

  3.   

    不改控件,通过程序代码实现可以啊,哈哈,不过你还是要继承dbgrid ,然后写代码实现之,很少见过有这样需求的,列的拖动是有
      

  4.   

    你说的不还是重写控件吗?
    我的是一个程序里用到了很多个dbgrid,只有一个需要实现行记录的拖动
    所以我想当触发行拖动时,在相应的事件代码中修改记录,然后就实现了行的拖动
    这样能行吗?
      

  5.   

    dbgrid和table或者query相联,它里面的顺序也就是query和table里的顺序,也就是select出来的顺序,数据库原理里有一条是元组没有顺序的说。
    所以用简单的方法好象是不能实现的了。
      

  6.   

    我是想改table的内容啊
    我是想点中行然后拖动开始时得到点中行的记录号,然后释放时得到当时鼠标所在行的记录号,然后根据这两个不就可以修改记录和相应的次序吗
    这样做也不行吗?
      

  7.   

    表是按哪个field排序的我是知道的,我只要把表的该field直改成相应数值就好了。
    但我不知道行拖动事件何时触发和结束的,触发和结束时各在哪条记录上。
      

  8.   

    把dbgrid的DragMode改成dmAutomatic后,dbgrid开始接受drag消息。
    开始的位置你肯定知道的了,dbgrid的selectindex属性
    在dragend事件中你可以用sendmessage发送WM_LBUTTONDOWN 和 WM_LBUTTONUP消息,这样不就是模拟了一次鼠标click?然后你再读取selectindex属性,就可以得到结束时在哪条记录上。
    满意了吗?
      

  9.   

    不行的
    首先,selectedindex取的是列号,不过这没关系,我取tabel.recno就好了
    但要命的是,dragmode改成dmAutomatic后,dbgrid开始接受drag消息,但是这时鼠标点击后无法选中行了,所以虽然sendmessage了,记录还是在原来的位置上。
      

  10.   

    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.