2009-08-17 3 views
2

У меня есть ListView: TListview в моей форме, и я добавляю много значений (приблизительно 25k TListViewItem), который работает довольно быстро, но когда я вызываю Listview.Clear, программа freezes.I проверила его с помощью отладчика, t шаг этой линии.TListView.Clear замораживает мое приложение, как его исправить?

Мой вопрос: как я могу решить свою проблему? Если создать так много элементов менее чем за секунду, то почему их удаление длится вечно (я ждал более 5 минут)?

ответ

13

Вы пробовали ограждающих ваш звонок Ясно в BeginUpdate/EndUpdate блока:

listview.Items.BeginUpdate; 
    try 
    listview.Items.Clear; 
    finally 
    listview.Items.EndUpdate; 
    end; 

Добавление/удаление элементов в виде списка (или различные другие элементы управления, например ListBox) запускает обновление графического интерфейса контроль за каждым добавленным/удаленным элементом. В частности, для списка, это может быть довольно дорогостоящим, и для 25 000 предметов накладные расходы будут значительными.

По общему признанию, 5 минут звучат чрезмерно, но это было бы первым, что я попробовал бы.

5

Первое, что я попробую, - это обернуть свой звонок Clear с BeginUpdate/EndUpdate.

ListView1.Items.BeginUpdate; 
    ListView1.Clear; 
    ListView1.Items.EndUpdate; 

У вас есть какие-либо события, связанные с ListView, и они стреляют, когда список очищается?

+0

Нет, я использовал начальное/конечное обновление на первом месте. То же самое. –

+0

Это время где-то проводится. Устраивают ли какие-либо мероприятия? Я бы использовал точки останова или сообщения CodeSite/OutputDebugString. Мне нравится CodeSite для этого, потому что у него есть подключаемый модуль IDE для ввода сообщений EnterMethod/ExitMethod во всех (или нескольких) ваших методах в единицу. –

2

как другие отметили BeginUpdate .... EndUpdate значительно увеличит производительность, однако я бы действительно предложил вам переместить свой код для использования VirtualTreeView. Это гибридное дерево/ListView, которое будет содержать до 1 м узлов менее чем за секунду (фактически это зависит от процессора, но вы получаете идею).

Это немного сложнее узнать в начале, но как только вы привыкнете к нему, вы найдете его «легким» для работы. Я лично, когда мне нужно много строк в ListView или TreeView, выглядят не более, чем VirtualTreeView. О, и забыл упомянуть, что, вдобавок ко всему, это бесплатно. Попробуйте: http://soft-gems.net/

2

John, это не должно быть больше, чем очистить, чем добавить предметы 25k.
Интересно, загрузите ли вы его, пока он невидим (автоматически отключает обновления), но очищайте его, когда он виден, где каждое удаление элемента запускает обновление.

+0

Это видно.BeginUpdate/EndUpdate - это пользователь. –

0

Я не знаю, должен ли я удалить этот вопрос или нет, я считаю, что это не будет никому другому, но я предпочитаю держать его на некоторое время, по крайней мере, для вас, кто ответил.

Проблема была в том, что я использовал компонент, наследующий от TListView, я думал, что это не будет проблемой, поэтому я решил сказать TListView, но я ошибся.

Я поддержал все ваши ответы, пожалуйста, извините мое невежество - я новичок.

+0

Не потейте. Итак, какой компонент вы используете? Что-то дома выросло, или от третьего лица? –

+0

AlphaControls - это пакет с черным корпусом с элементами управления, наследующими от vc Borland, и их skinView (TsSkinView) довольно плох. –

+0

В чем была проблема? Был ли их четкий код настолько медленным? Почему? – jpfollenius

Смежные вопросы