Bezieht sich auf | |||
Produkt(e): | MicroStation | ||
Version(en): | V8i, CONNECT, 2023, 2024 | ||
Umgebung: | N/A | ||
Produktbereich: | Programmierung | ||
Produktunterbereich: | VBA | ||
Ursprünglicher Autor: | Artur Goldsweer, Bentley Technical Support Group | ||
Oftmals steht man vor der Aufgabe, beim Öffnen oder Schliessen von Zeichnungen etwas durchführen zu müssen. Sei es um Einstellungen vorzunehmen oder Kontrollroutinen zu starten, die die Zeichnungen prüfen oder korrigieren.
Hier möchte ich ein kleines Beispiel vorstellen, das in großen Teilen aus der VBA Hilfe von MicroStation stammt und nur etwas modifiziert und zusammengestellt ist.
In dem Beitrag zum automatischen Ausführen beim Laden einer VBA Routine hatte ich bereits angemerkt, dass man damit zwar automatisch etwas ausführen kann, aber dies passiert, bevor noch eine Zeichnung geöffnet ist.
Deshalb kann dieses Beispiel als Erweiterung gesehen werden, und zwar wird in diesem Beispiel beim Laden der VBA Routine ein Eventhandler installiert, so dass später bei jedem Öffnen oder Schliessen einer Zeichnung dieses Ereignis oder Event abgefangen wird, und man beim Eintreten dieser Ereignisse etwas ausführen kann.
Die Möglichkeit etwas beim Öffnen oder Schliessen habe ich nur durch eine Messagebox angedeutet, dies kann dann für die eigene Verwendung entsprechend ersetzt werden.
Das Modul mit der Subroutine OnProjectLoad könnte folgendermaßen aussehen:
Option Explicit
Private m_DGNOpenClose As clsDGNOpenClose
Public Sub OnProjectLoad()
If m_DGNOpenClose Is Nothing Then
Set m_DGNOpenClose = New clsDGNOpenClose
End If
End Sub
Public Sub OnProjectUnload()
Set m_DGNOpenClose = Nothing
End Sub
Wenn nun diese VBA Routine so eingestellt wird, dass sie beim Start von MicroStation geladen wird, also über MS_VBAAUTOLOADPROJECTS gelistet ist, wird der Eventhandler im Klassenmodul clsDGNOpenClose geladen.
Dabei wird ein Klassenmodul clsDGNOpenClose geladen, das gesondert als class Module definiert werden muss:
Option Explicit
Private WithEvents m_OpenCloseHooks As MicroStationDGN.Application
Private Sub Class_Initialize()
Set m_OpenCloseHooks = MicroStationDGN.Application
End Sub
Private Sub Class_Terminate()
Set m_OpenCloseHooks = Nothing
End Sub
Private Sub m_OpenCloseHooks_OnDesignFileOpened(ByVal DesignFileName As String)
MsgBox ActiveDesignFile.FullName + " opened"
End Sub
Private Sub m_OpenCloseHooks_OnDesignFileClosed(ByVal DesignFileName As String)
MsgBox ActiveDesignFile.FullName + " closed"
End Sub
In diesem Klassenmodul werden die beiden Ereignisse OnDesignFileOpened und OnDesignFileClosed abgefangen, d.h. sobald eine Zeichnung geöffnet oder geschlossen wird, erscheint eine Messagebox, die angibt, welche Zeichnung soeben geöffnet oder geschlossen wurde.
Der Einfachheit halber ist dieses Beispiel als fertiges VBA Projekt hier zum Download hinterlegt:
VBA Routine zum Installieren eines Eventhandlers