Перетаскивание файлов на форму

Предводителев Сергей

В этой статья я расскажу, как реализовать перетаскивание файлов на форму… Рассмотрим на примере текстового редактора с многооконным интерфейсом, при перетаскивании файлов на главную форму которого будут открываться MDI-окна с уже открытыми в них файлами. Не будем далеко ходить, возьмем текстовый редактор из примеров, которые поставляются вместе с Delphi, и дополним его.

Итак, для начала надо зарегистрировать окно для приема файлов, для этого в обработчике onCreate для главной формы напишем следующий код:

DragAcceptFiles(FrameForm. Handle, True);

Эта функция оп7исана в библиотеке ShellAPI, поэтому не забудьте его добавить в раздел uses. Первый параметр функции – handle регистрируемого окна, второй параметр – определяет можно перетаскивать файлы (True) или нет (False).

Теперь надо обрабатывать сообщение WM_DROPFILES. В разделе private добавим следующую строчку:

Procedure WMDROPFILES(var Message: TWMDROPFILES); message WM_DROPFILES;

И соответственно напишем процедуру обработки сообщения:

Procedure TFrameForm. WMDROPFILES(var Message: TWMDROPFILES);

Var

Files: Longint;

I: Longint;

Buffer: array[0..MAX_PATH] of Char;

Begin

Files := DragQueryFile(Message. Drop, $FFFFFFFF, nil, 0);

For I := 0 to Files – 1 do begin

DragQueryFile(Message. Drop, I, @Buffer, SizeOf(Buffer));

If FileExists(Buffer) then

With TEditForm. Create(Self) do

Open(Buffer);

End;

DragFinish(Message. Drop);

End;

В этой процедуре используется функция DragQueryFile. Вот ее описание:

DragQueryFile(

HDROP hDrop, // handle структуры, перетащенных файлов

UINT iFile, // номер нужного файла

LPTSTR lpszFile, // буфер для возвращаемого FileName

UINT cch // размер буфера для FileName

);

Если iFile равен $FFFFFFFF, то функция возвращает количество перетащенных файлов.

Итак, в нашей процедуре сначала в переменную Files заносится кол-во перетащенных файлов, а затем мы просматриваем все FileName’ы и если данный файл существует, то открываем его.

Примечание. MATH_PATH – константа, которая задается в модуле Windows. Это, если я все правильно понял ;), максимальное количество символов в FileName.

Функция DragFinish очищает память, которая использовалась для передачи FileName в приложение.

Ну вот и все… Если что-то непонятно или здесь что-то не так, то пишите… разберемся 😉

Внимание! Запрещается перепечатка данной статьи или ее части без согласования с автором. Если вы хотите разместить эту статью на своем сайте или издать в печатном виде, свяжитесь с автором.


Перетаскивание файлов на форму