Advent, Advent
Adventskalender mit wxBasic
Zeigt her Eure Gaben!
Wer ist nicht schon der Versuchung erlegen, das letzte Türchen des Adventskalenders ein paar Tage früher zu öffnen? Solchem Treiben soll Einhalt geboten werden, indem das Programm prüft, ob bereits der Tag gekommen ist, an dem die ausgewählte Tür geöffnet werden darf – Zeitgenossen, die schamlos die Hardware-Uhr ihres PCs vorstellen, kommen wir so natürlich nicht bei.
Die wxBasic-Funktion date$() liefert das Datum in der Form MM.TT.JJJJ. Um den aktuellen Monat herauszufinden, genügt es, die beiden ersten Zeichen davon abzuschneiden. Das erledigt die left$()-Funktion (Listing 2).
Listing 2
Konditionale Abfrage gegen Schummler
if left$( date$, 2) = "11" then msg="Es ist noch November!" wxMessageBox( msg, "Schummeln gilt nicht!", wxOK + wxICON_INFORMATION, frmHaupt ) return False end if
Wenn jemand vorwitzig versucht, bereits im November den Kalender zu öffnen, wird er durch eine kleine Dialogbox auf sein verruchtes Tun hingewiesen.
Den aktuellen Tag erhalten Sie auf etwas umständlicherem Weg, da hier zwei Zeichen aus dem Datum herausoperiert werden müssen. Neben left$ gibt es auch noch eine right$-Funktion, die Zeichen rechts vom Text abschneidet. Den aktuellen Tag erhalten wir so:
tag = right$( left$( date$, 5), 2 )
Wenn die Benutzerin im Dezember erlaubte Türchen aufmachen will, öffnet sich bereitwillig das Rezeptfenster und zeigt das Rezept des Tages an.
Zur Ausgabe des Rezepts schreiben wir ein Unterprogramm onTuerchenClick, das bereits bei der Erzeugung der Buttons mit dem Click-Ereignis verbunden wurde (Listing 1). Wie aber weiß die Sub, welcher Knopf gedrückt wurde, wo doch alle 24 Knöpfe diese Funktion aufrufen? Sie bekommt wie alle Callbacks einen Parameter vom Typ wxEvent mit. Bei diesen Ereignissen lässt sich mit event.GetId() die ID des auslösenden Elements abfragen. Beim Erzeugen der Buttons haben wir jedem im zweiten Parameter (int(cmd[i])) den Tag als ID mitgegeben. So müssen wir der Funktion rezeptHolen, die für das Öffnen und Lesen der Rezept-Datei zuständig ist, einfach nur diesen Wert überlassen:
rezeptHolen( event.GetId() )
Sie öffnet die Datei rezepte.txt, liest diese ein und gibt als Rückgabewert den Inhalt der Zeile aus, die dem Tag entspricht. Falls die Datei nicht im Arbeitsverzeichnis vorliegt, öffnet sich eine Dialogbox mit der Fehlermeldung Konnte die Datei rezepte.txt nicht im Programmverzeichnis finden.
Jetzt bleibt nur noch, den Text des Tages in das in der Variablen txtRezept abgelegte Textfeld des Rezeptfensters zu setzen und es auf dem Bildschirm anzuzeigen:
txtRezept.SetValue( rezeptHolen( event.GetId() ) ) frmRezept.SetTitle( event.GetId() + ". Dezember" ) frmRezept.Show( True )
Schreddern und Verbinden
Als Interpreter kann wxBasic keine Binaries herstellen. Allerdings gibt es eine Möglichkeit, Programme weiterzugeben, ohne dass die Empfängerin den Interpreter installieren muss. Dazu binden Sie Ihr Programm mit dem Interpreter zusammen. Beim Aufruf des so entstandenen Binaries prüft dieser, ob er ein Programm Huckepack trägt und führt es, so vorhanden, sofort aus.
Im Verzeichnis, in das Sie das wxBasic-Archiv entpackt haben, finden Sie das Bindeprogramm compile.wx. Nach dessen Aufruf mit dem Kommando wxbasic compile.wx erscheint ein Dialog, in dem Sie die zu übersetzende Datei auswählen und durch Klicken auf Bind den Bindevorgang starten (Abbildung 8). Die Option Shroud Source soll dafür sorgen, dass der Quelltext zusammengefasst und gekürzt wird.
Soweit die Theorie: In der Praxis erscheint nicht nur der Name der ausgewählten Quelltextdatei nicht im Feld Source File. Weitaus schlimmer als dieser Schönheitsfehler ist, dass das generierte Programm manchmal (zum Beispiel im Falle von advent.wx) etwas zerschreddert heraus kommt, egal, ob die Shroud-Option angewählt wurde oder nicht. Diese Fehler behebt compile-2.wx, das Sie in [10] finden.
Packen Sie sie in ein Verzeichnis mit wxbasic, rufen Sie dort wxbasic compile-2.wx auf, suchen Sie advent.wx mit Find File..., und klicken Sie auf Bind. Anschließend finden Sie eine ausführbare Datei mit dem Basisnamen der Quelltextdatei im gleichen Verzeichnis wie diese: Der Adventskalender bekommt den Namen advent. Mit Ausführbarkeitsrechten versehen kann man dieses Binary nun in einem X-Terminal starten. Rezepte zeigt es allerdings nur an, wenn rezepte.txt im jeweiligen Arbeitsverzeichnis liegt. Auf dem System, auf dem das gebundene Programm ausgeführt wird, müssen lediglich GTK und OpenGL installiert sein.



