[Решено] Перетаскивание (файла) НАРУЖУ

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

[Решено] Перетаскивание (файла) НАРУЖУ

Сообщение kotompazb »

Здрасьте.
Это опять я со своими традиционно глупыми вопросами.
Итак, задача.
Место действия: Винда.
Хочется научить свое приложение таскать мышью файлы наружу, аналогично тому как, например, из 7-zip я могу свободно вытаскивать файлы из архива хоть в проводник, хоть в Total Commander, а также между разными экземплярами моего приложения. Насколько я понимаю, 7-zip в этом случае распаковывает файлы уже после того, как я отпустил мышь над проводником, например.
Пояснение. Самих файлов как таковых (то есть лежащих готовыми уже на диске) нет, моя программа должна их формировать по мере надобности.
ПодскАжите, как это реализуется?
Заранее спасибо.
Последний раз редактировалось kotompazb 17.08.2016 21:57:39, всего редактировалось 1 раз.
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

Это ваще возможно?
azsx
энтузиаст
Сообщения: 959
Зарегистрирован: 16.11.2015 05:38:32

Сообщение azsx »

так как из total commander можно вытащить файл на рабочий стол - то значит да, можно.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

Это ваще возможно?
не...е: это не возможно.... :mrgreen:

http://wiki.freepascal.org/Drag_and_Drop_sample
http://wiki.lazarus.freepascal.org/LCL_Drag_Drop
ну...у и нечто компонента:
https://github.com/prof7bit/NativeDragDrop
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

pupsik писал(а):http://wiki.freepascal.org/Drag_and_Drop_sample
http://wiki.lazarus.freepascal.org/LCL_Drag_Drop

в этих статьях рассказывается про драг-дроп внутри LCL приложения, к запросу kotompazb отношения не имеет.

pupsik писал(а):ну...у и нечто компонента:
https://github.com/prof7bit/NativeDragDrop

А вот этот компонент больше похож на правду.
Процесс "вытаскивания" файла из приложения, взаимодейтсвует с системой в винде реализуется через ole.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

в этих статьях рассказывается про драг-дроп внутри LCL приложения
что не мешает пойти дальше... Т.е. начало "положил" а вопрошающий пускай продолжает. Полезность там есть.

А вот этот компонент больше похож на правду.
вот этого не понял. Т.е. вы считаете ссылки выше - Брехня, а компонент Правда? Бред какой то :roll:

Процесс "вытаскивания...через ole" файла
:mrgreen: угу... Но можно и не только. Было бы желание.

п.с.
критика...критика, а ваша польза какая?
В общем: будут пользоваться компонентом. Оно ведь готовое и работает :) Или у вас, скалогрыз, есть иные предложения?

Кстати... а коим боком: total commander??? Может DC? Если да то там свои булыжники. Он весело с драгом работает. Да и вытащить проблемно будет (буков много :)).
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

а коим боком: total commander

Википедия говорит, что TC64 в Лазарусе компилится

Добавлено спустя 22 минуты 3 секунды:
Всем спасибо. Пойду разбираться.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

Википедия говорит
и сорцы открыты? :wink: Т.е. как там реализовано можно только догадываться... А вот в DC, tuxcmd можно посмотреть как.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

pupsik писал(а):вот этого не понял. Т.е. вы считаете ссылки выше - Брехня, а компонент Правда? Бред какой то

сам то читал о чём в ссылках пишется?
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

скалогрыз ну куда мне до вас то... КонеШно не читал :mrgreen:
То что там о "внутри" это не значит что не даст понять как сделать "наружу". Но...о: если вы считаете по другому... Поделитесь рабочим примером (ссылкой).

И почему, наезд есть, а смысла от него нет. Т.е. каким образом вопрошающий начнёт этот "drag" (до drop потом ещё дойти надо)? По мановению волшебной палочки?

Откуда вы знаете как у него данные будут подаваться? Из поста выше я не догадался. Там минимут 3 варианта развития события (в принципе можно свести к одному но... он бы вопроса не задавал, если бы знал).

п.с.
Но..о, если охота флудить то хоть по теме. Второй раз прошу вас поделиться чем то полезным и по теме...

п.с.п.с.
Хотя:
моя программа должна их формировать по мере надобности
может и драг она сама сделает, по мере надобности :mrgreen:
Сори за фривольность :)
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

pupsik писал(а):То что там о "внутри" это не значит что не даст понять как сделать "наружу".

Тогда тебе нужно пояснить, каким таким образом TObject попадает "наружу" и каким образом система (Windows) его (TObject) узнаёт и обращается с ним как со списком файлов.
Если система с TObject-ом ничего сделать не может, то и мне рабочими примерами поделиться не удасться ;)

pupsik писал(а):Откуда вы знаете как у него данные будут подаваться? Из поста выше я не догадался.

а потому что я писал этот самый драг файлов наружу... давно, для закрытой библиотеки на Делфи.
И именно NativeDragDrop выглядит, как то что нужно.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

Тогда тебе нужно пояснить
э..э: вы о чем? Мне нужно? Вы уверены? Понять что да как нужно не мне, а вопрошающему... Я, как и любой другой, может показать как (согласно вопроса), или направить где почитать. А вот нужно, должен - это другой вопрос.

Вот я вас прощу, прощу, а вы:
а потому что я писал этот самый драг файлов наружу... давно, для закрытой библиотеки на Делфи.
Писал, когда то и т.д, и т.п.... уж..жс :mrgreen:

И именно NativeDragDrop выглядит, как то что нужно.
он выглядит как возможное решение вопроса... Ни более.
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

скалогрыз писал(а):NativeDragDrop

Да. Штука предельно простая для вытаскивания файлов ничего проще не нашел.
Но мне похоже придется все же ковырять в сторону этих ссылок:
http://www.webdelphi.ru/2012/01/zametki-pro-dragdrop-v-delphi/
и
http://it.kgsu.ru/DelCOM/com_0012.html
У меня, если подробнее, есть ListView - в нем собственно список файлов, есть ListBox - в нем некое подобие "папок". На данный момент в обработчике onMouseDown ListView через BeginDrag таскаются файлы между этими "папками", то есть взял в ListView, бросил в ListBox (в onDragOver обрабатывается возможность бросить само собой, в onDragDrop - сам результат).
В результате до NativeDragDrop дело просто не доходит. Если же эту (выше описанную) фичу отключить, то NativeDragDrop отлично с задачей справляется. Как-то так.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

kotompazb писал(а):У меня, если подробнее, есть ListView - в нем собственно список файлов, есть ListBox - в нем некое подобие "папок". На данный момент в обработчике onMouseDown ListView через BeginDrag таскаются файлы между этими "папками", то есть взял в ListView, бросил в ListBox (в onDragOver обрабатывается возможность бросить само собой, в onDragDrop - сам результат).
В результате до NativeDragDrop дело просто не доходит. Если же эту (выше описанную) фичу отключить, то NativeDragDrop отлично с задачей справляется. Как-то так.

а вот попробуй так:
закоментируй код, который использует LCL-ный drag-and-drop. (BeginDrag).. Вместо него добавь использование NativeDragDrop.
Кроме этого добавь обработчик в форму (TForm) OnDropFiles.
В этом OnDropFiles заполняй тот ListView из которого nativedrag НЕ начинался :)
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

скалогрыз писал(а):Кроме этого добавь обработчик в форму (TForm) OnDropFiles.
В этом OnDropFiles заполняй тот ListView из которого nativedrag НЕ начинался :)

OnDropFiles у формы существует уже давненько (она и раньше извне файлики принимала).
Остался вопрос, как различить два случая:
1. Файлы бросаются извне (или из другого экземпляра приложения),
2. Перетаскивание происходит внутри приложения.
Точнее различить то их не сложно, просто ведя флажек, который устанавливается в DragGetFileList NativeDragDrop, сигнализируя о том, что началось перетаскивание внутри, и анализируется, а потом сбрасывается в OnDropFiles формы.
Также естественно можно определить и координаты курсора, задетектив в какую именно "папку" брошен(ы) файл(ы)
Выходит, пока получается только одна проблема: в старом обработчике MouseDown перед BeginDrag я смотрел Shift: TShiftState и при зажатом Shift менял курсор (и режим с переноса на копирование, но это тонкости). Вот где (в каком обработчике) это (изменять курсор и режим) лучше сделать сейчас (и как), я пока не понял. Если проверять
Ответить