Прием файлов из Program Manager II
Для осуществления функции drag/drop из File Manager, вы должны "зарегистрировать" дескриптор принимаемой формы (свойство Handle) Windows API функцией
DragAcceptFiles(Handle, True); |
После этого вы сможете получать сообщения WM_DROPFILES при перетаскивании файлов из File Manager в вашу форму. Для "отключения" этой характеристики необходимо вторично вызвать ту же API функцию, но со вторым параметром равным False.
Для получения имен перетаскиваемых файлов необходимо воспользоваться Windows функцией DragQueryFile, для получения информации при окончании операции Drag/Drop воспользуйтесь функцией DragFinish. DragQueryPt подскажет вам в каком месте формы былы "брошены" перетаскиваемые файлы.
Вам необходимо принимать файлы даже при свернутой форме? Для этого нужно дополнительно создать обработчик события OnMessage объекта Application. Нижеприведенный пример предполагает, что на форме имеется компонент ListBox, свойство Align которого установлено в alClient:
...
{ Private declarations }
procedure WMDropFiles(VAR Msg: TWMDropFiles);
message WM_DROPFILES;
procedure AppOnMessage(VAR Msg: TMsg;
VAR Handled : Boolean);
... implementation USES ShellApi; ... procedure TForm1.WMDropFiles(VAR Msg: TWMDropFiles); VAR N : Word; buffer : ARRAY[0..80] OF Char; BEGIN WITH Msg DO BEGIN FOR N := 0 TO DragQueryFile(Drop, $FFFF, buffer, 80)-1 DO BEGIN DragQueryFile(Drop, N, Buffer, 80); ListBox1.Items.Add(StrPas(Buffer)); END; DragFinish(Drop); END; END; procedure TForm1.AppOnMessage(VAR Msg: TMsg; VAR Handled : Boolean); VAR WMD : TWMDropFiles; BEGIN IF Msg.message = WM_DROPFILES then BEGIN MessageBeep(0); WMD.Msg := Msg.message; WMD.Drop := Msg.wParam; WMD.Unused := Msg.lParam; WMD.Result := 0; WMDropFiles(WMD); Handled := TRUE; END; END; procedure TForm1.FormCreate(Sender: TObject); begin DragAcceptFiles(Handle, True); DragAcceptFiles(Application.Handle, True); Application.OnMessage := AppOnMessage; end; |
[000466]