Via Cà Matta 2 - Peschiera Borromeo (MI)
+39 02 00704272
info@synaptica.info

Delphi – Drag & Drop from shell

Digital Innovation Partner

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 :


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.

Lascia un commento