Rückruffunktionen (Callback Functions) in Access anwenden

By , 6. April 2012

Hallo liebe Leser,
beim Schmökern in diversen Foren bin ich auf Rückruffunktionen gestoßen, die ich bislang selbst nicht einsetzte. Eine Rückruffunktion ist eine Funktion, die als Parameter einer anderen Prozedur übergeben wird. Die Rückruffunktion selbst kann auch eigene Parameter haben die auch übergeben werden. Dadurch kann man eine allgemeine Prozedur erstellen, deren Verhalten erst durch die übergebene Rückruffunktion bestimmt wird. Das Verhalten dieser allgemeinen Prozedur kann sich mit jedem Aufruf ändern.

Dadurch kann man eine Access-Anwendung erstellen, mit einer Art Programm-Schnittstelle – bei PHP Entwicklern auch als Hook bekannt – die später hinzugefügte Module nutzen können, um eigene Funktionen auszuführen. Dies bedeutet aber auch, dass eine vom Entwickler ungewollte Prozedur ausgeführt werden könnte die auch Schadcode enthalten kann. Man sollte den Einsatz nachfolgend vorgestellter Methode also genau planen.

Da beim Übergeben von Parametern Access nicht den Datentyp „Funktion“ kennt, muss man da ein wenig tricksen. Statt dessen übergibt man den Funktionsname als String und den/die erforderlichen Parameter. Wie genau das geht zeigt nachfolgender Code.

Erstellen Sie zu erst ein Standardmodul. Beginnen wir anschließend mit der „neutralen“ Prozedur.

Function apply_to(ByVal funktion As String, ByVal werte As Variant) AS Variant
    Dim ergebnis() As Variant
    Dim i As Long
    Dim e As Variant
    For i = LBound(werte) To UBound(werte)          'Schleife über alle Werte
        e = Eval(funktion & "(" & werte(i) & ")")   'rufe die Rückruffunktion mit Parameter auf
        ReDim Preserve ergebnis(i)                  'Wertebereich des Rückgabearrays erweitern
        ergebnis(i) = e                             'und hänge den Rückgabewert an das Array an.
    Next i
    apply_to = ergebnis
End Function


Der interessante Teil ist wie der Aufruf der Rückruffunktion zusammengesetzt wird. Ich benutze dazu die Funktion Eval() – der Name sagt doch alles – welche aus der Stringvariable funktion einen richtigen Funktionsaufruf macht. Per Stringaddition werden Klammern und Parameter zusammengesetzt und an den Funktionsaufruf angehängt. Wie man sieht wird immer genau 1 Wert aus dem – an die neutrale Prozedur übergebenem – Array an die Rückruffunktion übergeben. Das Ergebnis wird in einem Array gespeichert, welches dann, wenn die Schleife über alle Array-Werte fertig ist, zurückgegeben wird.

Betrachten wir nun die Rückruffunktionen:

Function verdoppeln(ByVal wert As Double) As Double
    verdoppeln = wert * 2
End Function

Function quadrat(ByVal wert As Double) As Double
    quadrat = wert * wert
End Function

Ich denke diese brauchen keine weiteren Erläuterungen.
Also auf zur Prozedur die das ganze ins Rollen bringt. Dazu hab ich eine kleine Test-Routiene erstellt:

Sub Test()
    Dim doppelte_Werte() As Variant
    Dim quadrierte_Werte() As Variant
    Dim werte As Variant
    werte = Array(1, 2, 3, 4)
    
    doppelte_Werte = apply_to("verdoppeln", werte)    'Rückgabe: Array(2, 4, 6, 8)
    quadrierte_Werte = apply_to("quadrat", werte)     'Rückgabe: Array(1, 4, 9, 16)
End Sub

An die neutrale Prozedur wird als Parameter der jeweilige Funktionsname und ein Array mit Zahlen 1 bis 4 übergeben. Dahinter steht als Kommentar was die neutrale Prozedur jeweils zurückliefert.
Zum Testen rate ich dass Ihr zuerst einen Haltepunkt bei „Sub Test“ setzt und dann „Test“ markiert und F8 klickt. Dann könnt Ihr genau verfolgen wie die neutrale Prozedur die Rückruffunktionen aufruft.

Die Beispieldaten und teilweise Bezeichnungen habe ich aus dem entsprechenden Wikipedia-Artikel entnommen und nach VBA übersetzt.

Bis dahin
© Andreas Vogt 2012

OfficeFolders theme by Themocracy