2. Die BASIC Programmiersprache
Die R-BASIC Programmiersprache baut auf einer einfachen BASIC Syntax auf. Diese ist, wenn man den grundlegenden Elementen der englischen Sprache mächtig ist, weitgehend selbsterklärend. Dabei geht R-BASIC weit über klassische BASIC Programmiersprachen hinaus. Es unterstützt nicht nur das GEOS Objektsystem sondern auch die typischen GEOS-Eigenschaften und Systemdienste wie lange Dateinamen, Tokens (Icons), die Zwischenablage, Hilfedateien, Timer und mehr.
Beachten Sie, dass die Groß- und Kleinschreibung von Kommandos, Variablen, Objekten usw. unter R-BASIC keine Rolle spielt.
Ziel des Programmierhandbuchs - dem Handbuch, dass Sie gerade lesen - ist es, die Elemente der BASIC-Programmiersprache darzustellen. Dabei wird nicht jedes Mal auf die notwendigen Objekte eingegangen. Diese werden im Objekthandbuch beschrieben. Um die Beispiele und Codefragmente aus den folgenden Kapiteln auszuprobieren haben Sie zwei Möglichkeiten.
Möglichkeit 1 (empfohlen):
Öffnen Sie das Beispielprogramm "Hallo 1" aus dem Ordner "R-BASIC\ Beispiele\Erste Schritte" und speichern Sie es unter einem neuen Namen. Die Beispielprogramme enthalten bereits alle notwendigen Objekte. Ersetzen Sie dann im Fenster "BASIC Code" den Code des Beispiels durch den Code, den Sie ausprobieren möchten.
|
BUTTONACTION DemoHandler
... hier neuen Code einfügen
End ACTION
|
DemoAction ist der Name der Routine (des sogenannten Actionhandlers), die aufgerufen wird, wenn Sie auf den Button "Beispiel starten" klicken. Sie können den Zusammenhang zwischen dem Button und dem Actionhandler im Fenster "UI-Code" nachvollziehen, wenn Sie ganz nach unten scrollen.
Möglichkeit 2:
Öffnen Sie ein neues, leeres BASIC Programm. Schreiben Sie im Fenster "BASIC Code" die Anweisung ClassicCode und dann den Code, den Sie ausprobieren möchten.
|
ClassicCode
... hier neuen Code einfügen
|
Die Anweisung ClassicCode versetzt R-BASIC in den sogenannten "klassischen" Modus. In diesem Modus stellt R-BASIC ein paar Objekte bereit, die sich so verhalten, als hätten Sie einen altmodischen Homecomputer vor sich. Sie können direkt Text und Grafik auf den Bildschirm ausgeben, ohne sich um den Objekthintergrund kümmern zu müssen. Details dazu finden Sie im Kapitel 2.13.1 (Der klassische BASIC Modus)
^2.1 Grundlegende Konzepte
Hier finden Sie eine Zusammenstellung wissenswerter und grundlegender Fakten zur BASIC-Sprache. Eine ausführliche Beschreibung der Zusammenhänge finden Sie in den folgenden Kapiteln.
^2.1.1 Die Struktur eines BASIC Programms
Jedes R-BASIC-Programm besteht im Wesentlichen aus zwei Teilen: den Objekten und dem eigentlichen Programmcode.
Die Objekte sind sie sichtbaren Elemente des Programms. Sie werden im UI-Code Fenster vereinbart. UI steht für User-Interface. Die Objekte heißen daher auch UI-Objekte. Alle Objekte sind miteinander verbunden. Ein "Parent" Objekt hat ein oder mehrere "Children". Jedes der Children kann wieder Parent für weitere Objekte sein. Diese Struktur nennt man einen Objekt-Baum (object tree).
Das Top-Objekt jedes Programms ist ein Application-Objekt. Dessen Child ist ein Primary-Objekt, das Hauptfenster des Programms. Dieses enthält wiederum die anderen sichtbaren Objekte des Programms: Buttons, Listen, Objekte zur Grafikausgabe und so weiter.
R-BASIC stellt die allermeisten der unter PC/GEOS verfügbaren Objekte bereit. Die Anwendung der Objekte wird dem Programmierer dabei so einfach wie möglich gemacht. Eine ausführliche Beschreibung der Objekte finden Sie im Objekt-Handbuch.
Solange nichts passiert ist das Programm im Wartezustand. Wenn der Nutzer nun zum Beispiel einen Button anklickt, so ruft dieser seinen Actionhandler auf. Dieser Handler kann wiederum andere Subs oder Functions aufrufen. Außerdem kann er auf die Daten der anderen Objekte des Programms zugreifen, diese lesen oder verändern. Natürlich kann er auch Grafiken ausgeben oder auf Dateien zugreifen. Auf diese Weise wird die Funktionalität des Programms implementiert. Nachdem der Code des Actionhandlers abgearbeitet ist geht das Programm wieder in den Wartezustand über. ... Bis der Nutzer die nächste Aktion macht und der nächste Actionhandler aufgerufen wird.
Zahlen
Zahlen können in folgender Weise dargestellt werden:
- Einfache Zahlen, z.B. 12 oder 4.8. Dezimaltrennzeichen ist immer der Punkt.
- Darstellung mit Zehnerpotenzen z.B. 1.8E4 ( = 1,8104 = 18000 )
- Binärdarstellung, z.B. &B1001 ( = 9 )
- Hexadezimale Darstellung z.B. &HFF ( = 255 )
- Zahlen dürfen keine Leerzeichen enthalten.
Eine ausführliche Behandlung des Themas finden Sie im Kapitel 2.3 (Arbeit mit numerischen Ausdrücken)
Strings (Zeichenketten)
- Zeichenketten werden in BASIC als "Strings" bezeichnet
- Strings werden immer in Anführungszeichen gesetzt, z.B. "Im Haus des Donners"
- Innerhalb von Strings können Sonderzeichen vorkommen. Sie werden mit einem Backslash "\" eingeleitet. Zum Beispiel eröffnet "\r" eine neue Zeile und "\200" fügt das Zeichen mit dem ASCII-Code 200 ein.
- Eine ausführliche Behandlung des Themas finden Sie im Kapitel 2.5 (Arbeit mit Strings)
Trennzeichen
- Erfordert ein Befehl mehrere Parameter, müssen diese durch Komma ',' getrennt werden.
- Hinter jedem Bezeichner (Variablennamen und dgl.) muss ein Zeichen folgen, dass nicht Teil eines Bezeichners sein kann. Üblicher Weise sind das ein Leerzeichen, ein Komma ',' oder eine öffnende Klammer '('. R-BASIC kann sonst nicht erkennen dass DIMA eigentlich DIM A heißen soll.
- Leerzeichen oder Tabulatoren sind überall erlaubt, außer innerhalb von Bezeichnern und innerhalb von Zahlen.
Kommentare
Kommentare und Leerzeilen dienen der optischen Strukturierung und der Erläuterung des Programmcodes. Kommentare und Leerzeilen werden beim Compilieren ignoriert, d.h. sie verlängern das Programm nicht, es wird dadurch auch nicht langsamer. Weiter unten finden Sie einen Exkurs zur Verwendung von Kommentaren und zur optischen Strukturierung von Programmen.
Klammern
Klammern haben in R-BASIC zwei Funktionen:
- Strukturieren von mathematischen Ausdrücken. Ausdrücke, die in Klammern gesetzt sind, haben immer Vorrang.
- Einschließen von Funktionsargumenten.
Einige BASIC-Befehle erfordern Klammern, andere nicht. Das Konzept dahinter ist sehr einfach:
- Befehle, die am Anfang einer Zeile stehen, erfordern keine Klammern. Es ist aber erlaubt, die Befehlsparameter in Klammern zu setzen
Beispiel:
|
LINE 20, 30, 100, 200
LINE ( 20, 30, 100, 200 ) ' Beides ist gleichwertig
|
- Befehle (genauer: Funktionen), die auf der rechten Seite einer Zuweisung stehen (können) erfordern in jedem Fall Klammern, damit R-BASIC weiß, wie es die Parameter zu behandeln hat.
Tipp für Umsteiger: In R-BASIC kann man statt der BASIC-üblichen runden Klammern ( ) auch die eckigen Klammern [ ] verwenden. Damit kann man, wie in anderen Programmiersprachen üblich, Feldindizes in eckige Klammern setzen, während man Funktionsargumente in runde Klammern setzt. R-BASIC unterscheidet jedoch beide Klammertypen nicht.
Exkurs: Setzen von Klammern
Sicher ist Ihnen aufgefallen, dass einige BASIC-Befehle Klammern erfordern, andere nicht. Das Konzept dahinter ist sehr einfach:
Befehle, die am Anfang einer Zeile stehen, erfordern keine Klammern. z.B.
|
PRINT A, B, C$
|
|
Befehle (genauer: Funktionen), die auf der rechten Seite einer Zuweisung stehen (können), erfordern in jedem Fall Klammern, damit R-BASIC weiß, wie es die Parameter zu behandeln hat. Außerdem erhöht das die Lesbarkeit ungemein.
Nehmen wir als Beispiel (SQR berechnet die Quadratwurzel):
|
DIM A, X
A = 16
X = SQR A * 4 ' <-- Falsch, Klammern fehlen
PRINT X
|
|
Es ist etwas anderes, ob wir die Klammern so setzen:
|
X = SQR (A * 4)
|
|
oder so
|
X = SQR(A) * 4
|
|
Im ersten Fall erhalten wir 8, im zweiten 16.
Außerdem sollte Sie bei logischen Operatoren nicht mit Klammern sparen. Die Operatoren folgen einer bestimmten Hierarchie, so dass es schnell passiert, dass der Compiler etwas anderes versteht, als Sie ihm sagen wollten. Beispiel:
|
X = (7 OR 3) AND 1 ' liefert 1
X = 7 OR (3 AND 1) ' liefert 7
|
Exkurs: Optische Strukturierung des Programms
REM
REM (Remark - Anmerkung) leitet einen Kommentar ein. Der Kommentartext erstreckt sich bis zum Ende der Zeile und kann beliebige Zeichen enthalten. Sie sollten Ihr Programm immer ausführlich kommentieren. Das erleichtert das Verständnis des eigenen Programms, wenn Sie es später noch einmal anschauen oder überarbeiten.
- REM kann durch eine Apostroph ' oder einem Ausrufezeichen ! abgekürzt werden.
- Vor REM (bzw. ' oder !) kann man den Doppelpunkt weglassen.
- Kommentare verlangsamen den Ablauf des Programms nicht! Der Compiler ignoriert alle Kommentare, während er das Programm übersetzt.
Der Doppelpunkt :
Der Doppelpunkt ':' trennt mehrere Anweisungen in einer Zeile.
Syntax: Anweisung1 : Anweisung2
Beispiel:
|
COLOR 7,0 : CLS
|
Tipps:
- Sie sollten eine häufige Verwendung des Doppelpunktes vermeiden, da er die Übersichtlichkeit des Programms negativ beeinflussen kann.
- Anweisungsfolgen, die mit einem Doppelpunkt getrennt wurden, laufen geringfügig schneller ab, als wenn sie jede in einer eigenen Zeile stehen. Der Unterschied ist jedoch sehr gering.
- Vor einem Kommentar ist kein Doppelpunkt erforderlich.
- Ein Doppelpunkt am Zeilenende ist zulässig und wird von R-BASIC ignoriert.
Leerzeichen und Tabulatoren
Es ist dringend zu empfehlen, ein Programm optisch zu strukturieren. Dazu eignen sich insbesondere Leerzeilen und Einrückungen. Die optische Strukturierung verbessert die Lesbarkeit und signalisiert die Struktur des Programms. Die Abarbeitungsgeschwindigkeit wird nicht beeinflusst.
Das folgende Beispiel gibt die ersten Quadratzahlen aus. Dabei wird jede durch 3 teilbare Zahl rot dargestellt.
|
' Unstrukturiert
DIM n, z
COLOR 15, 0
CLS
Print "Ausgabe der Quadratzahlen"
FOR n = 1 TO 15
z = n*n
IF z/3 = Int (z/3) THEN
Ink 12
ELSE
Ink 15
End IF
Print n, z
NEXT n
PRINT "Fertig"
|
|
|
' Strukturiert mit Einrückungen, Kommentaren und Leerzeilen
DIM n, z
COLOR 15, 0 ' Weiß auf Schwarz
CLS
Print "Ausgabe der Quadratzahlen"
FOR n = 1 TO 15
z = n*n
IF z/3 = Int (z/3) THEN ' Wenn durch 3 teilbar
Ink 12 ' Vordergrund rot
ELSE
Ink 15 ' ansonsten: Vordergrund weiß
End IF
Print n, z ' Ausgabe, tabuliert (wegen Komma)
NEXT n
PRINT "Fertig"
|
Verwendung der Code-Fenster
Wenn Sie ein Programm schreiben stehen Ihnen bis zu 6 Code-Fenster zur Verfügung.
UI-Objekte
In diesem Fenster müssen die UI-Objekte des Programms vereinbart werden. Das Schreiben von Code in diesem Fenster ist nicht möglich.
DIM & DATA
Bei umfangreichen Projekten sollten hier global Deklarationen untergebracht werden. Das Schreiben von Code ist möglich, aber ganz schlechter Stil.
Exports
Wenn Sie eine Library schreiben werden hier Deklarationen untergebracht, die von der Library "exportiert" werden. Libraries sind im Kapitel 2.12 beschrieben.
BASIC-Code, Tools, Init-Code
Diese Fenster sind für den eigentlichen Programmcode vorgesehen. Aus Sicht von R-BASIC sind diese Codefenster alle gleichwertig. Einem erfahrenen Programmierer ermöglichen sie, seinen Code übersichtlicher zu gestalten. Programmieranfängern wird empfohlen zunächst nur das Fenster BASIC-Code zu benutzen.
Die Fenster werden in der Reihenfolge "Exports" -> "DIM & DATA" -> "UI-Objekte" -> "Tools" -> "BASIC-Code" -> "Init" compiliert. Dadurch stehen den drei eigentlichen Codefenstern sowohl die Vereinbarungen aus Exports und DIM & DATA als auch die Namen aller UI-Objekte zur Verfügung.
Tipps:
- Die Codefenster können auch mit den Tastenkombinationen Strg-1 bis Strg-6 angewählt werden.
- Im Menü "Optionen" -> "Editor-Einstellungen" finden Sie den Menüpunkt "Code-Widnows umbenennen". Dort können Sie den Windows "DIM & DATA", "BASIC-Code", "Tools", und "Init" andere, an ihr aktuelles Projekt angepasste, Namen geben.
^2.1.2 Begriffe und Fakten
Im Folgenden werden ein paar Begriffe erläutert, die in den Handbüchern immer wieder vorkommen. Sie müssen diese Definitionen nicht auswendig lernen, aber um die Handbücher zu verstehen und sich mit anderen Programmierern verständigen zu können sollten Sie in etwa wissen, was sie bedeuten.
Ausdruck
- Alle Berechnungen oder Formeln zur Ermittlung eines Wertes werden als Ausdruck bezeichnet.
- Am wichtigsten sind numerische Ausdrücke (das Ergebnis ist eine Zahl), es gibt aber auch String-Ausdrücke (das Ergebnis ist ein Text), Objekt-Ausdrücke, Handle-Ausdrücke usw.
- Ausdrücke stehen häufig - aber nicht ausschließlich - auf der rechten Seite einer Zuweisung. Beispiel dafür:
|
y = 7
z = Int(y) + 5
st$ = "Hallo Welt"
|
- Siehe auch: Funktion, Parameter, Zuweisung
Actionhandler
- ActionHandler sind spezielle Unterprogramme, die automatisch aufgerufen werden, wenn der Nutzer ein "Ereignis" auslöst, z.B. auf einen Button klickt.
- Siehe auch: Funktion, Parameter, Routine, Sub
Anweisung
- Als Anweisung wird eine einzelne Codezeile bezeichnet. Eine Anweisung geht bis zum Zeilenende oder bis einem Doppelpunkt. Dann stehen mehrere Anweisungen in einer Zeile.
- Der Begriff Anweisung wird häufig verwendet wenn man nicht explizit angeben kann oder will, ob es sich um eine Deklaration, eine Zuweisung oder eine UI-Anweisung handelt.
- Kommentar- und Leerzeilen werden nicht als Anweisungen bezeichnet.
- Kontroll-Anweisungen (z.B. FOR-TO-NEXT) stellen einen Spezialfall dar. Sie beeinflussen den Programmablauf.
- Vergleiche auch: Befehl, Deklaration, Parameter, UI-Anweisung, Zuweisung
Befehl
- Ein Befehl wird im Programm aufgerufen um eine bestimmte Aufgabe zu erledigen, z.B. LINE, Print, CLS, EXIT oder FontFind.
- Befehle werden oft von Parametern gefolgt. Beispiel:
|
LINE 10, 20, 100, 200
|
- Siehe auch: Anweisung, Deklaration, Zuweisung, Parameter
Bezeichner
- Alle Namen für Variablen, Objekte, Strukturen usw. heißen "Bezeichner". Sie dürfen bis zu 32 Zeichen lang sein.
- Am Anfang eines Bezeichners steht immer ein Buchstabe. Zulässige Zeichen sind weiterhin: die Ziffern (0..9), der Unterstrich '_' und das Dollar-Zeichen '$'.
- R-BASIC unterscheidet nicht zwischen Groß- und Kleinschreibung. Es ist egal, ob sie CLS, cls oder Cls schreiben. Der Editor erkennt R-BASIC Befehle und hebt sie hervor. Dabei wird, wie in den Handbüchern auch, oftmals eine kombinierte Groß-Kleinschreibung verwendet, z.B. FillEllipse statt FILLELLIPSE oder fillellipse. BASIC Schlüsselworte wie DIM, IF, THEN oder FOR werden groß geschrieben.
- Bezeichner dürfen keine Leerzeichen enthalten.
Deklaration
- Deklarationen sind "Vereinbarungen". Zum Beispiel vereinbart
|
DIM A as Real
|
eine Variable mit dem Namen A, die eine Real-Zahl speichern kann.
- Weitere Beispiele für Deklarationen sind
|
DECL SUB MaleBild( )
CONST y_0 = 12
|
- Eine Deklaration erzeugt noch keinen ausführbaren Code. Sie zeigt nur dem Compiler an, dass der vereinbarte Bezeichner existiert und welche Eigenschaften er hat.
- Es wird empfohlen, für globale Deklarationen nur das Dim&Data-Fenster zu nutzen.
- Vergleiche auch: Anweisung, UI-Anweisung, Zuweisung
Ereignis
- Jeder Vorgang, der eine Reaktion des Programm erfordert, wird als Ereignis bezeichnet.
- Ereignisse sind zum Beispiel:
* Das Betätigen einer Taste auf der Tastatur
* Das Anklicken eines Buttons
* Das Auswählen eines Eintrags aus einer Liste
- Ereignisse werden vom GEOS-System an das zuständige Objekt weitergeleitet. Dieses behandelt das Ereignis dann intern oder es ruft den passenden BASIC-Handler auf, damit das R-BASIC Programm das Ereignis behandeln kann.
Funktion
- Funktionen sind Unterprogramme, die einen Wert zurückgeben.
- Es gibt BASIC-interne Funktionen (z.B. Int( ) ) und selbst definierte Funktionen (Schlüsselwort FUNCTION).
- Beim Aufruf einer Funktion müssen Klammern angegeben werden, auch wenn die Funktion keine Parameter hat.
- Siehe auch: Actionhandler, Parameter, Routine, Sub
Hint
- Hints (=Hilfen) sind spezielle Instancevariablen, die einem Objekt mitteilen, wie es sich zu verhalten oder darzustellen hat.
- Hints können von Objekten ignoriert werden, wenn es die Situation erfordert.
Instancevariable
- Die Instancevariablen enthalten die Eigenschaften der einzelnen Objekte. So hat jeder Button z.B. eine Aufschrift, die aber von Button zu Button verschieden ist.
- Instancevariablen werden im Objekt-Handbuch bei den zugehörigen Objekten besprochen.
- Vergleiche auch: Methode, Objekt, UI-Anweisung
Kommando
Konstante
- Eine Konstante ist ein symbolischer Name für einen festen, d.h. während des Programmablaufs nicht veränderbaren Wert.
- In R-BASIC sind über einhundert numerischen Konstanten definiert (d.h. sie stehen für eine Zahl). Besonders wichtig sind die Konstanten TRUE (Wert: -1) und FALSE (Wert: 0)
- Eigene Konstanten der Typen Real und String kann man mit der Anweisung CONST definieren.
Methode
- Methoden sind "Anweisungen an ein Objekt". Der Aufruf einer Methode führt dazu, dass das Objekt eine bestimmte Operation ausführt.
- Beispiel: Die Methode "Open" bringt eine Dialogbox auf den Schirm:
|
MyDialog.Open
|
- Vergleiche auch: Instancevariable, Objekt, UI-Anweisung
Objekt
- Die sichtbaren Elemente der grafischen Oberfläche werden in R-BASIC als Objekte bezeichnet. Das sind zum Beispiel ein Button, eine Liste oder eine Dialogbox.
- Die in R-BASIC verfügbaren Objekte werden im Objekt-Handbuch besprochen.
- Vergleiche auch: Instancevariable, Methode, UI-Anweisung
Parameter
- Parameter sind Werte, die an eine Routine oder einen Befehl übergeben werden. Felder können nicht als Parameter übergeben werden.
- Für Parameter sind alle in R-BASIC verfügbaren Typen zulässig.
- Siehe auch: Actionhandler, Funktion, Routine, Sub
Routine
- Die Begriffe Routine und Unterprogramm werden zusammenfassend für Sub, Function und ActionHandler verwendet. Man benutzt sie, wenn man nicht näher spezifizieren will oder kann, ob man ein Sub, eine Function oder einen ActionHandler meint.
- Siehe auch: Actionhandler, Funktion, Parameter, Sub
Sub
- Eine SUB (englisch für Subroutine, Unterprogramm) ist ein in sich geschlossener Programmteil, der eine bestimmte Aufgabe zu erledigen hat.
- SUB's können mehrfach aufgerufen werden und sie dienen der Strukturierung des Programms.
- Siehe auch: Actionhandler, Funktion, Parameter, Routine
UI-Anweisung
- UI-Anweisungen sind spezielle Anweisungen, mit denen Objekte vereinbart oder die Startwerte für Instancevariablen belegt werden.
- UI-Anweisungen können nur im UI-Code Fenster stehen.
- Vergleiche auch: Anweisung, Deklaration, Objekt, Instancevariable, Zuweisung
Unterprogramm
Variable
- Variablen dienen zum Speichern von Zahlen, Texten und anderen Daten. Ihr Inhalt kann verändert werde, d.h. er ist variabel. Daher kommt auch der Name.
- Auf lokale Variablen kann nur innerhalb der Routine, in der sie deklariert wurden, zugegriffen werden.
- Globale Variablen sind für alle Programmteile sichtbar.
- Variablen sind eines der grundlegenden Konzepte in einer Programmiersprache. Sie werden ausführlich im nächsten Kapitel (Variablen und Typen) erläutert.
Zuweisung
- Zuweisungen bestehen aus einer Variablen (das kann auch eine Objekt-Instancevariable sein), einem Gleichheitszeichen und auf der rechen Seite einem Ausdruck, dessen Wert der Variablen zugewiesen werden soll.
|
NAME$ = "Paul"
|
Dadurch wird der Wert 'Paul' in der Variablen NAME$ gespeichert.
- Der Ausdruck auf der rechten Seite muss kompatibel zum Variablentyp sein, d.h. Sie dürfen z.B. einer String-Variablen keine Zahl zuweisen. Natürlich gibt es entsprechende Umwandlungs-(Konvertierungs)-Funktionen.
- Vergleiche auch: Anweisung, Deklaration, UI-Anweisung
^
Weiter...
|