To use File Manager Drag & Drop, add a method to your form that
handles the WM_DROPFILES message. For example, the following
would be placed in the TForm1 declaration in the protected
section:
...
procedure WMDropFiles(var msg : TMessage); message WM_DROPFILES;
...
You would typically activate file drag & drop by calling
DragAcceptFiles() in the OnCreate event, and turn it off
with a subsequent call to DragAcceptFiles() in the OnClose
or OnDestroy events. The code follows:
procedure TForm1.WMDropFiles(var msg : TMessage);
var
i, n : word;
size : word;
fname : string;
hdrop : word;
begin
{1. Get the drop handle.}
hdrop := msg.WParam;
{2. Find out how many files were dropped by passing $ffff in arg #2.}
n := DragQueryFile(hdrop, $ffff, nil, 0);
{3. Loop through, reading in the filenames (w/full paths).}
for i := 0 to (n - 1) do begin
{4. Get the size of the filename string by passing 0 in arg #4.}
size := DragQueryFile(hdrop, i, nil, 0);
{5. Make sure it won't overflow our string (255 char. limit)}
if size < 255 then begin
fname[0] := Chr(size);
{6. Get the dropped filename.}
DragQueryFile(hdrop, i, @fname[1], size + 1);
{-- Do whatever you want to do with fname. --}
end;
end;
{7. Return zero.}
msg.Result := 0;
{8. Let the inherited message handler (if there is one) go at it.}
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;
Keep in mind that you don't have to put all of this stuff
on a form. Any windowed control that has an HWnd handle
(descendants of TWinControl) should be able to accept
dropped files.