Использование ListView в режиме виртуального списка

Использование ListView в режиме виртуального списка

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность. Книга завершается финалом, связывающим воедино темы и сюжетные линии, исследуемые на протяжении всей истории. В целом, книга представляет собой увлекательное и наводящее на размышления чтение, которое исследует человеческий опыт уникальным и осмысленным образом.

Жанр: Программирование
Серии: -
Всего страниц: 2
ISBN: -
Год издания: Не установлен
Формат: Полный

Использование ListView в режиме виртуального списка читать онлайн бесплатно

Шрифт
Интервал

Демонстрационная программа – 161 KB

Исходные тексты – 39 KB

Все программисты делятся на тех, кто повсеместно применяет виртуальный режим, и тех, кто о нем даже и не слышал. Конечно, это шутка, как и любая с долей … шутки-)

На таких сайтах как CodeGuru, есть несколько неплохих примеров применения виртуальных списков. Однако, многие программисты, с которыми мне приходится сталкиваться, лишь изредка прибегают к этой технике, ошибочно считая, что это если не извращение, то уж по крайней мере излишество. Многие заблуждаются, считая, что применение виртуальных списков необходимо только лишь в случаях больших массивов данных, например, при отображении информации из баз данных. Конечно это справедливо, однако, о чем действительно часто забывают – применение виртуальных списков позволяет не только повысить производительность, но и обеспечивает разделение данных и их представлений. Последнее, на мой взгляд, не менее важно.

Конечно, как и везде, нужно знать меру. Не стоит сломя голову бежать переписывать свой код, если требуется вывести диалоговое окно для выбора десятков элементов: cойдет и обычный подход. Однако, если логика вашего приложения основана на применении представления на основе ListView с широкими возможностями по добавлению|удалению|редактированию, да к тому же большого объема записей, – стоит задуматься о виртуальном режиме.

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

Виртуальность это просто

Для работы с виртуальным списком в простейшем случае достаточно следующего:

• Создать виртуальный список

• Вовремя заботиться о количестве элементов

• По запросу списка заполнять элементы нужной информацией

В некоторых случаях возможно понадобятся и более сложные вещи:

• Кеширование

• Сортировка

• Быстрый поиск элементов

Итак, обо всем по порядку.

Переход в режим виртуальности

Чтобы включить режим "виртуальности", необходимо установить стиль LVS_OWNERDATA. Текущая версия библиотеки элементов управления не позволяет переводить список из обычного режима в виртуальный "на лету", поэтому установку данного стиля необходимо делать при создании элемента. Если вы использует редактор диалога достаточно отметить переключатель Owner Data на вкладке More Style в окне свойств List Control. В случае применения класса СListView следует перекрыть PreCreateWindow.

Вся прелесть виртуального режима в том, что список хранит не сами элементы, а только их общее количество, диапазон отображаемых в данный момент, и тому подобную "мелочь". Значения самих элементов (строковые метки, рисунки и т.п) запрашиваются у приложения непосредственно перед их отрисовкой на экране. Такой прием позволяет значительно сэкономить память и существенно повысить производительность, особенно для больших объемов данных.

ПРИМЕЧАНИЕ

В MSDN сказано, что после установки данного стиля, число элементов, которые сможет хранить список, будет ограничено максимальным значением DWORD (для обычных списков только int). Однако, все функции (в том числе и API) для работы со списком принимают int. Кроме этого, мне не удалось использовать более 100.000.000 элементов. Более того, в примере MSJ за ноябрь 1996 г. от Strohm Armstrong встречается именно эта магическая цифра. Отговорка, стандартна: "Сложно представить, что возникнет необходимость использовать больше". Нет вопросов, если бы использовалась хотя бы степень двойки, а так, IMHO, ограничение такой странной (круглой) цифрой выглядит коварным замыслом.

Количество элементов

Итак, список создан. Чтобы вставить в него элементы, достаточной задать их количество. Количество элементов в виртуальном списке задается одной из следующих функций.

void CListCtrl::SetItemCount(int iCount);

void CListCtrl::SetItemCountEx(int iCount, DWORD dwFlags = LVSICF_NOINVALIDATEALL);

iCount

новое количество элементов

dwDlags

Комбинация Флагов определяющая реакцию списка на изменение количества элементов.

LVSICF_NOINVALIDATEALL Список не будет перерисован, пока добавленные элементы не окажутся с поле видимости.

LVSICF_NOSCROLL Позиция скроллинга не изменится.

Таким образом, все что нам нужно, чтобы оперировать элементами списка, – это задать их количество. Никаких вызовов InsertItem, DeleteItem и т.п. Это существенно упрощает код, отвечающий за манипуляцию с данными. Конечно, это не избавляет от подобных операций с самой информацией, однако, разделение данные-представление благоприятно сказывается на ясности кода, а значит способствует уменьшению ошибок.

Содержание элементов

Итак, виртуальный список хранит очень мало информации. За заполнение элементов перед отрисовкой отвечает приложение. Для этого список посылает уведомление LVN_GETDISPINFO. Обработчик несложно добавить, воспользовавшись ClassWizzard.

В обработчике уведомления LVN_GETDISPINFO необходимо проверить, какая информация требуется, и заполнить соответствующие поля.

В следующем примере показан один из способов реализации.

>void CMyListView::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult) {

> LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;

> LV_ITEM* pItem= &(pDispInfo)->item;


Рекомендуем почитать
Психокибернетика

Написанная в стиле практического руководства, книга показывает, как "вечно" несчастливые люди могут научиться радоваться жизни. По мнению автора, прозванного на Западе "Доктор Пигмалион", природа вложила в человека Механизм Успеха, который работает независимо от сознания, и мы сами зачастую мешаем ему, "вставляя палки в колеса". Вы узнаете о тайнах собственного Я, как улучшить свою внутреннюю жизнь, используя правду о себе. О своем душевном комфорте. Как создать программу полноценной жизни, об инстинкте успеха и использовании неограниченного запаса интеллекта.


Поцелуй на закате

Рауль дель Арко обещает умирающему старику позаботиться о его внучке. Единственный способ защитить Габриеллу, богатую наследницу, от охотников поживиться — жениться на ней. Рауль не хочет влюбляться и всеми возможными способами отталкивает Габриеллу даже после свадьбы. Однако сердцу не прикажешь…Для возрастной категории 16+.


Рассвет новой эры

Битвой с Хаосом и уходом Богов магии завершился Четвертый Век истории Кринна, именуемый Веком Отчаяния. Таинственный взрыв, уничтоживший Башню Высшего Волшебства в Палантасе, и прибытие на Ансалонский континент страшных драконов-завоевателей возвестили наступление Века Смертных. В мрачном ожидании грядущих невзгод жители Кринна встретили РАССВЕТ НОВОЙ ЭРЫ.


День бури

Кринн стонет под гнетом жестокой воли драконов-владык. Некогда плодородные земли прекращены в пустыни, цветущие острова закованы во льды, леса затянуты ядовитыми болотами. Рыцари Такхизис и дракониды собираются вместе, чтобы присоединиться к армиям новых чудовищ – потомков драконов. Отчаяние и безысходность окутывают мир. Лишь небольшой отряд героев, стремясь не допустить, чтобы Век Смертных стал веком рабства и гибели, вступает в борьбу с владыками.


Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.