| Das R-BASIC Handbuch im HTML-Format |
| Startseite > R-BASIC > Das R-BASIC Handbuch im HTML-Format |
|
|
Das R-BASIC Objekt-HandbuchEinfach unter PC/GEOS programmierenAutor: Rainer BettstellerHTML-Version: Mütze - Hinweise & Fehler an |
Willkommen in der Welt der Objekte, Ereignisse und Botschaften1.0 Überblick ^1.0 ÜberblickIn 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ührungErstellen der grafischen OberflächeIn 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 ObjektenZurü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 HandlerAktuell 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 ObjektFü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 ereignetWird 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 GeometriemanagementWir 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 BegriffeHier 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)
Klassen
Objekte
Window-Objekte
Instance-Variablen
Hints
Ereignisse (Events)
Ereignisorientierte Programmierung
Botschaften (Messages)
Methoden
Action-Handler
ActionHandler können auch Botschaften an andere Objekte aussenden oder Methoden ausführen. Beispielsweise wird die Anweisung
Objekt-Tree, Parents und Children
Vererbung
Folgen:
1.3 Vereinbarungen für dieses HandbuchIn diesem Handbuch gelten einheitlich die folgenden Abkürzungen. Es wird empfohlen zumindest diese Seiten auszudrucken.
Beispiel:
^1.4 Syntax für ObjektzugriffeVereinbaren von ObjektenObjekte 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 ObjekteObjektzugriffe 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-CodeAuf 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-CodeWie 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-HandlernAction-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
Parameter
Vereinbarung des Handlers
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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
^ |