Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2011, 23:23   #1
m_kostik
Пользователь
 
Регистрация: 22.02.2010
Сообщений: 24
По умолчанию добавление в TListView больших объемов инфы

Здравствуйте, уважаемые коллеги!
У меня проблема с TListView (режим vsReport). Мне нужно добавить в
него большое количество Item'ов (порядка 80 тысяч). В Item'е 3
Subitem'а. Делаю примерно так:
Код:
var
  i: integer;
  li: TListItem;
begin
  for i := 0 to 80000 do
    begin
      li := ListView1.Items.Add();
      li.Caption := str1;
      li.SubItems.Add(str2);
      li.SubItems.Add(str3);
      li.SubItems.Add(str4);
    end;
end;
Беда в том, что на машине средней паршивости этот код выполняется
примерно за 15..20 минут, что не допустимо. Проблема именно в
заполнении ListView - все остальное работает быстро. Есть ли
какой-нибудь способ поднять производительность?

Последний раз редактировалось Stilet; 14.03.2011 в 07:59.
m_kostik вне форума Ответить с цитированием
Старый 14.03.2011, 08:01   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

1) ListView.Items.BeginUpdate...код добавления записей...ListView.Items.EndUpdate
2) Не пользоваться ListView. Заменить его чем другим.
3) Не вносить сразу столько записей
4) Вносить. Но в дополнительном потоке.
Выбирай
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.03.2011, 08:49   #3
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Виртуальный список - точно так, как посоветовали на Королевстве
ReportCube вне форума Ответить с цитированием
Старый 14.03.2011, 13:26   #4
m_kostik
Пользователь
 
Регистрация: 22.02.2010
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
1) ListView.Items.BeginUpdate...код добавления записей...ListView.Items.EndUpdate
2) Не пользоваться ListView. Заменить его чем другим.
3) Не вносить сразу столько записей
4) Вносить. Но в дополнительном потоке.
Выбирай
Пункт 1 выигрыша не дает.
2. Заказчик настаивает на использовании только стандартных компонентов.
3. К сожалению, все записи нужно внести за раз.
4. Данные и так вносятся в дополнительном потоке.
m_kostik вне форума Ответить с цитированием
Старый 14.03.2011, 13:42   #5
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

У Вас есть источник данных, тот самый список, откуда Вы берёте Str1, Str2 и т.п. Вы знаете его размер. Просто указываете этот размер как размер для TListView.Items.Count, а данные будете передавать в обработчике события OnData. Вам же никто не предлагает какой-то нестандартный компонент: обычное и правильное использование стандартного класса для работы с большими списками.
ReportCube вне форума Ответить с цитированием
Старый 14.03.2011, 13:43   #6
m_kostik
Пользователь
 
Регистрация: 22.02.2010
Сообщений: 24
По умолчанию

Цитата:
Сообщение от ReportCube Посмотреть сообщение
Виртуальный список - точно так, как посоветовали на Королевстве
Был бы крайне признателен за пример кода.
m_kostik вне форума Ответить с цитированием
Старый 14.03.2011, 14:06   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

http://tinyurl.com/63d4h3u
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 14.03.2011, 19:14   #8
m_kostik
Пользователь
 
Регистрация: 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'ов скорость увеличивается на порядки.
m_kostik вне форума Ответить с цитированием
Старый 14.03.2011, 19:28   #9
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Всё так, но не забывайте про проблемы, которые обязательно возникнут при включение группового выделения. Кабы было всё так просто...
ReportCube вне форума Ответить с цитированием
Старый 15.03.2011, 21:06   #10
m_kostik
Пользователь
 
Регистрация: 22.02.2010
Сообщений: 24
По умолчанию

Цитата:
Сообщение от ReportCube Посмотреть сообщение
Всё так, но не забывайте про проблемы, которые обязательно возникнут при включение группового выделения. Кабы было всё так просто...
А можно об этом по-подробнее. Или хотя бы ссылочку где об этом говорят? А то у меня возникло легкое головокружение от успехов :-))) Надо приходить в себя :-)
m_kostik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расчет объемов поставки товара Глумов 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