Delphi - перетаскивание с помощью ListView
Добрый вечер:-)!
У меня есть этот код для использования метода Drag & Drop для файлов:
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 ответа
Решение
Вы вызвали DragAcceptFiles для ListView, поэтому Windows отправляет WM_DROPFILES в ваш ListView, а не в вашу форму. Вы должны поймать сообщение WM_DROPFILES из ListView.
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;
Ваша проблема в том, что вы регистрируете окно просмотра списка в качестве цели удаления, но обрабатываете WM_DROPFILES
сообщение в форме класса. Сообщение отправляется в элемент управления представлением списка, вы должны обработать сообщение там.