I see now ... I should be working with the StringList rather than with ListView.Items. That never occurred to me.
In virtual mode, what about code like
ListItem := WordListView.FindCaption (0, 'a', true, true, false);
WordListView.Scroll (0, ListItem.DisplayRect (drBounds).Top);
For example, do I need to replace FindCaption by a search of the StringList?
By way of explanation, it was while trying to debug such code that I became concerned about what was happening to ListItem, leading me to display its Index value. Although I no longer need to do this, it is still disconcerting that (in virtual mode) its value can change in the way that my test program showed.
Thanks for pointing me in the right direction.
@emailx45: I didn't explain it well. I am happy with non-virtual mode. My problem was with virtual mode, the change in value of ListItem between the two lines where its value was displayed.