unit UDrag;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Label1: TLabel;
    Image1: TImage;
    Label2: TLabel;
    RichEdit1: TRichEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ListBox1DblClick(Sender: TObject);
  private
    { Private declarations }
    procedure WMDROPFILES(var Msg: TMessage); message WM_DROPFILES;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses ShellAPI;

procedure TForm1.WMDROPFILES(var Msg: TMessage);
var Filename: array[0 .. 256] of Char;
    Count, i: integer;
begin
 // число перетащенных файлов
 Count := DragQueryFile(Msg.WParam, $FFFFFFFF, Filename, SizeOf(Filename));
 ListBox1.Clear;
 // цикл по файлам
 for i:=0 to Count - 1 do
 begin
 // запрос имени файла
  DragQueryFile(Msg.WParam,i,Filename,SizeOf(Filename));
  ListBox1.Items.Add(Filename);
 end;
 // завершение перетаскивания
 DragFinish(Msg.WParam);
 ListBox1.ItemIndex := 0;
 // уход на загрузку файла
 ListBox1DblClick(Form1);
 end;
procedure TForm1.FormCreate(Sender: TObject);
// регистрация формы как приемника файлов
begin
 DragAcceptFiles(Handle, True);
end;

procedure TForm1.FormDestroy(Sender: TObject);
// снятие формы с регистрации
begin
 DragAcceptFiles(Handle, False);
end;

procedure TForm1.ListBox1DblClick(Sender: TObject);
// открытие файла
var ext: string;
begin
 ext := LowerCase(ExtractFileExt(ListBox1.Items[ListBox1.ItemIndex]));
 if (ext = '.txt') or (ext = '.rtf')
  then begin
   RichEdit1.Lines.LoadfromFile(ListBox1.Items[ListBox1.ItemIndex]);
   Image1.Hide;
   RichEdit1.Show;
  end
  else if (ext = '.bmp')
   then begin
    Image1.Picture.LoadfromFile(ListBox1.Items[ListBox1.ItemIndex]);
    RichEdit1.Hide;
    Image1.Show;
   end
  else begin
    ShellExecute(Handle, nil, PChar(ListBox1.Items[ListBox1.ItemIndex]),
                      nil, nil, SW_RESTORE);
    RichEdit1.Hide;
    Image1.Hide;
   end;
end;

end.
