Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
191 / 50 / 10
Регистрация: 27.09.2013
Сообщений: 516
Записей в блоге: 4
1

Нужен пример реализации Drag&Drop в виртуальном ListView

16.03.2014, 00:10. Показов 2076. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите пример реализации Drag&Drop в виртуальном ListView.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.03.2014, 00:10
Ответы с готовыми решениями:

Drag&drop внутри listview
Написал код drad&drop'a, но в нем существует баг, при котором, если перетаскивать элемент на самого...

Смещение элемента после Drag&Drop (ListView)
Как-то по короче можно переделать? if PlayID=q then begin PlayID:=n; exit; end; if (q<PlayID) and...

DrawGrid & Drag&Drop
Здравствуйте. Суть вопроса - поставлена задача по заполнению TDrawGrid формата 5х5 изображениями...

Drag&Drop
Вот я зделал чтоб при перетаскивание c List на Panel окно закрывалась!А как зделать чтоб окно...

8
angstrom
16.03.2014, 01:04 2
В данном случае Drag&Drop делается не в самом ListView, а в массиве откуда читаются данные.
191 / 50 / 10
Регистрация: 27.09.2013
Сообщений: 516
Записей в блоге: 4
16.03.2014, 20:18  [ТС] 3
angstrom, в массиве перестановку сделал без проблем, но появились сложности с реализацией, ListView отказывается "принять" элемент т.е. показывается курсор "стоп"(примерно назвал его) и не могу "дропнуть элемент", а по нажатию кнопки все происходит без проблем.

PS

код привести не могу т.к. не сохранял его.
Заполняется LV через TObjectList т.е. перестановку сделать можно банальным TObjectList.Exchange(int1,int2).
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
16.03.2014, 22:28 4
Цитата Сообщение от artemka2008 Посмотреть сообщение
ListView отказывается "принять" элемент т.е. показывается курсор "стоп"(примерно назвал его) и не могу "дропнуть элемент"
Вот у меня почему-то не показывается. Но видишь ли, в чем проблема. Я код тоже не сохранял, поэтому привести не могу...
0
191 / 50 / 10
Регистрация: 27.09.2013
Сообщений: 516
Записей в блоге: 4
17.03.2014, 00:58  [ТС] 5
UI, прошу прощения за довольно кривой код, писал так сказать "на коленке" по памяти

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TForm1.pl1EndDrag(Sender, Target: TObject; X, Y: Integer);
var DropItem,CurrentItem:TListItem; test,i,n,j,old:integer; st,st1,st2,st3:string;
    itemsdata:tdata;
begin
  if Sender = Target then
    with TListView(Sender) do begin
    old:=textp;
    DropItem:= GetItemAt(X, Y);
    if DropItem=nil then exit;
    CurrentItem:=TListItem.Create(Items);
    CurrentItem.Assign(Selected);
    n:=DropItem.Index;
    j:=pl1.ItemIndex;
    lvdata.Exchange(n,j);
      applyfilter('');
      if j=playid then begin
         playid:=n;
         pl1.Items.Item[playid].Selected:=true;
         textp:=n;
      end;
end;
0
726 / 478 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
17.03.2014, 01:10 6
Примерно так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if button=mbleft then
  form1.ListView1.BeginDrag(false);
end;
 
procedure TForm1.Image1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  accept:=source=form1.ListView1
end;
 
procedure TForm1.Image1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
Bitprom.LoadFromFile(SP+form1.ListView1.ItemFocused.Caption);
 
case Obraz of
1:form1.Image1.Canvas.StretchDraw(rect(0,0,200,50),bitprom);
2:form1.Image1.Canvas.StretchDraw(rect(0,50,200,100),bitprom);
3:form1.Image1.Canvas.StretchDraw(rect(0,100,200,150),bitprom);
4:form1.Image1.Canvas.StretchDraw(rect(0,150,200,200),bitprom);
end;
 
end;
Тут перенос как бы с TListView на TImage
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
17.03.2014, 01:16 7
И чем мне этот "наколеночный код" помогает? Надо знать, что у тебя хранится в ListView, как выглядит OnData, а ты бросил какой-то огрызок, даже не соизволя привести информацию, что такое вообще этот pl1, откуда и куда происходит D&D, выставлены ли DragMode в автоматический режим... Неинтересно.

Будет проект, который можно не переписывать с нуля, а откомпилировать, запустить, и убедиться, что с D&D есть проблема - будет о чем говорить. Пока говорить не о чем.

Добавлено через 1 минуту
Цитата Сообщение от Игорь[Igor] Посмотреть сообщение
перенос как бы с TListView на TImage
не нужен.
Цитата Сообщение от artemka2008 Посмотреть сообщение
ListView отказывается "принять" элемент
=> перенос должен быть откуда-то (это, наверное, секретная информация, ТС не говорит, откуда) на виртуальный LV
0
726 / 478 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
17.03.2014, 01:19 8
По приведенному примеру ничего не понять потому просто ответил на вопрос
Цитата Сообщение от artemka2008 Посмотреть сообщение
Подскажите пример реализации Drag&Drop в виртуальном ListView.
0
191 / 50 / 10
Регистрация: 27.09.2013
Сообщений: 516
Записей в блоге: 4
17.03.2014, 04:21  [ТС] 9
dragmode:=dmAutomatic; перетаскивание идет идет внутри ListView

Кликните здесь для просмотра всего текста
OnData

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
private
    FShownItems: TList;
//////
procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
var
  DataItem: TData;
begin
  DataItem := FShownItems[Item.Index];
  Item.Caption := DataItem.colArt;
  Item.SubItems.Add(DataItem.colTitle);
  Item.SubItems.Add(DataItem.colUrl);
  Item.SubItems.Add(DataItem.colLenght);
end;
TData

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
  TData = class
    colArt, colTitle, colUrl, colLenght:string;
    constructor Create(art, title, url, lenght:string);
  end;
/////
constructor TData.Create(art, title, url, lenght:string);
begin
  colart:=art;
  coltitle:=title;
  colurl:=url;
  collenght:=lenght;
end;
DragOver

Delphi
1
2
3
4
5
6
procedure TForm1.ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
with Sender as TListView do
    Accept := (Sender = ListView1) and (GetItemAt(X, Y) <> Selected);
end;
StartDrag

Delphi
1
2
3
4
5
procedure TForm1.ListView1StartDrag(Sender: TObject; var DragObject: TDragObject);
begin
  DragObject := TLVDragControlObjectEx.Create(ListView1);
  DragObject.AlwaysShowDragImages := True;
end;
TLVDragControlObjectEx

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
type
  TLVDragControlObjectEx = class(TDragControlObjectEx)
  protected
    function GetDragImages: TDragImageList; override;
  end;
/////
function TLVDragControlObjectEx.GetDragImages: TDragImageList;
var
  bmp: TBitmap;
  pm: tpoint;
  R, ARect: TRect;
 
  procedure Out (Canvas: TCanvas);
  var st,st1 : string;
  begin
    st := TListView(Control).Selected.Caption;
    st1 := TListView(Control).Selected.SubItems.Strings[0];
    SetLength(st, Length(st));
    SetLength(st1, Length(st1));
 
    with Canvas do
    begin
      Canvas.TextRect(aRect, st, [tfSingleLine, tfTop, tfLeft, tfEndEllipsis, tfModifyString]);
      TextOut(0, 0, st);
      Canvas.TextRect(aRect, st1, [tfSingleLine, tfTop, tfLeft, tfEndEllipsis, tfModifyString]);
      TextOut(165, 0, st1);
      TextOut(trunc(370-(canvas.TextWidth(TListView(Control).Selected.SubItems.Strings[2])/2)), 0, TListView(Control).Selected.SubItems.Strings[2]);
    end;
  end;
 
begin
  getcursorpos(pm);
  bmp := TBitmap.Create;
  bmp.Canvas.Brush.Color := clSkyBlue;
  R := TListView(Control).Selected.DisplayRect(drBounds);
 
  aRect := R;
  aRect.Width := TListView(Control).Column[0].Width;
 
  bmp.SetSize(r.Right - r.Left, r.Bottom - r.Top);
  bmp.Canvas.Font := TListView(Control).Font;
  Out (bmp.Canvas);
  result := TDragImageList.Create(Control);
  result.Width := bmp.Width;
  result.Height := bmp.Height;
  ImageList_EndDrag;
  result.SetDragImage(result.Add(bmp, nil), -11 - Form1.Left + pm.X, 0);
  bmp.Free;
end;


Вроде бы ничего не забыл(pl1 = ListView1).
Для "простого" ListView d&d получилось сделать довольно легко(вернее это был drag&copy), а вот с виртуальным никак, пытался сделать, редактируя старый код, но ничего не вышло, хотя по кнопке без проблем получалось менять местами элементы.

Добавлено через 2 часа 38 минут
В общем сделал, все оказалось проще, чем я думал, да и ошибки как таковой не было, просто немного неверное условие.
0
17.03.2014, 04:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.03.2014, 04:21
Помогаю со студенческими работами здесь

Drag&Drop
Доброго времени суток. Подскажите как открыть содержимое файла в Memo, перенеся его на ехешник...

Drag & Drop
Как сделать drag&amp;drop файлов из проводника, например, на Memo1, это может быть один, а может быть...

Плавный Drag&Drop
Приветствую, Господа! Пытаюсь сделать Drag&amp;Drop на подобии ListView в Андроиде, только никак не...

Drag and Drop из ListView в другую программу
Всем Привет, Подскажите как можно реализовать перенос Item из ListView в другую программу или на...

Drag and Drop из ListView в другую программу
Добрый день! Как правильно осуществить Drag and Drop из ListView в другую программу?

Drag&Drop из Edit в браузер
Как сделать drag and drop из Edit в браузер,например mozilla в поле поиска яндекса. Из любого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru