Info: Late binding und Events

29/06/2008 - 16:33 von Josef Poetzl | Report spam
Hallo!

Im Thread "A97: Verweise in mde" vom 25 Jun 2008
(Message-ID: <6cem70F3gp4taU1@mid.individual.net>) erwàhnte ich
bereits die Möglichkeit, dass man auch bei late binding auf Ereignisse
reagieren kann.
Das ist zwar bei weitem nicht so angenehm, wie mit early binding, doch
für "Sonderfàlle" könnte ich es mir als durchaus brauchbar vorstellen.

Mittlerweile kann ich auch eine etwas mehr geprüfte Beispiel-Anwendung
zeigen. Vielleicht hat jemand Interesse daran, das zu testen.


Kurz zum Prinzip:
Statt für jedes Ereignis einen eigene Prozedur für die
Ereignisbehandlung zu erstellen, wie es mit WithEvents üblich ist,
wird nur eine VBA-Prozedur in einer Hilfsklasse erstellt, die von
einer COM-dll aufgerufen wird und per Parameter die Ereignis-Kennungen
und -Parameter zurückliefert.

| Public Sub EventCollectionEventRaised(ByVal Index As Long, ByVal EventName As Variant, _
| ByRef aParams() As Variant, ByVal Key As Variant)
| ...
| End Sub


Die Kommunikation zw. Access-Anwendung und COM-dll erfolgt wiederum
per Late binding und Weitergabe einer Objekt-Referenz.

| Private m_EC As Object 'EventCollection aus COM-dll
| Private WithEvents m_ECB As EventCollectionBridge '= Access-Klasse
|
| Private Property Get EC() As Object
| If m_EC Is Nothing Then
| Set m_EC = CreateObject("LateBindingEventBridge.EventCollection")
| Set m_EC.EventListener.EventCaller = ECB ' => m_ECB_EventRaised
| End If
| Set EC = m_EC
| End Property
|
| Private Sub excelTest()
|
| 'Excel-App.
| If xlApp Is Nothing Then
| Set xlApp = CreateObject("Excel.Application")
| xlApp.Visible = True
| End If
|
| 'Worksheet:
| Set wb = xlApp.Workbooks.Add
|
| 'Event für Workbook:
| EC.Add wb, , "Excel.Workbook" 'Events von WorkBook weiterreichen
|
| End Sub


Innerhalb der COM-dll wird auf die Events der Late-Binding-Referenz
(im Beispiel: Excel.Workbook) reagiert und über die
Schnittstellen-Prozedur weitergeleitet.

Auf die Idee brachte mich vor einiger Zeit:
http://groups.google.at/group/micro...a2c75f8065

Der Code zur Ereignisbehandlung in der COM-dll basiert auf Code von
Eduardo Morcillo und Olaf Schmidt. Ich ergànzte die Funktionalitàt der
Schnittstellenprozedur, damit die COM-dll per Late binding eingesetzt
werden kann.


Die von mir erstellte Beispiel-Anwendung (Ac00 + Ac97) inkl. Code für
die COM-dll:
http://access.joposol.com/download/...Bridge.zip

eine Code-Übersicht der COM-dll:
http://access.joposol.com/codelib/L...entBridge/


mfg
Josef


EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
 

Lesen sie die antworten

#1 Sascha Trowitzsch
29/06/2008 - 19:57 | Warnen spam
Hi Josef,

Funktioniert bei mir unter A2000-2007.
Super!
Nur eine Formularprozedur muss offenbar so aussehen:
Private Sub disposeEC()

On Error Resume Next


#If AccVer97 Then
m_EC.dispose '... für Ac97 erforderlich
#Else
Set m_ECB = Nothing
#End If

If Not (m_EC Is Nothing) Then
Set m_EC = Nothing
End If

End Sub
-
... weil, wenn ich die bedingte Kompilierung nicht auch für m_EC.dispose
einsetze, die DirectCom-Meldung kommt: "Parameter erwartet".
Oder? (Hab nicht weiter nachgeforscht, woher die Meldung in den Klassenmodulen
kommt; Dispose selbst braucht ja keinen Parameter - also muss es aus einer
anderen Prozedur kommen. Passiert aber nur, wenn die Mappe manuell geschlossen
wurde, Excel aber noch offen ist.)

Die große Frage nun: Wer kommt mit den Modulen, ihrem Einsatz und der Weitergabe
der DirectCOM inkl. Registrierung zurecht? ;-)
Ich befürchte, dass die Zielgruppe recht klein sein wird.
Der Anwendungsfàlle - so wie in "A97: Verweise in mde" - gibt es ja auch nicht
gar so viele. Üblicherweise weiß ich schon, was auf dem Zielrechner drauf ist.
Wenn die entspr. Telefonanlagen-Software fehlt, dann muss sie halt vom Admin
installiert werden - egal, ob sie im Einzelfall gebraucht wird, oder nicht.
(Übrigens hàtte ich für den speziellen Fall auch noch eine andere Notlösung: Aus
der Telefon-Software-ActiveX die TLB mit einem Resourceneditor extrahieren und
ins Setup der DB integrieren. Dann kann auch Early binding eingesetzt werden.
Ist die Software nicht vollstàndig installiert, dann rufen Aufrufe an die Klasse
halt einen abfangbaren Fehler hervor.)

Ciao, Sascha

"Josef Poetzl" schrieb im Newsbeitrag
news:1ns12a6kt8w0b$
Hallo!

Im Thread "A97: Verweise in mde" vom 25 Jun 2008
(Message-ID: ) erwàhnte ich
bereits die Möglichkeit, dass man auch bei late binding auf Ereignisse
reagieren kann.
Das ist zwar bei weitem nicht so angenehm, wie mit early binding, doch
für "Sonderfàlle" könnte ich es mir als durchaus brauchbar vorstellen.

Mittlerweile kann ich auch eine etwas mehr geprüfte Beispiel-Anwendung
zeigen. Vielleicht hat jemand Interesse daran, das zu testen.


Kurz zum Prinzip:
Statt für jedes Ereignis einen eigene Prozedur für die
Ereignisbehandlung zu erstellen, wie es mit WithEvents üblich ist,
wird nur eine VBA-Prozedur in einer Hilfsklasse erstellt, die von
einer COM-dll aufgerufen wird und per Parameter die Ereignis-Kennungen
und -Parameter zurückliefert.

| Public Sub EventCollectionEventRaised(ByVal Index As Long, ByVal EventName
As Variant, _
| ByRef aParams() As Variant, ByVal
Key As Variant)
| ...
| End Sub


Die Kommunikation zw. Access-Anwendung und COM-dll erfolgt wiederum
per Late binding und Weitergabe einer Objekt-Referenz.

| Private m_EC As Object 'EventCollection aus COM-dll
| Private WithEvents m_ECB As EventCollectionBridge '= Access-Klasse
|
| Private Property Get EC() As Object
| If m_EC Is Nothing Then
| Set m_EC = CreateObject("LateBindingEventBridge.EventCollection")
| Set m_EC.EventListener.EventCaller = ECB ' => m_ECB_EventRaised
| End If
| Set EC = m_EC
| End Property
|
| Private Sub excelTest()
|
| 'Excel-App.
| If xlApp Is Nothing Then
| Set xlApp = CreateObject("Excel.Application")
| xlApp.Visible = True
| End If
|
| 'Worksheet:
| Set wb = xlApp.Workbooks.Add
|
| 'Event für Workbook:
| EC.Add wb, , "Excel.Workbook" 'Events von WorkBook weiterreichen
|
| End Sub


Innerhalb der COM-dll wird auf die Events der Late-Binding-Referenz
(im Beispiel: Excel.Workbook) reagiert und über die
Schnittstellen-Prozedur weitergeleitet.

Auf die Idee brachte mich vor einiger Zeit:
http://groups.google.at/group/micro...a2c75f8065

Der Code zur Ereignisbehandlung in der COM-dll basiert auf Code von
Eduardo Morcillo und Olaf Schmidt. Ich ergànzte die Funktionalitàt der
Schnittstellenprozedur, damit die COM-dll per Late binding eingesetzt
werden kann.


Die von mir erstellte Beispiel-Anwendung (Ac00 + Ac97) inkl. Code für
die COM-dll:
http://access.joposol.com/download/...Bridge.zip

eine Code-Übersicht der COM-dll:
http://access.joposol.com/codelib/L...entBridge/


mfg
Josef


EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/

Ähnliche fragen