Offenbar lässt sich das Desktop-Verhalten mit einem normalen ListView nicht exakt nachbilden (zumindest ist mir das nicht gelungen).
Knackpunkt ist das Wrapping der Spalten, wenn ein Item in die Spalte verschoben wird. Der Desktop führt das Wrapping korrekt durch, lässt aber alle Items außerhalb der belegten Spalten an ihrem Platz. Beim ListView macht ein
Arrange(arSnapToGrid)
aber kein Column-Wrapping, während das
Arrange(arDefault)
die frei positionierten Items wieder in die Spalten einordnet.
Nun ist ein Desktop aber auch in der Regel nicht einfach in der Größe änderbar bzw. geraten die Icons schon mal gehörig durcheinander, wenn man das tut. Ich vermute daher daß Microsoft hier eine spezielle Version eines ListViews verwendet oder mit undokumentierten Funktionen arbeitet.
Vielleicht kommt ja noch jemand auf die zündende Idee.
Hier noch der Code für das korrekte Einordnen:
Delphi-Quellcode:
var
DropItem: TListItem;
CurrentItem: TListItem;
lvw: TListView;
begin
if Sender = Source then begin
lvw := TListView(Sender);
CurrentItem := lvw.Selected;
if CurrentItem <> nil then begin
DropItem := lvw.GetItemAt(X, Y);
if DropItem <> nil then begin
Y := DropItem.Top - 1;
end;
CurrentItem.SetPosition(Point(X, Y));
lvw.Arrange(arSnapToGrid);
end;
end;
end;