|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Drag & Drop на контроль, а не на форму
Здравствуйте! Простите за глупый, быть может, вопрос, но ответа не удалось найти во других темах.
Как добиться, чтобы перетаскивание файла на контроль (например ListView) (а не Form) из Проводника приводило к добавлению элемента с именем файла в ListView). Везде приводится пример, где получатель форма. Комментарий: Смотрел книги Озерова. Там тоже рассмотрены исключительно примеры, когда файл воспринимает форма. Пробовал указывать другие хэндлы в DragAcceptFiles(Handle,True) и не только. Никакого результата. Последний раз редактировалось Turbine, 17.01.2008 в 14:50. |
#2
|
||||
|
||||
Ну и пусть она будет получателем! Вот при получении и добавляй имя файла в ListView.
Велик и могуч наш Object Pascal ! ICQ: 357-591-887 |
#3
|
|||
|
|||
Просто планировалось реализровать механизм, когда можно накидывать разные файлы одного типа в разные листбоксы, чтобы потом не сортировать и не заводить лишние диалоги "куда добавить?"
О реализации именно этой задачи практически нигде и ничего не сказано... Т.е. воду в ступе, вроде не толчем. Последний раз редактировалось Turbine, 17.01.2008 в 15:26. |
#4
|
||||
|
||||
Как получить список файлов из Проводника
Цитата:
http://www.delphiworld.narod.ru/base...iles_list.html 1. Добавляем в список модулей ShellAPI 2. В описание формы раздел private: Код:
procedure WMDropFiles(var M: TMessage); message WM_DROPFILES; Код:
procedure TForm1.WMDropFiles(var M: TMessage); var i, indx, CountFiles, SizeName, cch, hDrop: integer; wnd:HWND; Point: TPoint; lpszFile: string; begin hDrop := M.WParam; cch:=0; indx:=-1; DragQueryPoint(hDrop, Point); CountFiles := DragQueryFile(hDrop, $FFFFFFFF, nil, cch); // Получаем идентификатор окна над которым находиться курсор wnd:=ChildWindowFromPoint(Form1.Handle,Point); for i:=0 to Form1.ComponentCount-1 do // для всех компонентов if (Form1.Components[i] is TListBox) then // если это ListBox if (Form1.Components[i] as TListBox).Handle = Wnd then // и его Handle совпадает с полученным begin Indx:=i; Break; end; // запоминаем индекс компонента for i := 0 to CountFiles - 1 do begin SizeName := DragQueryFile(hDrop, i, nil, cch); SetLength(lpszFile, SizeName+1); DragQueryFile(hDrop, i, Addr(lpszFile[1]), SizeName+1); if indx <> -1 then // если нужный компонент найден - добавляем строку (Form1.Components[indx] as TListBox).Items.Add(lpszFile); // подразумевается, что это ListBox lpszFile:=''; end; DragFinish(hDrop); end; Код:
DragAcceptFiles(Handle, True); Велик и могуч наш Object Pascal ! ICQ: 357-591-887 |
#5
|
|||
|
|||
Данный пример ищет первый принадлежащий форме листбокс и на этом успокаивается
А если на форме несколько ListBox ов и нужно добавлять именно в тот на котором был отпущен курсор мыши... Что делать тогда? Последний раз редактировалось Turbine, 19.01.2008 в 18:59. |
#6
|
|||
|
|||
Очевидно, Turbine всё-таки проверил код в Delphi и убедился, что он работает. У меня в CodeGear RAD Studio 2009 тоже работает.
Большое спасибо Rokuell за отличный пример! |