![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Это называется, за компьютером пересидел.
![]() |