Author: Pablo Reyes
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.
1 interface
2
3 procedure WMDROPFILES(var Msg: TMessage);
4
5 implementation
6
7 procedure TForm1.WMDROPFILES(var Msg: TMessage);
8 var
9 pcFileName: PChar;
10 i, iSize, iFileCount: integer;
11 begin
12 pcFileName := ''; // to avoid compiler warning message
13 iFileCount := DragQueryFile(Msg.WParam, $FFFFFFFF, pcFileName, 255);
14 for i := 0 to iFileCount - 1 do
15 begin
16 iSize := DragQueryFile(Msg.wParam, 0, nil, 0) + 1;
17 pcFileName := StrAlloc(iSize);
18 DragQueryFile(Msg.WParam, i, pcFileName, iSize);
19 if FileExists(pcFileName) then
20 AddFile(pcFileName); // method to add each file
21 StrDispose(pcFileName);
22 end;
23 DragFinish(Msg.WParam);
24 end;
2. Second, a WindowProc method to replace ListBox1 WindowProc default method and a
variable to store ListBox1 WindowProc default method.
25 interface
26
27 procedure LBWindowProc(var message: TMessage);
28
29 implementation
30
31 var
32 OldLBWindowProc: TWndMethod;
33
34 procedure TForm1.LBWindowProc(var message: TMessage);
35 begin
36 if message.Msg = WM_DROPFILES then
37 WMDROPFILES(message); // handle WM_DROPFILES message
38 OldLBWindowProc(message);
39 // call default ListBox1 WindowProc method to handle all other messages
40 end;
3. In Form1 OnCreate event, initialize all.
41
42 procedure TForm1.FormCreate(Sender: TObject);
43 begin
44 OldLBWindowProc := ListBox1.WindowProc; // store defualt WindowProc
45 ListBox1.WindowProc := LBWindowProc; // replace default WindowProc
46 DragAcceptFiles(ListBox1.Handle, True); // now ListBox1 accept dropped files
47 end;
4. In Form1 OnDestroy event, uninitialize all. Not necesary but a good practice.
48
49 procedure TForm1.FormDestroy(Sender: TObject);
50 begin
51 ListBox1.WindowProc := OldLBWindowProc;
52 DragAcceptFiles(ListBox1.Handle, False);
53 end;
5. To complete source code, the AddFile method.
54
55 interface
56
57 procedure AddFile(sFileName: string);
58
59 implementation
60
61 procedure TForm1.AddFile(sFileName: string);
62 begin
63 ListBox1.Items.Add(sFilename);
64 end;
6. Do not forget to add ShellAPI unit to the uses clause.
|