(1) DBGrid 在Mouse按下时,会选中当前记录,因此实现OnMouseDown如下:
procedure TCmpList.ListGridMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if not(ssDouble in Shift) then
  begin
    ListGrid.BeginDrag(false,5);
  end;
end;
ListGrid为TDBGrid类型的实体。(2)实现TTreeView/TListView的OnDragOver事件,以指定是否接受拖过来的值。
procedure TMchForm.FDTDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  if Source is TDBGrid then  //您可以再加入其它条件
      Accept := true;
end;(3) 最重要的,是要实现TTreeView/TListView的OnDragDrop事件。procedure TMchForm.FDTDragDrop(Sender, Source: TObject; X, Y: Integer);
var
  s: String;
  ListItem: TListItem;
  i,j: Integer;begin
    with Source as TDBGrid do
    begin      if SelectedRows.Count>0 then
      with DataSource.DataSet do
        for i:=0 to DBGrid1.SelectedRows.Count-1 do
        begin
          GotoBook(pointer(DBGrid1.SelectedRows.Items[i]));
          for j := 0 to FieldCount-1 do
          begin            if (j>0) then s:=s+', ';
            s:=s+Fields[j].AsString;
          end;
          with ListView1 do
          begin
            ListItem := Items.Add;
            ListItem.Caption := s;
          end;
          s:= '';
        end;
      end;end;

解决方案 »

  1.   

    谢谢Muf,程序思路很清楚,但我为什么拉DbGrid不动?
      

  2.   

    一旦把DragMode设作 Auto,就没法拖动了~为什么为什么?
      

  3.   

    真要命,Muf兄,各位高手,帮忙阿!UP!UP!
      

  4.   

    procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
      Accept := Source is TDBGrid;
    end;procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
    var
      Node: TTreeNode;
    begin
      Node := TreeView1.GetNodeAt(X, Y);
      TreeView1.Items.AddChild(Node,ADOTable1.Fields[0].AsString);
      if Assigned(Node) then
        Node.Expand(True);
    end;procedure TForm1.DBGrid1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
      Accept := Source is TDBGrid;
    end;procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if ssLeft in Shift then
        DBGrid1.BeginDrag(True);
    end;