...drag & drop within a TListBox?

Author: Thomas Stutz

Category: VCL

{
 This example shows how to drag&drop within a TListBox.
 The Demo Program also shows how to implement an autoscroll-feature.

 Dieses Beispiel zeigt, wie man drag & drop in einer TListBox realisiert.
 Im Demo-Programm wird auch eine Autoscroll-Funktion gezeigt.
}

procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  
Accept := Sender is TListBox;
end;

procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  
iTemp: Integer;
  ptTemp: TPoint;
  szTemp: string;
begin
  
{ change the x,y coordinates into a TPoint record }
  
ptTemp.x := x;
  ptTemp.y := y;

  { Use a while loop instead of a for loop due to items possible being removed
   from listboxes this prevents an out of bounds exception }
  
iTemp := 0;
   while iTemp <= TListBox(Source).Items.Count-1 do
  begin
    
{ look for the selected items as these are the ones we wish to move }
    
if TListBox(Source).selected[iTemp] then
    begin
      
{ use a with as to make code easier to read }
      
with Sender as TListBox do
      begin
      
{ need to use a temporary variable as when the item is deleted the
        indexing will change }
        
szTemp := TListBox(Source).Items[iTemp];

        { delete the item that is being dragged  }
        
TListBox(Source).Items.Delete(iTemp);

      { insert the item into the correct position in the listbox that it
       was dropped on }
        
Items.Insert(itemAtPos(ptTemp, True), szTemp);
      end;
    end;
    Inc(iTemp);
  end;
end;

 

printed from
www.swissdelphicenter.ch
developers knowledge base