Delphi - 使用ListView实现拖放功能

4

晚上好 :-)!

我有这段代码可以使用拖放方法来处理文件

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

谢谢 :-)


1
“不起作用”并不能清晰描述您遇到的问题。请详细阐述您的问题,并不要忘记包括任何意外行为的完整描述,包括您看到的和想要看到的内容。如果涉及到任何错误或异常,请同时包括错误消息和异常类名。 - jachguate
不要发布重复的问题。 - Tim Post
@jachguate:谢谢,DropFiles方法可能什么也没做,但没有任何错误。 - Nanik
@Tim Post:抱歉,这是刷新页面的问题。我不知道如何删除第二篇帖子? - Nanik
现在有一些答案解释了这个问题。为了更好的生产解决方案,您可能希望考虑对列表视图进行子类化,以便以不那么hacky的方式修改其消息处理。 - David Heffernan
2个回答

8

您已经为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;

感谢您的解决方案 :-)! - Nanik

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接