Welcher SIGNUM!-Besitzer erinnert sich nicht an die frustbeladenen Sekunden (Minuten, Stunden...?), in denen er mit hektischem linken Zeigefinger auf seinem kleinen Krabbeltierchen herumhackte, nur um den blöden Kommafehler zu korrigieren, der sich in Tante Emma’s Schnorrerbrief eingeschlichen hatte (SIGNUM! verlassen, Druckprogramm aufrufen, Drucken, Fehler entdecken, Ärger, Druckprogramm verlassen, SIGNUM! aufrufen....)?
Das Problem bei dieser Prozedur ist das GEM, welches schier unendlich lange braucht, seine Fenster aufzubauen, und nicht zuletzt der User selbst, der in seiner Hektik das gewünschte Programm natürlich nicht sofort findet.
Es gibt nun zwei Möglichkeiten, diesen Vorgang zu beschleunigen. Die eine davon wird schon seit Jahren auf Rechnern der Weltmarke mit den drei Buchstaben benutzt (sog. Command Line Interpreter: MS-DOS, just say No!), entspricht aber nicht mehr ganz den Möglichkeiten moderner Hard-und Software. Wir haben uns daher für die zweite Alternative entschieden, eine Art Desktop ohne Fenster. Die einzelnen Programmteile werden dabei bequem und schnell über Pull-Down-Menüs oder sogar über einen simplen Tastendruck (UNIX läßt grüßen...) aufgerufen. Einfacher geht’s nicht mehr!!
Das ganze haben wir in GfA-Basic realisiert. Im Prinzip eignet sich dazu jede Sprache, die den Aufruf von GEM-und TOS-Routinen erlaubt, gerade in GfA-Basic ist das jedoch besonders einfach. Das Programm sollte aber auf jeden Fall compiliert werden, da der Interpreter mit dem Ein- und Ausschalten der Maus und der Menüleiste seine Probleme hat.
Nun zum eigentlichen Programm.
Mit RESERVE 50000 werden für den Manager 50000 Bytes an Arbeitsspeicher reserviert, der Rest wird ans GEMDOS zurückgegeben und steht den danach aufgerufenen Programmen zur Verfügung.
Nach dem Aufbau der Menüzeile in der Prozedur Init_menu werden mittels On Menu (Key) zwei Prozeduren festgelegt, die bei der Auswahl eines Menüpunktes bzw. eines Tastendrucks angesprungen werden. Die Prozedur Menu_bestimmen übergibt an Select_item den Index des gewählten Menüpunktes, während Key_bestimmen den ASCII-Code der gedrückten Taste (niederwertiges Byte von Menu (14)) ermittelt und eventuell Kleinbuchstaben konvertiert.
In Select_item wird dann der gewählte Befehl ausgeführt. Wenn man die bei Menu% und Code% auftretenden Zahlen vergleicht, könnte man meinen, daß eine Variable auch genügen würde. Dabei treten jedoch Probleme auf, wenn man Programme mit Control-Codes (z. B. in einer erweiterten Version des Managers) aufrufen möchte, da diese als ASCII-Zeichen im Bereich von 1 bis 26 liegen.
Zum Ausfuhren von Programmen wird die Prozedur Programm_starten aufgerufen, deren Parameter wir vielleicht etwas genauer erläutern sollten: Der erste gibt die Nummer des Laufwerks an, auf welchem sich das zu startende Programm befindet (A=1, B=2 etc.), der zweite den Suchpfad (kann auch ein Leerstring sein) und der dritte endlich den Programmnamen. Reichlich kompliziert bis behämmert, könnte man meinen. Aber dann hat man die Rechnung ohne den Wirt (GEMDOS) gemacht: Dieses läßt bei einem simplen Programmaufruf mit Exec den aktuellen Suchpfad samt Laufwerk unbehelligt, worauf das aufgerufene Programm seine Resourcedatei o. ä. zwar sucht (in dem Ordner, aus dem der Manager gestartet würde), aber niemals findet. Um der dann (hoffentlich) erscheinenden Fehlermeldung (sengt hat der geheimnisvolle Bombenleger wieder einmal zugeschlagen) auszuweichen, legt man entweder alle Resourcedateien in denselben Ordner wie den Manager (scheußlich...) oder aber ändert den aktuellen Pfad mittels Chdrive und Chdir.
Nun aber zum Kern des Ganzen, dem Befehl ’Exec modus, name, command line, environment string’. Mit diesem (GEMDOS-) Befehl kann ein Programm ein anderes quasi als „Unterprogramm“ ablaufen lassen. Uns interessiert nur der Aufruf mit Exec 0,..., die „load and go“-Option. Damit wird ein Programm geladen, gestartet und nach dessen Ende das aufgerufende Programm weitergeführt. Auf command line und environment string kann man im Normalfall verzichten (= > Übergabe von Leerstrings).
Es ist nun aber nicht anzunehmen, daß man nur noch mit SIGNUM! arbeitet (so gut das Programm auch sein mag). Daher erscheint beim Anwählen von ”,Programm starten“ eine Fileselectorbox, in der man bieder ein Programm auswählen und starten kann. In der Version 2.02 des GfA-Basic traten aber (im Gegensatz zur Version 2.0) Probleme beim Erkennen einer Laufwerkänderung in dieser Box auf, GEMDOS erkannte sie nicht mehr und wir mußten daher das aktuelle Laufwerk etwas unschön herausfiltern (sonst: Aktuelles_laufwerk% = Gemdos(25)+1).
Das direkte Starten von SIGNUM! ist aber nicht das Ende der Fahnenstange. Man könnte (so wie wir) noch weitere oft benötigte Programme, z. B. GfA-Basic, Wordplus etc., in den Manager einbinden. Es ist aber aus praktischen Gründen ratsam, zumindest eine Ramdisk. am besten aber eine Harddisk zu benutzen. Dann steht der Entmachtung des Desktop nichts mehr im Wege!
' ****************************************************************************
' * *
' * Titel: SIGNUM!-Manager *
' * Zweck: Verwaltung der SIGNUM!-Programmteile und SIGPIC.TOS *
' * Autor: Martin Wunderli & Patrick Seemann *
' * Eschenweg 7 Landstra₧e 122 *
' * CH-8057 Zürich CH-5430 Wettingen *
' * Zielmaschine: ATARI ST *
' * Sprache: GfA Basic Version 2.0 Compiler Version 1.8 *
' * Erstellungsdatum der Version 1.0: 19.9.1987 *
' * Aktuelle Version: 1.2 *
' * *
' * (c) MAXON Computer GmbH 1987 *
' * *
' ****************************************************************************
'
' Initialisierung:
'
RESERVE 50000
@desktop_loeschen
@init_menu
'
' Hauptprogrammschleife:
'
DO
ON MENU
LOOP
'
'
PROCEDURE init_menu
'
LOCAL i%
'
' Globale Variablen:
' ==================
' Titel$()
'
DIM titel$(19)
FOR i%=0 TO 19
READ titel$(i%)
NEXT i%
DATA , Info SIGNUM!-Manager
DATA --------------------------
DATA 1,2,3,4,5,6,""
'
' Selektierbare Punkte: 11,12,14,15,17
DATA SIGNUM! , Editiere Text ... S , Drucke Text ... P ,-------------------------------
DATA Wandle Bild ... B , Bearbeite Zeichensatz ... Z ,-------------------------------, Ende Q ,""
'
DATA ""
MENU titel$()
'
' Disable Item
'
MENU 13,2
MENU 16,2
'
ON MENU GOSUB menu_bestimmen
ON MENU KEY GOSUB key_bestimmen
RETURN ! Init_menu
'
'
PROCEDURE key_bestimmen
'
LOCAL code%
'
code%=MENU(14) MOD 256
@select_item(code%+32*(code%>90))
RETURN ! Key_bestimmen
'
'
PROCEDURE menu_bestimmen
@select_item(MENU(0))
RETURN ! Menu_bestimmen
'
'
PROCEDURE select_item(nummer%)
MENU OFF
MENU KILL
'
' Nummer des Menüeintrages oder ASCII-Code
' der gedrückten Taste:
'
IF nummer%=1 OR nummer%=73 THEN
@info
ENDIF
IF nummer%=11 OR nummer%=83 THEN
@programm_starten("SIGNUM.PRG")
ENDIF
IF nummer%=12 OR nummer%=80 THEN
@programm_starten("PR24N.PRG")
ENDIF
IF nummer%=14 OR nummer%=66 THEN
@programm_starten("SIGPIC.TOS")
ENDIF
IF nummer%=15 OR nummer%=90 THEN
@programm_starten("DCS24N.PRG")
ENDIF
IF nummer%=17 OR nummer%=81 THEN
@desktop
ENDIF
@desktop_loeschen
MENU titel$()
'
' Disable Item
'
MENU 13,2
MENU 16,2
'
ON MENU GOSUB menu_bestimmen
ON MENU KEY GOSUB key_bestimmen
RETURN ! Select_item
'
'
PROCEDURE info
'
LOCAL entscheid%
'
ALERT 0," SIGNUM!-Manager|Version 1.2 (c) 1987 by| Martin Wunderli| & Patrick Seemann",1," Goil! ",entscheid%
RETURN ! Info
'
'
PROCEDURE programm_starten(name$)
'
' Name zeigen
'
DEFFILL 1,0,0
PBOX 0,0,639,18
TEXT (40-LEN(name$+" wird geladen")/2)*8,15,name$+" wird geladen"
HIDEM
EXEC 0,name$,"",""
SHOWM
RETURN ! Programm_starten
'
'
PROCEDURE desktop
MENU KILL
END
RETURN ! Desktop
'
'
PROCEDURE desktop_loeschen
DEFFILL 1,2,4
PBOX 0,0,639,399
RETURN ! Desktop_loeschen