|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||||||
Как добавить в список ListBox большое количество строк, чтобы это было быстро по времени?27.09.2023, 11:31. Показов 6960. Ответов 125
Всем привет! У меня есть листбокс List1 в VB6 и я пытаюсь добавить в этот список много строк, скажем 10 тысяч строк, но я хочу добавить их таким образом, чтобы они добавились быстро по времени, а не ждать целую секунду... Я этого делать не умею, поэтому помогите пожалуйста! Единственный лайфхак который я нашёл это сначала скрывать список а потом показывать так можно добавить в список много строк в 3 раза быстрее, но для 10 тысяч строк это всё равно занимает целых пол секунды времени...
Добавлено через 24 минуты Вопрос: почему не работает сообщение LB_INITSTORAGE? Добавлено через 24 секунды Скорость добавления в листбокс никак не изменилась!
0
|
||||||
| 27.09.2023, 11:31 | |
|
Ответы с готовыми решениями:
125
Как быстро создать список на большое количество элементов? Максимально быстро записать большое количество строк SQLite Как сделать так чтобы из продуктов можно было добавить в блюда и это списывалось все на кухне |
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|||||||
| 01.10.2023, 15:51 [ТС] | |||||||
|
Добавлено через 47 минут Я вот например потратил пол часа на то чтобы по-убирать всё лишнее в Common.bas сам смотри сколько лишнего мусора там было, было 1336 строк и 53 КБ файл, а теперь стало всего 340 строк и всего 13 КБ файл модуля стал! После перемпиляции размер EXE сократился ажно на 10 КБ!!! Добавлено через 59 секунд Новый Common.bas (всего 340 строк, на тысячу строк меньше, чем было):
Может функции конечно и хорошие, но для работа контрола они не нужны, в итоге я повыбрасывал функции: MsgBox, SendKeys, GetAttr, SetAttr, Dir, MkDir, RmDir, FileLen, FileDateTime, Command$, FileExists, AppPath, AppEXEName, AppMajor, AppMinor, AppRevision, GetAppVersionInfo, GetClipboardText, SetClipboardText, AcelCharCode, ProperControlName, GetTopUserControl, CloneOLEFont, GetNumberGroupDigit, GetDicimalChar, IsFormLoaded, GetWindowTitle, GetWindowClassName, CenterFormToScreen, FlashForm, GetFormTitleBarHeight, GetFormNonScaleHeight, SetWindowRedraw, GetWindowsDir, GetSystemDir, GetMouseStateFromMsg, GetShiftState, GetMouseState, KeyToggled, KeyPressed, InIDE, LoByte, HiByte, MakeWord, UTF16_To_UTF8, UTF8_To_UTF16, VarToStr, UnsignedSub, CULngToLng, CLngToULng, PictureFromByteStream, RenderPicture. Итого я выбросил 52 функции!!! Без всяких сомнений функции конечно очень хорошие, но я люблю пользоваться своими и чтобы ничего лишнего небыло...
1
|
|||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 01.10.2023, 17:05 [ТС] | |
|
Кстати, я добился того, чтобы в элементе управления пользователя ListBoxW1 добавлялось 10 тысяч строк так же быстро, как и в моём первом примере, где я через API создавал листбокс и добавлял строки. Скачайте архив, нажмите на Command2 и вы увидите, что добавление происходит всего за 47 млск. Быстрее всего добавляются строки через API! Для теста можете так же нажать и на Command1 и убедиться что добавление строк через ListBoxW1.AddItem в два раза медленнее.
P. S. Кстати говоря в этом архиве, модуль Common.bas уже урезанный до 13 Кб.
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 01.10.2023, 17:21 [ТС] | |
|
Теперь по идее The Trick ещё хочу сказать, насчёт того, чтобы записывать сразу массив строк в ListBox. Лично я это вижу для себя так:
1. Нужно сначала выделить память для множества строк листбокса с помощью SendMessage LB_INITSTORAGE 2. Потом нужно найти каким-то чудом, адрес в памяти куда записывать массив строк и записать его с помощью CopyMemory Лично я это так вижу
0
|
|
|
Модератор
|
||||
| 01.10.2023, 18:43 | ||||
|
Добавлено через 1 минуту
0
|
||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|||
| 01.10.2023, 19:15 [ТС] | |||
|
Добавлено через 3 минуты Добавлено через 6 минут Я только что проверил по SetWindowSubclass вешается только при коде End. Если останавливать в дизайнере то никаких проблем. Добавлено через 32 секунды Но сам по себе глючный код End думаю ни один уважающий себя программист не использует Добавлено через 22 секунды Поэтому можно спокойно использовать SetWindowSubclass
0
|
|||
|
Модератор
|
||
| 01.10.2023, 19:16 | ||
|
0
|
||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 01.10.2023, 19:16 [ТС] | |
|
Вот простой пример сабклассинга
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 01.10.2023, 19:24 [ТС] | |
|
The trick, так сам попробуй, я архив скинул даже с самым простым кодом, можно спокойно останавливать в дизайнере
Добавлено через 1 минуту Если тот же самый простой код был бы через SetWindowLong по старой технологии то VB6 сразу бы повесился при остановки проекта в дизайнере Добавлено через 1 минуту Прошу прощения, я ошибся Добавлено через 13 секунд Произошла какая-то фантастика: SetWindowLong тоже не вешается Добавлено через 1 минуту Может потому что у меня семёрка 64-битная, это очень странно, я помню что раньше вешалась остановка проекта Добавлено через 45 секунд Ладно, сейчас попробую в XP
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||
| 01.10.2023, 21:12 [ТС] | ||
|
The trick, я пока не знаю почему, но у меня работает, это странно
Добавлено через 38 секунд Именно из-за этого у меня и возникло ложное впечатление, что SetWindowSubclass не вешается. Добавлено через 2 минуты Стоп-точка тоже не вешается у меня Добавлено через 39 секунд Я могу спокойно прервать через Ctrl+Break отредактировать код и продолжить - ничего не вешается вообще кроме кода ENd Добавлено через 1 минуту Это очень странно что у меня всё работает, при чём в XP тоже Добавлено через 7 минут The trick, Я не знаю почему у меня всё работает, но у меня всё работает, поэтому у меня и нет нужды даже использовать твой класс сабклассинга Добавлено через 1 час 28 минут Тот результат которого я достиг, а это 47 млск, меня вполне устраивает, тут не надо заниматься больше этим.
0
|
||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 01.10.2023, 22:20 [ТС] | |
Сообщение было отмечено testuser2 как решение
Решение
Ещё я провёл тесты, и выяснил, что в XP работает добавление в список ещё быстрее почему-то. У меня вообще за 16 млск 10 тысяч строк добавляет в XP. И 32 - 47 млск теперь в семёрке. Самый новый и самый лучший самый быстрый вариант. Даже функцию SendMessage в цикле которая используется юзаю теперь из TLB!!! Уже убыстрил как только можно.
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 03.10.2023, 14:11 [ТС] | |
|
Итак финальный релиз контрола ListBoxW от Krool. Полностью урезанная версия. Здесь выброшено всё лишнее, что не касается работы листбокса. Почти 100Кб лишнего мусора выброшено. Как вы все помните, для работы контрола требовались следующие зависимости:
1. ComCtlsBase.bas (45 Кб) 2. Common.bas (52 Кб) 3. VisualStyles.bas (22 Кб) 4. VTableHandle.bas (33 Кб) 5. ISubclass.cls (0 Кб) Итого: 152 Кб зависимостей было и это ещё помимо того, что сам контрол весит около 100 КБ!!! Я взял на себя смелость произвести большую работу по чистке мусора из всех этих модулей, в итоге было выброшено сотни ненужных функций, все модули я объединил в один новый модуль modKroolControlsSmall.bas, который весит всего 58 Кб, что на 94 КБ меньше, чем было!!! Итого теперь из зависимостей осталось всего 2 файла: 1. modKroolControlsSmall.bas (58 Кб) 2. ISubclass.cls (0 Кб) Этот новый модуль является объединением всех четырёх старых модулей с тотальной чисткой ненужного мусора. Теперь чтобы работать с контролом не нужно таскать за собой 4 разных модуля, что согласитесь было крайне неудобно. Теперь достаточно таскать за собой только один модуль и один класс, что стало гораздо удобнее. Krool к сожалению, не думал о людях которые будут использовать только один его элемент и не делал компактного кода для одного контрола. Я это исправил. И кстати размер EXE теперь будет меньше почти на 20 КБ!!! Ну и тут, в этом моём примере так же видно, как очень быстро можно добавить 10 тысяч строк в листбокс.
1
|
|
| 08.05.2024, 21:45 | |
|
Добавление строк путем прямой записи в память листбокса. Из минусов не оптимальный механизм поиска нужных указателей - сканирование памяти программы. Если возможно как-то по иному их вычислять, было бы идеально, я пока не нашел как это сделать. Проверял только в IDE, без компиляции. Пример в файле с комментариями.
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 08.05.2024, 22:26 [ТС] | |
|
testuser2, спасибо конечно за старания, но твой проект не работает
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||||||
| 08.05.2024, 22:37 [ТС] | ||||||
|
testuser2, проверять надо в VB6 на семёрке - у меня вылетает сразу после запуска
Добавлено через 1 минуту testuser2, и ещё большая просьба навести порядок в проекте чтобы он смог откомпилироваться в EXE и запускаться через Ctrl+F5 Добавлено через 3 минуты testuser2, ещё так же удивило твоё заявление, что ты создал этот проект завтра
0
|
||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||
| 09.05.2024, 05:41 [ТС] | ||
|
0
|
||
| 09.05.2024, 05:41 | |
|
Как исправить, чтобы количество столбцов и строк StringGrid было таким, как ввел пользователь Как добавить значения с Листа в Listbox, если количество строк может меняться
Поиск минимального времени выполнения теста, чтобы количество набранных баллов было максимальным Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2.
Задача: контроль уникальности строк в. . .
|
Клиент
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
• Смежный проект:. . .
|