AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ListView: mehrere Items verschieben

Ein Thema von Steran · begonnen am 3. Jul 2003 · letzter Beitrag vom 28. Jul 2003
Antwort Antwort
Steran

Registriert seit: 14. Jan 2003
42 Beiträge
 
#1

ListView: mehrere Items verschieben

  Alt 3. Jul 2003, 11:59
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
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 3. Jul 2003, 12: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;
......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Steran

Registriert seit: 14. Jan 2003
42 Beiträge
 
#3
  Alt 3. Jul 2003, 14: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?)
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 3. Jul 2003, 15: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;
......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#5
  Alt 3. Jul 2003, 16:31
Hallo,

möcht ja nicht aufdringlich sein, aber geht jetzt um die ListView oder ListBox? Der Titel müsste evtl. geändert werden.

Grüsse, Daniel
  Mit Zitat antworten Zitat
Steran

Registriert seit: 14. Jan 2003
42 Beiträge
 
#6
  Alt 4. Jul 2003, 06: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
  Mit Zitat antworten Zitat
Tpercon

Registriert seit: 7. Jun 2002
638 Beiträge
 
Delphi 5 Professional
 
#7

Re: ListView: mehrere Items verschieben

  Alt 28. Jul 2003, 12:17
Wie bekommt man denn beim ListView das Item, wo der Mauszeiger ist? ItemAtPos gibt's doch da nicht?!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz