VBA unterstützt verschiedene Eventhandler. Ich möchte hier ein Beispiel für IViewUpdateEvents aufzeigen, der zwei Ereignisse abfangen kann, und zwar das Ereignis direkt vor bzw. direkt nach dem Neuzeichnen einer Ansicht.
Um dies an einem VBA Beispiel zu zeigen, soll die Funktionalität darin bestehen, das Regenerieren einer Ansicht festzustellen, und darauf zu reagieren, konkret hier im Beispiel so, dass dieselbe Zoomtiefe und Zoomzentrum auf eine weitere Ansicht angewendet wird.Konkret also, wenn ich in einer Ansicht zoome, wird automatisch ein anderes Fenster ebenso gezoomt
Um diese Funktionalität zu erreichen, benötige ich I'm VBA neben einem Funktionsmodul noch ein Klassenmodul, das den Namen clsEventHandlers haben muss, weil der Name in der Subroutine festgelegt ist. Man kann auch andere Namen wählen, nur muss dies I'm Module entsprechend angepasst werden.
Hier zunächst das VBA Beispiel:
Zunächst das Funktionsmodul:
Public oVw1 As View Public oVw2 As View Public bDo As Boolean Private oEventHandlers As clsEventHandlers Sub viewtest() Dim oMsg As CadInputMessage CommandState.StartDefaultCommand RemoveHandlers bDo = True ShowPrompt "Bitte erste Ansicht wählen" Set oMsg = CadInputQueue.GetInput(msdCadInputTypeDataPoint, msdCadInputTypeReset) If oMsg.InputType = msdCadInputTypeReset Then ShowPrompt "" Exit Sub End If Set oVw1 = oMsg.View ShowPrompt "Bitte zweite Ansicht wählen" Set oMsg = CadInputQueue.GetInput(msdCadInputTypeDataPoint, msdCadInputTypeReset) If oMsg.InputType = msdCadInputTypeReset Then ShowPrompt "" Exit Sub End If Set oVw2 = oMsg.View ShowPrompt "" 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
Und hier das Klassenmodul:
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 If bDo Then If TheViews(0).Index = oVw1.Index Then oVw2.Extents = oVw1.Extents oVw2.Center = oVw1.Center oVw2.Redraw End If If TheViews(0).Index = oVw2.Index Then oVw1.Extents = oVw2.Extents oVw1.Center = oVw2.Center oVw1.Redraw End If End If End If End Sub Private Sub IViewUpdateEvents_BeforeRedraw(TheViews() As View, TheModels() As ModelReference, ByVal DrawMode As MsdDrawingMode) bDo = Not bDo End Sub
Wenn nun die Subroutine "viewtest" gestartet wird, muss zunächst einmal festgelegt warden, welche beiden Ansichten miteinander synchronisiert warden sollen.Dies geschieht durch 2 Klicks in 2 verschiedenen Ansichten.Nach einem Zoom in einem der Fenster wird der Mechanismus aktiviert, d.h. ab dem 2. Zoom wird ein Zoom in einem der beiden Fenster auf das andere Fenster angewendet.
Die hier vorgestellte VBA Routine stellt nur einen Ansatz dar und soll als Beispiel dienen, um die Möglichkeiten von Eventhandlern aufzuzeigen und kann als Grundlage für eigene Beispiele dienen.
Viel Spaß beim testen und anpassen.
Um die Erstellung des Klassenmoduls zu vereinfachen, hier das Beispielprojekt zum Download:
6888.views.zip