Wer Silvester 2001 den guten Vorsatz fasste, im neuen Jahr endlich programmieren zu lernen, muss sich beeilen. Doch glücklicherweise sind Adventskalender dankbare Kandidaten, wenn es darum geht, eine überschaubare und nützliche Anwendung zu schreiben – dieses Jahr mit wxBasic.
Neben dem Duft von selbst gebackenen Keksen und Stollen, der ab Anfang Dezember die Wohnung durchzieht, gehört ein Adventskalender unbedingt zur Ausstattung der Vorweihnachtszeit. Der mittlerweile traditionelle digitale Kalender aus dem LinuxUser hat mehrere Vorteile: Er nimmt keinen Platz in der Wohnung weg und kann nach Ende der Nutzung rückstandslos und umweltgerecht entsorgt werden.
In diesem Jahr verwenden wir zu seiner Herstellung wxBasic [1], einen Dialekt der immer noch sehr beliebten Programmiersprache Basic. Dabei handelt es sich um eine interpretierte Sprache; ein mitgelieferter Interpreter führt die darin geschriebenen Skripte direkt aus. Man braucht also nichts kompilieren und erstellt keine unmittelbar für das Betriebssystem ausführbaren Programme. Grafische Benutzerschnittstellen realisiert wxBasic mit Hilfe der wxWindows-Bibliothek [2]. Die in dieser Sprache geschriebenen Programme sind unter Linux wie unter Windows nutzbar, ohne dass am Quelltext etwas geändert werden muss.
Wer beim Wort “Basic” mit Grausen an Zeilennummern, haufenweise undeklarierte Variablen und schrecklichen Spaghetti-Code voller GOTO-Anweisungen denkt, wird von wxBasic angenehm überrascht. Der Interpreter unterstützt strukturiertes Programmieren durch benutzerdefinierte Prozeduren, verlangt das Deklarieren von Variablen und bietet durch die Verwendung von wxWindows sogar einige objektorientierte Ansätze. Wer also Basic unter DOS gelernt hat, wird sich ein bisschen umstellen müssen.
Handwerkszeug
wxBasic ist ein sehr junges Projekt und bringt derzeit noch keine IDE mit. Sie müssen den Quelltext für das Programm und die Benutzerschnittstelle also in einem Texteditor eingeben. Für den in Java geschriebenen Editor jEdit [3,4] haben wir unter [5] eine Sprachdefinitionsdatei bereit gelegt, die Syntax-Highlighting für wxBasic ermöglicht (Abbildung 1). Sehr praktisch ist zudem das Console-Plugin von jEdit; so müssen Sie zum Starten des Programms nicht erst zu einer Terminalemulation wechseln. Andere Editoren wie zum Beispiel kate[6] oder emacs[7] eignen sich natürlich auch zum Programmieren, nur müssen Sie hier auf eine Färbung der Programmsyntax verzichten oder sich die dazu nötige Anpassung selbst basteln.
Basic ins Haus
Die Installation von wxBasic ist schnell erledigt. Sie laden von der Programm-Homepage [1] oder unserer Heft-CD die Datei wxbleed.tar.gz herunter und entpacken sie in ein beliebiges Verzeichnis. Das Archiv enthält neben dem Interpreter wxbasic noch eine Reihe von Beispielprogrammen, die die Benutzung der Programmiersprache veranschaulichen. Als root kopieren Sie die ausführbare Datei wxbasic in ein Verzeichnis, das im Suchpfad steht.
Zusätzlich benötigen Sie GTK [8] in einer Version > 1.2.0 (nicht aber GTK 2.0.x) für die Umsetzung der grafischen Oberflächen. Zudem muss OpenGL vorhanden sein, was allerdings bei den meisten Distributionen bereits installiert sein dürfte.
Das Kommando wxbasic, eingegeben in einer Konsole, startet den Interpreter, der sich daraufhin beschwert, dass er kein Programm zum Ausführen findet. In die Röhre schauen allerdings Benutzerinnen älterer Distributionen, denn das wxbasic-Binary verlangt mindestens glibc 2.2.3.
Als große Hilfe beim Programmieren erweist sich die wxBasic-Dokumentation, die wir in Form der Datei wxbasic.pdf ebenfalls auf die Heft-CD gepresst haben. Sie betrachten sie zum Beispiel mit kghostview oder xpdf.
Da die Beschreibung der wxWindows-Klassen in der wxBasic-Dokumentation doch ein wenig kurz kommt, lohnt es sich, die wxWindows-Hilfe bereit zu legen, die alle Elemente dieses Toolkits ausführlich und mit Beispielen beschreibt. Sie finden die pdf-Variante dieses Textes unter [9] oder auf unserer Heft-CD. Entpacken Sie die Datei mit dem Befehl unzip wxWindows-2.2.9-PDF.zip am besten in das gleiche Verzeichnis wie die wxBasic-Hilfe.
Hallo Welt!
Kein Programmiertutorial kommt ohne das “Hallo Welt”-Programm aus: Es tut nichts anderes, als den Text Hallo Welt auszugeben. All das erledigen Sie mit wxBasic in einer einzigen Zeile:
print "Hallo Welt!"
print ist eine Anweisung, die etwas auf dem Bildschirm ausgibt; was das sein soll, folgt eingeschlossen in doppelte Anführungszeichen. Beachten Sie, dass wxBasic bei Befehlen nicht zwischen Groß- und Kleinschreibung unterscheidet: print und PRINT sind identisch. Bei Variablen hingegen spielt die Schreibweise eine Rolle: Bei TEST und test handelt es sich um zwei verschiedene Variablen. Anders als bei den alten Basic-Varianten veranlassen Sie wxBasic mit der Anweisung Option Explicit am Anfang des Quelltexts, alle Variablen nur dann zuzulassen, wenn sie vorher deklariert wurden.
Speichern Sie dieses Listing in einer beliebigen Datei (wir nennen sie hallo.wx), und rufen Sie den Interpreter mit dem Programmnamen als Parameter auf:
wxbasic hallo.wx
Der Interpreter startet, eine Konsole öffnet sich und zeigt den soeben eingegebenen Text an (Abbildung 2).

Abbildung 2: Das erste wxBasic-Programm in Aktion
Nach dieser kleinen Spielerei geht es richtig los: Das komplette Listing für den Adventskalender finden Sie unter [10] in der Datei advent02-0.2.tar.gz (einer leicht verbesserten Version der auf der Heft-CD mitgelieferten Version advent02-0.1.tar.gz). Dieses Archiv enthält zudem für jeden Tag ein weihnachtliches Rezept zum Nachkochen oder -backen, womit denn auch schon der Kalenderinhalt verraten wäre.
Rahmen
Doch ehe Sie diese Funktionalität einbauen können, brauchen Sie zunächst einen Rahmen oder Frame, der die Grundlage eines jeden grafischen wxBasic-Programms bildet. Darauf platzieren Sie das Menü, eventuell eine Statusleiste und die übrigen Elemente der Programmoberfläche.
Jedes mit dem Befehl new erzeugte Oberflächenelement legen wir in einer Variablen ab. So landet der Haupt-wxFrame in der Variablen frmHaupt:
common frmHaupt = new wxFrame( Null, -1, "Adventskalender", wxPoint( 10, 10 ), wxSize( 450, 450 ), wxCAPTION | wxSYSTEM_MENU | wxMINIMIZE_BOX )
Die ersten drei Parameter innerhalb der wxFrame-Klammer sind zwingend erforderlich: Der erste legt das Elternfenster (den “Parent”) fest, das es beim allerersten Frame nicht gibt, also Null ist. Der zweite Parameter vergibt eine eindeutige Nummer, die das Objekt identifiziert; -1 ist der Standardwert, den man verwendet, wenn ein Widget im Programm nicht über diese Konstante ansprechbar sein muss. An dritter Stelle steht in Anführungszeichen der Text, der im Titel des Fensters zur Anzeige kommt.
In den weiteren Parametern geben Sie die Position an, an der das Fenster erscheint, sowie seine Größe (alles in Pixeln). Nach dem letzten Komma stehen drei Angaben, die das Aussehen des Fensters bestimmen: Es bekommt eine Titelzeile (wxCAPTION) sowie Knöpfe zum Anzeigen eines Menüs mit Fensteraktionen (Vergrößern, Verlagern auf einen anderen Desktop usw.) sowie zum Verkleinern. (KDE, aber auch so mancher Windowmanager erzeugt allerdings eigenmächtigerweise auch dann ein Fenster mit Titelzeile, wenn Sie wxCAPTION weglassen.)
Um das neu geschaffene Fenster auf dem Bildschirm anzuzeigen, benutzen Sie die Methode Show des Frames. In Klammern steht als Argument True, wenn das Fenster angezeigt und False, wenn es verborgen werden soll:
frmHaupt.Show( True )
Wenn Sie das Programm nun ausführen, erscheint ein leeres Fenster auf dem Bildschirm, das verkleinert, wieder vergrößert und geschlossen werden kann (Abbildung 3).
Auf einem Frame wie frmHaupt können Sie nur ein Element platzieren, das dann dessen gesamte Fläche einnimmt. Um 24 Türchen unterzubringen, versehen wir den Frame mit einem Panel. Ein wxPanel ist ein unsichtbarer Container, der beliebig viele Oberflächenelemente aufnimmt. Mit folgendem Befehl setzen Sie ihn auf den Frame, der damit zum Eltern-Widget von panTueren befördert wird:
common panTueren = new wxPanel( frmHaupt, -1 )
Auf diesem Panel ordnen wir später die Türchen des Kalenders an.
Es ist angerichtet
Auch das Adventskalender-Programm soll ein Menü bekommen, aus dem die Benutzerin Befehle zum Steuern der Anwendung auswählt. Zunächst brauchen Sie eine Menüzeile, die der Befehl wxMenuBar erzeugt …
dim menuHaupt = new wxMenuBar()
…, und die Sie mit der Methode setMenuBar zum Frame frmHaupt hinzufügen:
frmHaupt.SetMenuBar( menuHaupt )
Das Ergebnis ist eine leere Menüzeile, die Sie schnell noch durch die beiden Menüs Datei und Hilfe aufpeppen. Menüs entstehen, indem man Objekte der Klasse wxMenu erzeugt:
common mnuFile = new wxMenu()
Die Methode Append aus wxMenuBar fügt das Menü in die Menüzeile ein; mit der Methode Append aus wxMenu ergänzen wir das Menü um einen Eintrag. Als Parameter wollen hierbei eine Konstante, mit der der Menüeintrag eindeutig identifiziert wird, die Menübeschriftung mit Tastenkürzel und der Text, der in der Statuszeile erscheint, wenn der Cursor auf dem Menüeintrag steht, spezifiert werden:
menuHaupt.Append( mnuFile, "&Datei" ) mnuFile.Append( wxID_EXIT, "B&eenden\tAlt-X", "Programm beenden" )
Das & vor einem Buchstaben legt fest, welches Zeichen im Menü unterstrichen erscheint und zur Schnellauswahl des Befehl bei geöffnetem Menü dient.
Außer dem Datei-Menü fügen wir noch ein Hilfe-Menü hinzu, das nur den einen Menüpunkt Info enthält.
Rückrufe
Was passiert aber, wenn die Benutzerin einen Menüeintrag auswählt? Zunächst einmal gar nichts. Um eine Benutzeraktion mit dem Programm zu verbinden, schreiben Sie ein Callback-Unterprogramm, das Sie mit einem bestimmten Ereignis, beispielsweise einem Mausklick oder Tastendruck, verknüpfen.
Benutzerdefinierte Unterprogramme stehen zwischen den Anweisungen sub und end sub. Als Argument bekommen sie einen Parameter namens event mit auf den Weg, der das Ereignis enthält. Das Unterprogramm zum Auswerten des Klicks auf Datei / Beenden im Menü (das auch vom Schließen-Knopf am Fensterrahmen benutzt werden soll) sieht so aus:
sub onFileExit( event ) end end sub
Die Anweisung end beendet die gesamte Anwendung. Um wxBasic mitzuteilen, wann die Prozedur onFileExit aufgerufen wird, verbinden Sie ein Ereignis mit dem Prozeduraufruf. Dazu dient die Anweisung connect, die als Parameter den Namen des Fensters, das Ereignis, das die Aktion auslöst, und den Namen der Prozedur erwartet. Wenn das auslösende Ereignis der Klick auf einen Menüeintrag (wxEVT_COMMAND_MENU_SELECTED) ist, wird zudem noch die Konstante des Menüeintrags (wxID_EXIT) benötigt. Für den Befehl Datei / Beenden sieht der connect-Befehl so aus:
connect( frmHaupt, wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, "onFileExit" )
Der Rahmen für unseren Adventskalender steht jetzt vor uns (Abbildung 4), nun geht es endlich an den Inhalt.
Macht auf die Tür …
Jeder handelsübliche Schokoladenadventskalender hat eine Reihe von Türchen, hinter denen jeden Tag ein kleines Figürchen zu finden ist. In unserem Kalender werden die Türen durch Schaltflächen, die in der Klasse wxButton zu finden sind, dargestellt.
Das Programmfenster versehen wir mit einem gleichmäßigen Raster aus sechs Spalten und vier Zeilen. In jeder Zelle dieser “Tabellenanordnung” findet ein wxButton seinen Platz. Um die Buttons zu platzieren, verwenden wir einen Layoutmanager. Wie in Qt und GTK erleichtern diese Komponenten die Entwicklung von Programmoberflächen, indem sie ohne zusätzliche Programmierarbeit die Elemente auf der Oberfläche schön verteilen. In diesem Fall findet wxGridSizer Verwendung.
Dieser Layoutmanager erwartet als Parameter die Anzahl Spalten und Zeilen sowie den Abstand der eingefügten Elemente zum Rand:
common grdsizer=new wxGridSizer( 4, 6, 0, 4 )
Damit die Türchen nicht in der Reihenfolge von 1 bis 24 angeordnet werden, packen wir die Beschriftung der Schaltflächen in ein Array mit 24 Namen cmd[]. Arrays (auf Deutsch: Felder) kennzeichnet wxBasic (wie z. B. auch die Programmiersprache C) mit eckigen Klammern.
Um eine Schaltfläche (einen “Button”) zu erzeugen, benötigen Sie fünf Parameter: den Namen des Eltern-Widgets, auf dem der Knopf platziert werden soll, eine Konstante, die den Button eindeutig kennzeichnet, die Beschriftung, die Position, an der der Button erscheint, und seine Größe. Einen Knopf mit der Beschriftung 1 rufen Sie so auf den Plan:
common cmdSuchen = new wxButton( panTueren, -1, "1", wxPoint( 1, 1 ), wxSize ( 80, 80 ) )
Die eingegebene Position ist in unserem Fall nicht wichtig, der Layoutmanager kümmert sich darum, dass alle Buttons an den rechten Fleck kommen.
Alle 24 Knöpfe per Hand zu erzeugen, ist natürlich nicht sonderlich elegant. Daher lassen wir uns von einer Schleife helfen: In jedem Durchlauf erzeugt sie einen Knopf, packt ihn ins Gitter und verbindet ihn auch gleich noch mit dem passenden Callback-Unterprogramm onTuerchenClick (Listing 1).
Listing 1
24 Buttons in der Schleife
dim i = 0 dim knopfname="" dim knopf="cmd" for i=1 to 24 knopfname = knopf + cmd[i] knopfname = new wxButton( panTueren, int( cmd[i] ), cmd[i], wxPoint( 0,0), wxSize( 80, 80 ) ) grdsizer.AddWindow( knopfname, 1, wxEXPAND | wxALL, 4 ) connect( knopfname, wxEVT_COMMAND_BUTTON_CLICKED, "onTuerchenClick" ) next
Der Layoutmanager muss jetzt noch erfahren, dass er sich um die Aufteilung des Panels kümmern soll:
panTueren.SetAutoLayout( True ) panTueren.SetSizer( grdsizer )
Anschließend sagen wir dem gridsizer, er solle die gesamte Fläche des Panels ausfüllen:
grdsizer.Fit( frmHaupt )
Das Ergebnis dieser Aktion, noch im grauen Einheitslook, zeigt Abbildung 5.
Um das Programm ein wenig weihnachtlicher aussehen zu lassen, färben wir das Panel, auf dem die Türchen liegen, zu Anfang dunkelgrün ein. Alle später darauf angeordneten Elemente übernehmen diese Farbe. Als Vordergrundfarbe für die Beschriftung der Türchen wählen wir ein Hellbeige. Die Farben definieren wir global, damit wir sie auch für das Rezeptfenster verwenden können:
global hintergrund = new wxColor( "66", "163", "73" ) global vordergrund = new wxColor( "253", "255", "211" )
Zur Einfärbung eines Panels genügt jetzt ein einfacher Aufruf der Methode SetBackgroundColor …
panTueren.SetBackgroundColor( hintergrund )
…, und alles erscheint in weihnachtlichem Grün (Abbildung 6). Die Buttons beschriften wir im fertigen Programm innerhalb der Schleife in einem etwas größeren Font, damit die Zahlen auch lesbar sind.
Päckchen packen
Wie versprochen gibt es für jeden Tag ein weihnachtliches Rezept, das in einem eigenen Fenster angezeigt wird. Sie haben dort die Möglichkeit, den Text zu kopieren und in einem anderen Programm weiter zu verwenden. Die Rezepte liegen in einer Textdatei namens rezepte.txt (aus dem Quelltext-Archiv des Kalenders) vor, die Sie im gleichen Verzeichnis wie den Programmquelltext ablegen.
Ein neues Fenster ist schnell erstellt, zur Aufnahme der GUI-Elemente benötigen wir wieder ein Panel. Darauf ordnen wir nun ein Textfeld zur Ausgabe des Rezepts und zwei Schaltflächen zum Kopieren des Textes und zum Schließen des Fensters an. Die genaue Positionierung übernimmt wieder ein Layoutmanager, diesmal heißt er wxBoxSizer.
Er ordnet die Widgets zeilen- oder spaltenweise an. Für das Rezeptfenster schachteln wir zwei wxBoxSizer: Der äußere ist zeilenweise organisiert und nimmt das Textfeld txtRezept …
dim box0 = new wxBoxSizer( wxVERTICAL ) box0.AddWindow( txtRezept, 1, wxEXPAND | wxALL, 4 )
… und den zweiten wxBoxSizer auf. Dieser seinerseits sorgt dafür, dass die Schaltflächen Kopieren und Schließen nebeneinander erscheinen (Abbildung 7).
Für das Kopieren des Rezepts in die Zwischenablage ist die Methode Copy des Textfelds txtRezept zuständig. Alles, was wir tun müssen, ist, ein Unterprogramm zu schreiben, das diese Methode benutzt:
sub onRezeptKopieren( event ) txtRezept.Copy() end sub
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.

Abbildung 8: Programme binden
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.
Geschenkt
Wenn Sie sich bis hierhin durchgekämpft haben, finden Sie auf Ihrer Festplatte einen kleinen Kalender, der das Warten aufs Fest verkürzt. Dank der Betriebssystemunabhängigkeit von wxBasic können Sie ihn auch Freunden oder Kollegen, die Windows benutzen, bescheren. Sie müssen nur daran denken, ihm oder ihr die Windows-Version von wxBasic mitzugeben, denn ein gegen den Linux-Interpreter gebundenes Binary kann Windows natürlich nicht ausführen.
Glossar
-
IDE
-
Eine integrierte Entwicklungsumgebung (“Integrated Development Environment”) enthält neben einem Quelltexteditor meist auch Helferlein zum Erstellen von Programmoberflächen und für den Zugriff auf einen Debugger.
-
Elternfenster
-
Grafische Benutzeroberflächen sind hierarchisch aufgebaut: Jedes GUI-Element (“Widget”) gehört zu einem übergeordneten (Teil-)Fenster; verschwindet jenes, verschwindet es mit. Anders ausgedrückt ist das Element ein Kind eines Eltern-Widgets.
Infos
[1] http://wxbasic.sourceforge.net/
[4] Sebastian Eschweiler: “Perfekt editiert”, LinuxUser 01/2002, S. 53 f.
[5] http://www.wieduwilt.org/download/jedit_wxbas.zip
[6] Stefanie Teufel, Patricia Jung: “Editier mal wieder”, LinuxUser 06/2002, S. 50 ff.
[7] Oliver Much: “Keine Angst vorm Monster”, LinuxUser 10/2002, S. 46 ff.
[9] http://prdownloads.sourceforge.net/wxwindows/wxWindows-2.2.9-PDF.zip










