Как получить диапазон индексов OnData из Virtual Listview

Я имею дело с большими текстовыми файлами (больше 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? Любая идея приветствуется.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
222
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Событие OnData предназначено для возврата данных только для определенного элемента, диапазон не указан. Вы правильно используете свойство Item.Index, чтобы узнать, какой элемент запрашивается.

Если вы хотите заранее загрузить свои данные, вам нужно использовать событие OnDataHint в дополнение к событию OnData. Событие OnDataHint дает вам ряд индексов, которые являются лучшим предположением ListView о том, какие элементы, вероятно, потребуются в ближайшее время из-за прокрутки, рисования и т. д.

Однако при этом нет гарантии, что событие OnData будет запрашивать только те элементы, которые ранее были запрошены событием OnDataHint. Вот почему это называется намеком. Ваш обработчик OnData должен быть готов к загрузке элементов, которые еще не были загружены. Кроме того, хорошей идеей будет по возможности всегда загружать несколько первых и несколько последних элементов, поскольку ListView довольно часто обращается к этим элементам.

Тот, кто создал OnDataHint, был настоящим мудрецом.

Xel Naga 18.12.2020 23:06

Это будет Microsoft. OnData — это оболочка для уведомления LVN_GETDISPINFO , а OnDataHint — для уведомления LVN_ODCACHEHINT . См. Виртуальный стиль просмотра списка для получения более подробной информации, особенно в разделе Управление кэшем.

Remy Lebeau 18.12.2020 23:08

Другие вопросы по теме