I am trying to control a Microstation application through its VBA api.
I am able to connect to the object and control it but I am now trying
to figure
out how to deal with Microstation’s event handling. In Microstation
VBA you declare
that a class implements an Event interface and make sure the class
implements all the methods.
You then call a method on the Application object. In example below
SaveHandler implements ‘ISaveAsEvents’
app = WIN32OLE.new(‘MicrostationDGN.Application.1’)
app.visible = TRUE
app.AddSaveAsEventsHandler SaveHandler
I tried to create a class that implements the methods in ‘ISaveAsEvents’
class SaveHandler
def AfterRedraw
end
def BeforeRedraw
end
end
but get a segmentation fault because of type mismatch
I also tried to use the WIN32OLE_EVENT class
ev = WIN32OLE_EVENT.new(app, ‘IViewUpdateEvents’)
=> No such interface supported
Here is a win32ole_pp of the ‘AddSaveAsEventsHandler’ method
#<WIN32OLE_METHOD:0x32c7ac4: AddViewUpdateEventsHandler
name=“AddViewUpdateEventsHandler”,
dispid=1610744231,
helpstring="",
helpcontext=2674,
helpfile=“C:\PROGRA~1\Bentley\Program\MICROS~1\MicroStationVBA.chm”,
invoke_kind=“FUNC”,
invkind=1,
return_type=“VOID”,
return_type_detail=[“VOID”],
return_vtype=24,
size_opt_params=0,
size_params=1,
offset_vtbl=1720,
visible?=true,
event?=false,
event_interface=nil,
params=
[#<WIN32OLE_PARAM:0x32ad494: EventHandler
name=“EventHandler”,
ole_type=“IViewUpdateEvents”,
ole_type_detail=[“PTR”, “USERDEFINED”, “IViewUpdateEvents”],
default=nil,
input?=true,
output?=false,
optional?=false,
retval?=false>]>
Here is an example that they show in the help file for Microstation.
the following is the class file
’ This is the implementation of clsEventHandlers. It has Implements
statements declaring that it implements anevent interface.
Implements IViewUpdateEvents
’
’ Methods for the IViewUpdateEvents
’
Private Sub IViewUpdateEvents_AfterRedraw(TheViews() As View,
TheModels() As ModelReference, ByVal DrawMode As MsdDrawingMode)
If UBound(TheModels) < 0 Then
’ This is a normal update. Everything is being redrawn
End If
End Sub
Private Sub IViewUpdateEvents_BeforeRedraw(TheViews() As View,
TheModels() As ModelReference, ByVal DrawMode As MsdDrawingMode)
End Sub
Here is how the initialize it. Everything not declared defaults to
the Application object
Private oEventHandlers As clsEventHandlers
Sub InstallHandlers()
RemoveHandlers
Set oEventHandlers = New clsEventHandlers
AddViewUpdateEventsHandler oEventHandlers
End Sub
Sub RemoveHandlers()
If Not oEventHandlers Is Nothing Then
RemoveViewUpdateEventsHandler oEventHandlers
End If
Set oEventHandlers = Nothing
End Sub