Как организовать Drag&Drop из менеджера файлов?
Как организовать Drag&Drop из менеджера файлов?
Как организовать Drag&Drop из менеджера файлов? Чтобы организовать Drag&Drop, добавьте в вашу форму обработку системного сообщения WM_DROPFILES. Следующий код нужно поместить в защищенную секцию деклараций вашей формы: ... procedure WMDropFiles(var msg : TMessage); message WM_DROPFILES; ... Вы можете активировать процесс drag&drop как обычно, вызовом DragAcceptFiles() в событии OnCreate, and дезактивировать повторным вызовом DragAcceptFiles() по событиям OnClose или OnDestroy. Вот этот код: procedure TForm1.WMDropFiles(var msg : TMessage); var i, n : word; size : word; fname : string; hdrop : word; begin {1. Получаем хэндл для drop.} hdrop := msg.WParam; {2. Определяем количество файлов для drop.} n := DragQueryFile(hdrop, $ffff, nil, 0); {3. В цикле читаем их имена с полными путями.} for i := 0 to (n - 1) do begin {4. Получаем размер файла.} size := DragQueryFile(hdrop, i, nil, 0); {5. Проверяем, чтбы общая длина имени не превышала 255 символов} if size < 255 then begin fname[0] := Chr(size); {6. Берем очередной файл.} DragQueryFile(hdrop, i, @fname[1], size + 1); {-- Повторяем для всех файлов. --} end; end; {7. Возвращаем признак завершения - ноль.} msg.Result := 0; {8. Выполняем "родной" обработчик.} inherited; end; procedure TForm1.FormCreate(Sender: TObject); begin DragAcceptFiles(Handle, true); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin DragAcceptFiles(Handle, false); end; Не забывайте, что не всякий TWinControl способен принять "брошенный" на него файл. ***************************************************************************** { На эту форму можно бросить файл (например из проводника) и он будет открыт } unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, ShellAPI {обязательно!}; type TForm1 = class(TForm) Memo1: TMemo; FileNameLabel: TLabel; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); protected {Это и есть самая главная процедура} procedure WMDropFiles(var Msg: TMessage); message wm_DropFiles; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.WMDropFiles(var Msg: TMessage); var Filename: array[0 .. 256] of Char; Count : integer; begin { Получаем количество файлов (просто пример) } nCount := DragQueryFile( msg.WParam, $FFFFFFFF, acFileName, cnMaxFileNameLen); { Получаем имя первого файла } DragQueryFile( THandle(Msg.WParam), 0, { это номер файла } Filename,SizeOf(Filename) ) ; { Открываем его } with FileNameLabel do begin Caption := LowerCase(StrPas(FileName)); Memo1.Lines.LoadfromFile(Caption); end; { Отдаем сообщение о завершении процесса } DragFinish(THandle(Msg.WParam)); end; procedure TForm1.FormCreate(Sender: TObject); begin { Говорим Windows, что на нас можно бросать файлы } DragAcceptFiles(Handle, True); end; procedure TForm1.FormDestroy(Sender: TObject); begin { Закрываем за собой дверь золотым ключиком} DragAcceptFiles(Handle, False); end; end.