Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2016, 11:49   #11
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
ага, и тратить кучу времени на копирование строк.
Дело ваше. Но на это времени надо не много. Перед добавлением строк задать LB_INITSTORAGE, тем более что размер заранее известен, а потом отобразить вновь созданное окно.
EUGY вне форума Ответить с цитированием
Старый 10.12.2016, 12:23   #12
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

уже не по теме, но раз уж начали
Цитата:
Сообщение от EUGY Посмотреть сообщение
LB_INITSTORAGE
Это еще одно из сообщений/функций, которые непонятно что делают. Увы, я тупой.
Цитата:
Сообщение от MSDN
wParam

The number of items to add.

Windows 95/Windows 98/Windows Millennium Edition (Windows Me) : The wParam parameter is limited to 16-bit values. This means list boxes cannot contain more than 32,767 items. Although the number of items is restricted, the total size in bytes of the items in a list box is limited only by available memory.

lParam

The amount of memory, in bytes, to allocate for item strings.
То есть, в 16-битной системе в ListBox можно добавить не более 32767 строк, в 32-битной 2^31, в 64-битной 2^63. Ок, это ясно. Но они следом пишут, что несмотря на ограничения, количество элементов ограничено только доступной памятью. Как это понимать?
и в Lparam тоже не понятно что указывать. Откуда я узнаю, сколько памяти будут занимать добавленные строчки? Только если это не будет заранее известно. Например: '1',2',3','10' - 5 байт. Или это произвольное значение, при превышении которого скорость добавления просто снизится, а на лимит оно не влияет?

Последний раз редактировалось BLACK_RAIN; 10.12.2016 в 12:29.
BLACK_RAIN вне форума Ответить с цитированием
Старый 10.12.2016, 12:29   #13
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Только если это не будет заранее известно
А оно Вам известно. Предполагается копирование данных листбокса, окно которого будет уничтожено.
EUGY вне форума Ответить с цитированием
Старый 10.12.2016, 12:38   #14
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
А оно Вам известно. Предполагается копирование данных листбокса, окно которого будет уничтожено.
Получается, надо проходить два раза? Первый раз считать длину строк, а второй их копировать. Так что-ли?
нет же сообщения, которое возвращает суммарную длину всех строк.
BLACK_RAIN вне форума Ответить с цитированием
Старый 10.12.2016, 12:47   #15
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Получается, надо проходить два раза?
Нет.
SendMessage LB_GETTEXT
вернет длину строки и саму строку.

..
У вас наверное стереотип, что LB_ADDSTRING при большом количестве вызовов будет долго отрабатывать. Но это верно только в случае, если окно видимо и не выделена память под весь массив строк.
А тут как раз вариант, что окно загружено, еще не отображено и все данные заранее известны.
EUGY вне форума Ответить с цитированием
Старый 10.12.2016, 12:55   #16
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
SendMessage LB_GETTEXT
вернет длину строки и саму строку.
то есть, надо выделять память не под все строки сразу, а под каждую строку перед LB_ADDSTRING?
BLACK_RAIN вне форума Ответить с цитированием
Старый 10.12.2016, 13:01   #17
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Ну, нет конечно.

Сначала считываете данные в цикле из умирающего листбокса.
Суммируете общую длину.
Убиваете листбокс.
Создаете новый. Вызываете один раз LB_INITSTORAGE.
И в цикле из сохраненного массива строк добавляете LB_ADDSTRING.
Отображаете листбокс.

Ну, как-то так...
EUGY вне форума Ответить с цитированием
Старый 10.12.2016, 13:08   #18
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Сначала считываете данные в цикле из умирающего листбокса.
Суммируете общую длину.
Убиваете листбокс.
Создаете новый. Вызываете один раз LB_INITSTORAGE.
И в цикле из сохраненного массива строк добавляете LB_ADDSTRING.
Ну да. Я примерно это и имел ввиду, когда говорил "проходить два раза".
Я никогда с массивом строк не работал. Разве это быстрее, чем листбокс?
BLACK_RAIN вне форума Ответить с цитированием
Старый 10.12.2016, 13:18   #19
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

То, что я Вам предложил, по-умному называется сериализацией объекта.
Утверждать, что это именно то, что нужно Вам, я не стану.

Поэкспериментируйте.
EUGY вне форума Ответить с цитированием
Старый 10.12.2016, 15:37   #20
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Как это понимать?
Система позволяет добавить не более 2^31 элементов, но никто не гарантирует, что в системе будет достаточно памяти, чтоб разместить 2^31 элементов.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разные стили в одной строке ListBox rota Общие вопросы Delphi 14 26.02.2012 21:48
Добавить/убрать раскладку Stilet Win Api 5 20.07.2011 11:35
как добавить в listbox файлы(пишу с помощью bassplayer)(Listbox+opendialog=play) blackstersl Общие вопросы Delphi 11 09.06.2010 13:23
Чем отличаются стили listBox'a? TwiX Общие вопросы Delphi 2 14.11.2009 01:40
Как в RichView убрать стили? KurtWagner Компоненты Delphi 2 05.02.2009 10:43