![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте! Простите за глупый, быть может, вопрос, но ответа не удалось найти во других темах.
Как добиться, чтобы перетаскивание файла на контроль (например ListView) (а не Form) из Проводника приводило к добавлению элемента с именем файла в ListView). Везде приводится пример, где получатель форма. Комментарий: Смотрел книги Озерова. Там тоже рассмотрены исключительно примеры, когда файл воспринимает форма. Пробовал указывать другие хэндлы в DragAcceptFiles(Handle,True) и не только. Никакого результата. Последний раз редактировалось Turbine, 17.01.2008 в 14:50. |
|
#2
|
||||
|
||||
|
Ну и пусть она будет получателем! Вот при получении и добавляй имя файла в ListView.
|
|
#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); |
|
#5
|
|||
|
|||
|
Данный пример ищет первый принадлежащий форме листбокс и на этом успокаивается
А если на форме несколько ListBox ов и нужно добавлять именно в тот на котором был отпущен курсор мыши... Что делать тогда? Последний раз редактировалось Turbine, 19.01.2008 в 18:59. |
|
#6
|
|||
|
|||
|
Очевидно, Turbine всё-таки проверил код в Delphi и убедился, что он работает.
У меня в CodeGear RAD Studio 2009 тоже работает.Большое спасибо Rokuell за отличный пример! |