Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.005 c
15-1300438782
compuser
2011-03-18 11:59
2011.07.03
Несворачиваемая, дырявая форма


2-1301060792
Fr
2011-03-25 16:46
2011.07.03
Текст на TImage


1-1258707280
4el0vek
2009-11-20 11:54
2011.07.03
TStreamReader | TStream | Проблема с чтением потока


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


15-1300257468
Артём
2011-03-16 09:37
2011.07.03
Cистема на работе барохлит?




   Наверх