如何从虚拟列表视图中获取OnData索引的范围



我正在处理大型文本文件(大于100MB(。我使用的是TListView(OwnerData=True(。ListView的OnData事件一个接一个地为我提供了所需的项。

procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
Item.Caption:=MyStringList.strings[Item.Index];
end;

但我需要一次(滚动后(所需的全部项目。我需要这个概念事件:

procedure TForm1.ListView1DataRange(Sender: TObject; ItemIndexStarts: int64; ItemIndexEnds: int64);
begin
LoadMyItemsByRange(ItemIndexStarts,ItemIndexEnds);
end;

LoadMyItemsByRange易于实现。如何获取ItemIndexStarts和ItemIndexEnds值?任何想法都值得赞赏。

OnData事件仅用于返回特定项目的数据,没有提供范围。使用Item.Index属性来了解请求的项目是正确的。

如果要提前预加载数据,除了OnData事件外,还需要使用OnDataHint事件。OnDataHint事件为您提供了一系列索引,这些索引是ListView对由于滚动、绘图等原因可能很快需要的项目的最佳猜测。

但是,也就是说,不能保证OnData事件只要求OnDataHint事件先前请求的项目。这就是为什么它被称为提示。您的OnData处理程序需要准备好加载尚未加载的项。而且,如果可能的话,最好始终加载前几项和后几项,因为ListView经常引用这些项。

最新更新