Hallo, wer weiß hier einen Rat? Ich haben eine ListView (SortType = stNone), die z.B. 8 Items in der vsIcon-Ansicht anzeigt. Wenn ich nun z.B. Item2 per Drag&Drop nach Position 5 verschiebe (Routine s. unten), so wird dieses Item immer
am Ende der Items eingefügt (anstatt an Position 5)! Wenn ich danach aber in die vsReport-Ansicht wechsle, befindet sich das verschobene Item doch an der richtigen Stelle (an Position 5). Wieder zurück in der vsIcon-Ansicht ist das verschobene Item wieder an letzter Stelle!
Wie kann man nun in der vsIcon-Ansicht die gleiche Reihenfolge der Items wie in der vsReport-Ansicht herstellen, d.h. dass sich das verschobene Item an der richtigen Position 5 befindet?
Hier ist der Code für das Drag&Drop innerhalb der ListView:
Delphi-Quellcode:
procedure TMainForm.ListViewDragDrop(Sender, Source: TObject; X, Y: Integer);
var
currentItem, nextItem, dragItem, dropItem: TListItem;
begin
if Sender = Source then
begin
with TListView(Sender) do
begin
dropItem := GetItemAt(X, Y);
currentItem := Selected;
while currentItem <> nil do
begin
nextItem := GetNextItem(currentItem, TSearchDirection(sdAll), [IsSelected]);
if Assigned(dropItem) then
dragItem := Items.Insert(dropItem.Index)
else
dragItem := Items.Add;
dragItem.Assign(currentItem);
currentItem.Free;
currentItem := nextItem;
end;
end;
end;
end;
procedure TMainForm.ListViewDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept := Sender = ListView;
end;
ListView.DragMode ist natürlich dmAutomatic.
Ich habe die ListViewDragDrop-Routine im Debugger genau verfolgt: Das verschobene Item
wird in der vsIcon-Ansicht tatsächlich an Position 5 eingefügt, aber als
letztes Item angezeigt!