All Forums
 Категория Visio
 Форум Вопросы и ответы
 Об работе с AddAdvise
Author Previous Topic Topic Next 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.
Go to Top of Page
  Previous Topic Topic Next Topic  
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)