Советы по Delphi


Прием файлов из 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]



Содержание раздела