Jak obsłużyć upuszczanie plików na formę?

Należy skorzystać z komunikatu wm_DropFiles. Ma to tą zaletę, że zadziała nawet w Delphi 1.

uses
  ShellAPI; {obsługa D&D}

....

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := AppMessage;
  DragAcceptFiles (Handle, True);
end; {mówimy systemowi że chcemy obsłużyć D&D}

procedure TForm1.WMDropFiles (hDrop : THandle; hWindow : HWnd);
Var
  TotalNumberOfFiles,
  nFileLength : Integer;
  pszFileName : PChar;
  i : Integer;

Begin
  //liczba zrzuconych plików
  TotalNumberOfFiles := DragQueryFile (hDrop , $FFFFFFFF, Nil, 0); 

  for i := 0 to TotalNumberOfFiles - 1 do begin
    nFileLength := DragQueryFile (hDrop, i , Nil, 0) + 1;
    GetMem (pszFileName, nFileLength);
    DragQueryFile (hDrop , i, pszFileName, nFileLength);

    //pszFileName - nazwa upuszczonego pliku
    //tutaj robimy coś z nazwą pliku

    FreeMem (pszFileName, nFileLength);
  end;

  DragFinish (hDrop);
end; //sprawdzamy co zostało przeciągnięte i obsługujemy to

procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
  case Msg.Message of
    WM_DROPFILES :  WMDropFiles (Msg.wParam, Msg.hWnd);
  end;
end; //obsługujemy komunikat WM_DROPFILES 

procedure TForm1.FormClose (Sender: TObject; var Action: TCloseAction);
begin
  DragAcceptFiles (Handle, False);
end; //dziękujemy

Źródło informacji: Artur Prokopiuk.