Title: How to Drag and Drop Image Files to a Timage Delphi control (from Windows Explorer)
Delphi makes it really easy to implement dragging & dropping into your applications.
Let's say you need to "open" you application to the Windows - allowing it to accept files dragged from the Windows Explorer.
Here's how to accept dragging (and dropping) an image file onto a TImage...
To be able to accept files dropped from the Windows Explorer, you need to let Windows know that your application accepts dropped files (by calling the DragAcceptFiles procedure from the ShellApi unit). Next, you must respond to the drag events by creating a procedure to handle the WM_DROPFILES message. (Hint: Handling Windows Message).
The DragAcceptFiles procedure accepts a Handle as the first parameter. Since the TImage control does not provide a handle you cannot register a TImage to accept files :(
What you *can* do is to:
Place a TImage on a Panel (Image.Align := alClient)
Call DragAcceptFiles for the Panel
Subclass the Panel's WindowProcedure to make it respond to the WM_DROPFILES message
(Try to) load the image file dropeed in the TImage after getting your hands ot the image file name (using the DragQueryFile procedure)
This is the full source of the Form1's unit (where a TImage named Image1 is placed on a TPanel named Panel1):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Image1: TImage;
procedure FormCreate(Sender: TObject) ;
private
originalPanelWindowProc : TWndMethod;
procedure PanelWindowProc (var Msg : TMessage) ;
procedure PanelImageDrop (var Msg : TWMDROPFILES) ;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses ShellApi;
procedure TForm1.FormCreate(Sender: TObject) ;
begin
originalPanelWindowProc := Panel1.WindowProc;
Panel1.WindowProc := PanelWindowProc;
DragAcceptFiles(Panel1.Handle,true) ;
end; (*FormCreate*)
procedure TForm1.PanelWindowProc(var Msg: TMessage) ;
begin
if Msg.Msg = WM_DROPFILES then
PanelImageDrop(TWMDROPFILES(Msg))
else
originalPanelWindowProc(Msg) ;
end; (*PanelWindowProc*)
procedure TForm1.PanelImageDrop(var Msg: TWMDROPFILES) ;
var
numFiles : longInt;
buffer : array[0..MAX_PATH] of char;
begin
numFiles := DragQueryFile(Msg.Drop, $FFFFFFFF, nil, 0) ;
if numFiles 1 then
begin
ShowMessage('You can drop only one image file at a time!') ;
end
else
begin
DragQueryFile(Msg.Drop, 0, @buffer, sizeof(buffer)) ;
try
Image1.Picture.LoadFromFile(buffer) ;
except
on EInvalidGraphic do ShowMessage('Unsupported image file, or not an image!') ;
end;
end;
end; (*PanelImageDrop*)
end.