Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ListView: mehrere Items verschieben (https://www.delphipraxis.net/6204-listview-mehrere-items-verschieben.html)

Steran 3. Jul 2003 12:59


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

sakura 3. Jul 2003 13:09

Das hat mich auch interessiert, hier die Lösung. Ändere folgende Eigenschaften der ListBox
  • DragMode: dmAutomatic
  • MultiSelect: True
Dann musst Du folgenden Code für die Ereignisse OnDragDrop und OnDragOver der ListBox eingeben
Delphi-Quellcode:
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;
...:cat:...

Steran 3. Jul 2003 15:59

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?)

sakura 3. Jul 2003 16:11

Hm, ich weiß nicht, wie es da aussieht, aber versuche mal:
Delphi-Quellcode:
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;
...:cat:...

Daniel B 3. Jul 2003 17:31

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:

Steran 4. Jul 2003 07:57

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

Tpercon 28. Jul 2003 13:17

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