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/106612-listview-mehrere-items-verschieben.html)

DelphiforEver 13. Jan 2008 23:28


ListView mehrere Items verschieben
 
Hallo,
Ich habe ein Problem ich möchte in einem ListView mehrere Items, welche Selected sind nach oben und unten verschieben.
Momentan kann ich jedoch nur 1 selektiertes Item nach oben und unten verschieben, es geht also nicht mit mehreren gleichzeitig.
Ich wollte Fragen, ob man die folgende Prozedure auch so erweitern kann, sodass man mehrere Items gleichzeitig verschschieben kann?

Delphi-Quellcode:
procedure MoveLVItem(LV: TListView;Direction: TSearchDirection);
var aItem, NextItem,TmpItem : TListItem;
begin
  with LV do
  begin
   if IsEditing or not Assigned(ItemFocused) then
      exit;//raus wenn Item editiert wird oder kein Item selektiert ist
    aItem := ItemFocused;
    case Direction of
      sdAbove : if aItem.Index = 0 then
                  exit;//Erstes Item ist markiert > raus
      sdBelow : if aItem.Index = Items.Count-1 then
                  exit;//Letztes Item ist markiert > raus
    end;
    NextItem := GetNextItem(aItem,Direction,[isNone]);
    Items.BeginUpdate;
    try
      TmpItem := TListItem.Create(Items);
      TmpItem.Assign(NextItem);
      NextItem.Assign(aItem);
      aItem.Assign(TmpItem);
      aItem.Selected := NextItem.Selected;
      TmpItem.Free;
      NextItem.MakeVisible(True);
      ItemFocused := NextItem;
      Selected := NextItem;
    finally
      Items.EndUpdate;
    end;
  end;
end;

Mackhack 13. Jan 2008 23:55

Re: ListView mehrere Items verschieben
 
Ist Multiselect auf True?

DelphiforEver 14. Jan 2008 00:04

Re: ListView mehrere Items verschieben
 
Ja, ist auf True.

Lannes 14. Jan 2008 08:12

Re: ListView mehrere Items verschieben
 
Hallo,

die Prozedur kommt mir irgendwie bekannt vor :wink:

Was hindert Dich daran für jedes Item die Prozedur aufzurufen?

Du könntest die Items über ein TListItems-Objekt übergeben und dann in der Prozedur eine Schleife einbauen.
Oder direkt einen Zeiger auf die Listview übergeben und in der Prozedur dann Selected auswerten.

So oder so, es ist immer eine Schleife erforderlich.

marabu 14. Jan 2008 09:34

Re: ListView mehrere Items verschieben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Herzlich willkommen in der Delphi-PRAXiS, DelphiForEver.

Der Code zum Verschieben von mehreren ListItems lässt sich bei Verwendung der Methode MoveSelection() extrem kompakt schreiben, aber die nötigen Fallunterscheidungen für zusammenhängende und nicht zusammenhängende Auswahlmengen stellt einen vor die Wahl: Entweder für jeden Fall den optimalen Code oder ein relativ kompakter Code für alle Fälle. Ich erfreue mich an möglichst wenigen Codezeilen.

Freundliche Grüße vom marabu

DelphiforEver 15. Jan 2008 19:27

Re: ListView mehrere Items verschieben
 
Vielen Dank für die Hilfe. Mit dem verschieben über Drag & Drop war kein Problem, aber ich versuche die oben genannte Prozedure so umzuformen, dass sie auch mit mehreren Items funktioniert. Einfach in eine Schleife kann nicht gehen, weil die verschobenen Items erneut selected werden...

Matze 15. Jan 2008 19:30

Re: ListView mehrere Items verschieben
 
Ein Beispiel für eine ListBox gibt es in der Code-Library. Evtl. lässt sich das für einen ListView umschreiben.

Lannes 16. Jan 2008 14:00

Re: ListView mehrere Items verschieben
 
Hallo,

die folgende Prozedur arbeitet mit einem Objekt zur Zwischenspeicherung, sie könnte annähernd Deinen Anforderungen entsprechen. Du solltest aber noch prüfen ob alle Randbedingungen abgefangen werden :angel2:
Delphi-Quellcode:
procedure MoveMultiSelectLVItem(LV: TListView;iDest: Integer);
var vLV : TListView;
    vListItems : TListItems;
    aItem : TListItem;
    z,iTempDest : Integer;
begin
  vLV := TListView.CreateParented(THandle(-3));
  vListItems := TListItems.Create(vLV);
  try
  iTempDest := iDest;
  for z := LV.Items.Count - 1 downto 0 do
    if LV.Items[z].Selected then
      begin
      aItem := vListItems.Add;
      aItem.Assign(LV.Items[z]);
      if z < iDest then
        dec(iTempDest);
      LV.Items[z].Delete;
      end;
  for z := 0 to vLV.Items.Count - 1 do
    begin
    aItem := LV.Items.Insert(iTempDest);
    aItem.Assign(vLV.Items[z]);
    aItem.Selected := True;
    end;
  finally
    vLV.Free;
    vListItems.Free;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:18 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-2025 by Thomas Breitkreuz