• Управление кешированием.

  • Нахождение специфических элементов

  • Сортировка

  • Кажущиеся трудности

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

    Управление кешированием.

    Если вы самостоятельно решили оперировать большими объемами информации – без кеширования не обойтись. Виртуальный список помогает оперировать процессом кеширования, посылая приложению уведомления LVN_ODCACHEHINT, в которых передает информацию о диапазоне элементов, которые необходимо отобразить на экране. Эту информацию можно использовать для динамического выделения памяти под требуемое число элементов и заполнения их корректными значениями.

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

     NMLVCACHEHINT* pCacheHint = (NMLVCACHEHINT*)pNMHDR;

     // Подготовить кеш

     PrepareCach(pCacheHint->iFrom, pCacheHint->iTo);

     *pResult = 0;

    }

    Реализация функции, подобной PrepareCach, зависит от того, каким способом вы храните и обрабатываете данные, и может быть различной в зависимости от решаемой задачи. Данное уведомление всего лишь своевременная подсказка.

    Нахождение специфических элементов

    Когда списку необходимо найти специфический элемент, он посылает уведомление LVN_ODFINDITEM. Это может случиться, если требуется реализовать нажатие быстрой клавиши (поиск по имени), или элемент получил сообщение LVM_FINDITEM. Информация для поиска передается в двух структурах NMLVFINDITEM и LVFINDINFO. В них содержится: номер элемента, с которого следует начать поиск; элемент искомой строки; направление поиска и т.п.

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

     NMLVFINDITEM* pFindInfo = (NMLVFINDITEM*)pNMHDR;

     LVFINDINFO FindItem = pFindInfo->lvfi;


     if (FindItem.flags & LVFI_STRING) {

      //ишем FindItem.psz начиная pFindInfo->iStart

      *pResult = GetDocument()->FindItem(FindItem.psz, pFindInfo->iStart);

      return;

     }

     *pResult = –1;

    }

    Обработчик уведомления должен вернуть номер искомого элемента или –1 в случае неудачи.

    Сортировка

    Трудности? Это еще что такое? Однако бесплатный сыр сами знаете где. Дело в том, что, так как сами элементы в списке не хранятся, придется самим заботится о сортировке. Не удастся воспользоваться функцией CListCtrl::SortItems, бесполезно писать CompareItems и т.п. Все, что у вас есть – это порядковый номер элемента.

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







     


    Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх