![]() |
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; |
Re: ListView mehrere Items verschieben
Ist Multiselect auf True?
|
Re: ListView mehrere Items verschieben
Ja, ist auf True.
|
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. |
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 |
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...
|
Re: ListView mehrere Items verschieben
Ein Beispiel für eine ListBox gibt es in der
![]() |
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