Delphi – Drag & Drop from shell
Per gestire il drag&drop da shell in Delphi avevamo già scritto un articolo molto tempo fa : http://www.synaptica.info/2008/09/02/delphi-drag-drop-from-shell-idroptarget-interface/ in cui c’era un esempio di come implementare questa tecnologia utilizzando il componente “JvDropTarget” della libreria jvcl.
Credo che l’utilizzo di JvDropTarget sia ancora la soluzione più semplice, di seguito per completezza riportiamo invece il codice di esempio per fare la stessa cosa utilizzando la libreria “ShellAPI” di Delphi (che altro non è che un remapping delle librerie Windows).
Esempio di drag & drop da shell, in cui viene abilitato il componente Panel1 (TPanel) ad accettare il messggio di drag dalla shell e compila le righe del memo con l’elenco di file ricevuti :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Panel1: TPanel; Memo1: TMemo; JvDropTarget1: TJvDropTarget; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } originalPanelWindowProc : TWndMethod; procedure PanelWindowProc(var Msg: TMessage) ; procedure PanelImageDrop (var Msg : TWMDROPFILES) ; end; var Form1: TForm1; implementation {$R *.dfm} uses ShellApi; procedure TForm1.PanelWindowProc(var Msg: TMessage) ; begin if Msg.Msg = WM_DROPFILES then PanelImageDrop(TWMDROPFILES(Msg)) else originalPanelWindowProc(Msg) ; end; (*PanelWindowProc*) procedure TForm1.FormCreate(Sender: TObject); begin originalPanelWindowProc := Panel1.WindowProc; Panel1.WindowProc := PanelWindowProc; DragAcceptFiles(Panel1.Handle,true) ; end; procedure TForm1.PanelImageDrop(var Msg: TWMDROPFILES); var numFiles : longInt; buffer : array[0..MAX_PATH] of char; i : Integer; begin numFiles := DragQueryFile(Msg.Drop, $FFFFFFFF, nil, 0) ; For i:=0 to numFiles-1 do begin DragQueryFile(Msg.Drop, i, @buffer, sizeof(buffer)) ; try Memo1.Lines.Add(buffer); // Image1.Picture.LoadFromFile(buffer) ; except on EInvalidGraphic do ShowMessage('Unsupported image file, or not an image!') ; end; end; end; (*PanelImageDrop*) end. |