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

How to get range of OnData indexes from Virtual Listview

我正在处理大型文本文件(大于 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 事件之前请求的项目.这就是为什么它被称为 hint 的原因。您的 OnData 处理程序需要准备加载尚未加载的项目。而且,作为良好的衡量标准,如果可能的话,始终加载前几个项目和最后几个项目是个好主意,因为 ListView 经常引用这些项目。