Einzelnen Beitrag anzeigen

Basic-Master

Registriert seit: 9. Mär 2003
Ort: Brilon
395 Beiträge
 
Delphi 2007 Enterprise
 
#1

Drag&Drop in einer ListBox mit Mausevents umsetzen

  Alt 7. Apr 2008, 16:56
Um eine ListBox ohne Drag&Drop umsetzen zu können, muss man die drei Mouse-Events MouseUp, MouseMove und MouseDown der ListBox belegen und den folgenden Code verwenden:
Delphi-Quellcode:
procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ListStartItem := ListBox1.ItemAtPos(Point(X, Y), True);
  ListStopItem := ListStartItem;
  ListDragging := (ListStartItem <> -1);
  ListBox1.Cursor := crDrag;
end;

procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var NeuesItem: Integer;
begin
  if (not ListDragging) then exit;
  // neues Element ueber Koordinate suchen
  NeuesItem := ListBox1.ItemAtPos(Point(X, Y), True);
  if (ListStopItem = -1) or (NeuesItem = -1) or (ListStopItem = NeuesItem) then
    exit;
  // Elemente austauschen
  ListBox1.Items.Exchange(ListStopItem, NeuesItem);
  ListBox1.ItemIndex := NeuesItem;
  ListStopItem := NeuesItem;
end;

procedure TForm1.ListBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (not ListDragging) then exit;
  // Variablen zurücksetzen
  NewsDragging := False;
  lstNews.Cursor := crDefault;
  // Testen, ob ein Austausch stattgefunden hat
  if (ListStartItem = -1) or (ListStopItem = -1) or (ListStartItem = ListStopItem) then
    exit;
  // z. B. Meldung ausgeben
  Showmessage('Bewegtes Element: ' + IntToStr(ListStartItem) + #13#10 + 'Neuer Index: ' + IntToStr(ListStopItem));
end;
Der Code funktioniert unter Delphi 2007, sollte aber auch mit früheren Delphi-Versionen funktionieren.
Christian
  Mit Zitat antworten Zitat