(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

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

Источник: autodesk

Описание проблемы: Когда мой 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().

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


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 27.06.2012 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
AutoCAD LT 2022 Commercial New Single-user ELD Annual Subscription
Quest Software. Toad for Oracle Development Suite
IBM Rational Functional Tester Floating User License
Quest Software. TOAD for Oracle Edition
Business Studio 4.2 Enterprise. Конкурентная лицензия + Business Studio Portal 4.2. Пользовательская именная лицензия.
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование в AutoCAD
Компьютерный дизайн - Все графические редакторы
Adobe Photoshop: алхимия дизайна
3D и виртуальная реальность. Все о Macromedia Flash MX.
Новые программы для Windows
 
Статьи по теме
 
Новинки каталога Download
 
Документация
 
 



    
rambler's top100 Rambler's Top100