Dialogboxen in GFA Basic

Mit dem GFA Basic Interpreter ist es leicht möglich, einige GEM-Elemente wie z. B. Alert-Boxen zu programmieren, da die nötigen Befehle bereits implementiert sind. Nun stellt sich einem das Problem, daß diese Alert-Boxen nur für irgendwelche Bildschirmmeldungen geeignet sind. Um nun auch Eingaben in Boxenform realisieren zu können, muß man sogenannte Dialogboxen kreieren. Dies ist für GFA Basic mittels ein paar AES-Routinen und einem Resource Construction Set einfach zu bewerkstelligen.

Wenn Sie jetzt denken, daß ist ja alles schön und gut, nur ich habe kein Resource Construction Set, also höre ich gleich auf zu lesen, dann lesen Sie bitte doch noch einen Satz weiter und entscheiden Sie dann. Die ST Computer Redaktion bietet ab der Februar-Ausgabe das Resource Construction Set aus dem ATARI Entwicklungspaket für DM 15,- inkl. Diskette an. Es sei betont, daß diese Diskette keine Public Domain ist und somit nicht frei kopierbar ist. Das Resource Construction Set sollte also nicht das Problem sein.

Doch nun zurück zum Thema Dialogboxen. Wir wollen nicht allzu tief in die Materie von Objektbäumen, TEDINFO, u. ä. Dingen eingehen, da diese bereits in unserem GEM-Kurs Teil 2 Abschnitt 2.2 in der Januar-Ausgabe behandelt wurden und auch im Rahmen dieses Kurses weiter besprochen werden. Dieser Artikel soll also nur zeigen, wie man mittels einem Resource Construction Set erstellte Dialogboxen in das GFA Basic einbinden kann.

Benutzt wird in diesem Artikel das GFA Basic V2.0, da hiermit eine Parameterrückgabe aus Prozeduren leicht zu bewerkstelligen ist. Es sei sowieso jedem GFA Basic Besitzer empfohlen, den Update-Service auszunutzen. Es rentiert sich

AES heißt das Zauberwort

Mittels einiger AES-Routinen kann man das nötige Resource-File einladen, die Box erscheinen lassen und anschließend den Texte eingeben und weiterverwerten. Für jede AES-Routine wird eine eigene Prozedur benutzt, so daß man diese auch für andere Programme problemlos nutzen kann. Die Routinen müssen in folgender Reihenfolge angesprochen werden:

Rsrc_load

Hiermit wird Speicherplatz für das Resource-File reserviert und es anschließend in den Speicher geladen. Ist der Rückgabeparameter = 0, dann ist ein Fehler beim Laden aufgetreten. Als Paramet er wird der Resource-Filename benötigt.

Rsrc_gaddr

Diese Funktion dient zur Ermittlung der Anfangsadresse des Resource-Files (Gtype% = 0) und der TEDINFO (G-type% = 2). Die wichtigen Parameter sind Gtype%, der bestimmt, welche Adresse ermittelt werden soll, und Baum% bzw. Tedinfo%, die nach Aufruf der Routine die Adresse des Objektbaumes des Resource-Files bzw. der TEDINFO im Speicher enthält.

Form_center

Nach Aufruf dieser Routine bekommt man die Koordinaten der auf dem Bildschirm mittig zentrierten Dialogbox als Rückgabeparameter (X- und Y-Koordinate, Breite und Höhe der Box). Form__center benötigt nur die Adresse Baum% vor dem Aufruf.

Form_dial

Form_dial wird gleich viermal aufgerufen (zweimal vor den Objc_draw- und Form_do-Routinen und zweimal dahinter). Das kommt daher, da diese Routine im Grunde genommen aus vier Unterroutinen (0 — 3) besteht. Diese haben folgende Funktionen:

0 = reserviert einen Bildschirmbereich für die Box
1 = zeichnet ein sich vergrößerndes Rechteck
2 = zeichnet ein sich verkleinerndes Rechteck
3 = gibt den reservierten Bildschirmbereich wieder frei

Die Parameter für den Form_dial-Aufruf lauten:

Flag% = Funktionsnummer (0 — 3)
Littlx% = X-Koordinate des Rechtecks in der kleinsten Form
Littly% = Y-Koordinate des Rechtecks in der kleinsten Form
Littlw% = Breite des Rechtecks in der kleinsten Form
Littlh% = Höhe des Rechtecks in der kleinsten Form
Bigx% = X-Koordinate des Rechtecks in der größten Form
Bigy% = Y-Koordinate des Rechtecks in der größten Form
Bigw% = Breite des Rechtecks in der größten Form
Bigh% = Höhe des Rechtecks in der größten Form

Jetzt kommt vielleicht die Frage auf, welches Rechteck und wieso kleinste bzw. größte Form. Das ist einfach zu beantworten. Die Form_dial-Unterroutine l zeichnet ein sich vergrößerndes Rechteck und benötigt dazu die Littl-Parameter als Ursprungsgröße und die Big-Parameter als Endgröße des Rechtecks. Mit anderen Worten das Rechteck wächst von der linken oberen Ecke (X=0, Y=0) mit einer Breite von 64 und einer Höhe von 32 in die Bildschirmmitte. Bei der Unterroutine 2 verhält es sich genau umgekehrt, da das Rechteck ja von der maximalen Größe auf die kleinste schrumpfen soll.

Objc_draw

Diese Routine zeichnet die Dialogbox und benötigt folgende Parameter:

Baum% = Adresse des Objektbaumes
Startob% = Index des ersten zu zeichnenden Objektes (im Bsp. 0)
Depth% = Anzahl der Ebenen, die zu zeichnen sind (im Bsp. 1)
Xclip%, Yclip%, Wclip% und Hclip% = Koordinaten der Dialogbox

AES erlaubt maximal neun Ebenen (0-8), aus denen sich eine Box zusammensetzen kann. In unserem Falle werden allerdings nur die Ebenen 0 und l benötigt.

Form_do

Diese Routine übergibt die weitere Kontrolle des Programms an das AES und wartet auf Eingaben in der Dialogbox. Es werden folgende Parameter für den Aufruf benutzt:

Baum% = Adresse des Objektbaumes
Startob% = Index des editierbaren Objektes (im Bsp. 4)

Als Rückgabeparameter erhält man in Ex_obj% den Index des Objektes (siehe Tabelle), das man in der Box angeklickt hat. In unserem Beispiel wären nur die Objekte 2 (Taste 1) und 3 (Taste 2) möglich, da diese als Ausgangsbuttons definiert wurden.

Tabelle der Objekte

Objekt 0 = Dies ist eine Beispielbox
Objekt l = ST Computer
Objekt 2 = Taste l
Objekt 3 = Taste 2
Objekt 4 = EDIT-Feld:______

Form_dial

Siehe oben

Get_dialogtext

Diese Prozedur ist kein AES-Routinen-aufruf, sondern liest nur den Text der Eingabe Zeichen für Zeichen aus dem Speicher. Die Adresse erhält man durch das Auslesen einer Adresse der TED-INFO (Txt_adr%). Auf dieselbe Art und Weise bekommt man die Länge des editierten Textes (Te__txtlen%).

Es würde jetzt zu weit führen den kompletten Aufbau der TEDINFO zu erklären, so daß hier diese zwei Adressen genügen sollen.

Rsrc_free

Jedes Laden eines Resource-Files reserviert und verbraucht somit auch logischerweise Speicherplatz. Beim Austesten seiner Programme sollte man deswegen die Funktion Rsrc__free vor dem erneuten Start aufrufen, da ansonsten irgendwann kein Speicherplatz mehr vorhanden ist. Natürlich empfiehlt sich der Aufruf auch bei Beendigung des Programms.

Ein Loch auf dem Bildschirm

In manchen Programmen hinterläßt der Aufruf von Dialog- und Alertboxen häßliche Löcher auf dem Bildschirmaufbau. Das kommt daher, daß die Programmierer versäumt haben vor dem Objc_draw-Aufruf den Bildschirminhalt zu retten, der durch die Boxen überlagert wird. In GFA Basic ist dies ganz einfach zu bewerkstelligen. Man benutzt einfach den GET-Befehl, um den Bildschirmteil in einem String abzuspeichern. Nach dem Schließen der Box, wird dann der Bildschirmteil wieder mittels des PUT-Befehls ergänzt, so daß kein Loch zurückbleibt.

Wir hoffen, daß das kleine Beispiel zeigt, wie man sich mit einfachen Mitteln Dialogboxen für eigene Anwendungen erstellen kann und verweisen nochmals für genauere Informationen über die Objektbaumstrukturen auf den GEM-Kurs.

HE / Stefan Höhn



Aus: ST-Computer 02 / 1987, Seite 59

Links

Copyright-Bestimmungen: siehe Über diese Seite