Recent

Author Topic: [SOLVED] ListView + Drag and Drop  (Read 8978 times)

Vingadero

  • New Member
  • *
  • Posts: 46
[SOLVED] ListView + Drag and Drop
« on: October 30, 2012, 12:58:28 am »
Hello,

I'm trying to do this code in this article: http://delphi.about.com/od/vclusing/a/arrangelistview.htm

Code: [Select]
//ListView OnDragDrop
procedure TListViewForm.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer) ;
var
   currentItem, nextItem, dragItem, dropItem : TListItem;
begin
   if Sender = Source then
   begin
     with TListView(Sender) do
     begin
       dropItem := GetItemAt(X, Y) ;
       currentItem := Selected;
       while currentItem <> nil do
       begin
         nextItem := GetNextItem(currentItem, SdAll, [IsSelected]) ;
         if Assigned(dropItem) then
           dragItem := Items.Insert(dropItem.Index)
         else
           dragItem := Items.Add;
         dragItem.Assign(currentItem) ;
         currentItem.Free;
         currentItem := nextItem;
       end;
     end;
   end;
end;

IsSelected I have change to lisSelected.

But when I drag it, the program enter in a infinite loop on while currentItem <> nil do...

How can I adapt this code to lazarus?

thx in advance
« Last Edit: October 30, 2012, 02:31:28 pm by Vingadero »

vcunha

  • New member
  • *
  • Posts: 9
Re: ListView + Drag and Drop
« Reply #1 on: October 30, 2012, 01:11:46 pm »
Hello Vingadero

I do not know a method to find the next item in a TListView in Lazarus, but the code below can help you.

Code: [Select]
procedure TListViewForm.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer
  );
var
  currentItem, nextItem, dragItem, dropItem : TListItem;
  i: integer;
begin
  if Sender = Source then
  begin
    with TListView(Sender) do
    begin
      dropItem := GetItemAt(X, Y) ;
      currentItem := Selected;
      while currentItem <> nil do
      begin
        nextItem := nil;
        for i := 0 to Items.Count - 1 do begin
         if (Items[i].Selected) and (currentItem.Index <> i) then begin
           nextItem := Items[i];
           break;
         end;
        end;
        if Assigned(dropItem) then
          dragItem := Items.Insert(dropItem.Index)
        else
          dragItem := Items.Add;
        dragItem.Assign(currentItem) ;
        currentItem.Free;
        currentItem := nextItem;
      end;
    end;
  end;
end;

If you find a better way, please share with us. I'm always learning more.

Greetings.

VCunha.

Vingadero

  • New Member
  • *
  • Posts: 46
Re: ListView + Drag and Drop
« Reply #2 on: October 30, 2012, 02:31:00 pm »
Sweet, works like a charm

Ty

kandukeswara

  • Newbie
  • Posts: 2
Re: [SOLVED] ListView + Drag and Drop
« Reply #3 on: January 21, 2016, 09:50:54 am »
Thanks guys, this topic is help me  :D 8)
And.. you can add this code, so user can see which record has been moved :

Code: Pascal  [Select][+][-]
  1. dragItem.Selected:=True;

This is the complete code :

Code: Pascal  [Select][+][-]
  1. //ListView OnDragDrop
  2. procedure TListViewForm.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer) ;
  3. var
  4.   currentItem, nextItem, dragItem, dropItem : TListItem;
  5.   i: integer;
  6. begin
  7.   if Sender = Source then
  8.   begin
  9.     with TListView(Sender) do
  10.     begin
  11.       dropItem := GetItemAt(X, Y) ;
  12.       currentItem := Selected;
  13.       while currentItem <> nil do
  14.       begin
  15.         nextItem := nil;
  16.         for i := 0 to Items.Count - 1 do begin
  17.          if (Items[i].Selected) and (currentItem.Index <> i) then begin
  18.            nextItem := Items[i];
  19.            break;
  20.          end;
  21.         end;
  22.         if Assigned(dropItem) then
  23.           dragItem := Items.Insert(dropItem.Index)
  24.         else
  25.           dragItem := Items.Add;
  26.         dragItem.Assign(currentItem) ;
  27.  
  28.         dragItem.Selected:=True;
  29.  
  30.         currentItem.Free;
  31.         currentItem := nextItem;
  32.       end;
  33.     end;
  34.   end;
  35. end;
  36.  
  37. procedure TListViewForm.ListView1DragOver(Sender, Source: TObject; X,
  38.   Y: Integer; State: TDragState; var Accept: Boolean);
  39. begin
  40.   Accept := Sender = TListView(Sender);
  41. end;

Greetings
Bayu K

 

TinyPortal © 2005-2018