|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
13.03.2011, 23:23 | #1 |
Пользователь
Регистрация: 22.02.2010
Сообщений: 24
|
добавление в TListView больших объемов инфы
Здравствуйте, уважаемые коллеги!
У меня проблема с TListView (режим vsReport). Мне нужно добавить в него большое количество Item'ов (порядка 80 тысяч). В Item'е 3 Subitem'а. Делаю примерно так: Код:
примерно за 15..20 минут, что не допустимо. Проблема именно в заполнении ListView - все остальное работает быстро. Есть ли какой-нибудь способ поднять производительность? Последний раз редактировалось Stilet; 14.03.2011 в 07:59. |
14.03.2011, 08:01 | #2 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
1) ListView.Items.BeginUpdate...код добавления записей...ListView.Items.EndUpdate
2) Не пользоваться ListView. Заменить его чем другим. 3) Не вносить сразу столько записей 4) Вносить. Но в дополнительном потоке. Выбирай
I'm learning to live...
|
14.03.2011, 08:49 | #3 |
Форумчанин
Регистрация: 11.03.2011
Сообщений: 426
|
Виртуальный список - точно так, как посоветовали на Королевстве
|
14.03.2011, 13:26 | #4 | |
Пользователь
Регистрация: 22.02.2010
Сообщений: 24
|
Цитата:
2. Заказчик настаивает на использовании только стандартных компонентов. 3. К сожалению, все записи нужно внести за раз. 4. Данные и так вносятся в дополнительном потоке. |
|
14.03.2011, 13:42 | #5 |
Форумчанин
Регистрация: 11.03.2011
Сообщений: 426
|
У Вас есть источник данных, тот самый список, откуда Вы берёте Str1, Str2 и т.п. Вы знаете его размер. Просто указываете этот размер как размер для TListView.Items.Count, а данные будете передавать в обработчике события OnData. Вам же никто не предлагает какой-то нестандартный компонент: обычное и правильное использование стандартного класса для работы с большими списками.
|
14.03.2011, 13:43 | #6 |
Пользователь
Регистрация: 22.02.2010
Сообщений: 24
|
|
14.03.2011, 14:06 | #7 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
14.03.2011, 19:14 | #8 |
Пользователь
Регистрация: 22.02.2010
Сообщений: 24
|
Спасибо veniside'e! Нашел отличную статью по этой проблеме: http://www.delphi.int.ru/articles/38/
Суть в том, что при работе с большими объемами инфы нужно устанавливать ListView.OwnerData в true, затем присвоить ListView.Count сколько нужно (в моем случае 80000) и создать обработчик события OnData, в котором будет заполняться каждый конкретный Item (с Subitem'ами). Событие OnData возникает только тогда, когда нужно вывести соответствующий Item в видимую область ListView. Естественно, что при большом количестве Item'ов скорость увеличивается на порядки. |
14.03.2011, 19:28 | #9 |
Форумчанин
Регистрация: 11.03.2011
Сообщений: 426
|
Всё так, но не забывайте про проблемы, которые обязательно возникнут при включение группового выделения. Кабы было всё так просто...
|
15.03.2011, 21:06 | #10 |
Пользователь
Регистрация: 22.02.2010
Сообщений: 24
|
А можно об этом по-подробнее. Или хотя бы ссылочку где об этом говорят? А то у меня возникло легкое головокружение от успехов :-))) Надо приходить в себя :-)
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Расчет объемов поставки товара | Глумов | Microsoft Office Excel | 1 | 18.01.2011 13:31 |
TListView delphi | kefir4ik | Помощь студентам | 3 | 16.09.2010 23:17 |
добавление инфы из DBEdit в DBGreed нажатием кнопки | drakon803 | БД в Delphi | 1 | 23.05.2010 14:00 |
Ввод больших объемов данных из файла | Molotoff | Общие вопросы C/C++ | 15 | 02.04.2009 16:36 |
Соударение шариков разных размеров и объемов | Стаханов_Андрей | Помощь студентам | 3 | 09.03.2008 17:17 |