Вниз
Скачать: 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.006 c
15-1300208090
И. П. Павел
2011-03-15 19:54
2011.07.03
Прогноз погоды на JAVA


1-1258536836
Separator
2009-11-18 12:33
2011.07.03
id текущего thread?


15-1300321466
Дмитрий Тимохов
2011-03-17 03:24
2011.07.03
Нашел по рекламе на delphimaster.ru


15-1299878994
Юрий
2011-03-12 00:29
2011.07.03
С днем рождения ! 12 марта 2011 суббота


15-1300483790
Юрий
2011-03-19 00:29
2011.07.03
С днем рождения ! 19 марта 2011 суббота




   Наверх