Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
6 / 8 / 2
Регистрация: 20.12.2012
Сообщений: 748

Быстрое добавление строк в ListView

28.04.2016, 20:20. Показов 5658. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Скажите пожалуйста, есть ли возможность ускорить добавление строк в ListView? Этим способом 5000 строк добавляются за 7 секунд, нужно быстрее.

Delphi
1
2
3
4
5
6
7
8
9
  ListView1.Clear;
  n := 5000;
 
  for i := 1 to n do
  begin
    li:=ListView1.Items.Add;
    li.Caption:= IntToStr(i);
    li.SubItems.Add(IntToStr(Random (9999999)));
  end;
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.04.2016, 20:20
Ответы с готовыми решениями:

Быстрое добавление в ListView
Обычное добавление в listView по item такое ListViewItem ^item1 = gcnew ListViewItem("--------------"); ...

Добавление строк из listbox в listview
помогите разработать приложение «Магазин средств связи». Товар выбирается из элемента ListBox, который первоначально содержит 3 строки и...

Добавление строк в ListView сверху
Добрый день. Обычно в ListView строки добавляются сверху вниз. Можно ли как-то просто сделать, чтобы добавлялись снизу вверх, чтобы...

14
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33419 / 21526 / 8239
Регистрация: 22.10.2011
Сообщений: 36,932
Записей в блоге: 12
28.04.2016, 20:25
Pascal
1
2
3
4
5
6
7
8
9
10
11
  ListView1.Clear;
  n := 5000;
 
  ListView1.BeginUpdate; // раз
  for i := 1 to n do
  begin
    li := ListView1.Items.Add;
    li.Caption := IntToStr(i);
    li.SubItems.Add(IntToStr(Random(9999999)));
  end;
  ListView1.EndUpdate; // два
Можно вообще выставить OwnerData = True, и создать виртуальный LV, используя событие OnData. Будет еще быстрее.
0
6 / 8 / 2
Регистрация: 20.12.2012
Сообщений: 748
28.04.2016, 20:38  [ТС]
Лучше - 2,61 сек. А можно ещё ускорить, чтобы за 1 сек успевало при таком кол-ве? Может быт есть возможность массивом, сразу много элементов загрузить, без цикла?
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
28.04.2016, 21:58
Как без цикла-то? Он всегда есть. Даже если бы из файла грузилось - всё равно будет цикл.

Не по теме:

А в Делфи у самого ListView нет BeginUpdate и EndUpdate, даже в новых, хотя давно бы пора. Зато оно есть у его Items. А ещё в старых вполне прокатывал трюк:

Delphi
1
2
3
ListView1.Visible:=Not ListView1.Visible;
{DO SOMETHING HUGE WITH ListView1}
ListView1.Visible:=Not ListView1.Visible;
На поверку скорость может зависеть от ViewStyle. Завтра сделаю тест-сравнение Д7, Лазаруса и Сиэтла.

0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33419 / 21526 / 8239
Регистрация: 22.10.2011
Сообщений: 36,932
Записей в блоге: 12
28.04.2016, 22:20
Лучший ответ Сообщение было отмечено volvo как решение

Решение

Цитата Сообщение от artem78 Посмотреть сообщение
А можно ещё ускорить, чтобы за 1 сек успевало при таком кол-ве?
Я ж написал, как:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// ...
 TForm1 = class(TForm)
  private
    { private declarations }
    lvData : array of Integer; // Здесь будут храниться данные
  public
    { public declarations }
  end; 
 
procedure TForm1.FormCreate(Sender: TObject);
var i : integer;
begin
  ListView1.OwnerData := True;
  ListView1.Items.Count := 5000;
  SetLength(lvData, 5000);
  for i := 0 to High(lvData) do lvData[i] := Random(9999999); // заполняем сами данные
end;
 
// и по OnData их просто отображаем
procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
  Item.Caption := IntToStr(Item.Index + 1);
  Item.SubItems.Add(IntToStr(lvData[Item.Index]));
end;
Поскольку запрашиваются не все, а только видимые на данный момент данные - работает мгновенно. 50000 элементов - аналогично, моментально.
2
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
28.04.2016, 23:06
Очень интересная вещь, не знал. Спасибо. Вот только сперва SetLength, а уже после OwnerData:=True; а то AV.
0
6 / 8 / 2
Регистрация: 20.12.2012
Сообщений: 748
29.04.2016, 03:01  [ТС]
volvo, большое спасибо. Это то, что нужно!
0
 Аватар для salaev
2 / 2 / 0
Регистрация: 27.03.2018
Сообщений: 114
28.01.2021, 18:41
volvo, подскажи пожалуйста как заполнить ListView по твоему рецепту? с это строкой колдовать надо? - ...:= Random(9999999)
Сейчас так заполняю:
Delphi
1
2
3
4
5
6
7
           While not Query_Poisk.EOF do
                  begin
                    Item := ListView1.Items.Add;
                    Item.Caption := Query_Poisk.FieldByName('count').AsString;
                    Item.SubItems.Add(Query_Poisk.FieldByName('status').AsString);
                    Query_Poisk.Next;
                  end;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33419 / 21526 / 8239
Регистрация: 22.10.2011
Сообщений: 36,932
Записей в блоге: 12
28.01.2021, 19:09
По моему рецепту ListView не заполняется вообще. Заполняется сторонний контейнер. Я бы даже не стал здесь использовать массив. Описал бы класс из числа и строки, и сделал бы список этих записей. И вот его бы уже связал с ListView. Будет удобнее. Как-то вот так:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
type
  Rec = class
    count : Integer;
    status : string[50];
    constructor Create(ACount : Integer; AStatus : string);
  end;
  TLst = specialize TFPGList<Rec>; // uses FGL;
 
constructor Rec.Create(ACount: Integer; AStatus: string);
begin
  Self.count := ACount;
  Self.status := AStatus;
end;
 
var
  L : TLst; // не забываем создать экземпляр перед использованием
 
// ...
  while not Query_Poisk.EOF do
  begin
    L.Add(Rec.Create(Query_Poisk.FieldByName('count').AsInteger,
                     Query_Poisk.FieldByName('status').AsString));
    Query_Poisk.Next;
  end;
  ListView1.Items.Count := L.Count;
  ListView1.OwnerData := True;
Собственно, при такой реализации обработчик события OnData становится тривиальным, достаточно просто по индексу найти элемент списка и заполнить Item нужными значениями.
0
 Аватар для salaev
2 / 2 / 0
Регистрация: 27.03.2018
Сообщений: 114
28.01.2021, 20:14
Видимо недорос я еще до таких вершин.... FGL в uses добавил, var
L : TLst; добавил, а вот что с этим делать ??? Туплю
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
type
  Rec = class
    count : Integer;
    status : string[50];
    constructor Create(ACount : Integer; AStatus : string);
  end;
  TLst = specialize TFPGList<Rec>; // uses FGL;
 
constructor Rec.Create(ACount: Integer; AStatus: string);
begin
  Self.count := ACount;
  Self.status := AStatus;
end;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33419 / 21526 / 8239
Регистрация: 22.10.2011
Сообщений: 36,932
Записей в блоге: 12
28.01.2021, 21:16
Это тоже добавить в код. Можно перед классом формы, можно - в начале секции Implementation, можно - вообще в другом модуле. Ну, и в OnCreate формы создать экземпляр L, а в OnDestroy формы его удалить...
0
Злостный нарушитель
 Аватар для Verevkin
10862 / 5806 / 1283
Регистрация: 12.03.2015
Сообщений: 26,818
28.01.2021, 21:22
Не надо больше юзать тормозной TListView. Есть же TVirtualStringTree.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33419 / 21526 / 8239
Регистрация: 22.10.2011
Сообщений: 36,932
Записей в блоге: 12
28.01.2021, 22:29
TVirtualStringTree во-первых, надо ещё суметь установить, во-вторых, он при установке потребует пересобрать Лазарус, и в третьих, это может сломать другие установленные и прекрасно работающие пакеты. Плавали, знаем. Приходилось убивать Лазарус полностью и переустанавливать без TVirtualStringTree, а потом накатывать сверху все, что было установлено ДО попытки установить TVirtualStringTree. Ещё то удовольствие. Так что лучше TListView. По крайней мере ничего не ломается...

Ах, да... Ещё и поди разберись в использовании TVirtualStringTree, тоже так себе удовольствие для начинающего...
0
Злостный нарушитель
 Аватар для Verevkin
10862 / 5806 / 1283
Регистрация: 12.03.2015
Сообщений: 26,818
28.01.2021, 22:37
Цитата Сообщение от volvo Посмотреть сообщение
TVirtualStringTree во-первых, надо ещё суметь установить
Он предустановлен.

Проверь у себя там на линупсе, мне влом перезагружаться.
0
Злостный нарушитель
 Аватар для Verevkin
10862 / 5806 / 1283
Регистрация: 12.03.2015
Сообщений: 26,818
28.01.2021, 22:38
Цитата Сообщение от volvo Посмотреть сообщение
Ах, да... Ещё и поди разберись в использовании TVirtualStringTree, тоже так себе удовольствие для начинающего...
Оно того стоит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.01.2021, 22:38
Помогаю со студенческими работами здесь

Заполнения ListView путём добавление новых строк выше предыдущих
Добрый день! В ListView выводятся данные, поступающие в режиме онлайн построчно. Количество строк не известно Подскажите, как в...

Быстрое добавление 10 000 элементов на страницу
Добрый день! Вопрос следующий: Необходимо отобразить большое количество равнозначных строчных элементов на странице. Например,...

Быстрое добавление данных из array в dataTable
Вопрос очень простой, но интернет молчит: Как из string который имеет всего 1 колонку передать все записи в dataTable который имеет тоже...

Быстрое пошаговое добавление С-массивов в std::vector
Так... Допустим есть: int sizeA = 100; int* a = new; int sizeB = 200; int* b = new; //ну там инициализируются какими-то...

Как отменить быстрое добавление элемента на форму
Такое дело: когда работаешь с windows form applicationв visual studio, там есть возможность быстрого добавления элементов на форму( через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru