Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2020, 13:20   #1
maloun
Форумчанин
 
Аватар для maloun
 
Регистрация: 03.01.2011
Сообщений: 233
По умолчанию drag drop файла в explorer с получением папки

Доброго времени суток.
Пишу клиент для просмотра файлов на веб сервере. Файлы можно смотреть и сохранять на компьютер.
Мне нужно включать загрузку после перетаскивания файла из формы в explorer.

Пробовал с IDropSource и DoDragDrop создавать и перетаскивать пустой файл.
Но после перетаскивания я не знаю куда файл был перемещён,
думал отследить через ReadDirectoryChangesW, куда денется мой файл, но там такое не пишут.

Где-то нашёл ссылку на What a Drag
Вроде он реализует свой IDataObject и через создание IStorage потом управляет им, я так понял что может даже писать, сейчас пытаюсь написать код по этим статьям.

Я уже два дня маюсь с этим, подскажите, это вообще поможет или я не там ищу?
Может есть статьи на русском или решение на delphi на эту тему?
пыжок

Последний раз редактировалось maloun; 17.01.2020 в 13:57. Причина: вместо IDataObject был IObject
maloun вне форума Ответить с цитированием
Старый 17.01.2020, 21:51   #2
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Видимо что-то не учли. Посмотрите статью по ссылке:
Интерфейс переноса Drag-and-Drop
I am not a wizard, I am just learning.
Desc вне форума Ответить с цитированием
Старый 20.01.2020, 09:54   #3
maloun
Форумчанин
 
Аватар для maloun
 
Регистрация: 03.01.2011
Сообщений: 233
По умолчанию

Цитата:
Сообщение от Desc Посмотреть сообщение
Видимо что-то не учли. Посмотрите статью по ссылке:
Интерфейс переноса Drag-and-Drop
Спасибо прочёл, но это совершенно не про мой вопрос.
Я перемещаю объект из формы в проводник (т.е. в папку или на рабочий стол),
а не между компонентами формы как в этой статье.

Я вызываю DoDragDrop вот так:
Код:
procedure TMainForm.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  SelFileList: TStrings;
  Effect: Integer;
  FileName:String;
  DataObject: IDataObject;
begin
  try
    Perform(WM_LBUTTONUP, 0, MakeLong(X, Y));
    FileName:=ExtractFileDir(ParamStr(0))+'\1.txt';
    with TFileStream.Create(FileName,fmCreate) do Free;
    DataObject:=GetFileDataObject(FileName);
    Effect:=DROPEFFECT_NONE;
    DoDragDrop(DataObject, Self, DROPEFFECT_COPY, Effect);
  finally
  end;
end;
После чего у меня есть объект IDataObject, форма реализует интерфейс IDataSource,
а то куда упадет IDataObject это IDropTarget.
Пользователь нажимает мышкой на Image1 и перетаскивает файл в папку,
в папке создается пустой 1.txt, а я не знаю в какую папку он переместился - в этом и вопрос.

Я могу реализовать IDropTarget в классе формы или другом классе.
Зарегистрировав его и реализуя все методы IDropTarget'а например так:
Код:
TMainForm = class(TForm, IDropSource, IDropTarget)
published
    function DragEnter(const dataObj: IDataObject; grfKeyState: Longint;
      pt: TPoint; var dwEffect: Longint): HResult; stdcall;
    function DragOver(grfKeyState: Longint; pt: TPoint;
      var dwEffect: Longint): HResult; stdcall;
    function DragLeave: HResult; stdcall;
    function Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint;
      var dwEffect: Longint): HResult; stdcall;
...
procedure TMainForm.FormCreate(Sender: TObject);
begin
  OleInitialize(nil);
  OleCheck(RegisterDragDrop(Handle, Self));
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
	RevokeDragDrop(Handle);
  OleUninitialize;
end;
Но всё это не даёт мне понимания откуда взять папку куда переместился объект из моего окна.
Не в IDataObject, ни IDropSource, ни IDropTarget нет такого поля или намека на него.

И вот в статье What a drag: Dragging a virtual file (IStorage edition) я, вроде бы нашёл зацепку, что Рэймонд Чен реализует класс от интерфейса IDataObject и в методе GetData регистрирует IStorage, при этом какое-то имя файла в GetData ему приходит.


Добавлено: ------------

Вкратце... Никто прямым текстом не обсуждает мою тему.
Были кое какие внятные ответы, например как реализовать IDragDrop
или как читать данные из IDataObject'а, и даже общая статья на msdn.

Кроме одного места на форуме msdn
Откуда тема ушла в плюсы
Вложения
Тип файла: zip DragTest.zip (1.9 Кб, 9 просмотров)
пыжок

Последний раз редактировалось maloun; 20.01.2020 в 15:20.
maloun вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Drag&Drop виртуальной папки в проводник androidz Общие вопросы Delphi 0 20.11.2016 19:43
Drag & Drop файла в Edit Xo66um Общие вопросы Delphi 4 18.10.2013 13:41
drag and drop файла Михаил Юрьевич Общие вопросы Delphi 6 24.03.2013 09:18
Drag and Drop папки AmbaQ Общие вопросы Delphi 9 08.09.2010 17:03
Drag'n'Drop файла в ListBox D-Snaker Компоненты Delphi 2 07.08.2008 15:51