Программирование в Delphi
«Любой дурак может написать программу, которую поймет компилятор. Хорошие программисты пишут программы, которые смогут понять другие программисты»
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

Обратная связь