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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Перехват события и отмена действия (Реакторы)

Перехват события и отмена действия (Реакторы)

Ответ
Поиск в этой теме
Непрочитано 28.11.2019, 12:13 #1
Перехват события и отмена действия (Реакторы)
valerik88
 
Регистрация: 02.07.2016
Сообщений: 249

Хочу при двойном клике по ячейки таблицы произвести некие действия и что бы при этом ячейка не открылась для редактирования, как это обычно происходит.
Включил реактор, который срабатывает при двойном клике
Код:
[Выделить все]
 (vlr-mouse-reactor nil (list '(:vlr-beginDoubleClick . DoubleClickAction)))
Определил функцию DoubleClickAction, всё хорошо, но при этом всё равно выполняется команда _.tabledit.
Как бы мне отменить функцию _.tabledit, которая срабатывает при двойном клике по ячейке таблицы?
Просмотров: 1812
 
Непрочитано 28.11.2019, 13:31
#2
Кулик Алексей aka kpblc
Moderator

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


Может, проще в меню прописать обработку двойного клика?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.11.2019, 13:46
#3
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


или перехватывать команду _.tabledit. и по каким то критериям либо пропускать дальше, либо "гасить" и вызывать свои действия?
Сергей812 вне форума  
 
Автор темы   Непрочитано 28.11.2019, 13:57
#4
valerik88


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Может, проще в меню прописать обработку двойного клика?
Не понимаю в каком меню и как прописать? Программно можно как-то?


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
или перехватывать команду _.tabledit. и по каким то критериям либо пропускать дальше, либо "гасить" и вызывать свои действия?
Вот я как раз не знаю как её "гасить"...
valerik88 вне форума  
 
Непрочитано 28.11.2019, 14:53
#5
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Цитата:
Сообщение от valerik88 Посмотреть сообщение
Вот я как раз не знаю как её "гасить"...
ну как это предлагают делать на .Net - т.е. в обработчик события начала команды commandWillStart даже в .Net не вытащен метод отмены, предлагают косвенно через событие изменения состояния блокировки документа DocumentLockModeChanged делать.
Сергей812 вне форума  
 
Непрочитано 28.11.2019, 17:06
#6
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,091


Цитата:
Сообщение от valerik88 Посмотреть сообщение
Хочу при двойном клике по ячейки таблицы произвести некие действия и что бы при этом ячейка не открылась для редактирования, как это обычно происходит
Вставлю 5 коп.
1) как известно, редактирование ячейки возможно не только по двойному щелчку, но и по клавише F2. Это допускается или тоже надо обрабатывать?
2) что за "некие действия"? Если защита от случайного редактирования - есть же штатная блокировка ячеек. Команда _.tabledit запустится, выдаст сообщение о невозможности редактирования заблокированной ячейки и сама "погасится", а дальше "делай с ней (ячейкой) что хош". Правда, эту блокировку можно штатными же средствами снять.
Если нужна защита от злонамеренного редактирования или копирования "ценной информации" - тут не знаю, не люблю я эти вещи.

Последний раз редактировалось kp+, 28.11.2019 в 17:22.
kp+ вне форума  
 
Непрочитано 29.11.2019, 15:03
1 | #7
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Может, проще в меню прописать обработку двойного клика?
Насколько я понимаю, речь об "Операциях при двукратном нажатии" в _CUI. Я пробовал в свое время (в АС2011) - таблица - один из немногих объектов, на который нельзя переопределить двойное нажатие. Точнее, можно, но толку нет - все равно вызывает панель свойств, при условии, что двойной клик происходит не внутри ячейки, а на границе, когда таблица не выделена (не подсвечена ручками).

valerik88, есть пару мыслей.
Вначале я хотел воплотить идею блокировать ячейку от изменений при двойном нажатии на нее, используя функции лиспа HitTest и grread. Но почему-то при срабатывании реактора в лиспе при вызове
Код:
[Выделить все]
(cadr (grread T))
возвращаются не координаты точки под курсором, а список: '(2 95). Полагаю, хоть визуально редактор ячейки (с соответствующей панелью) еще не запущен, но для лиспа - уже да (ячейка Шрёдингера, так её сяк ). При этом, вызов этого же кода из командной строки при наведенном на ячейку курсоре возвращает координаты точки, которые мы бы впоследствии могли скормить функции HitTest, получив адрес ячейки и заблокировав ее, а после срабатывания реактора - обратно разблокировав. Но не судьба.

Далее я решил попробовать при срабатывании реактора заблокировать слой, на котором таблица расположена, и у меня получилось. Не без танцев с бубном, но все же. Однако, получилось у меня на АС2011. Была минутка для тестов на АС2015, но там почему-то не сработало. Я уже давно заметил, что на 2015 и выше реакторы ведут себя иначе.
Выкладываю код, сработавший на 2011:
Код:
[Выделить все]
 (defun DoubleClickAction (bdk data / );adoc dblclk_ss tbl_obj layer_item)
	(setq adoc (vla-get-ActiveDocument (vlax-get-acad-object))
		  dblclk_ss (ssget "_I") ;;; запоминаем набор выделенных примитивов
		  ;;; поскольку при двойном клике на таблицу подразумевается, что выделена только она одна, 
		  ;;; то она и будет единственным элементом набора. 
	)
	(if dblclk_ss 
		(setq tbl_obj (vlax-ename->vla-object (ssname dblclk_ss 0)) ;;; запоминаем примитив-таблицу
			  layer_item (vla-Item (vla-get-Layers adoc) (vla-get-Layer tbl_obj));;; vla-объект слоя
		)	
	)
	(cond 
	  ( (and layer_item (= (cadr (grread t 1)) 95)) ;;; если при двойном клике возвращается список '(2 95), значит, это ячейка таблицы
		(vla-put-Lock layer_item :vlax-true) ;;; блокируем слой
		(vla-sendcommand adoc "(vl-cmdf) ") ;;; поскольку в "реакции" запускать командные методы нельзя, прибегаем к лазейке (она эмулирует нажатие Esc)
		(vla-put-Lock layer_item :vlax-false) ;;; разблокируем слой
	  )
	  (	T 
		(princ "\nКлик не на таблице\n")
		(vla-sendcommand adoc "(vl-cmdf) ")
	  )
	)
	(princ)
	
)
skkkk вне форума  
 
Автор темы   Непрочитано 03.12.2019, 11:50
#8
valerik88


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


skkkk, Спасибо, попробую на неделе этот код
valerik88 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Перехват события и отмена действия (Реакторы)

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Должен ли срок действия сертификата соответствия на товар превышать срок действия гарантии? Rodionov_av Технология и организация строительства 3 07.07.2015 18:06
Свободная длина внецентренно-сжатой сквозной колонны из плоскости действия момента Наталья_С Металлические конструкции 5 25.08.2014 12:42
Каков срок действия серии? Ale$ka Поиск литературы, чертежей, моделей и прочих материалов 4 05.02.2010 06:21
Отмена действия СНиП Filip Morrison Разное 27 17.06.2008 08:45
Изменить имя сохраняемого файла в обработчике события сохранения Ax3 Программирование 2 25.12.2007 12:45