| Produkt(e): | MicroStation | ||
| Version(en): | 08.11.09.829 | ||
| Umgebung: | Windows 2000,Windows 8 | ||
| Produktbereich: | N/A | ||
| Produktunterbereich: | N\A |
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:
communities.bentley.com/.../6888.views.zip

| Ursprünglicher Autor: | Artur Goldsweer |