Accept dropped files from the explorer (Views: 454)
Problem/Question/Abstract: This way you can drag and drop files to a specific control in a Delphi form Answer: Just create a project and add a ListBox component to Form1. 1. First, a procedure to handle the message but without handling it. interface procedure WMDROPFILES(var Msg: TMessage); implementation procedure TForm1.WMDROPFILES(var Msg: TMessage); var pcFileName: PChar; i, iSize, iFileCount: integer; begin pcFileName := ''; // to avoid compiler warning message iFileCount := DragQueryFile(Msg.WParam, $FFFFFFFF, pcFileName, 255); for i := 0 to iFileCount - 1 do begin iSize := DragQueryFile(Msg.wParam, 0, nil, 0) + 1; pcFileName := StrAlloc(iSize); DragQueryFile(Msg.WParam, i, pcFileName, iSize); if FileExists(pcFileName) then AddFile(pcFileName); // method to add each file StrDispose(pcFileName); end; DragFinish(Msg.WParam); end; 2. Second, a WindowProc method to replace ListBox1 WindowProc default method and a variable to store ListBox1 WindowProc default method. interface procedure LBWindowProc(var Message: TMessage); implementation var OldLBWindowProc: TWndMethod; procedure TForm1.LBWindowProc(var Message: TMessage); begin if Message.Msg = WM_DROPFILES then WMDROPFILES(Message); // handle WM_DROPFILES message OldLBWindowProc(Message); // call default ListBox1 WindowProc method to handle all other messages end; 3. In Form1 OnCreate event, initialize all. procedure TForm1.FormCreate(Sender: TObject); begin OldLBWindowProc := ListBox1.WindowProc; // store defualt WindowProc ListBox1.WindowProc := LBWindowProc; // replace default WindowProc DragAcceptFiles(ListBox1.Handle, True); // now ListBox1 accept dropped files end; 4. In Form1 OnDestroy event, uninitialize all. Not necesary but a good practice. procedure TForm1.FormDestroy(Sender: TObject); begin ListBox1.WindowProc := OldLBWindowProc; DragAcceptFiles(ListBox1.Handle, False); end; 5. To complete source code, the AddFile method. interface procedure AddFile(sFileName: string); implementation procedure TForm1.AddFile(sFileName: string); begin ListBox1.Items.Add(sFilename); end; 6. Do not forget to add ShellAPI unit to the uses clause. Component Download: DroppedFiles.zip |