Я имею дело с большими текстовыми файлами (больше 100 МБ). Я использую TListView (OwnerData=True). Событие OnData ListView дает мне необходимые элементы один за другим.
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
, чтобы узнать, какой элемент запрашивается.
Если вы хотите заранее загрузить свои данные, вам нужно использовать событие OnDataHint
в дополнение к событию OnData
. Событие OnDataHint
дает вам ряд индексов, которые являются лучшим предположением ListView о том, какие элементы, вероятно, потребуются в ближайшее время из-за прокрутки, рисования и т. д.
Однако при этом нет гарантии, что событие OnData
будет запрашивать только те элементы, которые ранее были запрошены событием OnDataHint
. Вот почему это называется намеком. Ваш обработчик OnData
должен быть готов к загрузке элементов, которые еще не были загружены. Кроме того, хорошей идеей будет по возможности всегда загружать несколько первых и несколько последних элементов, поскольку ListView довольно часто обращается к этим элементам.
Это будет Microsoft. OnData
— это оболочка для уведомления LVN_GETDISPINFO , а OnDataHint
— для уведомления LVN_ODCACHEHINT . См. Виртуальный стиль просмотра списка для получения более подробной информации, особенно в разделе Управление кэшем.
Тот, кто создал OnDataHint, был настоящим мудрецом.