Текущий архив: 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.47 MB
Время: 0.004 c