Конференция "Прочее" » добавление в TListView больших объемов инфы
 
  • m_kostik (13.03.11 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 © (14.03.11 11:26) [1]
    Внимание! Здесь обсуждаются вопросы, связанные с разработкой компонентов, редакторов свойств, редакторов компонентов и экспертов IDE.
    Вопросы по поиску и использованию готовых компонентов, редакторов или экспертов являются нарушением тематики и могут быть удалены.
  • Anatoly Podgoretsky © (14.03.11 11:33) [2]
    А пользователю что вешаться из-за таких объемов, он же тормозить не умеет.
  • DimaBr © (14.03.11 11:34) [3]
    Пускай пользователь вчитывается, вдруг в 73652 элементе найдёт ошибку
  • CrytoGen (14.03.11 11:37) [4]
    VirtualTree посмотрите
  • RWolf © (14.03.11 11:38) [5]

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

    для начала элементарно обернуть код в Items.BeginUpdate / EndUpdate.
    но над [2] и [3] стоит задуматься.
  • m_kostik (14.03.11 19:23) [6]

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

    Этот фокус, к сожалению, не работает
  • m_kostik (14.03.11 19:25) [7]
    Нашел отличную статью по этой проблеме: http://www.delphi.int.ru/articles/38/
    Суть в том, что при работе с большими объемами инфы нужно устанавливать ListView.OwnerData в true, затем присвоить ListView.Count сколько нужно (в моем случае 80000) и создать обработчик события OnData, в котором будет заполняться каждый конкретный Item (с Subitem'ами). Событие OnData возникает только тогда, когда нужно вывести соответствующий Item в видимую область ListView. Естественно, что при большом количестве Item'ов скорость увеличивается на порядки.
    Всем большое спасибо! :-)))
  • _Юрий (14.03.11 19:37) [8]

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


    Завсегда рады помочь. Обращайтесь
  • DiamondShark © (15.03.11 12:43) [9]

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

    Ни один нормальный пользователь не сможет прочитать 80 тысяч элементов.
  • han_malign (15.03.11 17:19) [10]

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

    - в сортированном списке - найти коллизии и проследить динамику по "ASCII-узору" - легко...
  • han_malign (15.03.11 17:33) [11]
    На самом деле все банальней - некоторым пользователям - проще выдать все, чем каждый раз объяснять, что он "не сможет прочитать 80 тысяч элементов", поэтому включена фильтрация по умолчанию - и что события за предыдущий квартал не потеряны, а просто нужно настроить фильтр...
 
Конференция "Прочее" » добавление в TListView больших объемов инфы
Есть новые Нет новых   [120275   +42][b:0][p:0.001]