Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.07.03;
Скачать: CL | DM;

Вниз

добавление в TListView больших объемов инфы   Найти похожие ветки 

 
m_kostik   (2011-03-13 23:20) [0]

Здравствуйте, уважаемые коллеги!
У меня проблема с TListView (режим vsReport). Мне нужно добавить в

него большое количество Item"ов (порядка 80 тысяч). В Item"е 4

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 - все остальное работает быстро. Есть ли

какой-нибудь способ поднять производительность?


 
DimaBr ©   (2011-03-14 11:26) [1]

Внимание! Здесь обсуждаются вопросы, связанные с разработкой компонентов, редакторов свойств, редакторов компонентов и экспертов IDE.
Вопросы по поиску и использованию готовых компонентов, редакторов или экспертов являются нарушением тематики и могут быть удалены.


 
Anatoly Podgoretsky ©   (2011-03-14 11:33) [2]

А пользователю что вешаться из-за таких объемов, он же тормозить не умеет.


 
DimaBr ©   (2011-03-14 11:34) [3]

Пускай пользователь вчитывается, вдруг в 73652 элементе найдёт ошибку


 
CrytoGen   (2011-03-14 11:37) [4]

VirtualTree посмотрите


 
RWolf ©   (2011-03-14 11:38) [5]


> Есть ли какой-нибудь способ поднять производительность?

для начала элементарно обернуть код в Items.BeginUpdate / EndUpdate.
но над [2] и [3] стоит задуматься.


 
m_kostik   (2011-03-14 19:23) [6]


> для начала элементарно обернуть код в Items.BeginUpdate
> / EndUpdate

Этот фокус, к сожалению, не работает


 
m_kostik   (2011-03-14 19:25) [7]

Нашел отличную статью по этой проблеме: http://www.delphi.int.ru/articles/38/
Суть в том, что при работе с большими объемами инфы нужно устанавливать ListView.OwnerData в true, затем присвоить ListView.Count сколько нужно (в моем случае 80000) и создать обработчик события OnData, в котором будет заполняться каждый конкретный Item (с Subitem"ами). Событие OnData возникает только тогда, когда нужно вывести соответствующий Item в видимую область ListView. Естественно, что при большом количестве Item"ов скорость увеличивается на порядки.
Всем большое спасибо! :-)))


 
_Юрий   (2011-03-14 19:37) [8]


> Всем большое спасибо! :-)))
>


Завсегда рады помочь. Обращайтесь


 
DiamondShark ©   (2011-03-15 12:43) [9]


> большое количество Item"ов (порядка 80 тысяч).

Ни один нормальный пользователь не сможет прочитать 80 тысяч элементов.


 
han_malign   (2011-03-15 17:19) [10]


> Ни один нормальный пользователь не сможет прочитать 80 тысяч элементов.

- в сортированном списке - найти коллизии и проследить динамику по "ASCII-узору" - легко...


 
han_malign   (2011-03-15 17:33) [11]

На самом деле все банальней - некоторым пользователям - проще выдать все, чем каждый раз объяснять, что он "не сможет прочитать 80 тысяч элементов", поэтому включена фильтрация по умолчанию - и что события за предыдущий квартал не потеряны, а просто нужно настроить фильтр...



Страницы: 1 вся ветка

Текущий архив: 2011.07.03;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
11-1233338364
Сидор
2009-01-30 20:59
2011.07.03
PaintBox и Button: проблема размещения


1-1257942878
Yurikon
2009-11-11 15:34
2011.07.03
Использование RxTrayIcon


15-1300454463
stas
2011-03-18 16:21
2011.07.03
потоковое видео


1-1258894985
GreyWolf
2009-11-22 16:03
2011.07.03
Подскажите где взять Static Separator для Dialog Box


15-1300053471
KilkennyCat
2011-03-14 00:57
2011.07.03
о последствиях в японии наглядно