«Машины должны работать. Люди должны думать»
64. Перетаскивание файлов между приложениями
Решение этой задачи иллюстрирует проект DrgDrpFiles.dpr, листинг главного и единственного модуля представлен ниже.
Unit Main;
{ Иллюстрация перетаскивания файлов на форму. Для достижения этого
результата надо проделать следующее:
1. Создать обычный проект
2. Подключить модуль ShellAPI, в котором объявлены необходимые функции
3. Вызвать функцию WinAPIDragAcceptFiles, например, в обработчике
события FormCreate. Тем самым мы уведомляем Windows о готовности
нашего приложения принимать файлы
4. Создать свой собственный обработчик сообщения WindowsWM_DROPFILES,
который будет вызываться при перетаскивании объектов в окно нашего
приложения
5. С целью тестирования добавить на форму какой-нибудь компонент, например,
TMemo, для вывода в него имен перетаскиваемых файлов
С помощью функции WinAPIDragQueryPoint можно узнать координаты
курсора мыши в момент отпускания кнопки мыши, т.е. при завершении перетаскивания.
@В.Н.Овсянник 2004г.}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShellAPI;
type
TForm1 = class(TForm)
Memo1: TMemo;
Procedure FormCreate(Sender: TObject);
Procedure WMDropFiles(var Message: TWMDROPFILES); message
WM_DROPFILES;
end;
var Form1: TForm1;
implementation
{$R *.dfm}
Procedure TForm1.FormCreate(Sender: TObject);
Begin
{Сообщаем Windows о готовности принимать файлы}
DragAcceptFiles(
Form1.Handle, {дескриптор окна, которое будет принимать файлы}
True {true - будет, false - не будет}
);
End;
{TForm1.WMDropFiles - обработчик сообщения WindowsWM_DROPFILES,
который вызывается при перетаскивании объектов в окно нашего приложения}
Procedure TForm1.WMDropFiles(var Message: TWMDROPFILES);
var
NumFiles : longint;
i : longint;
buffer : array[0..255] of char;
Begin
{С помощью функции DragQueryFile получаем число перетаскиваемых файлов}
NumFiles := DragQueryFile(
Message.Drop, {Идентификатор записи,
содержащей имена перетаскиваемых файлов}
$ffffffff, { Индекс файла в запросе. Если значение этого параметра
равно $ffffffff, то функция возвращает число перетаскиваемых
файлов. Если значение этого параметра находится в диапазоне
от 0 до общего числа перетаскиваемых файлов, то функция
копирует имя файла (в формате строки с завершающим нулем)
с указанным индексом по адресу, заданному в следующем
параметре}
nil, { Адрес буфера для получения имени файла. Имя файла возвращается в
формате строки с завершающим нулем. Если этот параметр равен nil
и второй параметр не равен $ffffffff, то функция возвращает
требуемый размер буфера}
0 { Размер буфера, заданного предыдущим параметром, в байтах}
);
{С помощью все той же функции DragQueryFile извлекаем имена перетаскиваемых
файлов и добавляем их в компонент TMemo}
for i := 0 to (NumFiles - 1) do
begin
DragQueryFile( Message.Drop,
i, {индекс файла}
@buffer,{адрес буфера}
SizeOf(buffer) {размер буфера в байтах}
);
Form1.Memo1.Lines.Add(buffer);
end;
End;
END.
«63. Управление OLE-объектом, находящимся в контейнере»
65. Механизм Drag and Drop