Wednesday, January 5, 2011

File Manager Drag/Drop


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 protectedsection:

    ...
    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 stuffon a form.  Any windowed control that has an HWnd handle
(descendants of TWinControl) should be able to accept
dropped files.
I hope this answers your question.
--Mark Johnson

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Kang Iwan K-sev | Thank's for your visit To My Site - Ridwan Mulyana | Cibeureum