12.3 Callback-Funktionen

Bei mehreren Hollywood-Befehlen können Sie Callback-Funktionen angeben. Callback-Funktionen sind normale Funktionen mit dem Unterschied, dass sie nicht durch das Skript, sondern von Hollywood-Befehlen aufgerufen werden. Sie sind ein integraler Bestandteil von Hollywood und machen Ihr Programm viel flexibler. Das ganze Tasten-, Knopf- und Ereignis-Handler-System in Hollywood stützt sich stark auf Callback-Funktionen. Zum Beispiel wenn der Benutzer eine Taste drückt, dann wird Hollywood die Callback-Funktion, aufrufen, welche Sie für dieses spezielle Ereignis vorgesehen haben. Callback-Funktionen werden einfach als normale Argumente den entsprechenden Hollywood-Befehlen übergeben.

Ein Beispiel für einen Hollywood-Befehl, der Callback-Funktionen verwendet, ist MakeButton(). Dieser Befehl erwartet ab dem siebten Parameter eine Tabelle, die Callback-Funktionen für die verschiedenen Ereignisse definiert. Mögliche Ereignisse für eine Schaltfläche sind OnMouseOver, OnMouseOut, OnMouseDown, OnMouseUp, OnRightMouseDown und OnRightMouseUp. Wenn Sie bei einem Knopf auf einen linken Mausklick reagieren möchten, verwenden Sie das OnMouseUp-Ereignis. Hier ist ein Beispiel:

 
MakeButton(1, #SIMPLEBUTTON, 0, 0, 100, 100, {OnMouseUp = p_MyFunc})

Dieser Befehl erstellt eine neue Schaltfläche mit der ID 1 und legt fest, dass die Funktion p_MyFunc() aufgerufen wird, wenn der Benutzer diesen Knopf drückt. In diesem Fall ist p_MyFunc() eine Callback-Funktion. Sie wird nicht von Ihnen, sondern von Hollywood aufgerufen, wenn der Benutzer den Knopf drückt. Dies funktioniert automatisch. Genauer gesagt werden die Callback-Funktionen tatsächlich durch den Hollywood Befehl WaitEvent() aufgerufen, den Sie in jedem Skript verwenden sollten. Die Callback-Funktion selbst könnte nun wie folgt aussehen:

 
Function p_MyFunc()
    DebugPrint("Button 1 pressed!")
EndFunction

Sie könnten diese Funktion auch direkt in der Liste der Argumente von MakeButton() plazieren. Dies würde dann so aussehen:

 
MakeButton(1, #SIMPLEBUTTON, 0, 0, 100, 100, {OnMouseUp =
    Function() DebugPrint("Button 1 pressed!") EndFunction})

Sie sehen, dass Hollywood sehr flexibel ist. Denken Sie daran, dass wenn Sie Funktionen innerhalb einer Argumentenliste definieren, Sie den Namen einer Funktion nicht angeben dürfen, weil diese Funktionen anonym sind. So ist der folgende Code ungültig:

 
; ungültiger Code!
MakeButton(1, #SIMPLEBUTTON, 0, 0, 100, 100, {OnMouseUp =
    Function p_MyFunc() DebugPrint("Button 1 pressed!") EndFunction})

Callback-Funktionen erhalten in der Regel eine Nachrichtentabelle in Parameter 1. Im obigen Beispiel mussten wir diese Nachricht nicht abfragen, weil wir die Funktion ohne Argumente definiert haben. Für den obigen Code ist dies in Ordnung, aber im folgenden Beispiel sieht es anders aus:

 
MakeButton(1, #SIMPLEBUTTON, 0, 0, 100, 100, {OnMouseUp = p_MyFunc})
MakeButton(2, #SIMPLEBUTTON, 200, 0, 100, 100, {OnMouseUp = p_MyFunc})

Jetzt haben wir zwei Tasten erstellt, die beide die gleiche Funktion aufrufen, wenn der Benutzer sie drückt. Die Funktion p_MyFunc() muss nun wissen, welche Taste gedrückt wurde, wenn sie aufgerufen wird. p_MyFunc() kann dies, indem man die Nachricht in Argument 1 auswertet:

 
Function p_MyFunc(msg)
    If msg.id = 1
            DebugPrint("Button 1 pressed!")
    ElseIf msg.id = 2
            DebugPrint("Button 2 pressed!")
    EndIf
EndFunction

Sie sehen, p_MyFunc() prüft das id-Feld der Nachricht aus dem Argument 1 und so kann es zwischen Taste 1 und 2 unterscheiden. Natürlich könnten Sie das Ganze um eine beliebige Anzahl von Tasten erweitern. Aber da gibt es noch mehr zu erfahren. Betrachten Sie die folgende Situation:

 
evttable = {OnMouseUp = p_MyFunc, OnRightMouseUp = p_MyFunc}
MakeButton(1, #SIMPLEBUTTON, 0, 0, 100, 100, evttable)
MakeButton(2, #SIMPLEBUTTON, 200, 0, 100, 100, evttable)
MakeButton(3, #SIMPLEBUTTON, 400, 0, 100, 100, evttable)

Jetzt haben wir drei Tasten erstellt und sie alle nutzen die gleiche Ereignistabelle. So wird Hollywood die gleiche Funktion für alle Tasten aufrufen. Darüber hinaus reagieren diese Tasten auf ein anderes Ereignis, nämlich OnRightMouseUp. Jetzt muss p_MyFunc() in der Lage sein, nicht nur zwischen mehreren Tasten, sondern auch zwischen den verschiedenen Ereignissen zu unterscheiden. Aber das ist alles kein Problem, weil die übergebene Nachricht an p_MyFunc() noch ein anderes Feld hat, von dem Sie das Ereignis lesen können. Unsere Funktion p_MyFunc() sieht nun wie folgt aus:

 
Function p_MyFunc(msg)
    Switch msg.action
    Case "OnMouseUp":
            DebugPrint("Left mouse button pressed:", msg.id)
    Case "OnRightMouseUp":
            DebugPrint("Right mouse button pressed:", msg.id)
    EndSwitch
EndFunction

Sie sehen also, dass es kein Problem ist, mehrere Schaltflächen und Ereignisse mit der gleichen Callback-Funktion zu behandeln. Dies erhöht die Lesbarkeit des Programms um ein vielfaches. Es gibt noch viel mehr zu entdecken. Darum lesen Sie die Dokumentation über MakeButton() durch.

Wenn Sie benachrichtigt werden möchten, falls der Benutzer das Fenster schließt oder verschiebt, können Sie eine Callback-Funktion mit dem InstallEventHandler() installieren. Die Funktion, die Sie diesem Hollywood-Befehl übergeben, wird dann jedes Mal aufgerufen werden, wenn der Benutzer den Schließknopf (Close-Gadget) drückt oder das Fenster verschiebt. Aber InstallEventHandler() unterstützt mehrere Ereignistypen: Sie können auch eine Callback-Funktion installieren, die aufgerufen wird, wenn der Benutzer eine Taste auf der Tastatur drückt oder loslässt und vieles mehr.

Der Hollywood-Befehl SetInterval() verwendet auch Callback-Funktionen. Der Befehl SetInterval() wird immer wieder im angegebenen Intervall aufgerufen werden. Dies ist nützlich, wenn Sie sicherstellen möchten, dass Ihr Skript auf jedem System mit der gleichen Geschwindigkeit abläuft. Um dies zu realisieren, verwenden Sie einfach SetInterval(), um Hollywood mitzuteilen, dass Ihre Callback-Funktion 25-mal pro Sekunde ausgeführt werden soll. So können Sie sicherstellen, dass es nicht rascher auf schnellere Maschinen läuft. Siehe SetInterval() für einen guten Überblick über die Intervall-Technik.

SetTimeout() ist ein weiteres Beispiel für einen Hollywood-Befehl, der mit Callback-Funktion arbeitet. Sie übergeben eine Funktion sowie einen Timeout-Wert auf SetTimeout(). Ihre Callback-Funktion wird genau nach Ablauf der vorgegebenen Zeit aufgerufen. Dies ist sehr nützlich für das korrekte Timing des Skripts, z.B. Timing des Skripts mit der Musik.

Der Hollywood Befehl CopyFile() übernimmt eine Funktion im vierten Parameter. Diese Funktion wird von Zeit zu Zeit aufgerufen, während CopyFile() Dateien kopiert. Dies ist ein Unterschied zu den Callback-Funktionen von MakeButton(), SetInterval(), SetTimeout() usw. Diese werden immer durch WaitEvent() und nicht durch den Hollywood-Befehl selbst aufgerufen. CopyFile() wird jedoch die angegebene Funktion aufrufen, während es ausgeführt wird.

So könnten Sie Ihre Callback-Funktion nach erfolgtem CopyFile() löschen (Sie können Funktion mit Nil löschen). Dies ist mit MakeButton() oder SetInterval() nicht möglich, da diese Befehle nur die Callback-Funktionen installieren, aber Sie sie nicht aufrufen. Diese Aufgabe wird von WaitEvent() übernommen. Die Callback-Funktion von CopyFile() wird in der Regel verwendet, um einen Fortschrittsbalken zu aktualisieren oder den Kopiervorgang jederzeit abbrechen zu können. Siehe CopyFile() für Details.


Navigation zeigen