|
|
23.01.2025 | Archiv # Recherche # Links # Kontakt # Gästebuch # Impressum |
Index Login Die Anzeige des Archivs erfolgt grafisch. Ändern |
Kurs: Programmieren (Teil 4)In dieser Folge wird der Quelltext aus der letzten GUP besprochen. Wer die GUP 17 und somit den Quelltext nicht hat, findet diesen zusammen mit dem assemblierten Programm auf der Diskette GUP 17 und GUP 18 (erhältlich wie alle anderen GUP Ausgaben auf Diskette bei Martin Sauter; Versand wie bei den GeoThek Disketten). Der erste Teil des Listings ähnelt dem Programm aus dem letzten Heft, zwischen ";Lab1" und ";Lab2" liegt eine kleine Ergänzung vor. GEOS erwartet neben den Menüs auch die Installation von Icons (Piktogramme). Sofern man keine Icons installiert, kann es zu einem Fehlverhalten von GEOS kommen. Aus diesem Grund haben wir in diesem Programm ein nicht-anwählbares Icon installiert. Bei der Installation geht man genauso vor, wie bei der Installation von Menüs: man übergibt in r0 einfach einen Zeiger auf die Iconinformationen (auf die spezielle Struktur einer Icontabelle gehen wir in einem späteren Kursteil ausführlicher ein). Ab dem Label HMLinks beginnt die Definition des Hauptmenüs; diesmal werden 3 Menüpunkte horizontal angeordnet (b3!HORIZONTAL). Das Hauptmenü sollte bei Anwendungen (Applikationen) immer in der linken oberen Ecke liegen. Die Höhe des Menüpunktes beträgt in der Regel 14 Pixel. Jeder Menüpunkt besteht aus einer Word-Byte-Word-Kombination: Das erste Word zeigt auf den Text, unter dem der Menüpunkt erscheinen soll, dann folgt ein Funktionsbyte, sowie ein Zeiger auf die spezielle Menüfunktion. GEOS kennt drei verschiedene Funktionsbytes: 1. MENU_ACTION 2. SUB_MENU 3. DYN_SUB_MENU Vom Hauptmenü gehen in der Regel Untermenüs vom Typ SUB_MENU oder DYN_SUB_MENU ab. Ab dem Label :geosSub finden Sie dann eine ähnliche Menüstruktur wieder, wie sie auch für das Hauptmenü vorliegt: zunächst zwei Bytes für die y-Koordinaten und dann zwei Words für die x-Koordinaten, Normalerweise beginnt die obere y-Koordinate 1 Pixel unterhalb des darüberliegenden Menüs; die linke x-Koordinate beginnt mit dem Rand des darüberliegen Menüs. Auch hier müssen Sie bzgl. der x-Koordinate ein wenig tüfteln. Das folgende Byte gibt dann die Anzahl der Untermenüpunkte an sowie deren Ausrichtung. Im allgemeinen ist die Ausrichtung von Untermenüs immer vertikal, was durch die Oder-Verknüpfung verdeutlicht wird. Auch hier schließen sich die Informationen zu den einzelnen Menüpunkten an. In unserem Beispiel liegt ein Untermenüpunkt vor, der Text des Menüpunktes soll "Info" lauten, es handelt sich um einen ausführbaren Menüpunkt (b MENU_ACTION), bei dessen Anwahl die Routine ab DoInfo angesprungen wird. Ab dem Label :DoInfo finden Sie die erste menübezogene Routine: GotoFirstMenu Wir verlassen die Menüroutine einfach mit einem rts. In einer späteren Erweiterung werden wir hier eine Dialogbox erscheinen lassen, die nähere Auskünfte zum Programm gibt. Die Untermenüstruktur ab :geosSub werden wir im nächsten Kursteil um anwählbare DeskAccessories erweitern. Zurück zum zweiten Hauptmenüpunkt: Anschließend übergeben wir einen Zeiger (Word) auf die Untermenüstruktur, die nach der Teilinvertierung des Bildschirms dargestellt werden soll. Erst jetzt darf mittels rts die Menüfunktion abgeschlossen werden. Ab dem Label :DateiTab finden Sie die Menüeinträge für das Dateiuntermenü. Bei den dynamischen Untermenüs findet also immer erst eine Aktion statt, dann wird ein Untermenü aufgebaut. Auch die Untermenüstruktur ab :DateiTab entspricht wieder der der anderen Menüs. Wir haben allerdings für die Anzahl der Menüpunkte die Konstante DMPKT verwendet und als Wert 3 definiert, dies hat den einfachen Vorteil, daß bei einer Ergänzung von Menüpunkten sich auch die Menühöhe automatisch mit ändert. Eine besondere Beachtung soll hier aber noch die Textdarstellung finden: Für die Funktion "Ende" haben wir kein Shortcut vorgesehen, damit der Anwender das Programm bewußt mit der Maus beenden muß. Sie können jedoch in Analogie zu "schließen" und "drucken" auch für "Ende" ein Shortcut vorsehen und ergänzen. Bei der Routine zum Beenden des Programms bauen wir zunächst das Untermenü ab (jsr GotoFirstMenu) bevor wir es korrekt nach Desktop verlassen. Der dritte Hauptmenüeintrag "Bearbeiten" verfügt über dieselbe Struktur wie die anderen beiden Menüs, jedoch haben wir hier zusätzlich bei der Anzahl und Ausrichtung der Untermenüpunkte diese mit CONSTRAINED geodert. Der Aufbau der Texte und der Routinen zu den Untermenüpunkten "ändern", "löschen" und "weitersuchen" entspricht (noch) dem Aufbau aus dem Dateiuntermenü (siehe oben). Eine Besonderheit ergibt sich für das Einfügenmenü: Damit später vom Programm aus der Einfügemodus exakt abgelesen werden kann, haben wir das InsertFlag im Listing eingeführt. Ist der Wert dieses Flags $ff (255), so ist das Sternchen gesetzt, ist er Null, so ist es gelöscht. In Abhängigkeit des gelöschten bzw. gesetzten Sternchens wird entweder in den Text ab :EinfügenText ein Sternchen oder ein Space geschrieben. Die Entscheidung ob InsertFlag über den Wert Null oder $ff verfügt, geschieht bei der Routine :DoInsert mittels des bit-Befehls. Wird eine Speicherstelle über bit abgefragt, so wird das sechste und siebte Bit der Speicherstelle in das Statusregister übertragen. Das siebte Bit setzt das Negativflag im Statusregister, das mit bmi bzw. bpl abgefragt wird. Ist der Wert in InsertFlag negativ (also $ff=255=-1), so wird das lokale Label ::10 angesprungen, ein Space in den Text ab :EinfügenText geschrieben, und das InsertFlag gelöscht. War der Wert in InsertFlag nicht negativ (auch der Wert Null ist beim Computer positiv - entgegen der Mathematik!), so wird das Sternchen gesetzt und das InsertFlag auf $ff (=255=-1) gelegt. Da dieser Wert (im Akku) nicht Null ist, wird über bne nach dem lokalen Label ::20 verzweigt, wo auch der andere Teil der Routine endet. Hier wird aber nicht das Menü mittels GotoFirstMenü abgebaut, sondern über die Routine ReDoMenu nochmals angezeigt! ReDoMenu stellt das letzte Menü nochmals zu Auswahl, wobei der dann geänderte EinfügenText schon gleich miterscheint! Der Untermenüpunkt "suchen" eröffnet ein weiters Untermenü. Unter GEOS sind beliebig viele Unter-(Unter-)Menüs machbar, sie dürfen sich auch überlappen! Die jeweilige Untermenüebene hat dieselbe Struktur wie jedes andere Menü auch. Wir gehen deshalb auch nicht mehr auf die Struktur von SearchSub ein. Eine dritte menübezogene Routine lernen Sie noch ab :DoCDTitel kennen: Zusammenfassung: Der Aufbau aller GEOS-Menüs erfolgt aus einer Struktur heraus, die für alle Menüs gleich ist. Zunächst werden die beiden y-Koordinaten als Byte und dann die x-Koordinaten als Word angegeben. Das sich daran anschließende Byte gibt Auskunft über die Anzahl der Menüpunkte, die Ausrichtung (Bit 7) sowie der Mausbegrenzung bezogen auf dieses Menü (Bit 6). Danach folgen die Einträge zu den einzelnen Menüpunkten. Zuerst ein Zeiger (Word) auf den Menütext, dann ein Funktionsbyte und schließlich ein Zeiger auf die vom Funkionsbyte abhängige Funktion. Menütexte können mit Attributen versehen bzw. formatiert werden. Das Funktionsbyte ist entweder vom Typ MENU_ACTION, SUB_MENU oder DYN_SUB_MENU. Handelt es sich um den Typ MENU_ACTION, so dient das sich anschließende Word als Zeiger auf die auszuführende Routine, war es vom Typ SUB_MENU, so dient das folgende Word als Zeiger auf die Untermenüstruktur. Im Falle von DYN_SUB_MENU ist das folgende Word als Zeiger auf die zuerst auszuführende Aktion zu sehen, am Ende der Aktion übergibt man in r0 einen Zeiger auf das dann anzuzeigende Menü. Folgende menübezogenen Routinen kennt GEOS:
Für den nächsten Kursteil sollten Sie das bisherige Listing wie folgt abändern:
Viel Spaß beim Programmieren, bis zur nächsten Ausgabe.
H. J. Ciprina
Kurzlink hierhin: http://geos-printarchiv.de/1217 |
Letzte Änderung am 01.11.2019 |