Ein Timer – viele Aktionen

Der klassische Weg, in Xojo einen Timer zu verwenden, besteht darin, seinen Actionhandler auf ein bestimmte Methode umzulenken. Etwa wie

AddHandler timer1.action, addressof Testmethod

Dabei benötigt die Methode Testmethod einen Timer als Parameter, den wir dann gleich wieder hinwegerklären, damit sich der Compiler nicht über die ungenutzte Variable beschwert. Die erste Programmzeile in der Methode lautet also häufig

#pragma unused thetimer

Eigentlich ein bisschen unelegant, oder? Und was machen wir, wenn der Timer mehrere Aktionen gleichzeitig anstupsen soll? Setzen wir ans Ende von Testmethod einen weiteren Methodenaufruf, dort wieder einen usw.? Das macht unseren Code sehr schwer durchschaubar.

Wie wäre es stattdessen mal mit diesem Weg: Wenn wir uns die Xojo-Sprachreferenz zum Thema anschauen, finden wir beim Timer die Methode AddActionNotificationReceiver. Und die macht genau das, was der Name vermuten lässt: Sie fügt die Instanz einer Klasse, die das ActionNotificationReceiverInterface (puha!) implementiert hat, zu den Objekten hinzu, die bei einer Timer-Aktivierung aufgerufen werden.

Was heißt das jetzt mit weniger esoterischen Worten ausgedrückt? Ein Interface bietet eine extrem praktische Verbindung zweier getrennter Objekte. Wenn auf der Senderseite eines Interfaces eine bestimmte Methode ausgeführt wird – wie der Action-Event beim Timer –, werden bei allen verbundenen Instanzen bestimmte Methoden aufgerufen. Wie diese heißen, legt man bei der Definition eines Interfaces fest, bzw. wurde für einige mitgelieferte Interfaces gleich definiert. Beim – noch einmal – ActionNotificationReceiverInterface heißt diese Methode PerformAction. Zum Mitschreiben also:

  • Legen Sie wie gewohnt einen Timer an. Verbiegen Sie seinen ActionEvent-Handler aber einmal nicht. Setzen Sie nur seine Periodendauer und Art.
  • Wenn Sie eine Xojo-Standardklasse ansprechen wollen: Legen Sie von dieser eine Subklasse an. (Rechtsklicken Sie z.B. auf eine Instanz dieser Klasse im Navigator und wählen Sie „New Subclass“.) Das muss gemacht werden, weil Interfaces Klasseneigenschaften sind – Sie können nicht einer einzelnen Instanz ein Receiverinterface hinzufügen, sondern nur seiner Klasse. Die Instanzen können Sie dann aber sehr wohl einzeln ansprechen – das kommt gleich! Wenn Sie ohnehin eine Subklasse oder eine eigene Klasse bearbeiten, können Sie sich diesen Schritt natürlich sparen.
  • Rechtsklicken Sie nun auf diese neue Klasse im Navigator und wählen Sie „Implement Interface“.
  • Wählen Sie in der Auswahlliste den ersten Eintrag – da ist er wieder: actionNotificationReceiver. Falls Sie mehrere Klassen auf diese Art mit einem Interface versehen und sichergehen wollen, dass Sie Ihre PerformAction-Methoden auch mit Code füllen, klicken Sie den Knopf darunter an – „include #pragma error in the source of each method“. Dann bekommen Sie beim Ausführen einen Compilerfehler, den Sie entfernen können, indem Sie die Methode mit Code überschreiben.
  • Schreiben Sie also den Code in die vom Interface angelegte Methode PerformAction, der bei einem Timer-Aufruf ausgeführt werden soll.
  • Suchen Sie sich einen angenehmen Platz in Ihrem Code, wie etwa den Open-Event des Fensters, und ergänzen Sie die folgende Zeile (natürlich auf Ihren Klassennamen zugeschnitten):

Timer1.addActionNotificationReceiver (MeineKlassenInstanz)

MeineKlassenInstanz ist natürlich die Instanz der neuen Klasse, die Sie ansprechen wollen, und der Timer heißt evtl. nicht Timer1 bei Ihnen. Wenn Sie jetzt dafür sorgen, dass der Timer aktiviert wird, und das Projekt ausführen: Praktisch, oder? Sie können eine Vielzahl von Instanzen auf diese Art quasi gleichzeitig ansprechen – keine Querverkettung von Methoden nötig. Und wenn ein Objekt nicht mehr angesprochen werden soll, gibt es natürlich die Timer-Methode RemoveActionNotificationReceiver. Da kann man sich schon denken, was die macht, oder?

Ein Gedanke zu “Ein Timer – viele Aktionen

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s