Автор: Peter Below
Мне необходимо создать Listbox с использованием внешних данных,
хранимых в огромном (!) TStringList. Существует ли какое-нибудь системное
сообщение, которое я мог бы перехватывать для получения данных Listbox из
внешнего TStringlist?
Просматривая справочник по API, я нашел интересный пункт, который может
помочь вам решить проблему: в Win32 вы можете создать Listbox со стилем
LBS_NODATA:
(из описания CreateWindow:)
LBS_NODATA
Определяет ListBox со стилем no-data (без данных). Данный стиль необходимо
применять в случае, если количество элементов в ListBox превышает одну тысячу.
no-data ListBox также должен иметь стиль LBS_OWNERDRAWFIXED, но не может иметь
стиль LBS_SORT или LBS_HASSTRINGS.
no-data ListBox похож на owner-drawn ListBox за исключением того, что он не
содержит в своих элементах строк и изображений (иконок). Команды добавления,
вставки или удаления данных в элементах такого типа ListBox будут
проигнорированы, а запросы для поиска строк всегда будут заканчиваться неудачей.
При необходимости отрисовки данного элемента, Windows посылает родительскому
окну сообщение WM_DRAWITEM. Член itemID стуктуры DRAWITEMSTRUCT, передаваемой с
сообщением WM_DRAWITEM, определяет номер строки (элемент), который должен быть
перерисован. no-data ListBox не посылает сообщение WM_DELETEITEM.
Количество элементов в таком списке вы можете установить с помощью сообщения
LB_SETCOUNT. Это позволит вам создать "виртуальный" ListBox с очень небольшой
загрузкой.
Чтобы воспользоваться новым стилем, вам нужно создать новый класс-наследник
от TListbox и перекрыть метод CreateParams.
|