如何从虚拟列表视图获取 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 经常引用这些项目。
我正在处理大型文本文件(大于 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 经常引用这些项目。