Es hat offenbar Probleme mit den Objekt-Referenzen gegeben. Wenn man sich lediglich auf die Captions beschränkt, dann geht es. Zudem arbeitet die von mir vorgestellte Version auf einem Datenbestand, der mit dem Index 1 anfängt. Also musst Du die Indices aller Zugriffe auf die ListItems um 1 erniedrigen.
Code:
var i,j,h:integer;
v:TListItem;
begin
v:= TListItem.Create( ListView1.Items ); // den habe ich mal erzeugt
h:=1;
Repeat
h:=(3*h)+1;
Until (h>ListView1.Items.Count-1);
Repeat
h:=(h div 3);
For i:=(h+1) To ListView1.Items.Count-1 Do
Begin
v.Caption:=ListView1.Items.Item[i-1].Caption;
j:=i;
While ((j>h) and (ListView1.Items.Item[j-h-1].Caption>v.Caption)) Do
Begin
ListView1.Items.Item[j-1].Caption:=ListView1.Items.Item[j-h-1].Caption;
dec(j,h);
End;
ListView1.Items.Item[j-1].Caption:=v.Caption;
End;
Until (h=1);
v.Free;
end;
In dieser Fassung funktioniert der Algorithmus - jetzt muss man sich nur noch um eine saubere Behandlung der Objekte kümmern.
Grüße,
Daniel
Daniel R. Wolf