德尔福 - Drag&使用ListView删除

时间:2011-03-22 20:07:10

标签: delphi listview file drag-and-drop handle

晚上好: - )!

我有这个代码使用拖动& 文件的方法

TForm1 = class(TForm)
...
public
    procedure DropFiles(var msg: TMessage ); message WM_DROPFILES;
end;

procedure TForm1.FormCreate(Sender: TObject)
begin
    DragAcceptFiles(ListView1.Handle, True);
end;

procedure TForm1.DropFiles(var msg: TMessage );
var
  i, count  : integer;
  dropFileName : array [0..511] of Char;
  MAXFILENAME: integer;
begin
  MAXFILENAME := 511;
  count := DragQueryFile(msg.WParam, $FFFFFFFF, dropFileName, MAXFILENAME);
  for i := 0 to count - 1 do
  begin
    DragQueryFile(msg.WParam, i, dropFileName, MAXFILENAME);
    Memo1.Lines.Add(dropFileName);
  end;
  DragFinish(msg.WParam);
end;

ListView 的区域是 DragCursor ,但在Memo1 不是任何记录。 当我使用例如 ListBox 和方法 DragAcceptFiles(ListBox1.Handle,True)时,一切都很好。

ListView 属性 DragMode 我设置为 dmAutomatic

谢谢: - )

2 个答案:

答案 0 :(得分:7)

您已为ListView调用DragAcceptFiles,因此Windows将WM_DROPFILES发送到ListView而不是您的表单。您必须从ListView中捕获WM_DROPFILES消息。

  private
    FOrgListViewWndProc: TWndMethod;
    procedure ListViewWndProc(var Msg: TMessage);
  // ...
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Redirect the ListView's WindowProc to ListViewWndProc
  FOrgListViewWndProc := ListView1.WindowProc;
  ListView1.WindowProc := ListViewWndProc;

  DragAcceptFiles(ListView1.Handle, True);
end;

procedure TForm1.ListViewWndProc(var Msg: TMessage);
begin
  // Catch the WM_DROPFILES message, and call the original ListView WindowProc 
  // for all other messages.
  case Msg.Msg of
    WM_DROPFILES:
      DropFiles(Msg);
  else
    if Assigned(FOrgListViewWndProc) then
      FOrgListViewWndProc(Msg);
  end;
end;

答案 1 :(得分:1)

您的问题是,您将列表视图窗口注册为放置目标,但处理表单类中的WM_DROPFILES消息。消息被发送到列表视图控件,您应该在那里处理消息。