Как перетаскивать файлы?

=== Как перетаскивать файлы? ===
как принимать "перетаскиваемые" файлы.
* При получении программой файлов, окну посылается сообщение WM_DROPFILES. 
* При помощи функции DragQueryFile можно определить количество и имена файлов. 
* При помощи функции DragQueryPoint можно определить координату мыши в тот момент, когда пользователь "отпустил" файлы.
Эта программа открывает все "перетащенные" в нее файлы. 
Причем, если пользователь перетащил файлы в PageControl1, то в PageControl1 эти файлы и откроются. 
...
 public
 procedure WMDropFiles(var Msg: TWMDropFiles);
 message WM_DROPFILES;
 end;
var
 Form1: TForm1;
implementation
{$R *.DFM}
uses ShellAPI, stdctrls;
procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
 HF: THandle;
 s: array [0..1023] of Char;
 i, FileCount: Integer;
 p: TPoint;
 ts: TTabSheet;
 memo: TMemo;
begin
 HF := Msg.Drop;
 FileCount := DragQueryFile(HF, $FFFFFFFF, nil, 0);
 for i := 0 to FileCount - 1 do
 begin
 DragQueryFile(HF, i, s, SizeOf(s));
 ts := TTabSheet.Create(nil);
 DragQueryPoint(HF, p);
 if PtInRect(PageControl1.BoundsRect, p) then
 ts.PageControl := PageControl1
 else
 ts.PageControl := PageControl2;
 ts.Caption := ExtractFileName(s);
 memo := TMemo.Create(nil);
 memo.Parent := ts;
 memo.Align := alClient;
 memo.Lines.LoadFromFile(s);
 end;
 DragFinish(HF);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
 PageControl1.Align := alLeft;
 PageControl2.Align := alClient;
 DragAcceptFiles(Form1.Handle, true);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
 DragAcceptFiles(Form1.Handle, false);
end;
 На сайте http://delphi4all.narod.ru Вы найдете еще более 100 советов по Delphi.
 Email: delphi4all@narod.ru
Author: Даниил Карапетян
ID: 00363
----
{ На эту форму можно бросить файл (например из проводника) 
 и он будет открыт }
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, 
 Controls, Forms, Dialogs,StdCtrls, 
 ShellAPI {обязательно!};
type
 TForm1 = class(TForm)
 Memo1: TMemo;
 FileNameLabel: TLabel;
 procedure FormCreate(Sender: TObject);
 procedure FormDestroy(Sender: TObject);
 protected
 {Это и есть самая главная процедура}
 procedure WMDropFiles(var Msg: TMessage); message wm_DropFiles; 
end;
var
 Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMDropFiles(var Msg: TMessage);
var 
 Filename: array[0 .. 256] of Char;
 Count: Integer;
begin
 { Получаем количество файлов (просто пример) }
 nCount := DragQueryFile(msg.WParam, $FFFFFFFF, acFileName, cnMaxFileNameLen);
 { Получаем имя первого файла }
 DragQueryFile( THandle(Msg.WParam),
 0, { это номер файла }
 Filename, SizeOf(Filename));
 { Открываем его }
 with FileNameLabel do
 begin
 Caption := LowerCase(StrPas(FileName));
 Memo1.Lines.LoadfromFile(Caption);
 end;
 { Отдаем сообщение о завершении процесса }
 DragFinish(THandle(Msg.WParam));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
 { Говорим Windows, что на нас можно бросать файлы }
 DragAcceptFiles(Handle, True); 
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
 { Закрываем за собой дверь золотым ключиком}
 DragAcceptFiles(Handle, False); 
end;
end.
Source: http://dmitry9.nm.ru/info/
ID: 00364
----
Большинство программ, предназначенных для работы с текстом, предоставляют пользователю возможность перетаскивать файлы в свою программу, а мы что лысые... :-)) ...щас тоже организуем: 
Подключаем модуль ShellAPI в области uses 
По созданию окна [событие OnCreate] пишем такой код: 
DragAcceptFiles(Handle, true);
Когда вы перетаскиваете файл на своё приложение и отпускаете кнопку мыши, Windows посылает этому окну сообщение wm_DropFiles. Сообщение сопровождается именем файла. Обработчик этого сообщения нужно включить в раздел protected класса формы. Вставьте следующий код: 
protected
 procedure WMDropFiles (var Msg: TMessage); message wm_DropFiles;
Далее обрабатываем сообщение: 
procedure TForm1.WMDropFiles(var Msg: TMessage);
var
 FileName: array[0..256] of char;
begin
 DragQueryFile(THandle(Msg.WParam), 0, FileName, SizeOf(Filename));
 Memo1.Lines.LoadFromFile(FileName);
 DragFinish(THandle(Msg.WParam));
end;
или так: 
procedure TForm1.WMDROPFILES(var Msg: TMessage);
var
 i, Amount, Size: Integer;
 Filename: PChar;
begin
 inherited;
 Amount := DragQueryFile(Msg.WParam, $FFFFFFFF, Filename, 255);
 for i := 0 to (Amount - 1) do
 begin
 Size := DragQueryFile(Msg.WParam, i, nil, 0) + 1;
 Filename := StrAlloc(Size);
 DragQueryFile(Msg.WParam, i, Filename, Size);
 ListBox1.Items.Add(StrPas(Filename));
 StrDispose(Filename);
 end;
 DragFinish(Msg.WParam);
end;
Source: http://delphiworld.narod.ru/
ID: 00720
Category:VCL
Category:DragAndDrop
Category:Файлы