Heute zeigen wir Ihnen, wie Sie mit einem »Resource-Construction-Programm« sog. Resourcen für einen einfachen Dialog anlegen und wie Sie diese Resource dann in eigene Programme einbinden.
Beginnen wir mit einer leichten Übung, dem Entwerfen einer Dialogbox mit Hilfe eines Resource-Construction-Programms. Zu den bekanntesten Vertretern dieser Gattung von Programmen dürften das »Resource Construction Set« « von Atari und das »Resource Construction Program« von Kuma gehören. Die Bedienung ist jedoch durchaus ähnlich.
Legen Sie also eine neue Resource-Datei mit dem Namen »DEMO.RSC« an und beginnen Sie mit einer neuen, leeren Dialogbox mit dem Namen »BEISPIEL«. Diese leere Dialogbox besteht aus einem Objekt vom Typ »G_BOX«, welches meist noch mit dem Status »OUTLINED« versehen ist. Wählen Sie nun ein Objekt des Typs »G_STRING« (ob_spec in der Objektstruktur zeigt dann auf einen nullterminierten String) und plazieren Sie es am oberen Rand der noch leeren Dialogbox. Das Objekt wird mit keinen Flags oder Stati versehen. Geben Sie als Zeichenkette »BEISPIEL« an.
Nehmen Sie nun ein zweites Objekt vom Typ »G_STRING« und positionieren Sie dieses etwa in der Mitte der Dialogbox. Geben Sie als Text »Guten Tag!« an. Auch hier ist weder ein Flag noch ein Status zu setzen.
Das dritte Objekt in unserer Box ist vom Typ »G_BUTTON« (ob_spec zeigt wie bei einem Objekt des Typs »G_STRING« auf einen nullterminierten String) und erhält den Namen »BSPEXIT«. Es enthält den Text »OK« und wird am unteren Rand plaziert. Als Flags sind »SELECTABLE«, »DEFAULT« und »EXIT« anzugeben. Die Angabe der Stati entfällt. (Buttons sind immer am unteren oder rechten Rand einer Dialogbox zu plazieren!)
Das war's schon! Speichern Sie die Resource-Datei mit für die Programmiersprache »C« passender Header-Datei ab. Es werden nun vom Resource-Construction-Programm unter anderem die Dateien »DEMO.RSC« und »DEMO.H« abgespeichert. Diese beiden Dateien verwerten Sie weiter: »DEMO.RSC« wird zur Laufzeit des Beispielprogramms benötigt, »DEMO.H« bei der Übersetzung des Quelltexts. Die anderen Dateien - beispielsweise »DEMO.DFN« bei dem RCS von Atari - löschen Sie bitte nicht, denn Sie benötigen sie noch, wenn Änderungen an der Resource-Datei vorgenommen werden sollen.
Die Resource-Datei ist fertig. Nehmen Sie Ihr Entwicklungssystem und beginnen Sie mit der Programmierung. Der Rahmen für jedes GEM-Programm enthält die beiden Befehle »appl_init()« und »appl_exit()«. Sie werden benötigt, um eine Applikation beim AES an- bzw. abzumelden. »appl_init()« liefert die Identifikationsnummer unserer Applikation. Für ein späteres Programm, welches ebenso diesen Rahmen benutzt, speichern wir die ID-Nummer ab. In dem Fall, daß »appl_init()« den Wert -1 zurückliefert, muß das GEM-Programm enden, da die GEM-Funktionen wegen nicht erfolgter Anmeldung nicht benutzt werden dürfen.
Mittels »rsrc_load()« lädt unser Programm die Resource-Datei nach. Hier ist lediglich der Dateiname anzugeben. Den Pfad sucht sich die Funktion selbst! Den Speicherplatz der geladenen Resource-Datei gibt die Funktion »rsrc_free()« kurz vor Ende des Programmlaufs wieder frei. Was nun noch fehlt, ist die Adresse unserer Dialogbox. Diese Adresse ermittelt die Funktion »rsrc_gaddr()«. Die Anwendung ist nun angemeldet, die Resource-Datei geladen. Nun kommen einige Basisfunktionen, die (fast) immer benötigt werden, um einen Dialog durchzuführen.
Hierzu gehört die Funktion »wind_update()« mit den Parametern »BEG_UPDATE« und »END_UPDATE«, um zu verhindern, daß Fenster während des Dialogs erneuert werden, oder daß Drop-Down-Menüs herunterfallen können. (Die Menüs heißen nicht Pull-Down-Menüs! Unter GEM 1.x und 2.x gibt es nur Drop-Down-Menüs.) Die Parameter »BEGMCTRL« und »ENDMCTRL« erzwingen, daß die Mauskontrolle bei der zum Dialog gehörigen Applikation liegt, zu der der Dialog gehört. (Dies ist insbesondere dann wichtig, wenn Slider in Dialogen benutzt werden.)
Was fehlt nun noch? Zu den »AES« gehören die »form_«-Funktionen. Für einen Dialog benötigen wir »form_dial« mit den Parametern »FMD_START«, »FMD_GROW«, »FMD_SHRINK« und »FMD_FINISH«, wobei die Parameter »FMD_GROW« und »FMD_SHRINK« nur unter GEM 1.x eine Wirkung zeigen: die wachsenden und schrumpfenden Rechtecke. Mit »form_center()« wird eine Dialogbox zentriert, ab dem »Rainbow-TOS« sogar pixelgenau. Aus internen Gründen sollte eine Dialogbox eine Breite von 79 Zeichen nicht überschreiten!
Eine zentrale Aufgabe übernimmt »form_do()«. Mit dieser Funktion wird der gesamte Dialog verwaltet. Kümmern wir uns jedoch nicht näher um diese Funktion. Es reicht zur Zeit, zu wissen, daß der Rückgabewert von »form_do()« das angeklickte Objekt ist. in, obersten Bit des Rückgabewerts ist zudem eine Aussage darüber zu finden, ob ein Objekt einfach (nicht gesetzt) oder doppelt (gesetzt) angeklickt wurde.
Von den »graf_«-Funktionen der AES benötigt man noch die Funktion »graf_mouse()«, mit der die Mauszeigerform »ARROW« kurz vor dem Dialog gesetzt wird. Die Mauszeigerform »ARROW« (Pfeil) ist die Standardform für die meisten Aktionen mit der Maus.
Nun der letzte Block von Funktionen. Die Dialogbox wird mit »objc_draw()« ausgegeben. Da mit dem Verlassen des Beispieldialogs das Objekt, welches zum Verlassen benutzt wurde, noch immer mit dem Status »SELECTED« versehen ist, muß dieser zurückgesetzt werden. Die Funktion »objc_offset()« ermittelt die Position eines Objekts in absoluten Koordinaten. (Sie erinnern sich? In der »OBJECT«-Struktur sind nur relative Koordinaten angegeben!) Die Kenntnis der Position eines Objekts ist jedoch nur dann wichtig, wenn das betreffende Objekt neu zu zeichnen ist. Den Status schließlich ändert »objc_change()«.
Wenn Sie das Beispiel eingegeben und ausprobiert haben, versuchen Sie einmal, den Dialog zu erweitern beispielsweise durch weitere Exit-Buttons. Probieren Sie auch aus, was passiert, wenn ein Objekt zwar mit dem Flag »SELECTABLE«, aber nicht mit »EXIT« versehen wurde. Viel Spaß dabei!
(uw)
Literatur:
[1] Atari ST Profibuch, Jankowski/Rabich/ Reschke, Sybex 1987/88/89
[2] GEM Programmier-Handbuch, Balma/ Fitler, Sybex 1987/88