Delphi. TListView. Сортировка в обычном и virtual режимах

Понадобилось сделать сортировки в обычном и virtual режимах для компонента TListView. В обычном мы сами заполняем и сразу весь список так сказать. Для небольших списков это Ок, а если записей под 100 000 – это удовольствие будет тормозить, чтобы этого избежать, в TListView есть, как известно virtual режим, который подгружает данные в событии onData. Но об этом позже.

39

Сортировка TListView  в обычном режиме

Традиционная сортировка в сети достаточно известна, как я понял, вот например на блоге geekelectronics довольно хорошая статья. Сложного ничего нет.

Обработаем событие OnCompare

Сам вызов сортировки происходит таким образом

Направление сортировки можно заменить переменой порядка Item1.Caption и Item2.Caption на Item2.Caption и Item1.Caption в компараторе.

SortType определяет, как я понял – что мы будем сортировать – строки или цифры, как известно – они по разному сортируются. Как сортировать строки и цифры – более менее понятно. Как сортировать, скажем даты… Далее мы увидим как это можно сделать, сделав специальный компоратор для даты. В принципе, ничего сложного!!! Но вот как в стандартном режиме переключаться на разные типы данных внутри одного компоратора в событии OnCompare – не совсем понятно.

Вообще, прямо очень хорошее описание сортировки в обычном (невиртуальном) режиме TlistView находится на официальном сайте Embarcadero. Там есть ещё свои тонкости и нюансы, но я затеял данный пост скорее для описания сортировки в виртуальном режиме TListView.

Сортировка TListView в виртуальном режиме

Внимание, следующая часть статьи не совсем корректна, если данные одинаковые то алгоритм работает не совсем корректно. Чуть позже это поправлю.

Вот этой информации, я нигде не нашёл. Пришлось думать самому. Результат оправдал.

Что такое виртуальный режим TListView? Скажем, нам нужно отобразить, ну оч. много данных. Для этого и создан виртуальный режим. Включить его можно так…

Соответственно данные для отображения в TListView нужно передавать в событии OnData, ну скажем, так…

FrandomList и FrandomList2 это заранее созданные списки. При каждом обновлении списков – обновить данные в TListView можно так…

Конечная процедура, которая сортирует данные в каком-то одном списке, обновляет порядок в сортируемом столбце и всех других столбцах у меня получилась такой. Сначала я написал функции-компараторы для разных типов данных – string, integer, tdatetime – это то, что встречалось у меня в проекте, думаю, можно допилить под любой другой проект

И собственно сама сортировка. Нам нужно отсортировать столбец в соответствии с его типом данных и отобразить изменение порядка во всех остальных столбцах, в которых сортировка не происходила

Собственно само применение, пример

39

 

Пример стартового заполнения даннных

 

This entry was posted in Delphi. Bookmark the permalink.

Leave a Reply