![]() |
Listview items verschieben
Ich habe folgendes Problem,
ich möchte die markierten Items einer listview mit "strg+Pfeil auf" und "strg+Pfeil" runter verschieben. Das hochschieben der Items funktioniert ohne Probleme, jedoch das herunterschieben nicht, die Items werden aus mir unerklärlichen gründen nicht verschoben.
Delphi-Quellcode:
function MoveListViewItem(listView: TListView; ItemFrom, ItemTo: Word): Boolean;
var Source, Target: TListItem; begin Result := False; listview.Items.BeginUpdate; try Source := listview.Items[ItemFrom]; Target := listview.Items.Insert(ItemTo); Target.Assign(Source); Source.Free; Result := True; finally listview.Items.EndUpdate; end; end; procedure TForm1.items_nach_oben; var i:integer; begin for i:=0 to lv1.Items.Count-1 do begin if lv1.Items.Item[i].Selected then begin if i<>0 then begin MoveListViewItem(lv1,i,i-1); lv1.Items.Item[i-1].Selected:=true; end; end; end; end; procedure TForm1.items_nach_unten; var i:integer; begin for i:=0 to lv1.Items.Count-1 do begin if lv1.Items.Item[i].Selected then begin if i<lv1.Items.Count-1 then begin MoveListViewItem(lv1,i,i+1); lv1.Items.Item[i+1].Selected:=true; end; end; end; end; Aufruf: if key=38 then if KeyPressed(vk_Control) then items_nach_oben; if key=40 then if KeyPressed(vk_Control) then items_nach_unten; |
Re: Listview items verschieben
geh die schleife einfach mal schritt für schritt durch dann wirst du sehen das es daran liegt das du selected in der schleife änderst und somit das nächste item dann selektiert ist. Du solltest auf die Schleife ganz verzichten und direkt das selektierte Item ansteuern.
|
Re: Listview items verschieben
Es sollen aber alle markierten Items verschoben werden.
|
Re: Listview items verschieben
naja, wie gesagt solltest du da mal im einzelschritt durchgehen.
Stelle dir vor das 0te Item ist selektiert: du verschiebst das 0te Item an Position1 dann verschiebst du das 1te Item (was früher das 0te war) an Position 2 dann verschiebst du das 2te Item (was früher das 0te war) an Position 3 etc. Zudem kannst du die schleife auch bis count - 2 laufen lassen und kannst dir damit das if sparen. Deine Move-Methode ist auch fehlerhaft. Willst du Beispielsweise ein Item von 2 nach 3 verschieben legst du an Position 3 ein neues Item an und löschst danach das zweite weg. dadurch wird das neue auber von position 3 auf position2 verschoben |
Re: Listview items verschieben
Für alle die es interessiert, so funktionierts :
Delphi-Quellcode:
procedure TForm1.items_nach_unten;
var i:integer; begin for i:=lv1.Items.count-2 downto 0 do begin if lv1.Items.Item[i].Selected then begin MoveListViewItem(lv1,i,i+2); lv1.Items.Item[i+1].Selected:=true; end; end; end; |
Re: Listview items verschieben
Zusätzlich könntest Du noch überlegen, da es ja nur um Verschieben geht, einfach das Index des TListItem zu ändern, statt ihn in einen neu angelegten zu kopieren...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 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