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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > 2 варианта получения значения списка в диалогах

2 варианта получения значения списка в диалогах

Ответ
Поиск в этой теме
Непрочитано 23.11.2010, 21:29 #1
2 варианта получения значения списка в диалогах
swkx
 
Регистрация: 22.01.2010
Сообщений: 311

Коллеги,

в диалоге имеем вот такой списочек:
: popup_list { key = "tip"; list = "Тип 1\nТип 2\nТип 3\nТип 4";}

Использование в программе двух этих вариантов:

1. (action_tile "tip" "(setq num-tip (get_tile \"tip\"))")
2. (action_tile "tip" "(setq num-tip (atoi $value))")

даёт одинаково правильные результаты.

Оба способа абсолютно идентичны или есть какие-нибудь нюансы их применения ?
Просмотров: 5392
 
Непрочитано 23.11.2010, 23:50
#2
gomer

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


правильно! нюансов нет все идентично...
зы... забивать список в диалог - моветон, читайте матчасть=)
gomer вне форума  
 
Автор темы   Непрочитано 24.11.2010, 06:32
#3
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Даже если это список дней недели ??
swkx вне форума  
 
Непрочитано 24.11.2010, 08:25
#4
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от swkx Посмотреть сообщение
есть какие-нибудь нюансы их применения ?
Есть конечно.
$value - значение того элемента диалога, над которым производится действие. То есть с его помощью можно вытащить значение только одного элемента диалога.
get_tile получает текущее значение любого элемента диалога, даже если с ним не совершается никаких действий.
Ну а в приведенном примере оба варианта отработают одинаково.
Do$ вне форума  
 
Непрочитано 24.11.2010, 08:33
#5
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


ИМХО В варианте №1 масло-масляное получается. Get_tile прекрасно работает и без Action_tile.
E-degtyarev вне форума  
 
Непрочитано 24.11.2010, 08:44
#6
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Все равно get_tile должно вызываться по какому-то событию. Здесь это событие - действие с элементом "tip". В том-то и плюс, что get_tile можно к любому действию "прикрутить", и не обязательно с тем элементом, чье значение нужно получить.
Зы
Цитата:
Использование в программе двух этих вариантов:

1. (action_tile "tip" "(setq num-tip (get_tile \"tip\"))")
2. (action_tile "tip" "(setq num-tip (atoi $value))")

даёт одинаково правильные результаты.
Как эти два выражения могут давать одинаковые результаты, если во втором выражении есть atoi, а в первом нету?

Последний раз редактировалось Do$, 24.11.2010 в 09:00.
Do$ вне форума  
 
Автор темы   Непрочитано 24.11.2010, 11:33
#7
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Как мне кажется, было бы логичнее в любом месте программы, где мне нужно получить номер выбранного зачения из списка "tip", использовать конструкцию (get_tile "tip"), но у меня почему-то всегда это значение оказывается равным nil при любом выбранном значении списка.

В чем может быть дело ?

Do$,

в обоих случаях переменная num-tip будет иметь целочисленный тип. Разве не так ?

Последний раз редактировалось swkx, 24.11.2010 в 11:39.
swkx вне форума  
 
Непрочитано 24.11.2010, 11:57
#8
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


В первом варианте num_tip будет строкой.

Цитата:
Сообщение от swkx Посмотреть сообщение
Как мне кажется, было бы логичнее в любом месте программы, где мне нужно получить номер выбранного зачения из списка "tip", использовать конструкцию (get_tile "tip"), но у меня почему-то всегда это значение оказывается равным nil при любом выбранном значении списка.

В чем может быть дело ?
покажи код
Do$ вне форума  
 
Автор темы   Непрочитано 24.11.2010, 12:17
#9
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Код:
[Выделить все]
(defun C:TESTDIA ()
(vl-load-com)

(setq activedoc (vla-get-activedocument (vlax-get-acad-object)))
(vla-startundomark activedoc) 

(loaddialog)

(setq num-tip (get_tile "tip"))
(princ num-tip)


(vla-endundomark activedoc)
(princ)	
	
)


(defun loaddialog ()

	(if (< (setq dcl_id (load_dialog "F:\\CAD_Work\\TESTDIA.dcl")) 0) (exit))
	(if (not (new_dialog "testdia" dcl_id)) (exit))

	
	(start_dialog)
	(unload_dialog dcl_id)	

)
swkx вне форума  
 
Непрочитано 24.11.2010, 12:43
#10
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Теперь понятно...
Все <>_tile должны вызываться между вызовами функций new_dialog и start_dialog.
И что-то я сомневаюсь, что так будет правильно работать:
Код:
[Выделить все]
(setq num-tip (get_tile "tip"))
Лучше один из двух предыдущих вариантов.
Do$ вне форума  
 
Автор темы   Непрочитано 24.11.2010, 13:11
#11
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Цитата:
Сообщение от Do$ Посмотреть сообщение
Все <>_tile должны вызываться между вызовами функций new_dialog и start_dialog
Этого я и не знал Учту.
swkx вне форума  
 
Непрочитано 24.11.2010, 14:38
#12
Евгений А.

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


Цитата:
Сообщение от swkx Посмотреть сообщение
Все <>_tile должны вызываться между вызовами функций new_dialog и start_dialog.
Тоже не совсем верно. После new_dialog на экране появляется диалог, но он ещё не активен для пользователя, поэтому в этот момент можно и нужно только присваивать элементам диалога нужные параметры, заполнять списки и т.д.. И смысла в чтении этих параметрах ещё нет. Вызов (start_dialog) делает диалоговое окно активным, но сам лисп останавливается до закрытия диалога. То есть после (start_dialog) Опять бесполезно использовать get_tile, так как окно в этот момент уже закрыто! (именно поэтому nil) Все чтения параметров нужно выполнять в функциях отклика диалога.
Евгений А. вне форума  
 
Автор темы   Непрочитано 24.11.2010, 14:55
#13
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


После теоретических изысканий и экспериментов напрашивается вывод:

Код:
[Выделить все]
(new_dialog)
...
(setq num-tip 0) ; на случай, если пользователь не прикоснётся к списку
(action_tile "tip" "(setq num-tip (atoi $value))")
...
(start_dialog)
swkx вне форума  
 
Непрочитано 24.11.2010, 15:14
#14
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Евгений А. Посмотреть сообщение
Тоже не совсем верно.
Смотря как делать, конечно же!
Если задавать из лиспа действия с помощью action_tile, то делать это надо между вызовами функций new_dialog и start_dialog. Вот это я имел в виду.
Do$ вне форума  
 
Непрочитано 24.11.2010, 18:14
#15
gomer

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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Как эти два выражения могут давать одинаковые результаты, если во втором выражении есть atoi, а в первом нету?
Стал стар и слеп, простите, автор... Еще давно такими конструкциями не пользуюсь... action_tile всегда делаю по количеству элементов изменяющих диалог (т.е. если, например, кликнуть тоггл, станет недоступным едит_бокс и т.д.) + 2 на кенцел и акцепт, который собирает значения всех элементов диалога...
Минус метода в #1 в том, что если элемент не трогать, то значение переменной останется nil как следствие обязательно выскочит ошибка или переменную нужно инициализировать изначально...
gomer вне форума  
 
Непрочитано 24.11.2010, 18:23
#16
Евгений А.

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


Самый, на мой взгляд, удобный вариант работы с диалогом - это когда есть одна главная функция отклика для диалога и там делать всю его обработку, тогда не надо париться с action-tile и т.п.. Вот на данном примере накидал такой вариант:

Код:
[Выделить все]
(defun C:TESTDIA (/ num-tip activedoc)
  (vl-load-com)
  (setq activedoc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-startundomark activedoc)
  (loaddialog)
  (princ num-tip)
  (vla-endundomark activedoc)
  (princ)
  )


(defun loaddialog (/ dcl_id)
  (if (< (setq dcl_id (load_dialog "F:\\CAD_Work\\TESTDIA.dcl")) 0)
    (exit)
    )
  (if (not (new_dialog "testdia" dcl_id "(action-dialog)"))
    (exit)
    )
  (start_dialog)
  (unload_dialog dcl_id)
  )

(defun action-dialog (/)
  (cond	((= $key "tip") (setq num-tip $value))
            ;;((= $key "tip") (setq num-tip (get_tile "tip"))); - аналогично и по вкусу
               ((= $key "close") (DONE_DIALOG 0))
	(t nil)
	)
  )

Последний раз редактировалось Евгений А., 25.11.2010 в 00:32.
Евгений А. вне форума  
 
Непрочитано 24.11.2010, 20:05
#17
gomer

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


ИМХО, не лучший стиль программирования: action-dialog - это функция по умолчанию для элементов, которым явно не присвоено действие, зачем в него вставлять разграничение? Есть ведь action_tile! А что если забыть кнопку "close"... диалог не закроется просто... вы потеряете часть работы!
gomer вне форума  
 
Непрочитано 24.11.2010, 20:58
#18
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


По-моему, для accept и cancel не требуется специально назначать action_tile (ну, только если не требуется анализировать результат выполнения диалога )
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.11.2010, 21:05
#19
gomer

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
для accept и cancel не требуется специально назначать action_tile
Анализировать все равно придется
gomer вне форума  
 
Непрочитано 24.11.2010, 22:38
#20
Евгений А.

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


Э-э-э, налетели коршуны - это всего лишь пример, никого не заставляю делать именно так. Он удобен тем, что не надо вообще использовать action_tile. И это лучше, чем плодить множество мелких функции под каждый tile, особенно когда в программе много диалогов. Потом на кнопку cancel или accept тоже неплохо бы повесить какую-то деятельность, а не просто (done_dialog 0) или (done_dialog 1), которые по умолчанию, тогда и "детских" проблем не будет. Я про это:
Цитата:
Сообщение от gomer Посмотреть сообщение
Минус метода в #1 в том, что если элемент не трогать, то значение переменной останется nil как следствие обязательно выскочит ошибка или переменную нужно инициализировать изначально...
Ну каждый сам решает, задачи разные бывают.

PS: Забыл самое приятное - отлов ошибок диалога в отладчике при таком алгоритме - не проблема, а вот с action_tile - извините, тока силой мысли.

Последний раз редактировалось Евгений А., 24.11.2010 в 23:07.
Евгений А. вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > 2 варианта получения значения списка в диалогах



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Excel: Выбор значения из списка для ячейки (без ссылки на другие ячейки) Малюк Прочее. Программное обеспечение 11 15.09.2012 12:17
Получения списка кривых на чертеже (VBA) Тензор Программирование 3 12.12.2009 19:39
структурированный список Holon Программирование 22 11.09.2007 14:09
чтение данных из файла Александер Программирование 6 08.09.2005 10:24