Форум программистов
Реклама:
Гарантия безопасности сети с UTM-системой ИКС.
Защита ПД, межсетевой экран, контроль доступа, фильтрация трафика, система предотвращения вторжений.
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

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

уже не по теме, но раз уж начали
Цитата:
Сообщение от 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 в 13:29.
BLACK_RAIN вне форума   Ответить с цитированием
Старый 10.12.2016, 13:29   #13
EUGY
Участник клуба
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Адрес: Мурманск
Сообщений: 913
Репутация: 132
По умолчанию

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

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

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

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

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

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

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

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

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

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

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

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



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разные стили в одной строке 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 02:40
Как в RichView убрать стили? KurtWagner Компоненты Delphi 2 05.02.2009 11:43




01:33.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru