Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Drag & Drop


Автор: z-END 16.2.2006, 15:53
каким способом можно организовать алгоритм перетаскивания из моего приложения в другие, также как это организовано например в WinRAR?
нашел один топик по этой http://forum.vingrad.ru/index.php?showtopic=13552&view=findpost&p=88704, но слабоват я в этомsmile может кто поподробней разжевать может?

Автор: Snowy 16.2.2006, 15:58
Ну дык http://forum.vingrad.ru/index.php?act=module&module=vingradfaq&section=641

Автор: z-END 16.2.2006, 16:25
эм.. я это в DRKB все смотрел.. кроме http://forum.vingrad.ru/index.php?act=module&module=vingradfaq&target=main_panel&article=2513 ниче мне неподходит.. и то там не реалзован механизм "перетаскивания" а используется просто "вставка" smile

Автор: z-END 20.2.2006, 17:01
Снови, так что мне делать? smile

Автор: Snowy 20.2.2006, 20:25
Тут нужно курить очень много доки по COM.
В частности по IDropSource и IDataObject.
Как грится, M$ постаралась, чтобы процесс перетаскивания реализовать было легко и удобно - всего парой сотен строк кода.

Прогулялся на тори. В основном все либо платное, либо старое.
http://www.torry.net/pages.php?id=233 - вот более-менее подходящая штуковина.
Реализует нужные интерфейсы. Правда для 5-й дельфи, но хоть что-то.

Автор: Snowy 20.2.2006, 22:13
Щас у себя проверил.
Проинсталилось без проблем на семерку.
Вот, нарисовал код:
Код
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DropSource, ComCtrls, ImgList;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    DropFileSource1: TDropFileSource;
    procedure ListView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    Draggging: boolean;
    DPoint: TPoint;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  DPoint.X := X; DPoint.Y := Y; Draggging := false;
end;

procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  li: TListItem;
begin
  if Draggging then exit;
  Shift := (Shift * [ssLeft,ssRight]);
  if  (Shift = []) or ((abs(DPoint.X - X) <10) and (abs(DPoint.Y - Y) <10)) then
    exit;
  if Listview1.SelCount = 0 then exit;
  DropFileSource1.Files.Clear;
  li := ListView1.Selected;
  while li<>nil do
  begin
    DropFileSource1.Files.Add('C:\' + li.Caption);
    li := ListView1.GetNextItem(li, sdBelow, [isSelected]);
  end;
  Draggging := true;
  DropFileSource1.execute;
  Draggging := false;
end;

end.
Для проверки нужно на форму бросить TDropFileSource и TListView.
В TListView запихать список файлов (в примере файлы лежат на C:\). Поставить MultiSelect в true (не обязательно).
После этого можно спокойненько таскать "файлы" из листбокса куда угодно.

Автор: RA 20.2.2006, 22:47
От хорошо что я эту тему заметил smile

Помогут тебе компоненты Raize DropMaster.

Остальные вопросы по этим компонентам через PM.

Автор: z-END 22.2.2006, 14:12
блин.. ну намучлася я с ними...
во всех компонентах реализован такой вариант:
Цитата(Snowy @ 20.2.2006, 22:13 Найти цитируемый пост)
Draggging := true;
  DropFileSource1.execute;
  Draggging := false;

и вот этот на этот самый execute никак неповлиять... мне ненужен вариант простого копирования, нужен вариант аналогично как в winRAR перетаксивание вызывает за собой процесс разархивации во временную папку а потом перемещение в уже указанную. т.е. из контрола (листвью, листбокс и т.п. это непринципаильно) нужно перетащить столбцы, при этом должны создасьтся файлы (которые имеют имена отличные от указанных в списке, данные в них заполняются из других файлов) при этом процесс копирования нужно осуществлять собственной процедурой.
а во всех подобных контролах весь процесс сводится к TComponent.execute smile
че делать?

Автор: Snowy 22.2.2006, 14:18
Ну и хорошо.
Отдаешь компоненту имена файлов во временной папке (файлов пока нет).
На событие OnDrop вешаешь разархивацию. Файлы появляются.
Добавлено @ 14:21
Вот. Заглянул в справку по этому событию. Там как раз и написано, что оно и предназначено для
Цитата
This event is particularly useful when dragging files from a zipped archive or an internet site into the file system.

Добавлено @ 14:22
Там даже полноценный пример есть, как с ним работать.

Автор: z-END 22.2.2006, 14:36
Цитата(Snowy @ 22.2.2006, 14:18 Найти цитируемый пост)
Отдаешь компоненту имена файлов во временной папке (файлов пока нет).
На событие OnDrop вешаешь разархивацию. Файлы появляются.

это гутsmile
но елси у меня файлы по 50 метров... копирование их методом execute убьет приложение минуты на 2, а я этого нехочу...

Автор: Snowy 22.2.2006, 14:38
С чего ты решил, что убъет?
Копированием будет заниматься принимающая программ, а не твоя.
А при распаковке - тебе решать, будет твоя отвечать или нет.

Автор: z-END 22.2.2006, 14:42
Цитата(Snowy @ 22.2.2006, 14:38 Найти цитируемый пост)
Копированием будет заниматься принимающая программ, а не твоя

может быть и так, но в win2K при drag&drop между приложениями виснут оба до конца выполнения обработки...
т.е. если я из проводника пертащу файлы в фотошоп к примеру, то ни проводник ни фотофоп небудут доступны пока все файлы неоткроются в фотошопе.

Автор: Snowy 22.2.2006, 14:51
Хм. Логично. Тем более, что тебе нужно удалить файлы из временной папки.
Частично тут может помочь установка Dragtypes в [dtMove] .
Правда поможет только в том случае, когда временная папка находится на том же диске, что и target.
Добавлено @ 14:53
Кстати. Кроме этого ты спокойно можешь вынести Execute в другой Thread.
Тогда никакой задержки не будет.
Пусть другой тред выполняет распаковку и ожидание окончания операции.
Добавлено @ 15:00
Я тут еще подумал. Еще логичней будет создавать TDropFileSource динамически.
Тогда ты сможешь спокойно перетаскивать файлы еще раз, в то время, пока предыдущая операция по перетаскиванию продолжает работать в фоне.

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