Es geht vielleicht auch noch einfacher, in dem man sich nur auf das aktuelle und das neue TopItem konzentriert:
Delphi-Quellcode:
DI := ListView1.ItemIndex - Succ(ListView1.VisibleRowCount) div 2; // Index des neuen TopItem
R1 := ListView1.TopItem.DisplayRect(drSelectBounds); // Position des aktuellen TopItem
R2 := ListView1.Items[DI].DisplayRect(drSelectBounds); // Position des neuen TopItem
ListView1.Scroll(0, R2.Top - R1.Top);
Es fehlen noch ein paar Plausibilitätsprüfungen wie
- Gibt es überhaupt Einträge
- Ist ein Eintrag ausgewählt
- Sind überhaupt Zeilen sichtbar