Der ursprüngliche Quellcode ist leider unzureichend und daher fehlerhaft.
Versuche es hiermit:
Code:
procedure MoveLVItem(LV: TListView; Direction: TSearchDirection);
var
aItem, NextItem, TmpItem: TListItem;
fChecked: array of Boolean;
i: integer;
temp: Boolean;
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;
setlength(fchecked, items.Count);
for i := 0 to items.count - 1 do
fChecked[i] := Items.item[i].checked;
case Direction of
sdAbove:
begin
if aItem.Index = 0 then exit; // Erstes Item ist markiert > raus
temp := items[aItem.Index - 1].checked;
fChecked[aItem.Index - 1] := items[aItem.Index].checked;
fChecked[aItem.Index] := temp;
end;
sdBelow:
begin
if aItem.Index = Items.Count - 1 then exit; // Letztes Item ist markiert > raus
temp := items[aItem.Index + 1].checked;
fChecked[aItem.Index + 1] := items[aItem.Index].checked;
fChecked[aItem.Index] := temp;
end;
end;
NextItem := GetNextItem(aItem, Direction, [isNone]);
Items.BeginUpdate;
TmpItem := TListItem.Create(Items);
try
TmpItem.Assign(NextItem);
NextItem.Assign(aItem);
aItem.Assign(TmpItem);
aItem.Selected := NextItem.Selected;
NextItem.MakeVisible(True);
ItemFocused := NextItem;
Selected := NextItem;
finally
TmpItem.Free;
end;
for i := 0 to items.count - 1 do
items.item[i].checked := fChecked[i];
Items.EndUpdate;
end;
end;