+7 (495) 229-0436   shopadmin@itshop.ru 119334, г. Москва, ул. Бардина, д. 4, корп. 3
 
 
Вход
 
 
Каталог
 
 
Подписка на новости
Новости ITShop
Windows 7 и Office: Новости и советы
Обучение и сертификация Microsoft
Вопросы и ответы по MSSQLServer
Delphi - проблемы и решения
Adobe Photoshop: алхимия дизайна
 
Ваш отзыв
Оцените качество магазина ITShop.ru на Яндекс.Маркете. Если вам нравится наш магазин - скажите об этом Google!
 
 
Способы оплаты
 
Курс расчета
 
 1 у.е. = 93.29 руб.
 
 Цены показывать:
 
 
 
 
  
Новости, статьи, акции
 

Почему у меня не получается удалить обработчик события в AutoCAD .NET?

27.06.2012 12:10

Описание проблемы: Когда мой dll модуль загружается в AutoCAD, он подписывается на событие DocumentToBeDestroyed и всё работает, как задумано. За исключением того факта, что у меня не получается "отписаться" от этого события - мой обработчик продолжает вызываться. В чём может быть причина?


Вот мой код:


Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices


Public Class MyCommands
Implements IExtensionApplication


Public Sub Initialize() Implements IExtensionApplication.Initialize
AddHandler Application.DocumentManager.DocumentToBeDestroyed, AddressOf docBeginDocClose
End Sub


Public Sub Terminate() Implements IExtensionApplication.Terminate
End Sub


Public Sub docBeginDocClose(ByVal senderObj As Object, _
ByVal docColDocActEvtArgs As DocumentCollectionEventArgs)
System.Diagnostics.Debug.Print("in docBeginDocClose")
End Sub


<CommandMethod("StopEvent")> _
Public Sub StopEvents()
Try
RemoveHandler Application.DocumentManager.DocumentToBeDestroyed, AddressOf docBeginDocClose
Catch ex As Exception
MsgBox("Error: " & ex.Message)
End Try
End Sub


End Class


Решение: Причина объясняется в статье "Using Instance and Static Command Methods" в "ObjectARX Developer's Guide" (этот документ при установке ObjectARX копируется в "C:/ObjectARX 2012/docs/arxdev.chm"), а именно:



Вы можете объявить обработчик команды как статический метод класса (static method) или метод экземпляра (instance method), это делается с помощью ключевого слова static в C# или Shared в VB.NET. В зависимости от этого поведение AutoCAD будет отличаться - в случае метода экземпляра AutoCAD создает специальный объект-обертку этого метода для каждого открытого документа. Вы можете использовать это в своих целях, чтобы защитить какие-либо данные внутри документа. Также, вы можете сделать эти данными разделяемыми, объявив метод статическим. Как же это влияет на исполнение нашего кода?
В приведенном примере в классе MyCommands обработчик StopEvents() объявлен без ключевого слова Shared, т.е. он объявлен как метод экземпляра. Это значит, что для каждого документа будет создан свой экземпляр класса MyCommands. Также это значит, что для каждого документа адрес обработчика docBeginDocClose() будет свой! И если при вызове AddHandler мы находились в одном документе, а команду "StopEvent" вызовем из другого, то у нас не получится разорвать связь "событие-обработчик" в строке


RemoveHandler Application.DocumentManager.DocumentToBeDestroyed, AddressOf docBeginDocClose


потому что система не найдет данный AddressOf docBeginDocClose в своей таблице "событие-обработчик".



Видимо, наилучший выход в данной ситуации - добавить ключевое слово Shared к Public Sub StopEvents().

Ссылки по теме

  
Помощь
Задать вопрос
 программы
 обучение
 экзамены
 компьютеры
Бесплатный звонок
ICQ-консультанты
Skype-консультанты

Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 
Бестселлеры
Курсы обучения "Atlassian JIRA - система управления проектами и задачами на предприятии"
Microsoft Windows 10 Профессиональная 32-bit/64-bit. Все языки. Электронный ключ
Microsoft Office для Дома и Учебы 2019. Все языки. Электронный ключ
Курс "Oracle. Программирование на SQL и PL/SQL"
Курс "Основы TOGAF® 9"
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год. Электронный ключ
Курс "Нотация BPMN 2.0. Ее использование для моделирования бизнес-процессов и их регламентации"
 

О нас
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.

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

Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе.

В нашем магазине вы можете приобрести лицензионное ПО выбрав необходимое из широкого спектра и ассортимента по самым доступным ценам. Наши менеджеры любезно помогут определиться с выбором ПО, которое необходимо именно вам. Также мы проводим учебные курсы. Мы приглашаем к сотрудничеству учебные центры, организаторов семинаров и бизнес-тренингов, преподавателей. Сфера сотрудничества - продвижение бизнес-тренингов и курсов обучения по информационным технологиям.



 

О нас

 
Главная
Каталог
Новинки
Акции
Вакансии
 

Помощь

 
Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 

Способы оплаты

 

Проекты Interface Ltd.

 
Interface.ru   ITShop.ru   Interface.ru/training   Olap.ru   ITnews.ru  
 

119334, г. Москва, ул. Бардина, д. 4, корп. 3
+7 (495) 229-0436   shopadmin@itshop.ru
Проверить аттестат
© ООО "Interface Ltd."
Продаем программное обеспечение с 1990 года