Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786

Как добавить в список ListBox большое количество строк, чтобы это было быстро по времени?

27.09.2023, 11:31. Показов 6957. Ответов 125

Всем привет! У меня есть листбокс List1 в VB6 и я пытаюсь добавить в этот список много строк, скажем 10 тысяч строк, но я хочу добавить их таким образом, чтобы они добавились быстро по времени, а не ждать целую секунду... Я этого делать не умею, поэтому помогите пожалуйста! Единственный лайфхак который я нашёл это сначала скрывать список а потом показывать так можно добавить в список много строк в 3 раза быстрее, но для 10 тысяч строк это всё равно занимает целых пол секунды времени...

Visual Basic
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageW" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const LB_INITSTORAGE = &H1A8
Private Const LB_ADDSTRING = &H180
 
Private Sub Command1_Click()
    Dim i As Integer
    Dim tick As Long
    
    List1.Clear
    tick = GetTickCount
    
    For i = 0 To 10000
        List1.AddItem i
    Next
    Me.Caption = GetTickCount - tick ' 1311 ml
End Sub
 
Private Sub Command2_Click()
    Dim i As Integer
    Dim tick As Long
    
    List1.Clear
    tick = GetTickCount
    
    List1.Visible = False
    
    For i = 0 To 10000
        List1.AddItem i
    Next
    
    List1.Visible = True
    
    Me.Caption = GetTickCount - tick ' 468 ml
End Sub
 
 
Private Sub Command3_Click()
    Dim i As Integer
    Dim tick As Long
    Dim str As String
    Dim hwndList As Long
    
    str = "123"
    hwndList = List1.hwnd
    
    List1.Clear
    tick = GetTickCount
    
    'List1.Visible = False
    
    Debug.Print SendMessage(hwndList, LB_INITSTORAGE, 10001, CLng(LenB(str) * 10001))
    
    For i = 0 To 10000
        SendMessage hwndList, LB_ADDSTRING, 0, StrPtr(str)
    Next
    'List1.Visible = True
    
    Me.Caption = GetTickCount - tick ' 1310 ml
End Sub
Я начал читать в MSDN про сообщение LB_INITSTORAGE но у меня ничего не получилось почему-то всё равно строки в список добавляются очень медленно! Помогите плиз!

Добавлено через 24 минуты
Вопрос: почему не работает сообщение LB_INITSTORAGE?

Добавлено через 24 секунды
Скорость добавления в листбокс никак не изменилась!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.09.2023, 11:31
Ответы с готовыми решениями:

Как быстро создать список на большое количество элементов?
День добрый! Ищу информацию по такому вопросу. Например, в С++ объявить массив с сотней элементов можно простой строкой. string...

Максимально быстро записать большое количество строк SQLite
Приветствую всех. Думаю из заголовка понятно в чём вопрос как максимально эффективно и быстро записать в таблицу базы данных SQLite большое...

Как сделать так чтобы из продуктов можно было добавить в блюда и это списывалось все на кухне
Как сделать так чтобы из продуктов можно было добавить в блюда и это списывалось все на со склада

125
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
27.09.2023, 21:59  [ТС]
Ура, у меня получилось добавить мгновенно 10 тысяч строк в листбокс, но только если листбокс создан через API.

Добавлено через 4 минуты
Сообщение WM_SETREDRAW помогло

Добавлено через 2 минуты
Даже в MSDN сказано про это: "Это сообщение может быть полезно, если приложение должно добавить несколько элементов в список. Приложение может вызвать это сообщение с параметром wParam со значением FALSE, добавить элементы, а затем снова вызвать сообщение с параметром wParam , равным TRUE."
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
27.09.2023, 23:34  [ТС]
А вот и решение:

Visual Basic
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
27
28
29
30
31
32
Option Explicit
Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExW" (ByVal dwExStyle As Long, ByVal lpClassName As Long, ByVal lpWindowName As Long, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageW" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 
Private Const WS_CHILD          As Long = &H40000000
Private Const WS_VISIBLE        As Long = &H10000000
Private Const ES_AUTOVSCROLL    As Long = &H40&
Private Const WS_EX_CLIENTEDGE  As Long = &H200&
Private Const WS_VSCROLL = &H200000
Private Const WM_SETREDRAW = &HB
Private Const LB_ADDSTRING = &H180
 
Dim hwndListBox As Long
 
Private Sub Command1_Click()
    Dim i As Long
    Dim str As String
    
    SendMessage hwndListBox, WM_SETREDRAW, 0, 0
    
    For i = 0 To 9999
        str = i + 1
        SendMessage hwndListBox, LB_ADDSTRING, 0, StrPtr(str)
    Next
    
    SendMessage hwndListBox, WM_SETREDRAW, 1, 0
End Sub
 
Private Sub Form_Load()
    hwndListBox = CreateWindowEx(WS_EX_CLIENTEDGE, StrPtr("LISTBOX"), ByVal 0&, WS_CHILD Or WS_VISIBLE Or WS_VSCROLL Or ES_AUTOVSCROLL, _
    16, 16, 233, 420, Me.hwnd, 0&, 0&, ByVal 0&)
End Sub
Вложения
Тип файла: zip 10000 строк мгновенно.zip (1.7 Кб, 9 просмотров)
2
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
28.09.2023, 00:16  [ТС]
Но этот фокус почему-то не проходит со стандартным встроенным VB'шным списком, я так и не понял почему...

Добавлено через 36 минут
Кстати, прямо точно такая же тема как у меня: http://computer-programming-fo... 2eb627.htm
Видимо я ни первый пытаюсь это осуществить, и там человек тоже пишет, что SendMessage List1.hwnd, WM_SETREDRAW, False не работает для VB'шного ListBox'а и причина неизвестна...

Добавлено через 3 минуты
Но с LockWindowUpdate тоже не работает...
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
28.09.2023, 11:59  [ТС]
testuser2, посмотри, пожалуйста, работает ли это турбо-ускорение со стандартным списком в VBA там ListBox1 по моему называется а не List1 просто добавь эту строчку перед массовым добавлением:

Visual Basic
1
SendMessage hwndListBox, WM_SETREDRAW, 0, 0
потом добавишь 10 тысяч, а потом снова "
Visual Basic
1
SendMessage hwndListBox, WM_SETREDRAW, 1, 0
"

Добавлено через 1 минуту
Тим70, кстати ты тоже так попробуй в VB.Net
1
dive
 Аватар для I can
4988 / 4731 / 849
Регистрация: 13.04.2015
Сообщений: 9,958
28.09.2023, 12:44
Цитата Сообщение от HackerVlad Посмотреть сообщение
VBA там ListBox1
Не мучай человека В VBA получить дескриптор элемента не так просто, емнип. Через АПИ надо определять.
0
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,663
Записей в блоге: 2
28.09.2023, 13:17
Цитата Сообщение от I can Посмотреть сообщение
В VBA получить дескриптор элемента не так просто
Тем более, что это не слишком интересно, интересней было бы, если можно было бы получить доступ к блоку данных Листбокса и напрямую писать туда, или послать данные одной большой посылкой, вместо тысяч маленьких. Если мелкие не реализовали что-либо из этого для апишного листбокса, это слегка огорчительно.

Добавлено через 15 минут
В vba 1 млн строк добавляются присвоением массива за 0,15625 из массива числового типа, и 0,51 с. из строкового массива.
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
28.09.2023, 15:18  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
В VBA получить дескриптор элемента
Я не знал. Там нет hwnd?

Добавлено через 2 минуты
Без hwnd вообще не интересно программировать

Добавлено через 7 минут
Тим70, я тут прочитал кое что очень интересное: https://learn.microsoft.com/ru... esktop-7.0

Оказывается есть метод ListBox1.BeginUpdate и ListBox1.EndUpdate которые позволяют быстро добавлять много тысяч строк в листбокс, не знаю есть ли это в VBA но в Vb.net ну точно должно быть) Попробуй плиз

Добавлено через 1 минуту
И AddRange ещё существует

Добавлено через 2 минуты
Жаль всего этого нет в VB6, но я нашёл самописный контрол на иностранном форуме ListBoxW который ни только поддерживает уникод, но ещё и так же позволяет добавлять много строк быстро с помощью самописного свойства Redraw (false и true)
1
dive
 Аватар для I can
4988 / 4731 / 849
Регистрация: 13.04.2015
Сообщений: 9,958
28.09.2023, 15:30
Цитата Сообщение от HackerVlad Посмотреть сообщение
Там нет hwnd?
Нет. У формы еще можно получить через АПИ, а у элементов вообще всё плохо, они windowless контролы.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
28.09.2023, 15:32  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
они windowless контролы
ничего себе, я не знал, надеюсь в vb.net не так
1
dive
 Аватар для I can
4988 / 4731 / 849
Регистрация: 13.04.2015
Сообщений: 9,958
28.09.2023, 15:50
Цитата Сообщение от HackerVlad Посмотреть сообщение
надеюсь в vb.net не так
Если будешь делать не WinForm приложение, а WPF, то там еще хуже. Но бытует мнение, что WinForm уже использовать не комильфо, типа технологии прошлого века.
0
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,663
Записей в блоге: 2
28.09.2023, 15:56
Цитата Сообщение от HackerVlad Посмотреть сообщение
AddRange
это в api?

Добавлено через 4 минуты
Цитата Сообщение от HackerVlad Посмотреть сообщение
есть метод ListBox1.BeginUpdate и ListBox1.EndUpdate которые позволяют быстро добавлять много тысяч строк в листбокс
Если не так как в vba 1млн за 0,15, то это не очем разговор )
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
28.09.2023, 16:08  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
это в api?
Во фрэймворках
1
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
28.09.2023, 21:08
Не усложняйте жизнь пользователям, не добавляйте тысячи и миллионов строк в листбокс - он не предназначен для этого. Тут даже скрол нормальный не сделать мышью при таком количестве элементов. Это равносильно тому что если бы вы запрашивали раздел Visual Basic на этом форуме и вам выдавало все темы от начала существования раздела.
0
Любитель
 Аватар для Тим70
1047 / 757 / 161
Регистрация: 27.01.2019
Сообщений: 1,530
29.09.2023, 09:18
Цитата Сообщение от HackerVlad Посмотреть сообщение
в Vb.net ну точно должно быть) Попробуй плиз
Быстрее не полйчается
Миниатюры
Как добавить в список ListBox большое количество строк, чтобы это было быстро по времени?  
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
29.09.2023, 12:15  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Не усложняйте жизнь пользователям, не добавляйте тысячи и миллионов строк в листбокс
Почему тогда Microsoft убрала ограничение в 32767 строк как это была в Win 9x? Пусть и дальше бы тогда было ограничение по твоей логике... А если ограничение сняли значит можно и добавлять по 100 тысяч строк...
1
 Аватар для Mikle Quits
785 / 308 / 17
Регистрация: 21.01.2023
Сообщений: 528
29.09.2023, 13:59
Цитата Сообщение от HackerVlad Посмотреть сообщение
Почему тогда Microsoft убрала ограничение в 32767 строк как это была в Win 9x?
Может, просто потому, что сменилась разрядность счётчика?
0
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,663
Записей в блоге: 2
29.09.2023, 15:07
HackerVlad, а вот действительно, что побудило сделать такой длинный листбокс. Я здесь упоминал, как одному понадобился многоколоночный листбокс. Так он сетовал именно, на то, что длинны лб использовать неудобно, и что в табличном виде, уже все как бы более наглядно и т.д. Или, допустим, форму поиска (текстбокс) добавить, а в ЛБ выводить только найденный результат.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
29.09.2023, 17:51  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
а вот действительно, что побудило сделать такой длинный листбокс
В листбоксе моём выдаётся все файлы в папке которую выбирает пользователь. Иногда в папке может быть и 10 тысяч файлов.

Добавлено через 1 минуту
Поэтому я и задумался о произовдительности, о скорости, о времени, переходить на ListView или нет и т. д.

Добавлено через 36 секунд
Одно я знаю точно: я не собираюсь зависить от каких-то других OCX например для ListView

Добавлено через 6 минут
testuser2, тем более, я обрабатываю папку, вместе со всеми вложенными подпапками, для добавления абсолютно всех файлов, используя рекурсивную функцию поиска файлов)

Добавлено через 7 минут
кстати говоря функция поиска файлов вместе со всем вложенными подпапками будет сама по себе медленная конечно, но дело в том, что я потом записываю в текстовый файл весь этот список а потом загружаю вот, поэтому тут скорость будет важна для загрузки списка из TXT
1
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,663
Записей в блоге: 2
29.09.2023, 18:06
Цитата Сообщение от HackerVlad Посмотреть сообщение
кстати говоря функция поиска файлов вместе со всем вложенными подпапками будет сама по себе медленная конечно,
Ты имеешь в виду сканирование файлов в подпапках api-функциями. Это медленно работатет? На глаза как раз сегодня попалась тема про прямой доступ к диску. Там что-то про mbr упоминали. Я просто знаю, что прога ultrasearch использует чтение из mbr и поиск там мега-быстрый. Там конечно все низкоуровенно, но интересно, можно ли из vb подобрться к mbr..
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
29.09.2023, 18:26  [ТС]
testuser2, я не понимаю тебя, сначала почитай в википедии что такое MBR а потом говори

Добавлено через 30 секунд
Цитата Сообщение от testuser2 Посмотреть сообщение
Ты имеешь в виду сканирование файлов в подпапках api-функциями. Это медленно работатет?
Да, это медленно если файлов сотни тысяч.

Добавлено через 24 секунды
Поэтому я и сохраняю потом в TXT

Добавлено через 1 минуту
Всё это ни то
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.09.2023, 18:26

Вывести файл на экран, чтобы в каждой строке было не больше 40 символов, и количество строк было минимальным
Дано файл f. Вывести этот файл на экран так что бы в каждой строчке было не больше, чем 40 символов и количество строк было минимальным.

Как исправить, чтобы количество столбцов и строк StringGrid было таким, как ввел пользователь
Подскажите, в чем дело, программа создает двумерный массив элементы которого вводят с клавиатуры, ввод осуществляется в stringGrid. При...

Как добавить значения с Листа в Listbox, если количество строк может меняться
Есть Лист с уже заданными значениями, но они могут изменяться (добавляться, удаляться). Нужно добавить этот столбец в Listbox. Помогите...

Как сделать так,чтобы количество строк и столбцов массива можно было менять через меню?
как сделать так,чтобы количество строк (n) и столбцов(m) массива можно было менять через меню? весь код #include...

Поиск минимального времени выполнения теста, чтобы количество набранных баллов было максимальным
Здравствуйте! Подскажите пожалуйста, в чем ошиблась у меня массив Examen структур с данными о номере Nomer. Для каждого номера дано время...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru