Das R-BASIC Handbuch im HTML-Format
Startseite  > R-BASIC  > Das R-BASIC Handbuch im HTML-Format

Das R-BASIC Objekt-Handbuch

Einfach unter PC/GEOS programmieren

Autor: Rainer Bettsteller
HTML-Version: Mütze - Hinweise & Fehler an

Willkommen in der Welt der Objekte, Ereignisse und Botschaften

1.0 Überblick

1.1 Ein Beispiel zur Einführung

1.2 Grundlegende Begriffe

1.3 Vereinbarungen für dieses Handbuch

1.4 Syntax für Objektzugriffe

1.5 Vereinbarung von Action-Handlern


^

1.0 Überblick

In diesem Handbuch wird beschrieben, wie Sie mit R-BASIC Programme erstellen, die sich vollständig ins System integrieren und sich nach außen nicht von 'normalen' (mit dem PC/GEOS SDK erstellten) Programmen unterscheiden.

Zu den grundlegenden Konzepten von GEOS und damit auch von R-BASIC gehören die objektorientierte Programmierung (OOP) und die ereignisorientierte Programmierung. Selbst der 'klassische' Modus von R-BASIC ist intern mit OOP realisiert. Hier erfahren Sie, welche Objekte es gibt, welche Eigenschaften und Fähigkeiten sie haben und wie Sie die nutzen können.

Verweise auf andere Kapitel beziehen sich, wenn nicht explizit anderes angegeben, immer auf das Objekt Handbuch.

Um mit diesem Handbuch arbeiten zu können müssen Sie unbedingt die folgenden Kapitel 1.3 (Vereinbarungen für dieses Handbuch) und 1.4 (Syntax von UI-Objekten) lesen. Die dort vorgestellten Sachverhalte werden in allen darauffolgenden Kapiteln vorausgesetzt.

Im Benutzerhandbuch wird erklärt, wie man das R-BASIC Oberfläche benutzt, wie man Programme in andere Sprachen übersetzt und andere Dinge, die nur indirekt mit dem eigentlichen Programmieren zu tun haben.

Grundlegenden Befehle und Konzepte, die die R-BASIC Programmiersprache ausmachen, finden Sie im R-BASIC Programmierhandbuch. Dort erfahren Sie auch alles über Variablen, Schleifen, Verzweigungen, Unterprogramme und andere grundlegende Dinge.

Das Handbuch 'Spezielle Themen' widmet sich weiterführenden Themen, wie der Arbeit mit Dateien oder die Verwendung von Schriften.

^

1.1 Ein Beispiel zur Einführung

Erstellen der grafischen Oberfläche

In den meisten Fällen beginnt man ein Programm damit, dass man die grafische Oberfläche programmiert. Starten Sie R-BASIC mit einer neuen Datei. Links unten finden Sie die verfügbaren Code-Fenster. Wir benötigen nur die Fenster 'BASIC-Code' und 'UI-Objekte'. Im Fenster 'DIM & DATA' werden bei größeren Projekten globale Vereinbarungen und Variablen untergebracht. Die Codefenster 'Init-Code' und 'Tools' können wir zunächst ignorieren. Hier kann man Teile seines Programmcodes ablegen um das Programm übersichtlicher zu halten. UI steht für User Interface (Benutzerschnittstelle) und bezeichnet die Objekte, mit denen der Benutzer des Programms interagieren kann. Das Fenster 'UI-Objekte' enthält den UI-Code des Programms, der beschreibt, welche Objekte es gibt und welche Eigenschaften sie haben.

Klicken Sie nun auf 'UI-Objekte', so sehen Sie ... nichts. Wir müssen zunächst die gewünschten Objekte vereinbaren. Für die ersten Versuche benötigen wir nur ein Programmfenster und eine Möglichkeit, etwas auszugeben. Kopieren Sie dazu einfach den folgenden Code in Ihr 'UI-Objekte' Fenster.

Application DemoApplication
  Children = DemoPrimary
END Object

Primary DemoPrimary
  BreakButton = TRUE
  Children = DemoView
  SizeWindowAsDesired
END Object

View DemoView
  Content = DemoBitmap
  hControl = HVC_NO_LARGER_THAN_CONTENT + \
             HVC_NO_SMALLER_THAN_CONTENT
  vControl = HVC_NO_LARGER_THAN_CONTENT + \
             HVC_NO_SMALLER_THAN_CONTENT
END Object

BitmapContent  DemoBitmap
  bitmapFormat = 640, 400, 8
  DefaultScreen
  defaultColor = YELLOW, LIGHT_BLUE
END Object
R-BASIC unterstützt das Anlegen von Objekten sehr komfortabel. Im Menü 'Extras' finden Sie den Eintrag 'Code Bausteine' und dort 'UI-Objekt' und 'Neue UI-Sequenz'. Bevor wir den UI-Code besprechen sollten Sie sich etwas durch das Menü 'Code Bausteine' und seine Untermenüs klicken. Die Verwendung dieser Menüs wird Ihnen sehr viel Schreibarbeit ersparen! Menüpunkte, die jetzt noch grau sind, werden aktiv, wenn Sie im Fenster 'BASIC-Code' sind.

Von Klassen und Objekten

Zurück zu unserem UI Code. Das erste Objekt ist vom Typ (man sagt: der Klasse) 'Application' und hat den Namen DemoApplication. Dieses Objekt stellt die Verbindung zum GEOS-System her. Jedes Programm muss genau ein solches Objekt haben. Der Namen (hier: DemoApplication) ist frei wählbar. Über diesen Namen kann man das Objekt im BASIC-Code ansprechen.

Die Zeile

  Children = DemoPrimary
stellt die Verbindung zum nächsten Objekt, dem Hauptfenster (Primary-Objekt) her. Mehr zum sogenannten Objekt-Tree finden Sie im Kapitel 2.1. 'SizeWindowAsDesired' (engl: Window-Größe wie gewünscht) legt fest, dass das Primary anfangs nur so groß sein soll, dass alle Children gerade hineinpassen. Ansonsten nehmen Primaries automatisch einen relativ großen Bereich des Bildschirms ein.

Mit END Object wird angezeigt, dass die Definition des Objekts beendet ist.

Das nächste Objekt gehört der Klasse 'Primary' an und hat den Namen 'DemoPrimary'. Man hätte es natürlich auch anders nennen können. Das Primary-Objekt nimmt uns sehr viel Arbeit ab, denn es erzeugt selbständig einige Objekte: das Dateimenü, das System-Menü links oben neben der Titelleiste und die Minimieren-Maximieren-Schalter rechts oben. Auch das Express-Menü wird hier platziert. Das Child (Kind) des Primary-Objekts ist ein View-Objekt, dass in unserem Programm gemeinsam mit seinem 'Content' für alle Ausgaben auf den Bildschirm zuständig ist.

Mit der Anweisung

  BreakButton = TRUE
wird festgelegt, dass das Dateimenü einen BREAK-Schalter enthält, mit dem man ein 'hängendes' Programm abbrechen kann. Dieser Eintrag aktiviert auch die Tastenkombination 'Strg-B' für diese Aufgabe.

Die letzten beiden Objekte sind ein View-Objekt (Objektklasse 'View' mit dem Namen 'DemoView') und ein Content-Objekt (der Klasse 'BitmapContent' namens 'DemoBitmap'). Diese beiden Objekte arbeiten eng zusammen. Während das Content ausschließlich für die Verwaltung der darzustellenden Grafik zuständig ist kümmert sich das View-Objekt um das Wie, Wann und Wo. Eine ausführliche Beschreibung dieses Zusammenspiels finden Sie im Kapitel über das View-Objekt (Kapitel 4.6). Dabei ist nur das View-Objekt als Child des Primary-Objekts in den Tree eingebunden.

Die Zeile

  Content = DemoBitmap 
legt das Content-Objekt fest. Mit den Zeilen
  hControl = HVC_NO_LARGER_THAN_CONTENT + \
             HVC_NO_SMALLER_THAN_CONTENT
  vControl = HVC_NO_LARGER_THAN_CONTENT + \
             HVC_NO_SMALLER_THAN_CONTENT
wird das View angewiesen, seine eigene Größe von der des Content-Objekts abhängig zu machen, indem es sich in horizontaler (hControl) und vertikaler Richtung (vControl) nicht größer (engl. large: groß) oder kleiner (engl. small: klein) als das Content-Objekt macht. Dass stellt sicher, dass die komplette Bitmap stets sichtbar ist. Der Vorsatz HVC_ steht für Horizontal-Vertikal-Control.

Das Objekt 'DemoBitmap' verwaltet eine editierbare Bitmap, deren Größe und Farbtiefe mit der Anweisung

  bitmapFormat = 640, 400, 8
festgelegt wird. Das Objekt legt damit automatisch eine Bitmap der Größe 640 x 400 Pixel mit 256 Farben (8 Bit pro Pixel) an. Sie brauchen sich nicht weiter um die Verwaltung der Bitmap zu kümmern - mit der Ausnahme etwas hineinzuzeichnen. Das Objekt weiß z.B. selbst wann die Bitmap angelegt, gezeichnet oder am Programmende vernichtet werden muss.

Damit Sie etwas in die Bitmap zeichnen können legt die Anweisung

  DefaultScreen
fest, dass alle Grafik- und Textausgaben standardmäßig an dieses Objekt gehen. p>Mit der Anweisung
  defaultColor = YELLOW, LIGHT_BLUE
werden die Ausgabefarben auf 'Gelb auf Blau' eingestellt.

Beachten Sie, dass das BitmapContent-Objekt 'DemoBitmap' nirgends als Child eines Objekts auftaucht, sondern nur als 'Content' des View-Objekts. Das ist für das ordnungsgemäße Zusammenspiel von View und Content erforderlich.

Wenn Sie nun das Programm starten (Menü 'Programm', 'Programm starten') wird es compiliert und ausgeführt. Dabei erzeugt der Compiler die im UI-Code angegeben Objekte und übersetzt den Quelltext im 'BASIC-Code' Fenster in ein für R-BASIC ausführbares Format. Um zur R-BASIC IDE zurückzukehren wählen Sie aus dem Datei-Menü des laufenden BASIC-Programms den 'Beenden' Eintrag.

Ein OnStartup Handler

Aktuell sehen wir nur eine blaue Fläche. Nun wollen wir etwas hineinzeichnen. Eine sehr typische Situation ist, dass beim Programmstart automatisch eine Routine abgearbeitet werden muss, die das Programm initialisiert, d.h. in den Anfangszustand versetzt. In R-BASIC ist das der OnStartup-Handler. Routinen, die von Objekten direkt aufgerufen werden heißen in R-BASIC alle 'Action-Handler'. Wechseln Sie in das Codefenster 'BASIC-Code' und wählen Sie aus dem Menü 'Extras', 'Code Bausteine' den Eintrag 'Action-Handler' und dort den Punkt 'System-Action'. OnStartup-Handler müssen als 'SystemAction' vereinbart werden. Geben Sie einen möglichst selbsterklärenden Namen für den Handler, z.B. AppStart, ein. R-BASIC erstellt einen leeren Actionhandler. In den Handler können Sie nun Ihren Initialisierungscode schreiben. Wir benutzen ein Print-Befehl und zwei Grafikanweisungen.

SYSTEMACTION AppStart
  Print "Hallo Welt"
  Ellipse 10, 10, 200, 200
  Rectangle 30, 30, 180, 180
END ACTION
Starten wir das Programm jetzt (F9-Taste) so sehen wir ... wieder nichts. Das liegt daran, dass R-BASIC noch nicht weiß, wann es den Handler ausführen soll. Wir müssen noch festlegen, dass unser Handler namens 'AppStart' der 'OnStartup-Handler ist. Das passiert im UI-Code, im Application Objekt.
Application DemoApplication
  Children = DemoPrimary
  OnStartup = AppStart
END Object
Wenn wir jetzt wieder F9 drücken sehen wir endlich das Ergebnis unserer Bemühungen.

Nachdem der OnStartup-Handler abgearbeitet ist geht das Programm in den Wartezustand über. Damit wieder etwas passiert müssen wir etwas tun, z.B. einen Button anklicken.

Ein neues Objekt

Fügen Sie zum UI-Code die folgenden Zeilen hinzu:

Button TestButton
  Caption$ = "Drück mich"
END Object
Vergessen Sie nicht, den Testbutton in die Children-Liste des Primary-Objekts aufzunehmen:
    Children = DemoView, TestButton
Die Reihenfolge der Einträge bestimmt dabei ihre Anordnung im Primary-Objekt. Wenn sie jetzt F9 drücken sehen sie einen zusätzlichen Schalter mit der Aufschrift 'Drück mich'. Sie können ihn anklicken - aber es passiert nichts. Das liegt daran, dass Sie ihm nicht mitgeteilt haben, was er zu tun hat.

Wenn sich etwas ereignet

Wird der Button angeklickt, so spricht man von einem Ereignis - in diesem Fall ein Maus-Ereignis. Der Button nimmt dieses Ereignis entgegen und 'weiß' was er damit zu tun hat. Das ist der Kern der objektorientierten Programmierung: Jedes Objekt reagiert auf Ereignisse (Maus, Tastatur, Mitteilungen von anderen Objekten), indem es die Behandlung selbst vollständig übernimmt oder ein weiteres Ereignis auslöst. Auch das Starten des Programms stellt ein Ereignis dar. unser Application-Objekt reagiert auf dieses Ereignis, indem es seinen OnStartup-Handler aufruft (siehe oben). Ein Textobjekt z.B. stellt einen eingegebenen Buchstaben selbständig auf dem Bildschirm dar, für unseren Button aber müssen wir eine eigene Routine (einen eigenen Handler) schreiben, die eine Aktion ausführt.

Die Verknüpfung zwischen der Routine (dem Handler) und dem Button erfolgt wieder in UI-Code. Beim Button heißt die Instancevariable, die man dazu belegen muss, einfach ActionHandler.

Ändern Sie den UI-Code:

Button TestButton
  Caption$ = "Drück mich", 1
  ActionHandler = TestAction
END Object
Die 1 hinter dem Caption$-Text bewirkt, dass der Buchstabe mit der Nummer 1 unterstrichen wird und zur Tastaturnavigation verwendet werden kann. In unserem Fall ist das das 'r', da die Zählung bei Null beginnt.

Actionhandler von Buttons müssen als 'ButtonAction' vereinbart werden. Das teilt dem Compiler mit, dass die Routine 'TestAction' von einem Button aktiviert wird. Jede Objektklasse hat ihren eigenen Handlertyp. Näheres dazu finden Sie bei der Beschreibung er entsprechenden Objekte. Schreiben Sie im BASIC-Code-Fenster (nicht im UI-Code) den ActionHandler:

ButtonAction TestAction
  CLS
  Print "Button meldet: Bildschirm gelöscht."
END Action
Starten Sie das Programm mit F9. Herzlichen Glückwunsch! Sie haben Ihr erstes objektorientiertes BASIC-Programm geschrieben!

Es geht weiter...

Ändern Sie den BASIC-Code wie folgt, starten Sie das Programm erneut und klicken Sie auf den Button.

ButtonAction TestAction
  sender.enabled = FALSE
END Action
Was ist passiert? 'Sender' ist ein Parameter, der jedem Action-Handler übergeben wird. Je nach Action-Handler gibt es weitere Parameter, die Sie bitte der Beschreibung der entsprechenden Objekte entnehmen. Der Parameter 'sender' ist immer das Objekt, das den ActionHandler aktiviert hat. 'Enabled' ist eine Eigenschaft, über die jedes Objekt verfügt. Ein Objekt ist 'enabled', wenn der Nutzer damit interagieren kann, andernfalls ist es 'disabled' und wird grau dargestellt. Eine weitere wichtige Eigenschaft ist 'visible' (sichtbar). Versuchen Sie folgendes:
ButtonAction TestAction
  sender.visible = FALSE
END Action
Spielen Sie ruhig etwas mit den Objekten und den ActionHandlern herum! Ändern Sie zum Beispiel die Größe der Bitmap oder die Farben.

Anordnen von Objekten - das Geometriemanagement

Wir fügen zunächst einen zweiten Button ändern die ActionHandler wie folgt. Vergessen Sie nicht den neuen Button als Child des Primary einzubinden!

Button TestButton2
  Caption$ = "Drück mich auch", 6
  ActionHandler = TestAction2
END Object
ButtonAction TestAction
  FillEllipse  50, 50, 600, 350, LIGHT_GRAY
  Ellipse  50, 50, 600, 350
  Print "Grafik gezeichnet."
END Action

ButtonAction TestAction2
  CLS
  Print "Bildschirm ist gelöscht"
END Action
LIGHT_GRAY ist eine Farbkonstante, eine Zahl, die für eine Farbe steht. Näheres zur Beschreibung von Farben finden Sie im Programmierhandbuch, Kapitel 2.8.2 (Farben). Wenn Sie das Programm jetzt starten funktioniert es zwar, aber die links unten angeordneten Buttons sehen nicht sehr schön aus. Wir wollen jetzt die beiden Buttons unter der Bitmap, aber nebeneinander anordnen.

Unter GEOS, und damit auch in R-BASIC, funktioniert die Anordnung von Objekten nicht dadurch, dass man festlegt, wo die Objekte platziert werden, sondern wie sie angeordnet werden sollen. Man sagt nicht: platziere den Button dort, sondern man sagt: ordne beide Buttons nebeneinander an. Eine ausführliche Beschreibung dieses Konzepts finden Sie im Kapitel 3.3 (Geometriemanagement), dass Sie unbedingt lesen sollten.

Versuchen Sie zunächst folgendes:

Primary DemoPrimary
  BreakButton = TRUE
  Children = DemoView, TestButton, TestButton2
  orientChildren = ORIENT_HORIZONTALLY
  SizeWindowAsDesired
END Object
Sie werden wahrscheinlich nicht zufrieden sein, weil die Buttons jetzt neben der Bitmap sind. Die Lösung für dieses Dilemma ist, die Buttons in eine eigene Gruppe (ein Objekt der Klasse Group) zu verschieben. Die grundlegende Idee dahinter ist es, die Objekte innerhalb der Group nebeneinander anzuordnen während die Group selbst unterhalb der Bitmap bleibt. Dieses Konzept ist sehr ausführlich im Kapitel über das Geometriemanagement (siehe oben) beschrieben. Der große Vorteil dieser Technik ist, dass GEOS die Anordnung intelligent handelt. Man bekommt also auch dann ein gefälliges Aussehen, wenn der Nutzer eine andere Schriftgröße oder eine andere Bildschirmauflösung verwendet, als man selbst.
Primary DemoPrimary
  BreakButton = TRUE
  Children = DemoView, BottomGroup
  SizeWindowAsDesired
END Object

Group BottomGroup
  Children = TestButton, TestButton2
  orientChildren = ORIENT_HORIZONTALLY
End Object
Das sieht schon besser aus, ist aber noch nicht perfekt. Versuchen Sie - zunächst nacheinander und dann in beliebiger Kombination - die folgenden, fett markierten Programmzeilen. Die Reihenfolge der Codezeilen spielt dabei keine Rolle!
Group BottomGroup
  Children = TestButton, testButton2
  orientChildren = ORIENT_HORIZONTALLY
  ExpandWidth
  justifyChildren = J_FULL		' oder J_CENTER
  IncludeEndsInChildSpacing
  DrawInBox
End Object
Probieren Sie ruhig weitere Hints aus dem Kapitel 3.3 aus! Ich wünsche Ihnen viel Spaß beim Probieren!

^

1.2 Grundlegende Begriffe

Hier sind einige der grundlegenden Begriffe erklärt, die im Handbuch immer wieder vorkommen. Sie müssen diese Begriffe jetzt weder vollständig verstehen noch auswendig lernen. Aber sie können dieses Kapitel zum Nachschlagen benutzen.

Objektorientierte Programmierung (OOP)
OOP ist eine Programmierphilosophie, bei der das Programm aus einzelnen Objekten besteht. Die Objekte verfügen über eine gewisse 'Eigenintelligenz' (Eigenschaften und Fähigkeiten), mit denen die Programmfunktionalität realisiert wird. Zu diesem Zweck tauschen die Objekte Botschaften (Messages) aus und reagieren auf Ereignisse (Events). Unter GEOS sind die meisten Objekte sichtbar, wie z.B. Buttons oder Textobjekte. Es gibt aber auch unsichtbare Objekte, wie z.B. das Application-Objekt (vgl. Kapitel 1.1).

Klassen
Jedes Objekt hat eine bestimmten 'Typ' der in der OOP als Klasse bezeichnet wird. Die Klassendefinition legt fest, welche Eigenschaften und Fähigkeiten die Objekte dieser Klasse haben.

Objekte
Objekte sind konkrete Manifestationen einer Klasse. Welche Eigenschaften und Fähigkeiten ein bestimmtes Objekt hat, wird durch seine Klasse bestimmt. Fachlich korrekt spricht man davon, dass ein bestimmtes Objekt eine Instanz einer bestimmten Klasse ist. Beispielsweise ist der Schalter 'Schließen' in einer Dialogbox eine Instanz der Klasse 'Button'. Es hat sich jedoch eingebürgert vereinfachend zu sagen: Der 'Schließen' Schalter ist ein Button-Objekt.

Window-Objekte
Als Window-Objekte werden alle Objekte bezeichnet, die ein unabhängiges Fenster (Window) auf dem Bildschirm erzeugen. Dazu gehören z.B. Dialogboxen und auch das Hauptfenster des Programms. Diese Fenster sind oft verschieblich und größenveränderlich.

Instance-Variablen
Jedes Objekt muss einen bestimmten Satz an Daten speichern, um korrekt arbeiten zu können. Beispielsweise muss jedes Objekt seine eigene Größe und Position kennen, um sich selbst korrekt darzustellen. Welche Daten das konkret sind, wird von der Klasse des Objekts bestimmt, die Datenwerte selbst sind jedoch für jedes Objekt, d.h. für jede Instanz einer Klasse, verschieden. Die von einem konkreten Objekt verwalteten Daten werden deshalb als Instance-Variablen (englisch für Instanz-Variablen) bezeichnet.

Hints
Hints (engl. Hilfen) sind eine besondere Art von Instance Variablen. Hints werden nur im Objekt gespeichert, wenn Sie explizit angegeben werden. Andernfalls sind sie einfach nicht vorhanden. Das spart eine Menge Platz. Fast alle Instance-Variablen zum Geometrie-Management sind als Hints implementiert. Wie der Name schon sagt sind Hints keine Befehle, sondern Hilfen. Es steht einem Objekt frei, wie es die Hints konkret umsetzt. Dazu gehört auch, dass es Hints ignorieren kann, wenn das angebracht ist.

Ereignisse (Events)
Betätigt der Nutzer eine Taste auf der Tastatur, bewegt er die Maus oder drückt eine Maustaste, so spricht man von einem 'Ereignis'. Ereignisse können auch der Start eines Programms oder vieles andere sein. GEOS registriert dieses Ereignis und sendet eine Message (Botschaft) an die für das entsprechende Ereignis zuständigen Objekte. Die Objekte können dann angemessen reagieren.

Ereignisorientierte Programmierung
Dieser Begriff beschreibt, dass ein GEOS-Programm nur dann etwas tut, wenn ein Ereignis auftritt. Dieses Verfahren ist viel effizienter als z.B. in einer Schleife ständig die Tastatur abzufragen. OOP und ereignisorientierte Programmierung gehen daher Hand in Hand.

Botschaften (Messages)
Die Informationen, die Objekte untereinander austauschen werden als Messages oder auf Deutsch als Botschaften bezeichnet. Botschaften sind eines der Kernkonzepte in der objektorientierten Programmierung.

Methoden
Die Routine, die ausgeführt wird, wenn ein Objekt eine Message erhält, wird als 'Methode' bezeichnet. Die meisten Methoden sind R-BASIC-intern, d.h. sie sind für den R-BASIC Programmierer nicht direkt zugänglich, sondern werden automatisch ausgeführt. Es gibt davon jedoch Ausnahmen. Wenn Sie z.B. wollen, das eine Dialogbox auf dem Bildschirm erscheint, dann müssen Sie der Dialog-Objekt eine Message senden, die keine Instance-Variable setzt, sondern die Dialogbox auf den Schirm bringt. In diesem Beispiel müssen Sie schreiben
  MyDialog.Open
wobei 'Open' die Methode ist, die das Objekt namens 'MyDialog' auszuführen hat, damit es auf dem Bildschirm erscheint.

Action-Handler
R-BASIC realisiert die OOP-Konzepte konzeptionell über Action-Handler. Registriert ein Objekt ein Ereignis, z.B. das Anklicken eines Buttons, so sendet es eine Message an den R-BASIC-Kern. Sie enthält die Information, welche Programm-Routine ausgeführt werden soll. Diese Programm-Routine wird als ActionHandler bezeichnet, da sie eine Aktion des Users behandelt. Der R-BASIC Kern führt den Handler (der in R-BASIC-Code geschrieben ist) aus und geht dann wieder auf 'Stand-by' bis das nächste Ereignis eintritt.

ActionHandler können auch Botschaften an andere Objekte aussenden oder Methoden ausführen. Beispielsweise wird die Anweisung
  EndeButton.enabled = FALSE
über eine Message an den EndeButton realisiert. Der Button disabled sich daraufhin. Die gesamte Programmfunktionalität eines BASIC-Programms steckt also in den verschiedenen ActionHandlern.

Objekt-Tree, Parents und Children
Objekte sind unter GEOS in sogenannten Bäumen (Trees) organisiert. Jedes Objekt hat genau ein Parent (Eltern) und kann kein, ein oder mehrere Children (Kinder) haben. Der Objekttree eines Programms dient sowohl der Kommunikation der Objekte untereinander (was in R-BASIC meist intern stattfindet) als auch der Organisation der Objekte auf dem Bildschirm. Details dazu finden Sie im Anschnitt 2.1 (Arbeit mit Objekt Bäumen).

Vererbung
Der Begriff beschreibt, dass die Objektklassen voneinander abstammen. Eine neue Klasse wird von einer Vorgängerklasse abgeleitet. Dabei 'erbt' die neue Objektklasse die Eigenschaften und Fähigkeiten seiner Vorgängerklasse. Hinzu kommen neue Eigenschaften und Fähigkeiten, die der Vorgänger nicht hat. Ein Beispiel: Die meisten R-BASIC-Objekte können mit einer Aufschrift (Caption$) versehen werden. Bei Primary-Objekten erscheint sie in der Titelzeile, bei Buttons ist es 'die' Aufschrift. Es macht nun keinen Sinn, diese Fähigkeit für jede Objektklasse von Grund auf neu zu implementieren, sondern sie ist in einer Klasse implementiert, die im GEOS SDK als 'GenericClass' bezeichnet wird und von der die allermeisten R-BASIC-Objekte abstammen.

Folgen:
In der GenericClass ist z.B. auch das Geometrie-Management implementiert, so dass bei allen von der GenericClass abstammenden R-BASIC-Objekten das Geometrie-Management über die gleichen Befehle abgewickelt wird. Das gilt auch für viele weitere grundlegende Fähigkeiten von R-BASIC-Objekten. Das Handbuch ist deshalb so organisiert, dass die allen Objektklassen gemeinsamen Eigenschaften in separaten Kapiteln beschrieben werden. In den Kapiteln über die konkreten Klassen werden dann nur eventuelle Abweichungen ('überschriebene' Eigenschaften) und die neu hinzugekommenen Fähigkeiten, Eigenschaften und Instance-Variablen beschrieben.

^

1.3 Vereinbarungen für dieses Handbuch

In diesem Handbuch gelten einheitlich die folgenden Abkürzungen. Es wird empfohlen zumindest diese Seiten auszudrucken.

numWert Ein numerischer Wert allgemein z.B. 12 oder -17.4 Alle grünen und nicht weiter gekennzeichneten Elemente bedeuten einen numerischen Wert.
Darunter sind z.B.:
x, y, sizeX, sizeY Positions- oder Größenangaben,
n eine Anzahl oder eine Position.
index Der mögliche Wertebereich eines Index beginnt immer bei Null. Im BASIC-Code kann anstelle einer Zahl auch immer ein numerischer Ausdruck (Variablen, Funktionen..) stehen.
"Text" Die Anführungszeichen ".." kennzeichnen eine beliebige String-Konstante, z.B. "Ja, ich will"
Im BASIC-Code kann anstelle eines expliziten Textes auch immer ein String-Ausdruck (Variablen, Funktionen..) stehen.
[ .. ] Eckige Klammern kennzeichnen ein optionales Element, d.h. das Element kann angegeben werden, muss aber nicht vorhanden sein.
x | y Eine Alternative wird durch einen senkrechten Strich gekennzeichnet. Z.B. visible = TRUE | FALSE bedeutet, dass visible = TRUE oder visible = FALSE möglich ist.
TRUE R-BASIC Konstante mit dem Wert -1
Wird verwendet, wenn eine Eigenschaft 'erfüllt' oder 'wahr' ist. z.B. <obj>.visible = TRUE gibt an, dass das Objekt sichtbar ist.
FALSE R-BASIC Konstante mit dem Wert 0
Wird verwendet, wenn eine Eigenschaft 'nicht erfüllt' oder 'falsch' ist. z.B. <obj>.enabled = FASLE gibt an, dass der Nutzer nicht mit dem Objekt interagieren kann (es wird i.a. 'grau' dargestellt).
My.., Demo.., Test.. Zeigen an, dass das entsprechende Element (Objekt, Routine, ActionHandler usw.) von Programmierer selbst definiert wurde, d.h. nicht aus R-BASIC stammt.
<objVar> Objekt-Variable
Variable vom Typ OBJECT, z.B. DIM ov as OBJECT
<obj>, <obj2>> Referenz auf ein Objekt: namentlich aufgeführtes Objekt oder Objekt-Variable. Felder und Struktur-Elemente vom Typ OBJECT sind erlaubt. In diesem Handbuch bezeichnen wir das als 'Objekt Referenz'.
<objektListe> Liste von namentlich aufgeführten Objekten
<numVar> Numerische Variable (Real, Word, Integer usw.) auch z.B. <pos>, <index>, <breite>, usw.
<numExpr> Numerischer Ausdruck
<stringVar> String-Variable
auch z.B. <name$>, <path$>, usw.
<stringExpr> String Ausdruck
<handleVar> Handle-Variable
auch z.B. <han>, <gsHan>, usw.
<handleExpr> Handle Ausdruck
<structVar> Struktur-Variable
<structExpr> Struktur Ausdruck
<Handler> Der Name eines Action-Handlers


Sicher erkennen Sie das System dahinter, so dass Sie auch Elemente, die hier nicht explizit aufgeführt sind, zuordnen können.


Instancevariablen werden häufig in einer Tabelle dargestellt.

Beispiel:

Variable Syntax im UI-Code Im BASIC-Code
Children Children = <objektListe> nur lesen
numChildren -- nur lesen
parent -- lesen, schreiben


Dabei bedeuten:

Variable: Name der Instancevariablen
Syntax im UI-Code: Belegung der Instancevariablen im UI-Code Fenster Die so festgelegten Werte stehen beim Programmstart sofort zur Verfügung.
Im BASIC Code: Beschreibt, ob und wie man die Instancevariable vom BASIC Code aus (d.h. zur Laufzeit des Programms) ansprechen kann. Die Syntax dafür ist für alle Instancevariablen gleich und wird weiter unten, im Abschnitt 'Syntax für Objektzugriffe', beschrieben. Eventuelle Ausnahmen sind bei den entsprechenden Instancevariablen selbst beschrieben.
-- Ein Strich bedeutet, dass die Variable hier nicht verwendet werden kann.


^

1.4 Syntax für Objektzugriffe

Vereinbaren von Objekten

Objekte müssen im Fenster 'UI-Objekte' vereinbart werden. Die Vereinbarung beginnt der Objekt-Klasse, gefolgt vom (frei wählbaren) Namen des Objekts. Dann folgen die Instance-Werte für dieses Objekt. Die Anweisung 'END OBJECT' beendet die Objekt-Vereinbarung.

Beispiele:

ButtonMyButton
  Caption$ = "Durchlauf starten"
  ActionHandler = DemoActionHandler
END Object

Primary MyPrimary
   Children = MyButton, MyGroup, MyText
END Object


Zugriff auf Objekte

Objektzugriffe erfolgen entweder mit ihrem Namen oder über eine Objekt-Variable (Variable vom Typ OBJECT). Zur Vereinfachung bezeichnen wir die beiden Möglichkeiten als 'Objekt-Referenz'.

Beispiel:

DIM oba, obb AS OBJECT
DIM of(10) AS OBJECT	' ein Feld von Objekt-Variablen
  oba = MyButton
  obb = MyPrimay
  of(1) = oba
  IF oba = MyButton THEN ...
  IF of(1) = MyPrimay THEN ...


Lesen von Instance-Variablen im BASIC-Code

Auf Instance-Variablen wird mit einer Objekt-Referenz (namentlich aufgeführte Objekte oder Objekt-Variablen, siehe oben), gefolgt von einem Punkt und dem Namen der Instance-Variablen, zugegriffen.

Beispiele:

DIM obb AS OBJECT
DIM x AS REAL
DIM s$ AS STRING

  s$ = MyPrimay.Caption$
  Print s$, MyButton.Caption$

  obb = MyButton
  IF obb.visible THEN ...	' visible kann TRUE oder FLASE sein
Einige Instance-Werte (wie Children oder bitmapFormat) erwarten im UI-Code mehr als einen Wert. Gelesen kann aber immer nur ein Wert. Deshalb muss beim Lesen als Index angegeben werden, welcher Wert gelesen werden soll. Die zulässigen Werte für den Index beginnen immer mit Null.

Beispiel. Im UI-Code sei vereinbart:

PrimaryMyPrimary
  Children = Group1, View1, Group2
END Object

BitmapContentMyBitmap
  bitmapFormat = 48, 32, 8
END  Object

 <weitere Objekte..>
Lesen der Werte:
DIM x, y, c
DIM ob, ch AS OBJECT

  ! Abfrage der Bitmap-Werte
  x = MyBitmap.bitmapFormat (0)     ' Breite
  y = MyBitmap.bitmapFormat (1)     ' Höhe
  Print "Bitmap-Größe: "; x; "x"; y; "Pixel"
  Print "Farbtiefe: "; ob.bitmapFormat(2); "Bit"

  ch = MyPrimary.Children(0)        ' Liefert Group1
  Print ch.numChildren

  ch = MyPrimary.Children(1)        ' Liefert View1
  Print ch.Caption$

  ob = MyPrimary                    ' Zur Demonstration
  ch = ob.Children(2)               ' Liefert Group2
Hinweis: Kombinationen der Form
MyPrimary.Children(0).Caption$
oder ähnlich sind nicht zulässig.

Schreiben in Instance-Variablen im BASIC-Code

Wie beim Lesen werden die Instance-Variablen auch beim Schreiben durch einen Punkt von der Objekt-Referenz getrennt. Das Objekt kann auch hier namentlich aufgeführt oder über eine Objekt-Variable referenziert werden. Die Syntax beim Schreiben in Instance-Variablen entspricht ansonsten genau derjenigen im UI-Code, Berechnungen mit Variablen und Funktionen sind im Gegensatz zum UI-Code aber zulässig.

Beispiele:

DIM x AS WORD

  MyButton.visible = FALSE
  MyButton.Caption$ = "Beenden", 1

  ! Neuanlegen einer Bitmap
  x = 100
  MyBitmap.bitmapFormat = x, x/2, 8

^

1.5 Vereinbarung von Action-Handlern

Action-Handler sind spezielle Unterprogramme, die aufgerufen werden, wenn ein Ereignis eintritt, z.B. ein Button gedrückt oder mit der Maus geklickt wird.

Der Typ
Jeder Typ von Ereignissen erfordert auch einen speziellen Typ von Action-Handlern: Das Drücken eines Buttons z.B. ButtonAction, ein Mausereignis wird von einem Handler des Typs MouseAction behandelt.

Parameter
Jeder Typ von Action-Handlern hat einen eigenen Satz an Parametern. Allen gemeinsam ist der erste Parameter 'sender' vom Typ OBJECT. Er enthält eine Referenz auf das Objekt, dass das Ereignis ausgelöst hat. Dann folgen bis zu drei numerische Parameter, deren Bezeichnung und Bedeutung vom Typ des Handlers abhängt.

Vereinbarung des Handlers
Ein Handler wird vereinbart indem der Typ des Handlers, gefolgt von einem (frei wählbaren) Namen, angegeben wird. Die Parameter des Action-Handlers werden beim Vereinbaren des Handlers nicht explizit angegeben. Die Anweisung END ACTION schließt den Handler ab.

Tipp: Verwenden Sie den Menüpunkt 'Extras'-'Code Bausteine'-'Action-Handler'. Damit erhalten Sie neben dem Handler-Rumpf einen Kommentarblock mit allen Parametern des Handlers. Da Actionhandler spezielle Unterprogramme sind gelten die gleichen Regeln wie bei SUB's und FUNCTION's, d.h. es können z.B. lokale Variablen definiert, andere SUB's oder FUNCTION's gerufen oder Operationen mit Objekten durchgeführt werden. Andere ActionHandler können jedoch nicht direkt aufgerufen werden.

Beispiel: Im UI-Code sei vereinbart

ButtonMyButton
  Caption$ = "Durchlauf starten"
  actionHandler = DemoHandler
END Object
Vereinbarung von 'DemoHandler':
ButtonAction  DemoAction
DIM x
  sender.enabled = FALSE		' MyButton 'grau' zeichnen
  FOR x = 10 TO 100 STEP 10
  LINE x, 5, x, 100 : Pause 1
  NEXT
  sender.enabled = TRUE
END ACTION
Zuweisung im BASIC Code
Sie können einem Objekt zur Laufzeit (im BASIC Code) einen anderen ActionHandler zuweisen. Die Zuweisung des speziellen Wertes NoAction bewirkt das Löschen des Actionhandlers für das entsprechende Objekt.
  MyButton.ActionHandler = DemoAction
  MyButton.ActionHandler = NoAction

^

Weiter...