Author |
Topic |
|
eug
Russia
19 Posts |
Posted - 06/02/2003 : 07:41:50
|
К вопросу передачи событий из Visio-схемы, открытой приложением-клментом (продолжение темы поднятой в ответе на недавний вопрос Run AddonArgs ) ------------------------------------------------------------------- Как известно, согласно Help Visio2000, SDK Visio2002 методом AddAdbise декларируется добавление специальных событий к коллекции eventlist документа, при наступлении которых должен срабатывать обработчик-функция Function IvisEventProc(…), которая реализуется в класс-модуле приложения-клиента или VBA-коде документа Визио. Приводится даже пример Мною был проверен этот подход Код основного модуля VB6-приложения Dim g_Sink As CEventSamp, docObj As Visio.Document Dim eventsObj As Visio.EventList, g_appVisio As Visio.Application Private Sub Form_Load() 'Create an instance of the CEventSamp class.g_Sink is global to the form. Set g_appVisio = New Visio.Application Set g_Sink = New CEventSamp 'Create a new drawing. instance of Visio has already been assigned to g_appVisio. Set docObj = g_appVisio.Documents.Open("e:\scutor\test.vsd") 'Get the EventList collection of this document. Set eventsObj = docObj.EventList MsgBox ("Events=" & eventsObj.Count) 'Add an Event object for the DocumentSaved event. eventsObj.AddAdvise visEvtCodeDocSave, g_Sink, "", "Document Saved..." 'Add an Event object for the ShapeDeleted event. eventsObj.AddAdvise visEvtCodeShapeDelete, g_Sink, "", "Shape Deleted..." 'Add an Event object for the PageAdded event. eventsObj.AddAdvise (visEvtPage + visEvtAdd), g_Sink, "", "Page Added..." End Sub Код класс- модуля CeventSamp (почти повторяет код примера SDK Visio 2002) Implements Visio.IVisEventProc Public Function IVisEventProc_VisEventProc(ByVal nEventCode As Integer, ByVal pSourceObj As Object, ByVal nEventID As Long, ByVal nEventSeqNum As Long, ByVal pSubjectObj As Object, ByVal vMoreInfo As Variant) As Variant Dim strDumpMsg As String 'Find out which event fired. Select Case eventCode Case visEvtCodeDocSave strDumpMsg = "Save(" & eventCode & ")" Case (visEvtPage + visEvtAdd) strDumpMsg = "Page Added(" & eventCode & ")" Case visEvtCodeShapeDelete strDumpMsg = "Shape Deleted(" & eventCode & ")" Case Else strDumpMsg = "Other(" & eventCode & ")" End Select MsgBox (strDumpMsg) End Function Результат такой, что если приведенные выше модуль (без 1-го оператора т оператора открытия документа) реализован в области ThisDocument схемы Визио, то все работает. Если же можудь и класс-модуль – в проекте VB6, то на любом операторе AddAdvise происходит ошибка: “A property or metod call can’not include the reference to the private object eigther as argument, or as return value”. Не помогает объявление всех объявлений переменных выше как Global. В чем дело?
Багоцкий |
|
Tumanov
Russia
1198 Posts |
Posted - 06/02/2003 : 13:52:09
|
А Вы учитываете наличие вот такого примечания? Что-то смысл сообщения слегка смахивает на подобную причину... NOTE Visual Basic projects that use the AddAdvise method must be set up as an ActiveX EXE project rather than a Standard EXE project because they must expose public objects (sink objects). The Instancing property of classes that serve as sink objects should generally be set to MultiUse.
|
|
|
|
Topic |
|
|
|