Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Drag-Drop из ListView в File Manager


Автор: Teran 3.8.2006, 19:14
не подскажите как можно реализовать Drag-Drop из ListView в File Manager
Допустим у меня в ListView имеется список файлов как можно реализовать "перетаскивание" их в Exsplorer ?
т.е. мне необходимо узнать место куда эти файлы будут копироваться?
 smile  smile  smile 

Автор: Alexeis 3.8.2006, 23:49
Для этого есть специальный компонентик называется TDropper

Цитата

  TDropper - это компонент, который позволит Вам       ]
[ сделать возможным перетаскивание файлов из Вашего      ]
[ приложения в проводник Windows и другие программы, как ]
[ это делает WinRAR.   


Цитата

  В момент, когда необходимо начать процесс          
перетаскивания, вызовите метод TDropper.StartDrop, а 
в событии TDropper.OnDropUp в списке Files, укажите  
файлы для перетаскивания (Файлв должны существовать).
  Событие TDropper.OnDropUp происходит когда         
пользователь отпускает кнопку.     


Прикрепляю архив

Автор: Teran 4.8.2006, 08:56
Спасибо за компонент но он все делает автоматически, но мне нужно не копировать а производить определенные действия связанные путем. Можно ли отдельно получить путь куда будут скопированы файлы?

Автор: Snowy 4.8.2006, 09:12
http://forum.vingrad.ru/index.php?showtopic=84137

Автор: Teran 4.8.2006, 10:27
Цитата(Snowy @  4.8.2006,  09:12 Найти цитируемый пост)
index.php?showtopic=84137 


Snowy если не трудно приципи пожалуйста компонент который ты нашел, а то что-то я или не тот взял или он не ставится у меня

Автор: Snowy 4.8.2006, 10:40
Распакуй куда-нить.
Открой дельфи. Скажи "Установить компонент" и выдели все файлы в папке Components.
Появится новая закладка "Drag&Drop" - все компоненты там.

Добавлено @ 10:41 
Справка и примеры тамже в комплекте.

Автор: Teran 4.8.2006, 11:27
пасибо все поставилось 
еще не подскажеш в каком месте нужно делать create TDropFileSource 
Цитата(Snowy @  22.2.2006,  14:51 Найти цитируемый пост)
Добавлено @ 15:00 
Я тут еще подумал. Еще логичней будет создавать TDropFileSource динамически.
Тогда ты сможешь спокойно перетаскивать файлы еще раз, в то время, пока предыдущая операция по перетаскиванию продолжает работать в фоне.

 smile  smile  smile 

Автор: Teran 4.8.2006, 11:42
Все действия вешаются только н асобытия ListView1MouseDown и ListView1MouseMove, а вто где создавать TDropFileSource динамически?

Автор: Snowy 4.8.2006, 11:50
В примере, который я рисовал по вышеприведённой ссылке, ставить создание треда нужно вместо DropFileSource1.Files.Clear.
А уже при создании треда создавай и заполняй источник.
При умирании треда соответственно его убивай.

Автор: Teran 4.8.2006, 11:57
Цитата(Snowy @  4.8.2006,  11:50 Найти цитируемый пост)
создание треда нужно вместо DropFileSource1.Files.Clear

но если мы будем создавать поток в ListView1MouseMove, то будет большая трата ресурсов т.к. все содание и уничтожение будет происходить сильно часто(при движении мыши)....
или не прав??

Автор: Snowy 4.8.2006, 12:06
Нет, эта часть кода работает уже только в том случае, если мы куда-то потащили наши итемы.
Если просто возюкать мышью, то до туда не доходит - см. первые 2 условия.

Автор: Teran 4.8.2006, 12:25
вот изменил твой пример но чтото не работает:
Код

......
procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  i: integer;
  MyThread: TMyThread;
begin
  //Make sure mouse has moved at least 10 pixels before starting drag ...
  if (DragPoint.X = -1) or ((Shift <> [ssLeft]) and (Shift <> [ssRight])) or
     ((abs(DragPoint.X - X) <10) and (abs(DragPoint.Y - Y) <10)) then exit;
  //If no files selected then exit...
  if Listview1.SelCount = 0 then exit;

  MyThread:=TMyThread.Create(false);
end;

и сам поток:
Код

unit Unit1;

interface

uses
  Classes,Windows,DropSource;

type
  TMyThread = class(TThread)
  private
    DragPoint: TPoint;
    DropFileSource1: TDropFileSource;
    { Private declarations }
  protected
    constructor Create(CreateSuspended: Boolean);
    destructor Destroy;
    procedure Execute; override;
  end;

implementation

uses Main;

{ MyThread }
constructor TMyThread.Create(CreateSuspended: Boolean);
begin
DropFileSource1:=TDropFileSource.Create(Form1.ListView1);
inherited Create(CreateSuspended);
end;

destructor TMyThread.Destroy;
begin
DropFileSource1.Free;
inherited;
end;

procedure TMyThread.Execute;
var
  i: integer;
begin
  FreeOnTerminate:= true;

  //Delete anything from a previous dragdrop...
  DropFileSource1.Files.clear;

  //Fill DropSource1.Files with selected files in ListView1
  for i := 0 to Form1.Listview1.items.Count-1 do
    if (Form1.Listview1.items.item[i].Selected) then
      DropFileSource1.Files.Add(Form1.Listview1.items.item[i].caption);

  //Start the dragdrop...
  //Note: DropFileSource1.DragTypes = [dtCopy]
  DropFileSource1.execute;
  { Place thread code here }
end;
end.

программа доходит до строки DropFileSource1.Files.clear;
 в TMyThread.Execute; и все.... (похоже что её тоже не выполняет)

Автор: Teran 4.8.2006, 13:06
я думаю что Программа не прорабатывает конструктор потока и не выполняет DropFileSource1:=TDropFileSource.Create 
но что тут не правильного не понимаю??

Автор: Snowy 4.8.2006, 13:39
Нда уж...
Я уже тоже всё перепробовал.
С тредом ничего не выйдет.
Операция драгндропа слишком синхронная.
Асинхронность хоть и напрашивается, но... Никак.

Автор: Teran 4.8.2006, 14:29
Цитата(Snowy @  4.8.2006,  13:39 Найти цитируемый пост)
С тредом ничего не выйдет.

жаль конечно, ну неочень (меньше мороки будет)

Snowy Огромное спасибо за помощь

Автор: Snowy 4.8.2006, 14:41
Всегда пожалуйста.
Я пока тоже с ним воевал, получился небольшой пример именно не с готовыми файлами, а с пока не существующими.
В примере сделал просто файлы размером 100 метров, забитые символом 'S', но можно заменить этот кусок на распаковку и т.п.
Приклеиваю проектик.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)