Библиотека программиста

«Очень важно не прерывать вопросов. Любопытство имеет свое право на существование»

Альберт Эйнштейн

Главная страница > Технология COM > 64. Перетаскивание файлов между приложениями

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