1. Home
  2. Computing & Technology
  3. Delphi Programming

How to Drop Images from Windows Explorer to a TImage control

By Zarko Gajic, About.com

Drop Images on a TImage

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:

  1. Place a TImage on a Panel (Image.Align := alClient)
  2. Call DragAcceptFiles for the Panel
  3. Subclass the Panel's WindowProcedure to make it respond to the WM_DROPFILES message
  4. (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.

Delphi tips navigator:
» How to Parse a Delimited String Into a String List
« How to change the default Windows printer from Delphi code

More Delphi Programming Quick Tips
Explore Delphi Programming
About.com Special Features

Stay connected and entertained with reviews on tips on the latest HDTVs, cellphones and more. More >

Easy ways to connect two computers for networking purposes. More >

  1. Home
  2. Computing & Technology
  3. Delphi Programming
  4. Using VCL Components
  5. TImage
  6. How to Drag and Drop Image Files to a Timage Delphi control (from Windows Explorer)

©2009 About.com, a part of The New York Times Company.

All rights reserved.