| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Ограничения в List-box при множественном выборе

Ограничения в List-box при множественном выборе

Ответ
Поиск в этой теме
Непрочитано 02.01.2012, 10:53 #1
Ограничения в List-box при множественном выборе
Frigate
 
КИП, АСУ ТП, слаботочка
 
Москва-Тюмень
Регистрация: 02.09.2010
Сообщений: 422

Всех с наступившим :-)

Прошу помочь знатоков.
Столкнулся с такой проблемой - при установкe флага multiple_select=true - количество одновременно выбранных строк не может превышать 256, т.е. значение list_box будет "0 1 2 ... 255"
Это реально так или я что-то не так делаю?
Про ограничение не сказано в справке, а список может содержать до 32768 записей.


очень грустно, если это ограничение нельзя преодолеть...
Просмотров: 12248
 
Непрочитано 02.01.2012, 12:19
#2
Oliver_88

"ценный кадр"
 
Регистрация: 02.12.2010
Сообщений: 115
<phrase 1=


Frigate, попробуй такой вариант. Чтобы работало нужно подправить путь для загрузки диалога на свой.
.lsp
Код:
[Выделить все]
 (defun test ( / lst a id_dial scl)
  (setq a -1)
  (repeat 500
    (setq a (1+ a))
    (setq lst (cons (vl-princ-to-string a) lst))
    )
  ;dialog
  (setq id_dial (load_dialog "E:\\lisp\\заготовки\\dcl-ки\\dial.dcl"))
  (if
    (not
      (new_dialog "dial_copy" id_dial)
      )
    (exit)
    )
  (start_list "scaclelist")
  (mapcar 'add_list (reverse lst))
  (end_list)
  (action_tile
    "cancel"
    "(done_dialog) (setq userclick nil)"
    )
  (action_tile "accept"
    (strcat
      "(progn
	  (setq scl(get_tile \"scaclelist\"))
	  (done_dialog)"
      "(setq userclick T))"
      )
    )
  (start_dialog)
  (unload_dialog id_dial)
  ;end dialog
  scl
  )
.dcl
Код:
[Выделить все]
 dial_copy:dialog {label="Список масштабов";
width=10; height=10; fixed_width=true; fixed_height=true;
:text {label="Выберите масштаб";}
:list_box{key="scaclelist";multiple_select=true;}// width=10; height=5; fixed_width=true; fixed_height=true;
ok_cancel;
}
Oliver_88 вне форума  
 
Непрочитано 02.01.2012, 16:33
#3
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Всех с наступившим! Наверное, имеется ввиду, что при попытке програмно выделить больше 256 строк выдаётся ошибка о превышении не помню уже чего? Это решается просто - выделяй большой список по допустимым частям!
Евгений А. вне форума  
 
Автор темы   Непрочитано 02.01.2012, 20:16
#4
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Oliver_88,
ной
да, странно, почему работает с 500 строчками? Может потому, что ты используешь get_tile, а я присваиваю значение в action_tile списка?

В любом случае, поставь вместо 500 - 600. И акад вылетит. Какая-то ошибка происходит. Иногда акад пишет ошибку нарушения доступа. Странно, в общем.
Frigate вне форума  
 
Непрочитано 02.01.2012, 23:11
#5
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


в list_box ограничение на длину возвращаемой строки - 2002 (до 2004 было 254)
Vov.Ka вне форума  
 
Автор темы   Непрочитано 02.01.2012, 23:15
#6
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Vov.Ka,

а чем тогда вызвано зависание акада, когда в коде из сообщения #2 меняешь 500 на 600? Больше 600 смысла нет задавать - акад зависает или водникает ошибка.
Frigate вне форума  
 
Непрочитано 02.01.2012, 23:22
#7
Oliver_88

"ценный кадр"
 
Регистрация: 02.12.2010
Сообщений: 115
<phrase 1=


Frigate, я поставил 600. Ничего не зависало,не вылетало и ошибок не было. Просто функция вернула nil. Даже не знаю чего с этим делать.
Oliver_88 вне форума  
 
Непрочитано 02.01.2012, 23:32
#8
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


Цитата:
Сообщение от Frigate Посмотреть сообщение
а чем тогда вызвано зависание акада, когда в коде из сообщения #2 меняешь 500 на 600? Больше 600 смысла нет задавать - акад зависает или водникает ошибка.
какой автокад?
у меня 2005, не падает
Vov.Ka вне форума  
 
Автор темы   Непрочитано 03.01.2012, 00:01
#9
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


у меня 2009й

Oliver_88, но в любом случае 500 лучше, чем 256 ))) Хотя - у меня при моем варианте кода хотя б отрабатывает 256 значений, а не вылетает и не выводит nil

я тоже не знаю, что делать )))
Frigate вне форума  
 
Непрочитано 03.01.2012, 10:43
#10
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
я тоже не знаю, что делать
А я знаю. Надо забыть DCL. Причина глюков в том, что список формируется строкой, а длина строк ограничена.

И вообще (даже другими средствами), не выводить в линейный список для выбора пользователем большое количество строк.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 03.01.2012, 11:46
#11
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


ShaggyDoc,

совет хороший!

Я тоже думаю создать возможность выбора большого количества строк - не в dcl, а при помощи подкачки текстовых файлов. Но это редко когда понадобится в моей программе, так что особого внимания этим функциям не буду уделять.
Frigate вне форума  
 
Непрочитано 03.01.2012, 16:16
#12
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Но это редко когда понадобится в моей программе, так что особого внимания этим функциям не буду уделять
Это твоя единственная и последняя в жизни программа? И ты намерен до конца жизни с ней биться?

Надо только один раз сделать несколько универсальных, правильно работающих, надежных диалогов и закрыть эту тему для себя навсегда. Это быстрее, чем ты разбирался на форуме с первым встреченным глюком.

Возможно обнаружишь, что кроме этих нескольких простых диалогов, вызываемых как функции, тебе вообще больше ничего не понадобится.

Примеры простых диалогов для работы со списками на картинках. Все вызываются из LISP в виде функций. Например, список с "галочками"

(ru-dlg-show-check-list
dlg_caption ; Заголовок окна
lst_names ; Список строк
lst_values ; Список значений (помечен или нет)
lst_enabled ; Список доступности для изменения
help_file topic_id ; Пункт справки
)
Миниатюры
Нажмите на изображение для увеличения
Название: double_list.png
Просмотров: 94
Размер:	3.7 Кб
ID:	72368  Нажмите на изображение для увеличения
Название: dual_list.png
Просмотров: 94
Размер:	6.3 Кб
ID:	72369  Нажмите на изображение для увеличения
Название: single_list.png
Просмотров: 77
Размер:	3.7 Кб
ID:	72370  Нажмите на изображение для увеличения
Название: check_list_box.png
Просмотров: 83
Размер:	6.2 Кб
ID:	72371  

Последний раз редактировалось ShaggyDoc, 03.01.2012 в 16:19. Причина: Движок форума стал глючить с тегами?
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 03.01.2012, 18:57
#13
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


а как тогда позволить пользователю удалить 1500 выбранных им кабелей?
Frigate вне форума  
 
Непрочитано 03.01.2012, 20:04
#14
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от Frigate Посмотреть сообщение
а как тогда позволить пользователю удалить 1500 выбранных им кабелей?
Сделать доступной кнопку "Удалить" (или еще какую, которая результат принимает), если выбран хоть один элемент

Ты лучше думай, как пользователю обеспечить удобный выбор, да еще такого количества. В обычном ListBox множественный выбор осуществляется стандартными средствами - мышкой с нажатыми Shift или Ctrl. При больших списках это чрезвычайно неудобно - достаточно один раз сбиться (на 1499 элементе), и начинай все сначала. Вот для этого и делают специальные диалоги.

Например, в списке с "галочками" (CheckListBox) выбор не зависит от навигации и не сбивается. Можно и мышкой щелкать по галочкам, а клавишами прокручивать. Можно и отметку пробелом делать. Можно и свою клавишу назначить.

Другой вид списка, с двумя окнами (DualListBox), позволяет перебрасывать элементы из окна в окно. Допустим, надо выбрать 1500 элементов из 1600.

В простом списке надо будет щелкнуть до 1500 раз.

В DualListBox исходный список помещаем в левое окно. Пользователь может одним щелчком перебросить весь список в правое окно, а затем выбрать в нем и перебросить обратно только оставляемые 100 элементов. Тогда справа останется 1500 удаляемых элементов. Это будет в 15 раз быстрее. Да еще и элементы можно заодно по вертикали перетаскивать, т.е. изменять порядок следования. Можно и запомнить состояние списков и дать работать "с перекурами".

Последний раз редактировалось ShaggyDoc, 03.01.2012 в 20:10.
ShaggyDoc вне форума  
 
Непрочитано 03.01.2012, 20:11
#15
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


если б меня заставили выбрать 256 пунктов из 32768, я б афтору надел его диалоговое окно на голову, как юзер
Любые сложные данные можно структурировать и далее работать с деревьями (Вспомните установщик акада в пользовательском режиме), в примитивном виде это можно и через dcl организовать, если недотрах
Что касается картинок, то все, кроме последней можно организовать в dcl, последнюю тоже можно, если см. выше
Как по мне, оптимальный вариант - перейти на vb.net
Вариант ShaggyDoc мне лично не нравится тем, что нужно создавать установщик, да и не нужные по сути системе библиотеки регистрировать как то не очень хочется, ну и к тому же, при первом запуске, такая ком-форма появится не сразу... доли секунды, а негативное отношение уже сложено... впрочем все это не смертельно
самый лучший вариант - сесть и подумать как обойтись без длинных списков, 90% это возможно
gomer вне форума  
 
Непрочитано 03.01.2012, 21:35
#16
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Что касается картинок, то все, кроме последней можно организовать в dcl
Визуально такие же - можно. Но у таких диалогов еще и поведение есть, т.е. реакция на всякие действия. В DCL этого не сделать. Столько action_tile замучишься писать.

Цитата:
мне лично не нравится тем, что нужно создавать установщик, да и не нужные по сути системе библиотеки регистрировать как то не очень хочется
Будешь зарабатывать деньги программированием - понравится. Без этого и делать нечего. Заодно и без написания справок. И что значит "не нужные системе"? Да "системе" и сам Автокад не нужен. Пользователям надо. Программы сразу надо делать профессионально - чтоб они ставились в нужное место, чтоб нигде абсолютные пути не были записаны и прочее. Вообще чтоб работали не только на компьютере автора и не только в его присутствии.

Цитата:
Как по мне, оптимальный вариант - перейти на vb.net
Так среда программирования может быть любой. Только и на .NET надо соблюдать определенные правила, да еще и с версионностью самой .NET маленько помучиться.

Нужно не говорить о том, на что можно перейти, а перейти и сделать

Цитата:
такая ком-форма появится не сразу... доли секунды
Пробовал лично эти формы пользовать? Считал доли секунды? Знаешь, как внутренние механизмы COM, влияющие на задержки работают? Сравнивал с секундами задержек штатных диалогов? Много форм сделал на .NET? Сравнивал скорость их работы? Пробовал сделать диалог без COM, в виде обычного модального EXE да с передачей данных через файл и сравнить скорость его работы, с .NET, например?
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 03.01.2012, 23:01
#17
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Сделать доступной кнопку "Удалить" (или еще какую, которая результат принимает), если выбран хоть один элемент

Ты лучше думай, как пользователю обеспечить удобный выбор, да еще такого количества. В обычном ListBox множественный выбор осуществляется стандартными средствами - мышкой с нажатыми Shift или Ctrl. При больших списках это чрезвычайно неудобно - достаточно один раз сбиться (на 1499 элементе), и начинай все сначала. Вот для этого и делают специальные диалоги.

Например, в списке с "галочками" (CheckListBox) выбор не зависит от навигации и не сбивается. Можно и мышкой щелкать по галочкам, а клавишами прокручивать. Можно и отметку пробелом делать. Можно и свою клавишу назначить.

Другой вид списка, с двумя окнами (DualListBox), позволяет перебрасывать элементы из окна в окно. Допустим, надо выбрать 1500 элементов из 1600.

В простом списке надо будет щелкнуть до 1500 раз.

В DualListBox исходный список помещаем в левое окно. Пользователь может одним щелчком перебросить весь список в правое окно, а затем выбрать в нем и перебросить обратно только оставляемые 100 элементов. Тогда справа останется 1500 удаляемых элементов. Это будет в 15 раз быстрее. Да еще и элементы можно заодно по вертикали перетаскивать, т.е. изменять порядок следования. Можно и запомнить состояние списков и дать работать "с перекурами".

Благодарю за полезный и конструктивный комментарий
Frigate вне форума  
 
Непрочитано 03.01.2012, 23:35
#18
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Пробовал лично эти формы пользовать? Считал доли секунды? Знаешь, как внутренние механизмы COM, влияющие на задержки работают? Сравнивал с секундами задержек штатных диалогов? Много форм сделал на .NET? Сравнивал скорость их работы? Пробовал сделать диалог без COM, в виде обычного модального EXE да с передачей данных через файл и сравнить скорость его работы, с .NET, например?
Друзья мои какого года у Вас компьютеры (и тогда какой автокад там может нормально работать), у меня есть рабочие примеры диалогов вызывающие всеми перечисленными методами (DCL, COM, Net, EXE) и ничего - все работают "нажал-появилось" на любом более-менее современном компьютере (при более-менее настроенной ОС) разница скорости в вызове диалога вобще не существенна. У всех методов есть свои плюсы и минусы - лучше подходит в зависимости от ситуации.
Offtop: вышеперечисленное больше к Gomer'у относится.

Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Надо только один раз сделать несколько универсальных, правильно работающих, надежных диалогов и закрыть эту тему для себя навсегда.
ИХМО это либо утопия, либо самообман - да любое действие можно и через ДОС ком-строку организовать (и в свое время было не мало "доказательств", что так удобней всего) - да можно написать десяток другой и потом все под них "подгонять", но значит-ли это "закрыть эту тему для себя на всегда" - как минимум у меня пока точно не получилось.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 04.01.2012, 02:47
#19
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Будешь зарабатывать деньги программированием - понравится.
будь я профессиональным программистом, писал бы аэриксы, жаль не пришлось
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Программы сразу надо делать профессионально - чтоб они ставились в нужное место, чтоб нигде абсолютные пути не были записаны и прочее. Вообще чтоб работали не только на компьютере автора и не только в его присутствии.
ну, я об этом и написал, только короче
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Пробовал лично эти формы пользовать? Считал доли секунды?
считал, первый запуск длится около секунды, остальные - как тока, так сразу... что там внутри происходит, не разбирался, делал самую простую форму с одной кнопкой
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Пробовал сделать диалог без COM, в виде обычного модального EXE да с передачей данных через файл и сравнить скорость его работы, с .NET, например?
Зачем? это метод из доаркснетовской эпохи, с использованием самого медленного железа
в любом случае, если вы пытаетесь втиснуть в диалог данные со сложной структурой, то этот диалог должен растягиваться. этого нет и не будет в dcl.

В общем-то вариантов море. у всех свои достоинства и недостатки.

Oliver_88, почитайте про start_dialog в справке и не повторяйте автодесковских ошибок
gomer вне форума  
 
Непрочитано 04.01.2012, 08:14
#20
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Друзья мои какого года у Вас компьютеры (и тогда какой автокад там может нормально работать)
Важно не какой у меня компьютер, а какие компьютеры у пользователей. Обычная беда в головах у программистов - у меня "летает", значит хорошо. А для конечных пользователей - облом. И это происходит с очень популярными продуктами в том числе. Всё на "более или менее" рассчитано.

Цитата:
ИХМО это либо утопия, либо самообман - да любое действие можно и через ДОС ком-строку организовать
Причем здесь командная строка вообще? А с диалогами не самообман, а давно проверенное дело.
Вот почти все диалоги, которые я использую:

ruXmlMenu - иллюстрированное XML-меню. Единый диалог, позволяющий заменить множество индивидуально конструируемых форм. Картинку в очередной раз показываю. Помимо универсальных приемов работы позволяет продвинутым пользователям расширять возможности любых программ дополнением собственными данными. Без участия программиста.

Списки (показаны в #12)

ruChkList
ruDoubleList2
ruDualList
ruSingleList

Ввод двух чисел или строк (можно и одиночных, как опции). Имеют проверки допустимых диапазонов (для чисел), выбора из справочников, выбора спецсимволов (для строк), "взять" указанием в чертеже.
ruGetDoubleNumber
ruGetDoubleString (см. картинку)

ruSplash - заставка с информацией о длительном процессе

ruFileDlg - очень быстрый файловый диалог с рядом дополнительных возможностей.

ruCoordEdit - визуальный редактор координат (как-то показывал картинку)

ruXmlTable - редактор любых таблиц. Таблицу пользователь может и сам создать (с шапками и прочим оформлением), редактировать её как таблицу БД. И в виде таблицы AutoCAD нарисовать, не заботясь об оформлении. См. картинку.

ruTxtView - просмотр текста из файла или чертежа

ruLayerClass - классификатор слоев. Вот этот как раз сделан специально в виде EXE, причем не модального.

Правильная комбинация таких диалогов позволяет быстро создавать практически любые программы. Конечно, для отдельных сложных случаев приходится делать и более сложные формы. Вот программа аэродинамического расчета (см. рисунок) тоже сделана в виде самостоятельной программы, но она же и в LISP встроена в виде диалога. Это позволяет написать результаты расчета на нарисованной схеме, а в Автокаде измерить длины участков.
Миниатюры
Нажмите на изображение для увеличения
Название: xml_3d_pipe_support.png
Просмотров: 78
Размер:	21.1 Кб
ID:	72388  Нажмите на изображение для увеличения
Название: dlg_2_string.png
Просмотров: 66
Размер:	6.3 Кб
ID:	72389  Нажмите на изображение для увеличения
Название: dlg_xml_table.png
Просмотров: 67
Размер:	8.1 Кб
ID:	72390  Нажмите на изображение для увеличения
Название: app_win_lt.png
Просмотров: 66
Размер:	26.7 Кб
ID:	72391  Нажмите на изображение для увеличения
Название: dlg_air.png
Просмотров: 72
Размер:	10.2 Кб
ID:	72392  

ShaggyDoc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Ограничения в List-box при множественном выборе

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить доступ к таблице Access Cleper Программирование 22 02.02.2016 07:05
Express Tools Perezz!! AutoCAD 483 13.02.2015 10:57
(GRREAD) и привязка Ева Программирование 17 18.12.2009 09:10
Работоспособность программы написанной очень давно. faust999 Программирование 1 05.06.2009 08:06
3D Konstruktor для проектировщиков КМ. Дима_ Готовые программы 17 10.07.2008 10:03