Перетаскивание файлов на форму
Перетаскивание
файлов на форму
Предводителев
Сергей
В этой статья я
расскажу, как реализовать перетаскивание файлов на форму... Рассмотрим на
примере текстового редактора с многооконным интерфейсом, при перетаскивании
файлов на главную форму которого будут открываться 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 в
приложение.
Ну вот и всё...
Если что-то непонятно или здесь что-то не так, то пишите... разберёмся ;)
Внимание!
Запрещается перепечатка данной статьи или ее части без согласования с автором.
Если вы хотите разместить эту статью на своем сайте или издать в печатном виде,
свяжитесь с автором.
Список
литературы
Для подготовки
данной работы были использованы материалы с сайта http://andrey.nnov.ru/