Предполагая, что длина вашего журнала составляет 1 000 000 строк, которые вы можете забыть, используя HTML или RTF, самое чистое решение (и я обрабатываю 100-1 000 000) - это использовать (как предполагает mjustin) TListBox с
Style := lbVirtualOwnerDraw;
OnDrawItem := ListDrawItem; // your own function (example in help file)
- Определите ваш массив данных в любом формате, который будет полезен для остальной части приложения. Я иду с простым LogObject.
- Сохраняйте все объекты LogObjects в ObjectList, каждый раз, когда в список вносятся изменения (добавляются, удаляются), настраивайте TListBox.Count в соответствии с новым счетчиком ObjectList.
- Определите ListDrawItem самостоятельно, чтобы взять индекс, и вы можете получить информацию из вашего ObjectList (база данных, что угодно ..) и анализировать по требованию.
Поскольку вы будете просматривать только несколько записей за раз, подход «анализ по требованию» значительно лучше, так как не происходит «замедления» во время загрузки, когда вы пытаетесь проанализировать все миллионы строк.
Не зная вашей реальной проблемы, я могу просто сказать, что по моему опыту эта техника, которая когда-то изучена и освоена, полезна в большинстве приложений, ориентированных на данные.
Улучшения включают в себя прикрепление элемента управления заголовка над списком (я обертываю их вместе на панели), и вы можете создать превосходный элемент управления TListView. Прикрепите немного логики сортировки к событию click в элементе управления заголовка, и вы можете отсортировать список объектов, и все, что вам нужно сделать, это вызвать ListBox.Invalidate, чтобы обновить представление (когда это возможно).
++ Для обновления в реальном времени. Я делаю это в данный момент, чтобы вызвать событие таймера для настройки ListBox.Count, поскольку вы не хотите обновлять список 1000 раз в секунду ..: -)