![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Есть функция, на вход которой подаётся
Код:
var sbItems: arTStrings; var cpItems: arString Код:
type arTStrings = array of TStrings; type arString = array of string; Вот сама функция: Код:
with FormMain.ListGame do begin Clear; count := Length(gameList) - 1; if count > FormMain.spnMaxCount.value then count := FormMain.spnMaxCount.value; if count > 0 then FormLoadScreen.Showload; {На вышеприведенные мусор не обращайте внимание. Это просто подсчёт количества Item'ов и вычистку ListView'а} for i := 0 to count do begin FormLoadScreen.SetCount(i, count); //Это чисто техническая. Не обращайте внимания li := Items.Add; //Добавляем пустой Item li.Data := gameList[i]; //Приписываем ему объект li.Caption := cpItems[i]; //Приписываем ему Caption li.ImageIndex := -1; //Приписываем пустой значок li.SubItems := sbItems[i]; //Приписываем SubItem'ы li.SubItemImages[9] := 2; //Одному из SubItem'ов приписываем значок end; end; FormLoadScreen.HideLoad; Данный метод работает очень медленно. Уже поздно, поэтому зависимость Time(count) пока проводить не буду. Но при count = 13500 заполняет 18 секунд на не самом медленном процессоре! Есть возможность оптимизировать? |
#2
|
|||
|
|||
![]() Должно помочь, но грузить в лист 14 тысяч значений, на самом деле не вариант, лучше добавить какой-нибудь фильтр, и выводить по фильтру не более 500.
Код:
... Items.BeginUpdate; Clear; count := Length(gameList) - 1; if count > FormMain.spnMaxCount.value then count := FormMain.spnMaxCount.value; if count > 0 then FormLoadScreen.Showload; for i := 0 to count do begin FormLoadScreen.SetCount(i, count); //Это чисто техническая. Не обращайте внимания li := Items.Add; //Добавляем пустой Item li.Data := gameList[i]; //Приписываем ему объект li.Caption := cpItems[i]; //Приписываем ему Caption li.ImageIndex := -1; //Приписываем пустой значок li.SubItems := sbItems[i]; //Приписываем SubItem'ы li.SubItemImages[9] := 2; //Одному из SubItem'ов приписываем значок end; Items.EndUpdate; ... Последний раз редактировалось Asinkrit, 28.02.2011 в 01:23. |
#3
|
|||
|
|||
![]() Код:
Try ListView1.Items.BeginUpdate; // Далее добавляем итемы Finally ListView1.Items.EndUpdate; End; Должно сильно помочь. Далее только оптимизация по загрузке данных, но она уже не сильно поможет. Тогда лучше переходить на БД. Там есть режим, когда загружается в один момент только то, что отображается, а потом по мере надобности подгружается. Хотя и с ListView можно пойти темже путем - грузить в отдельном потоке, вернув управление пользователю. |
#4
|
|||
|
|||
![]() На первый взгляд не особо помогло. Вечером проведу точное тестирование зависимости time(count) для двух случаев.
ЗЫ: дело в том, что в ListView лист Item'ов представлен типом "TListItem", но и сами Item'ы представлены в точно таком же (по названию) типе "TListItem", но по содержанию - в другом. При объявлении переменной типа TListItem: Код:
var listItem: TListItem Вопрос: как это сделать? ЗЫ2: а при добавлении Item'а напрямую походу происходит не только его добавление, а ещё какие-то манипуляции с уже имеющимися Item'ами: если вывести в ProgressBar прогресс добавления Item'ов, то можно заметить, что на поздних этапах прогресс существенно замедляется. Опять же, точную зависимость выведу вечерам. Последний раз редактировалось Сорокин_Роман, 28.02.2011 в 10:52. |
#5
|
||||
|
||||
![]() Цитата:
у TListView свойство Items имеет тип TListItems, тогда как элемент Items[х] (Items.Item[х]) имеет тип TListItem. Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 28.02.2011 в 13:02. |
#6
|
|||
|
|||
![]() Это называется, за компьютером пересидел.
![]() |