![]() |
ListView: mehrere Items verschieben
Hallo!!!
In der Playlist von Winamp kann man mehrere Einträge makierne, und diese dann mit der Maus nach oben bzw. unten verschieben! (fast ohne cpu-belastung) Irgendwie fasziniert mich das, und möchte sowas auch in mein Programm einbauen, aber ich habe keinen blassen schimmer, wie ich das realisieren kann!?!?! (Alle Items nach makierung abfragen, die neue Mausposition auslesen, die items dann nach dieser positionieren? (geht das?)) Habt ihr vielleicht eine hilfreiche Idee oder einen kurzen Tipp für mich? Wäre euch sehr dankbar!! MfG Steran |
Das hat mich auch interessiert, hier die Lösung. Ändere folgende Eigenschaften der ListBox
Delphi-Quellcode:
...:cat:...
procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean); begin Accept := (Sender = Source) and (Sender = ListBox1); end; procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer); var I, NewPos: Integer; Temp: TStringList; begin if not (Sender = Source) and (Sender = ListBox1) then Exit; Temp := TStringList.Create; try NewPos := ListBox1.ItemAtPos(Point(X, Y), True); for I := Pred(ListBox1.Items.Count) downto 0 do if ListBox1.Selected[I] then begin Temp.Insert(0, ListBox1.Items[I]); ListBox1.Items.Delete(I); if I < NewPos then Dec(NewPos); end; if NewPos < 0 then ListBox1.Items.AddStrings(Temp) else for I := Pred(Temp.Count) downto 0 do ListBox1.Items.Insert(NewPos, Temp[I]); finally Temp.Free; end; end; |
Klasse!
Das funzt ja super!! DANKE!! Gibts noch ne möglichkeit, die Verschiebung auch in echtzeit anzeigen zu lassen? (so wie in der winamp playlist?) |
Hm, ich weiß nicht, wie es da aussieht, aber versuche mal:
Delphi-Quellcode:
...:cat:...
procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
var I, NewPos: Integer; Temp: TStringList; begin if not (Sender = Source) and (Sender = ListBox1) then Exit; Temp := TStringList.Create; try NewPos := ListBox1.ItemAtPos(Point(X, Y), True); for I := Pred(ListBox1.Items.Count) downto 0 do if ListBox1.Selected[I] then begin Temp.Insert(0, ListBox1.Items[I]); ListBox1.Items.Delete(I); if I < NewPos then Dec(NewPos); Application.ProcessMessages; end; if NewPos < 0 then begin for I := 0 to Pred(Temp.Count) do begin ListBox1.Items.Add(Temp[I]); Application.ProcessMessages; end; end else begin for I := Pred(Temp.Count) downto 0 do begin ListBox1.Items.Insert(NewPos, Temp[I]); Application.ProcessMessages; end; end; finally Temp.Free; end; end; |
Hallo,
möcht ja nicht aufdringlich sein, :D aber geht jetzt um die ListView oder ListBox? Der Titel müsste evtl. geändert werden. Grüsse, Daniel :hi: |
naja..mit nem ListView funktioniert es wahrscheinlich genauso!
das mit der "Echtzeitverschiebung" funzt leider nicht...auch ist mir aufgefallen, dass, wenn ich 5 Items makiere, und dazwischen ein paar Items nicht makiert sind (also mit STRG) die Items dann an der Position eingefügt werden, jedoch alle direkt hintereinander!! (also der Platzhalter wird nicht verschoben) Aber das müsste normal auch mit dem Code irgendwie zu realisieren sein! Grundsätzlich gings mir um die Grundidee! DANKE Sakura! MfG Steran |
Re: ListView: mehrere Items verschieben
Wie bekommt man denn beim ListView das Item, wo der Mauszeiger ist? ItemAtPos gibt's doch da nicht?!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz