#block##pageblock# #pagenr("%",1)##setcount(1)##count per page# #headeven# gs-Menu-Generator #center#____________________________________________________________ #end# #headodd# #right#gs-Menu-Generator #center#____________________________________________________________ #end# #bottomeven# #center#____________________________________________________________ 5 - % #right#ERGOS #end# #bottomodd# #center#____________________________________________________________ ERGOS #right# 5 - % #end# #ib#5  Dialoge innerhalb des Menus#ie# In Kapitel 4 haben Sie erfahren, wie Sie eine eigene Menukarte entwickeln können; sicher haben Sie das schon ausprobiert und sich Ihr selbstgestaltetes Menu auf dem Bildschirm angesehen. Bislang erscheint aber noch der Hinweis 'unbekanntes Kom­ mando', wenn Sie eine Menufunktion aktivieren - denn die Prozeduren, die Sie bei der Aktivierung der Menufunktion aufrufen, sind ja noch nicht fertiggestellt! Bei vielen Menufunktionen ist es notwendig, mit dem Benutzer noch einen Dialog zu führen: z.B. muß ein Dateiname erfragt, eine Information ausgegeben und bestätigt, eine Auswahl oder eine Entscheidung getroffen werden. In diesem Kapitel sollen Ihnen nun die Möglichkeiten vorgestellt werden, die Ihnen zur Verfügung stehen, um einen solchen Dialog mit dem Benutzer zu führen. Dieser Dialog wird innerhalb des Menus geführt. Alle Prozeduren, die sich auf diesen Menu-Dialog beziehen, enthalten deshalb den Wortbestandteil 'menu'. Hier noch einige Tips! Damit Sie Ihre Menu-Dialoge testen können, empfiehlt sich folgendes Vorgehen: Sie erstellen zuerst Ihre Menukarte und tragen schon die Namen für die jeweils aufzurufenden Prozeduren ein - wie wir es in Kapitel 4 ge­ macht haben. Mit 'testinstallation' installieren Sie dann in Ihrer Task die neue Menu­ karte. Nun schreiben Sie Ihre Prozeduren, die Sie unter das Menu legen wollen. Ist eine Prozedur "testreif", so müssen Sie sie zunächst insertieren, denn das Menusystem gs- DIALOG kann nur auf insertierte Prozeduren zugreifen. Anschließend rufen Sie das Menu (z.B. 'SCRIPT') aus der Menukarte mit dem Befehl 'handle menu ("SCRIPT")' (Hier ist der jeweilige Menuname einzusetzen!) auf. Wenn Sie den entsprechenden Menupunkt aktivieren, müßte Ihr Programm ablaufen. Es ist günstig, eine eigene Task zum Testen der Prozeduren anzulegen, damit diese hin und wieder gelöscht werden kann. #ib#5.1 Eingabe eines Textes/Namens#ie# ('#ib#menuanswer#ie#') Wenn der Benutzer in unserem Beispiel die Menufunktion 'Neu erstellen' aktiviert hat, muß der Name der Datei erfragt werden, die neu erstellt werden soll. Dafür steht die Prozedur 'menuanswer' zur Verfügung. Die in die Menukarte eingetragene Proze­ dur 'neue datei editieren' (Siehe Kapitel 4.1) könnte dann folgendermaßen aussehen: PROC neue datei editieren: TEXT VAR dateiname := menuanswer ("Bitte den gewünschten Dateinamen:", "", 5); IF dateiname <> "" AND NOT exists (dateiname) THEN command dialogue (FALSE); #ib#cursor on#ie#; edit (dateiname); #ib#cursor off#ie#; command dialogue (TRUE); regenerate menuscreen (* sehen Sie dazu Kapitel 5.10 *) FI END PROC neue datei editieren; Schauen wir uns zuerst die Prozedur 'menuanswer' an. Die Prozedur hat drei Para­ meter. Mit dem ersten Parameter legen Sie den Text fest, der innerhalb der Box ausgegeben wird, die auf dem Bildschirm erscheint. Der Text dient ausschließlich der Information des Anwenders. Mit dem zweiten Parameter können Sie dem Benutzer einen Vorschlag für die Einga­ be machen, der zum Editieren ausgegeben wird. Da eine solche Vorgabe aber in die­ ser Situation sinnlos wäre, verzichten wir darauf (""). Die auf dem Bildschirm erscheinende Box hat folgendes Aussehen: +-------------------------------------+ I Bitte den gewünschten Dateinamen: I I I I I I Eingabe: I +-------------------------------------+ Die Boxbreite und -höhe wird vom System automatisch anhand des von Ihnen als ersten Parameter übergebenen Textes festgelegt. Sie haben noch verschiedene Mög­ lichkeiten, diesen Text zu gestalten (mehrere Zeilen, Inversdarstellung etc.) - auf diese Möglichkeiten gehen wir in Kapitel 5.13 detailliert ein. In unserem Beispiel erscheint die Box in der Mitte des Menubildschirms. Diese Festlegung treffen wir durch die Angabe der Position '5' als dritten Parameter. Sie können hier zwischen 5 verschiedenen Positionen wählen: 1 - oben links, 2 - oben rechts, 3 - unten links, 4 - unten rechts, 5 - zentral im Menubildschirm - mehr dazu in Kapitel 5.12. Mit dem Erscheinen der obigen Box auf dem Bildschirm ändert sich automatisch auch die Fußzeile im Menu, über die der Benutzer Informationen zur Bedienung erhält. Hier erscheint der Hinweis: 'Fertig:   Abbruch: '. Um diese Hinweise brauchen Sie sich aber nicht zu kümmern , da sie alle automa­ tisch gesetzt werden. Die Prozedur 'menuanswer' hat noch folgende Besonderheit: Es ist nicht möglich, den Namen 'break' einzugeben! Diese Eingabe wird automatisch abgefangen. Es hat sich gezeigt, daß Anwender manchmal versuchen, über die Eingabe zu verlassen. In diesem Falle entstünde hier eine Datei mit Namen 'break' - was aber nicht sinnvoll wäre. Nach der Eingabe liefert die Prozedur 'menuanswer' als Wert den vom Benutzer eingegebenen Text - dabei sind führende und folgende Leerzeichen schon abgeschnit­ ten ('compress'). Wurde die Prozedur mit verlassen, so wird niltext geliefert. Wird in obiger Prozedur die Eingabe mit abgebrochen oder existiert bereits eine Datei mit dem eingegebenen Namen, so verschwindet die Box, und der Menubildschirm wird automatisch in den alten Zustand gebracht. Wenn schon eine Datei mit dem Namen existiert, dann wäre es sinnvoll, den Benutzer darauf aufmerksam zu machen. Wie ein solcher Hinweis in das Menu eingeblendet werden kann, erklären wir im Kapitel 5.2. gs-DIALOG ist so geschrieben, daß der Cursor möglichst wenig störend wirkt. Aus diesem Grunde wird der Cursor immer an einer Stelle "geparkt". Sofern Ihr System es zuläßt und eine entsprechende Anpassung vorliegt, wird der Cursor ganz ausgeschal­ tet. Denken Sie bitte daran, auch wenn er auf Ihrem Bildschirm ständig sichtbar ist! Wenn also jetzt eine Eingabe erfolgen soll, ist es notwendig, den Cursor anzuschalten. Wenn Sie wieder in das Menu zurückkehren, sollte der Cursor wieder ausgeschal­ tet werden, damit er dort nicht stört. Wenn Sie die Prozedur 'edit' mit einem neuen Namen als Parameter aufrufen, erfragt das System, ob die Datei neu eingerichtet werden soll. Diese Anfrage muß hier unter­ drückt werden, damit nicht irgendwelche Texte in den Menubildschirm geschrieben werden. Das Unterdrücken der Abfrage erreichen Sie durch Ausschalten des Kom­ mandodialoges. Nach Einrichten der Datei muß der Kommandodialog aber wieder eingeschaltet werden, da gs-DIALOG das Eingeschaltetsein für eine fehlerfreie Funk­ tion voraussetzt! Mit dem Befehl '#ib#regenerate menuscreen#ie#' (sehen Sie dazu auch Kapitel 5.10) wird der aktuelle Menubildschirm erneut vollständig auf den Bildschirm geschrieben (repro­ duziert). Das ist notwendig, weil die Prozedur 'edit' den Bildschirm benutzt hat. Durch diesen Befehl wird der Menubildschirm exakt in der Form hergestellt, wie er zuletzt ausgesehen hat. Auch wenn Sie geschachtelte Menubildschirme haben, wer­ den diese durch den einen Befehl reproduziert. So können Sie in Ihren Verarbei­ tungsfunktionen mit dem Bildschirm "machen was Sie wollen" - Sie kehren mit dem letztgenannten Befehl immer wieder so in das Menu zurück, wie Sie es verlassen haben. #ib#5.2 Ausgabe einer Information#ie# ('#ib#menuinfo#ie#') In der Prozedur 'neue datei editieren' (Kapitel 5.1) wäre es sinnvoll, den Benutzer zu informieren, wenn bereits eine Datei mit dem eingegebenen Namen existiert. Hierfür steht die Prozedur 'menuinfo' zur Verfügung. Beispiel: menuinfo (" Eine Datei mit dem Namen "13" existiert schon!"); Dadurch wird folgende Box ins Menu geschrieben: +----------------------------+ I I I Eine Datei mit dem Namen I I existiert schon I I I +----------------------------+ Die Box erscheint in der Mitte des Menus (Position 5); in der Fußzeile wird der Hin­ weis ausgegeben 'Zum Weitermachen bitte irgendeine Taste tippen!'. Dann wartet das System so lange, bis eine Taste gedrückt wird. Anschließend wird der aktuelle Menu­ schirm wiederhergestellt. Die Prozedur 'menuinfo' gibt es noch in zwei weiteren Versionen, nämlich mit zwei bzw. drei Parametern. Im ersten Fall kann über den zweiten Parameter noch die Position (1, 2, 3, 4, 5) innerhalb des Menubildschirmes festgelegt werden (sehen Sie dazu Kapitel 5.12). Mit dem dritten Parameter kann ggf. noch die Wartezeit festgelegt werden, die das System maximal verstreichen läßt, bevor es von sich aus das Pro­ gramm fortsetzt. 'menuinfo (" Eine Datei mit dem Namen "13" existiert schon!", 3, 40)' gibt die oben gezeigte Box aus, aber links unten in der Ecke des Menubildschirms (Position 3). Das System wartet (maximal) 4 Sekunden (40 Zehntel) und setzt dann - auch ohne Tastendruck - das Programm fort. Diese Prozedur mit gesondert angege­ bener Wartezeit verwendet man dann, wenn man nicht unbedingt die Kenntnisnahme der Information durch den Benutzer bestätigt haben möchte. #ib#5.3 Auswahl eines Namen durch Ankreuzen#ie# ('#ib#menuone#ie#') Während bei der Neuerstellung einer Datei ein Name neu erfragt werden muß, kann man beim Menupunkt 'Ansehen/Ändern' auf schon vorhandene Dateien zugreifen. Sie können dem Benutzer z.B. alle Dateien in der Task zur Auswahl anbieten. Sobald der Benutzer einen Namen angekreuzt hat, soll die entsprechende Datei geöffnet wer­ den. Dafür steht der Befehl 'menuone' zur Verfügung: PROC alte datei editieren: TEXT CONST kopf :: "Textdatei ansehen/ändern", hinweis :: "Bitte gewünschte Datei ankreuzen"; TEXT VAR dateiname := menuone (ALL myself, kopf, hinweis, FALSE); IF dateiname <> "" THEN #ib#cursor on#ie#; edit (dateiname); #ib#cursor off#ie#; FI; regenerate menuscreen END PROC alte datei editieren; Die Prozedur 'menuone' hat 4 Parameter: Als erster Parameter ist ein Thesaurus zu übergeben, in dem die zur Auswahl stehenden Namen enthalten sind. Zum Thesau­ rushandling werden noch einige zusätzliche Funktionen zur Verfügung gestellt (z.B. daß nur Dateien eines bestimmten Typs zur Auswahl angeboten werden können) - diese Funktionen werden in Kapitel 5.14 erläutert. In unserem Beispiel werden alle Dateien zur Auswahl angeboten, die in der Task zur Verfügung stehen. Die beiden Texte, die als 2. und 3. Parameter übergeben werden, erscheinen zur Kennzeichnung im Kopf der Auswahlliste. Der als zweiter Parameter übergebene Text erscheint zentriert und invers dargestellt auf dem Bildschirm, der als dritter Parame­ ter übergebene Text nur zentriert. Es ist sinnvoll, mit dem ersten Text (2.Parame­ ter) die zur Zeit aktivierte Menufunktion anzuzeigen, denn der Menubildschirm wird ja durch die Auswahlliste überschrieben. So kann sich der Benutzer besser im Menu­ system orientieren. Mit dem 4. Parameter wird festgelegt, ob der Bildschirm nach der Auswahl "ge­ reinigt", d.h. der alte Menubildschirm wiederhergestellt werden soll. Da in unserem Falle normalerweise im Anschluß an die Auswahl eine Datei auf dem Bildschirm editiert wird, verzichten wir auf die "automatische Regenerierung" des Menubild­ schirms. Dieses besorgen wir nach dem Editieren durch das Kommando 'regenerate menuscreen' "von Hand". Auf das Fenster, das für die Auswahl auf dem Bildschirm angezeigt wird, können Sie keinen Einfluß nehmen - es wird vom System selbständig festgelegt. Dadurch können Sie die Auswahl, wie auch die anderen Dialogkomponenten ebenso in geschachteleten Menus aufrufen, ohne daß es zu Problemen kommt. #ib#5.4 Auswahl mehrerer Namen durch Ankreuzen#ie# ('#ib#menusome#ie#') Es ist nicht immer sinnvoll, daß der Benutzer nur einen Namen auswählen, d.h. ankreuzen kann. Bei der Zeilenformatierung könnte man z.B. zulassen, daß gleich mehrere Dateinamen angekreuzt werden können. Im Anschluß an die Auswahl sollen dann alle angekreuzten Dateien mit 'lineform' bearbeitet werden. Für diesen Zweck steht die Prozedur 'menusome' zur Verfügung. Sie hat die gleichen Parameter wie die in 5.3 erläuterte Prozedur 'menuone' - nur daß hier die Auswahl mehrerer Namen möglich ist. Verläßt der Benutzer die Auswahl durch , so wird ein Thesaurus mit allen angekreuzten Namen geliefert; bei Verlassen mit ein leerer Thesaurus. Beispiel: PROC zeilen formatieren: TEXT CONST kopf :: "Textdateien zeilenweise formatieren", hinweis :: "Bitte gewünschte Dateien ankreuzen"; THESAURUS VAR dateinamen := menusome (ALL myself, kopf, hinweis, FALSE); cursor on; formatiere dateien; cursor off; regenerate menuscreen. formatiere dateien: INT VAR zaehler; FOR zaehler FROM 1 UPTO highest entry (dateinamen) REP IF name (dateinamen, zaehler) <> "" THEN lineform (name (dateinamen, zaehler)) FI PER END PROC zeilen formatieren; #ib#5.5 Eingabe eines Textes/Namens - alternativ: Auswahl durch Ankreuzen#ie# ('#ib#menuanswerone#ie#','#ib#menuanswersome#ie#') Sehr häufig kommt es vor, daß der Benutzer auf die zuletzt bearbeitete Datei zurück­ greifen will. In Kapitel 5.3 haben wir dem Benutzer bei der Menufunktion 'Anse­ hen/Ändern' gleich alle Dateien zur Auswahl angeboten. Hier wäre es vielleicht gün­ stiger gewesen, ihm die zuletzt bearbeitete Datei anzubieten und erst auf Wunsch die Liste aller Dateien zum Ankreuzen. Das läßt sich auf verschiedene Weise realisieren - wir werden Ihnen in diesem und in den folgenden Kapiteln verschiedene Möglich­ keiten aufzeigen: Sie können z.B. mit der Prozedur 'menuanswerone' arbeiten. Wie Sie schon aus dem Namen entnehmen können, handelt es sich dabei um eine Prozedur, die eigentlich aus zwei Prozeduren, nämlich 'menuanswer' und 'menuone' zusammengesetzt ist. Stellen Sie sich vor, sie führen den Namen der zuletzt bearbeiteten Datei in Ihrem Programm unter der Variablen 'letzte datei'. Dann könnte die Prozedur 'alte datei editieren' aus Kapitel 5.3 auch folgendermaßen geschrieben werden: TEXT VAR letzte datei; ... PROC alte datei editieren: TEXT CONST hinweis letzte :: "Zuletzt bearbeitete Datei:", kopf :: "Textdatei ansehen/ändern", hinweis :: "Bitte gewünschte Datei ankreuzen"; TEXT VAR dateiname := menuanswerone (hinweis letzte, letzte datei, ALL myself, kopf, hinweis, FALSE); IF dateiname <> "" THEN cursor on; edit (dateiname); letzte datei := dateiname; cursor off; FI; regenerate menuscreen END PROC alte datei editieren; Insgesamt hat die Prozedur 6 Parameter: Die ersten beiden Parameter beziehen sich auf die Eingabe ('menuanswer'). Wie dort kann auch hier der Text festgelegt werden, der in der Box auf dem Bildschirm erscheint. Der zweite Parameter ist der Text, der dem Benutzer zum Editieren angeboten wird - hier der zuletzt benutzte Dateiname. Möchte der Benutzer auf die Datei mit dem an­ gebotenen Namen zugreifen, braucht er nur mit zu bestätigen. Möchte er die Auswahl zum Ankreuzen angeboten bekommen, so braucht er nur die Tastenfolge (für 'Zeigen') zu tippen. Auf diese Auswahl beziehen sich die letzten 4 Parameter, die die gleiche Bedeutung haben wie bei der Prozedur 'menuone'. Auf die Möglichkeit, durch eine Auswahl angeboten zu bekommen, wird in der Fußzeile des Menus hingewiesen. Aber Achtung! Sie sollten sich einer "Gefahr" bei diesem Vorgehen bewußt sein. Der Benutzer hat natürlich so die Möglichkeit, auch einen anderen Namen als den vorge­ schlagenen anzugeben - einen Namen, der noch nicht in der Dateiliste enthalten ist. In einem solchen Falle würde Ihnen bei obiger Prozedur der Menubildschirm "ka­ puttgeschrieben", denn das System fragt (bei eingeschaltetem Kommandodialog) an, ob eine Datei mit dem Namen eingerichtet werden soll. Für diesen Fall sollten Sie also unbedingt eine Vorsorge treffen (z.B. indem Sie den Benutzer darauf hinweisen, daß der eingegebene Name nicht akzeptiert wird)! Sie vermuten sicher schon ganz richtig, daß es entsprechend auch die Prozedur 'menuanswersome' gibt, die zunächst einen Dateinamen erfragt und auf Wunsch eine Auswahl anbietet, in der mehrere Dateinamen angekreuzt werden können. Die Prozedur hat ebenfalls 6 Parameter, die identisch zur Prozedur 'menuanswerone' sind. Allerdings liefert die Prozedur 'menuanswersome' in jedem Fall einen Thesau­ rus; wurde die Auswahl mit abgebrochen, so liefert sie einen leeren Thesaurus. #ib# 5.6 Die Ja/Nein - Entscheidung#ie# ('#ib#menuyes#ie#','#ib#menuno#ie#') In Kapitel 5.5 trat das Problem auf, daß der Benutzer einen "unzulässigen" Namen eingeben konnte. Dieses Problem können wir umgehen: Wir fragen den Benutzer ein­ fach, ob er mit der zuletzt bearbeiteten Datei arbeiten will und lassen Ihm nur die Chance, mit 'Ja' oder 'Nein' zu antworten. Im ersten Fall bieten wir ihm eben diese Datei an - ansonsten die Auswahl zum Ankreuzen. Hierfür stehen die Prozeduren 'menuyes' und 'menuno' zur Verfügung, die von Ihrer Funktion her den Ihnen bekannten Prozeduren 'yes' und 'no' gleichen. Die beiden Menu-Prozeduren haben jeweils zwei Parameter: TEXT VAR letzte datei; ... PROC alte datei editieren: TEXT CONST kopf :: "Textdatei ansehen/ändern", hinweis :: "Bitte gewünschte Datei ankreuzen"; TEXT VAR dateiname; IF menuyes (" Wollen Sie mit der Datei "13"" + " '" +letzte datei+ "'"13" arbeiten", 5) THEN editiere letzte datei ELSE dateiname := menuone (ALL myself, kopf, hinweis, FALSE); editiere ausgewaehlte datei FI; regenerate menuscreen. editiere letzte datei: cursor on; edit (letzte datei); cursor off. editiere ausgewaehlte datei: IF dateiname <> "" THEN cursor on; edit (dateiname); cursor off; letzte datei := dateiname FI END PROC alte datei editieren; Über den zweiten Parameter legen Sie die Position auf dem Bildschirm innerhalb des Menus fest (1, 2, 3, 4, 5; sehen Sie auch Kapitel 5.12). Der erste Parameter ist ein Text, welcher der gs-DIALOG-Syntax gehorchen muß (die Codes "13" bewirken einen Zeilenvorschub; sehen Sie auch Kapitel 5.13). Er wird in einer Box auf den Bildschirm geschrieben und durch 'Ja  Nein' ergänzt: +-----------------------------+ I I I Wollen Sie mit der Datei I I 'Dateiname' I I arbeiten? I I I I Ja    Nein I I I +-----------------------------+ Für 'Dateiname' ist auf Ihrem Bildschirm dann natürlich der aktuelle Inhalt von 'letzte datei' eingetragen. Die Prozedur 'menuyes' liefert TRUE, wenn mit 'Ja' geantwortet wurde und FALSE, wenn mit 'Nein' geantwortet wurde. Die Prozedur 'menuno' wirkt wie 'NOT menuyes'. Nach Eingabe von 'Ja', 'Nein' (durch Tippen der Anfangsbuchstaben oder Positionie­ rung auf die Antwort und anschließendem ) wird der Menubildschirm automatisch regeneriert. Auch die entsprechenden Hinweise in der Fußzeile werden natürlich automatisch gesetzt. #ib#5.7 Die Alternativentscheidung#ie# ('#ib#menualternative#ie#') Im letzten Kapitel haben wir Ihnen die Prozeduren 'menuyes' und 'menuno' in Ihrer Wirkungsweise erläutert. Eigentlich sind die beiden Prozeduren nur ein (häufig benötigter) Spezialfall der Prozedur 'menualternative'. Die Funktionsweise der Proze­ dur 'menualternative' dürfte Ihnen schon aus dem 'Archivmenu' bekannt sein: Wenn Sie eine neue Zieltask einstellen, werden Ihnen nämlich vier Alternativen zur Auswahl angeboten (Archiv, Vatertask, PUBLIC, Sonstige Task). Auf unsere Textverarbeitung bezogen könnten wir z.B. vor der Zeilenformatierung (lineform) über die Alternativentscheidung den gewünschten Schrifttyp abfragen. Wir wollen dem Benutzer in diesem Beispiel fünf Schrifttypen (schmal, elite, pica, letter, groß) zur Auswahl anbieten: TEXT VAR schrifttyp; ... PROC schrifttyp waehlen: TEXT CONST info :: " Auswahl der Schrifttypen: "13""13"" + " s ... schmal (17 Zeichen pro Zoll) "13"" + " e ... elite (12 Zeichen pro Zoll) "13"" + " p ... pica (10 Zeichen pro Zoll) "13"" + " l ... letter (Proportionalschrift) "13"" + " g ... groß ( 5 Zeichen pro Zoll) ", liste :: "schmal"13"elite"13"pica"13"letter"13"groß", tasten :: "seplgSEPLG"; INT VAR auswahl := menualternative (info, liste, tasten, 5, TRUE); SELECT auswahl OF CASE 1, 101, 106: schrifttyp := "17" CASE 2, 102, 107: schrifttyp := "12" CASE 3, 103, 108: schrifttyp := "10" CASE 4, 104, 109: schrifttyp := "prop" CASE 5, 105, 110: schrifttyp := "5" OTHERWISE (* behalte alten Schrifttyp bei *) END SELECT END PROC schrifttyp waehlen; Hätten wir diese Prozedur in unsere Prozedur 'zeilen formatieren' eingebunden, so zeigte sich bei Aktivierung folgende Einblendung in den Menubildschirm: +---------------------------------------+ I I I Auswahl der Schrifttypen: I I I I s ... schmal (17 Zeichen pro Zoll) I I e ... elite (12 Zeichen pro Zoll) I I p ... pica (10 Zeichen pro Zoll) I I l ... letter (Proportionalschrift) I I g ... groß ( 5 Zeichen pro Zoll) I I I I schmal elite pica letter groß I I I +---------------------------------------+ Die Prozedur 'menualternative' besitzt insgesamt 5 Parameter. Wie Ihnen schon von von anderen Prozeduren bekannt ist, wird mit dem vorletzten (4.) Parameter die Position innerhalb des Menubildschirms bestimmt - hier also die Plazierung in die Mitte des Menubildschirms. Mit dem 5. Parameter können Sie noch festlegen, ob der Benutzer die Möglichkeit haben soll, die Alternativauswahl mit abzubrechen (bei TRUE, wie im Beispiel) oder eben nicht. Mit dem 1. Parameter wird der Informationstext festgelegt, der auf dem Bildschirm innerhalb der Box erscheinen soll. Für die Funktion der Alternativauswahl ist die­ ser Inhalt völlig belanglos - er dient ausschließlich der Information des Benutzers. Der Text kann - wie hier - z.B. durch eine Einteilung in Zeilen gestaltet werden (durch den Code "13"). Der Text in den Zeilen sollte nicht zu breit sein, da er noch in eine Box innerhalb des Menubildschirms hineinpassen muß! Damit es auch bei geschachtelten Menus zu keinen Problemen kommt, sollte eine Zeile nicht breiter als 64 Zeichen sein. Aber keine Angst: Sie können gs-DIALOG durch zu lange Texte nicht durcheinanderbrin­ gen - wenn Ihr Text zu breit ist, wird er rigoros abgeschnitten und einfach nicht angezeigt. Mit dem 2. Parameter übergeben Sie die Auswahlliste, die in der letzten Zeile der Box dargestellt wird. Hier dürfen insgesamt bis zu 10 Alternativen angegeben werden - bedenken Sie dabei aber unbedingt, daß diese Liste ebenfalls nicht zu lang werden darf (ebenfalls höchstens 64 Zeichen). Zwischen jeder von Ihnen notierten Alternative muß zur Kennung der Code "13" eingetragen werden - wie oben im Beispiel gezeigt. Da nachher in der Box zwischen den einzelnen Alternativen je drei Leerzeichen eingefügt werden, können Sie sich immer an der von Ihnen übergebenen Zeichenkette orientieren. Hat Ihre Auswahlliste nicht mehr als 64 Zeichen, dann ist sie in jedem Falle auf dem Bildschirm darstell­ bar. Über diese Auswahlliste erfolgt normalerweise die Auswahl. Mit den Cursortasten links und rechts kann der Benutzer auf die gewünschte Alternative positionieren (auf dem Bildschirm invers dargestellt) und dann die -Taste tippen. Die Prozedur 'menualternative liefert dann einen Zahlenwert, nämlich die Position der gewählten Alternative in der als 2. Parameter übergebenen Liste (wird in unse­ rem Beispiel die Alternative 'letter' gewählt, so liefert die Prozedur den Wert 4). Haben Sie den Abbruch durch zugelassen (5. Parameter), so wird im Falle eines solchen Abbruchs der Wert '0' geliefert. Mit dem 3. Parameter können Sie noch festlegen, über welche Tasten eine Auswahl erfolgen soll. Wenn Sie hier niltext ("") angeben, ist eine Auswahl über die Tasten nicht möglich. Im Beispiel haben wir hier die Anfangsbuchstaben der im Text ge­ nannten Schrifttypen gewählt und als Eingabe sowohl Klein- als auch Großbuchsta­ ben gestattet. Erfolgt nun die Auswahl über das Tippen einer zugelassenen Taste, dann wird Ihre Position in der im 3. Parameter übergebenen Zeichenkette ermittelt und der Wert '100' dazuaddiert. Tippt in unserem Falle der Benutzer die Taste , wird der Wert '109' geliefert. Es erfolgt übrigens kein Hinweis in der Fußzeile, ob eine Auswahl über das Tippen einer Taste möglich ist! Wenn Sie von der Möglichkeit Gebrauch machen, sollten Sie dieses durch die Gestaltung Ihres Informationstextes andeuten - wie wir es im Bei­ spiel auch getan haben. #ib#5.8 Die Menunotiz#ie# ('#ib#write menunotice#ie#', '#ib#erasemenunotice#ie#') Innerhalb des Menus können Sie für den Benutzer auch eine Notiz ablegen. Wir machen z.B. bei der Archivverwaltung Gebrauch davon. Dort wird nämlich ständig angezeigt, mit welcher Task kommuniziert wird und - sofern es sich um einen Ar­ chivmanager handelt - wie die (angemeldete) Diskette heißt. Wenn Sie z.B. dem Benutzer das aktuelle Datum im Menu anzeigen wollen, insertieren Sie die folgende Prozedur: PROC datum anzeigen: write menunotice ("Datum: " + date, 4) END PROC datum anzeigen; Die Prozedur 'write menunotice' besitzt zwei Parameter. Mit dem ersten Parameter wird der Text übergeben, der in der Box ausgegeben werden soll. Er unterliegt eben­ falls der gs-DIALOG-Syntax für Texte. Durch den zweiten Parameter wird wieder die Position innerhalb des Menus festgelegt (hier rechts unten: Position 4). Wenn Sie jetzt in Ihrer Menukarte die Prozedur 'oberbegriff  ("Bearbeiten")' in fol­ gender Weise abändern: oberbegriff ("Bearbeiten", "datum anzeigen", "erase menunotice") dann wird jedesmal, wenn das Pull-Down-Menu unter dem Oberbegriff 'Bearbeiten' aufgefaltet wird, unten rechts (Position 4) das aktuelle Datum in einer Box ange­ zeigt. Diese Notiz verschwindet, wenn in ein anderes Pull-Down-Menu gewechselt wird. Auf den ersten Eindruck scheinen die Prozeduren 'write menunotice' und 'menuinfo' gleich zu sein - das ist aber nicht der Fall: Bei 'menuinfo' wird der Text in einer Box ausgegeben und so lange gewartet, bis der Benutzer eine Taste getippt hat (oder die angegebene Zeit verstrichen ist). Bei 'write menunotice' wird ebenfalls ein Text in einer Box auf den Menubildschirm geschrieben. Diese Box bleibt aber über längere Zeit bestehen (auf Erscheinen und Verschwinden kann der Benutzer selbst keinen Einfluß nehmen!) - und zwar solange, bis die Notiz gelöscht wird (mit 'erase menu­ notice'; in unserem Beispiel, wenn das Pull-Down-Menu gewechselt wird) oder durch ein neues 'write menunotice' überschrieben wird. In einem Menu kann nämlich zu einem Zeitpunkt nur eine Menunotiz abgelegt werden. Wenn der Bildschirm durch gs-DIALOG-Prozeduren überschrieben wird, wird die Menunotiz ebenfalls ständig mitaufgefrischt, und auch, wenn Sie den Befehl 'regene­ rate menuscreen' oder 'refresh submenu' geben. #ib#5.9 Fußzeilen im Menu#ie# ('#ib#menufootnote#ie#', '#ib#oldmenufootnote#ie#') In den Fußzeilen innerhalb des Menus werden dem Benutzer Bedienhinweise ange­ zeigt. Die Fußzeile wird aber auch dazu benutzt, den Benutzer über Prozesse zu informieren, die im Hintergrund ablaufen - erst recht dann, wenn Sie einige Zeit in Anspruch nehmen. Sie zeigen dem Benutzer an, daß er nicht "unruhig" zu werden braucht, sondern das System "mit sich" beschäftigt ist. Im allgemeinen braucht sich der Programmierer um diese Fußnoten nicht zu küm­ mern, denn sie werden von den einzelnen Komponenten des Systems automatisch gesetzt. Wir können aber z.B. dem Benutzer einen Hinweis geben, wenn unter dem Menupunkt 'Verzeichnis' eine Liste erstellt wird. Die Prozedur könnte dann folgen­ dermaßen notiert werden: PROC verzeichnis ausgeben: menufootnote ("Bitte warten... Ich erstelle eine Dateiliste"); FILE VAR f :: sequential file (output, "Dateiliste"); list (f); modify (f); old menufootnote; entferne eigenen namen; zeige liste an; forget ("Dateiliste", quiet). entferne eigenen namen: TEXT VAR zeile :: ""; INT VAR i; FOR i FROM lines (f) DOWNTO 1 REP to line (f, i); read record (f, zeile); UNTIL pos (zeile, "Dateiliste") > 0 PER; delete record (f). zeige liste an: to line (f, 1); menuwindowshow (f) (* Sehen Sie Kapitel 5.11.1*) END PROC verzeichnis ausgeben; Beachten Sie, daß der Text nicht länger als 64 Zeichen ist, damit er auch bei ge­ schachtelten Menus vollständig ausgegeben werden kann. Sollte der Text dennoch zu lang sein, wird er vom System auf die entsprechende Länge gestutzt. Haben Sie mit 'menufootnote' eine eigene Fußzeile gesetzt, so können Sie die da­ durch gelöschte Zeile durch den Befehl 'old menufootnote' wieder hinschreiben. Ansonsten wird Ihre Fußzeile von der nächsten automatisch (d.h. vom System) ge­ setzten Fußnote überschrieben. In dem obigen Beispiel hätten Sie also gut auf den Befehl 'old menufootnote' verzichten können. Durch 'old menufootnote' wird die letzte Fußnote, die automatisch vom System ge­ setzt wurde, reproduziert. Der in der obigen Prozedur verwendete Befehl 'menuwin­ dowshow' ist bisher noch nicht erläutert. Sehen Sie dazu bitte das Kapitel 5.11.1. #ib#5.10 Wiederherstellung des Menubildschirms#ie# ('#ib#regenerate menuscreen#ie#','#ib#refresh submenu#ie#') Der Befehl 'regenerate menuscreen' ist Ihnen schon aus diversen Beispielprogram­ men dieses Handbuches bekannt. Ist der Menubildschirm "kaputtgeschrieben" oder der Bildschirm für andere Zwecke benutzt worden, so läßt sich durch diesen Befehl der Menubildschirm in seinem letzten Zustand reproduzieren (auch bei geschachtel­ ten Menus!). Durch den Befehl wird der Bildschirm gelöscht und komplett neu aufgebaut. Ein vollständiger Bildschirmaufbau ist aber gar nicht immer nötig. Wenn Sie sicher sind, daß durch Ihre Operationen nur der Bereich zwischen den beiden durchgezo­ genen Linien, die die Kopf- und Fußzeile abtrennen, betroffen ist, brauchen Sie nur den Befehl 'refresh submenu' zu geben. Hierdurch wird das aktuelle Pull-Down- Menu neu aufgebaut und - sofern gesetzt - die Menunotiz. Wenn möglich, ist er dem Befehl 'regenerate menuscreen vorzuziehen, da hierfür weniger Zeit benötigt wird und weniger "Unruhe" auf dem Bildschirm entsteht. Sorgen Sie aber unbedingt dafür, daß der von Ihnen benutzte Bildschirmbereich zuvor "gereinigt" wird, denn das besorgt 'refresh subnmenu' nicht! #ib#5.11 Arbeiten im Menufenster#ie# Neben den vorab aufgezeigten Möglichkeiten können Sie innerhalb des Menus auch noch ein Fenster öffnen. Innerhalb dieses Fensters stehen Ihnen alle Möglichkei­ ten zur Verfügung, die Sie auch sonst zum Beschreiben des gesamten Bildschirms haben - und noch einiges mehr. Wir machen z.B. intensiv beim Archivhandling Gebrauch davon. So werden Ihnen Verzeichnisse angezeigt, Sie können verfolgen, wie die einzelnen Dateien vom Archiv geholt werden oder dorthin geschrieben werden und einiges mehr. In diesem Kapitel wollen wir Ihnen die Möglichkeiten aufzeigen, die Sie innerhalb des Menufensters haben. Auf die Größe des Menufensters haben Sie keinen Einfluß, sie wird vom System ge­ setzt ("normales" Menu: 77 Zeichen breit und 20 Zeichen hoch; geschachteltes Menu: 71 Zeichen breit und 16 Zeichen hoch). Hierdurch ist sichergestellt, daß alle Operationen auch in geschachtelten Menus ohne Probleme ausführbar sind. Alle Prozeduren, die sich auf Aktionen im Menufenster beziehen, enthalten die Silbe 'menuwindow'. Sie können mit den hier beschriebenen Prozeduren ähnlich arbeiten, wie mit den entsprechenden Prozeduren ohne den Wortbestandteil 'menuwindow' auf dem ganzen Bildschirm. Allerdings gibt es einige Unterschiede, auf die Sie achten sollten! 5.11.1 Datei anzeigen/editieren ('#ib#menuwindowshow#ie#', '#ib#menuwindowedit#ie#') Von der Prozedur 'menuwindowshow (FILE VAR f)' haben wir im letzten Kapitel schon Gebrauch gemacht, um das Verzeichnis der Dateien in der Task innerhalb des Menus anzuzeigen. Die Prozedur gibt es in zwei Versionen mit je einem Parameter. Einmal kann, wie im vorigen Kapitel, ein FILE angegeben werden, andererseits kann auch der Name der anzuzeigenden Datei als Text übergeben werden ('menuwindow­ show (TEXT CONST dateiliste)'). Durch den Befehl wird innerhalb des Menus ein umrandetes Fenster geöffnet, in der das angegebene File/die Datei angezeigt wird. Bei 'menuwindowshow' kann die Datei nur eingesehen, nicht aber schreibend verändert werden. Die Prozedur 'menuwindowedit' gibt es ebenfalls in den zwei Ausprägungen. Sie verhält sich zur vorgenannten identisch - nur kann hier auch die Datei schreibend verändert werden. 5.11.2 Menufenster öffnen/anzeigen ('#ib#show menuwindow#ie#') Wenn Sie eigene Operationen in einem Fenster im Menu ausführen lassen wollen, muß dieses Fenster zunächst auf dem Bildschirm angezeigt werden. Durch den Befehl 'show menuwindow' wird ein entsprechender Rahmen innerhalb des Menus ausgegeben und der Bereich innerhalb dieses Rahmens (das Fenster) gelöscht. Auf die Größe des Fensters innerhalb des aktuellen Menus können Sie - wie bereits eingangs gesagt - keinen Einfluß nehmen. Zu einem Zeitpunkt kann immer nur ein Menufenster geöffnet sein, da das Fenster schon den größtmöglichen sinnvollen Bereich des aktuellen Menus belegt. Ein er­ neutes 'show menuwindow' hätte die gleiche Wirkung wie das nachfolgend beschrie­ bene 'menuwindowpage' - nur wird hier zusätzlich noch der Rahmen des Fensters mitausgegeben. 5.11.3 Menufenster löschen (putzen) ('#ib#menuwindowpage#ie#') Durch den Befehl 'menuwindowpage' wird das Fenster innerhalb des aktuellen Menus gelöscht; der Rahmen des Fensters bleibt bestehen, da er nicht mit zum ei­ gentlichen Fenster gehört. Durch den Befehl wird der Menubildschirm nicht(!) rekonstruiert! 5.11.4 Positionierungen im Menufenster ('#ib#menuwindowline#ie#', '#ib#menuwindowcursor#ie#') Mit 'menuwindowline' wird, wie auch sonst auf dem Bildschirm, an den Anfang der nächsten Zeile positioniert. Diesen Befehl gibt es, ebenso wie den Befehl 'line' (der auf dem Gesamtbildschirm operiert) ohne und mit einem Parameter. Durch 'menu­ windowline (3)' wird an den Anfang der "drittnächsten" Zeile innerhalb des Menu­ fensters positioniert. Aber Achtung! Der Befehl 'menuwindowline' weist einen deutlichen Unterschied zum Ihnen bekannten Befehl 'line' auf. Wird nämlich die untere Fenstergrenze überschrit­ ten, so rollt (scrollt) der Bildschirm nicht um die entsprechenden Zeilen nach oben, wie Sie es von 'line' gewohnt sind - statt dessen wird der Fensterinhalt gelöscht und wieder oben im Fenster zu schreiben begonnen. Es erscheint, als ob auf ein neues Fenster positioniert würde. Innerhalb des Fensters können Sie auch den Cursor positionieren, wie Sie es vom Bildschirm gewohnt sind - allerdings nur innerhalb der aktuell gültigen Grenzen. In einem Menu ist das Fenster 77 Zeichen breit und 20 Zeichen hoch; in einem ge­ schachtelten Menu 71 Zeichen breit und 16 Zeichen hoch. Wird außerhalb des aktuellen Menufensters positioniert, wird das Fenster gelöscht und die Fensterposition (1, 1) angenommen. 5.11.5 Informationen über die aktuelle Menu-Fenster position ('#ib#get menuwindowcursor#ie#', '#ib#remaining menuwindowlines#ie#') Mit der Prozedur 'get menuwindowcursor (INT VAR spalte, zeile)' kann die aktuelle Position des Cursors innerhalb des Menufensters erfragt werden. Die Prozedur hat zwei Parameter, die als 'INT VAR' deklariert sein müssen. Der erste Parameter enthält anschließend die aktuelle Spalte, der zweite die aktuelle Zeile. Mit der werteliefernden Prozedur 'remaining menuwindowlines' kann die Anzahl der noch verbleibenden Zeilen innerhalb des aktuellen Menufensters erfragt werden. Die Prozedur wurde deshalb zur Verfügung gestellt, weil der Fensterinhalt - im Gegensatz zum normalen Bildschirm - nicht gescrollt werden kann. So können Sie sich vorab informieren, ob der Text, der von Ihnen ausgegeben werden soll, noch Platz findet, so daß während der Ausgabe nicht plötzlich der Fensterinhalt gelöscht wird. 5.11.6 Ausgabe/Eingabe innerhalb des Menufensters ('#ib#menuwindowout#ie#', '#ib#menuwindowget#ie#', '#ib#menuwindoweditget#ie#', '#ib#menuwindowyes#ie#', '#ib#menuwindowno#ie#') Innerhalb des Menufensters können mit der Prozedur 'menuwindowout' Texte ausge­ geben werden - die Prozedur hat einen TEXT-Parameter. Sollen INTEGER- oder REAL- Werte ausgegeben werden, so müssen diese Werte zuerst in Texte konvertiert werden. Bitte beachten Sie unbedingt, daß innerhalb des Fensters nicht gescrollt wird und auch kein Zeilenumbruch stattfindet! Ist ein Text länger als die verbleibende Restzei­ le, so wird der Text bis zum Fensterende ausgegeben und die Ausgabe am Anfang der nächsten Zeile fortgesetzt. So ist sichergestellt, daß in keinem Falle die Fenstergren­ zen überschritten werden. Sobald die letzte Position des aktuellen Menufensters beschrieben ist (unten rechts in der Fensterecke), wird der Fensterinhalt komplett gelöscht und die Ausgabe in der ersten Zeile des "neuen" Fensters fortgesetzt. Auf Zeilenumbruch und Scrolling wurde verzichtet, da der Realisierungsaufwand dafür zu hoch gewesen wäre. Mit der Prozedur 'menuwindowget (TEXT VAR text)' können Sie auch Texte innerhalb des Menufensters einlesen - INTEGER-/ REAL-Werte müssen ggf. von Hand konvertiert werde. Die Eingabe wird durch abgeschlossen. Es muß mindestens ein Zeichen (ungleich Leerzeichen) eingegeben werden. Von der Eingabe werden die führenden Leerzeichen abgeschnitten. Ist der einzugebende Text länger als die noch verbleibende Restzeile, so wird der Text in der Restzeile gescrollt. Sind in der aktuellen Zeile weniger als 7 Zeichen für die Eingabe vorhanden, so wird automatisch für die Eingabe an den Anfang der nächsten Zeile positioniert. Ab gs-DIALOG-Version 1.1 steht auch die Prozedur 'menuwindoweditget (TEXT VAR text)' zur Verfügung, durch die ein Text zum Editieren vorgegeben werden kann. Es ist allerdings darauf zu achten, daß der Text in jedem Falle initialisiert wird! Die beiden Prozeduren 'menuwindowyes' und 'menuwindowno' ähneln den Ihnen bekannten Prozeduren 'yes' und 'no'. Sie operieren nur auf dem Menufenster. Be­ denken Sie aber bitte, daß, wenn bei der Ausgabe des Textes die Fenstergrenze über­ schritten wird, der Resttext in der nächsten Zeile ausgegeben wird. Wird dabei sogar die untere Fenstergrenze überschritten, so wird der komplette Fensterinhalt gelöscht und die Ausgabe in der linken oberen Ecke des "neuen Fensters" fortgesetzt! 5.11.7 Weiter Prozeduren ('#ib#menuwindowcenter#ie#', '#ib#menuwindowstop#ie#') Es werden noch zwei weitere Prozeduren für das Menufenster zur Verfügung gestellt, die bei der Programmentwicklung ganz nützlich sein können. Mit 'menuwindowcenter (TEXT CONST text)' werden vor und hinter dem übergebe­ nen Text so viele Leerzeichen angefügt, daß der Text zentriert in der Menufenster-Zei­ le ausgegeben wird. Bevor Sie den Text mit 'menuwindowout' ausgeben, müssen Sie an den Anfang einer Zeile positionieren, denn die Anzahl der vorangestellten Blanks wird unter Annahme dieser Zeilenposition ermittelt! Innerhalb der Zeile werden ggf. vorhandene Texte überschrieben. Durch die Prozedur 'menuwindowstop' wird an den Anfang der übernächsten Zeile positionert und der Text 'Zum Weitermachen bitte irgendeine Taste tippen!' ausgege­ ben. Danach wird so lange gewartet, bis eine Taste getippt wird. Mit 'menuwindow­ stop (INT CONST zeilenzahl) kann auch noch die Anzahl der Zeilen bestimmt wer­ den, die vorwärtspositioniert werden soll (Standard: 2 Zeilen). #ib#5.12 Festlegung der Boxpositionen innerhalb des Menus#ie# In vielen Fällen kann der Programmierer noch entscheiden, an welcher Position innerhalb des Menus die Box erscheinen soll (z. B. bei 'menuanswer', 'menuinfo', 'menuyes', 'menuno', 'menunotice' etc.). Die Positionen sind von 1 bis 5 durchnu­ meriert und haben folgende Bedeutung: +----------------------------------------+ I I +----------------------------------------+ I I I +-----+ +-----+ I I I 1 I I 2 I I I +-----+ +-----+ I I I I +-----+ I I I 5 I I I +-----+ I I I I +-----+ +-----+ I I I 3 I I 4 I I I +-----+ +-----+ I I I +----------------------------------------+ I I +----------------------------------------+ #page# #ib#5.13 gs-DIALOG-Syntax (Regeln zur Erstellung von Texten)#ie# Werden Texte als Parameter übergeben, die in einer Box ausgegeben werden sollen, so kann dieser Text durch Einfügen von Steuerzeichen noch gestaltet werden, z.B. kann der Programmierer so den Zeilenaufbau bestimmen. Das System analysiert den eingegebenen Text. Jedesmal, wenn innerhalb des Textes der Code "13" erscheint, wird innerhalb der Box auf den nächsten Zeilenanfang positioniert. So ist eine Einteilung eines Textes in Zeilen leicht möglich. Soll eine Leerzeile eingefügt werden, so geben Sie einfach zweimal den Code "13" ("13""13"). Bei der Textanalyse wird die jeweilige Zeilenlänge vermerkt. Die Box wird vom System gerade so breit gewählt, daß die längste vorkommende "Zeile" im Text gerade noch in die Box paßt. Aber Vorsicht! Die jeweilige Box kann innerhalb des Menus nur eine Maximalgröße annehmen (64 Zeichen breit und 14 Zeilen hoch). Wird von einer "Zeile" diese Maximalgröße überschritten, so wird die Zeile abgeschnitten und nur bis zur Maxi­ malbreite der Box ausgegeben. Ein Text für eine solche Box könnte z.B. so aussehen: menuinfo (" Informationstexte "13" sind meist"13" zu lang!") das ergibt folgende Ausgabe in der Box: +-----------------------+ I I I Informationstexte I I sind meist I I zu lang I I I +-----------------------+ Es ist auch möglich, in solchen Texten Textpassagen invers darzustellen. Dazu wer­ den in den Text die Codes zum Ein- ("15") und Ausschalten ("14") der Markierung eingefügt. Solche markierten Textpassagen dürfen aber nicht über interne Zeilen­ grenzen (Code "13") hinausgehen. Sie müßten dann am Zeilenende aus- und am nächsten Zeilenanfang wiedereingeschaltet werden. Soll in der obigen Box das Wort 'Informationstexte' invers dargestellt werden, so wäre z.B. folgendes Kommando zu geben: menuinfo (" "15"Informationstexte"14" "13"" + " sind meist"13" zu lang!") #ib#5.14 Thesaurushandling#ie# Neben den allgemein zur Verfügung gestellten Thesaurusoperationen stellt gs-DIALOG einige weitere bereit. Mit der Prozedur 'THESAURUS PROC #ib#infix namen#ie# (THESAURUS CONST thes, TEXT CONST infix)' werden aus allen Dateinamen des angegebenen Thesaurus die herausgefiltert, die den Wortbestandteil 'infix' enthalten - und zwar gleichgültig, an welcher Position! Die herausgefilterten Dateinamen werden in einem Thesaurus geliefert. Im Programmsystem 'gs-Herbert und Robbi' mach­ en wir z.B. Gebrauch davon, wenn wir nur die Landschaften der eigenen Task zur Auswahl anbieten wollen: THESAURUS VAR thes :: infix namen (ALL myself, "Flaeche:") Daneben gibt es eine ähnliche Prozedur, mit der man die Dateien eines bestimmten Dateityps herausfiltern kann. Mit THESAURUS VAR thes :: infix namen (ALL myself, 1003) werden alle Dateien mit dem Typ '1003' (normale Textfiles) herausgefiltert. Neben den beiden gibt es auch noch eine Prozedur, die beide Fälle miteinander koppelt: THESAURUS VAR thes :: infix namen (ALL myself, "gs-MENUKARTE:", 1954) Mit der folgenden Prozedur: THESAURUS VAR thes :: #ib#ohne praefix#ie# (ALL myself, "Flaeche:") wird aus den Dateinamen im angegebenen Thesaurus jeweils der führende Wortbe­ standteil entfernt. Wir machen z.B. in gs-Herbert und Robbi davon Gebrauch, um die Landschaften/Arbeitsfelder anbieten zu können, ohne jeweils den Wortbestandteil 'Flaeche:' miterscheinen zu lassen. Ganz nützlich ist auch noch die folgende Informationsprozedur '#ib#not empty#ie# (THESAURUS CONST thes)', mit der man z.B. feststellen kann, ob eine Auswahl ohne Ankreuzen oder mit abgebrochen wurde: PROC zeilen formatieren: TEXT CONST kopf :: "Textdateien zeilenweise formatieren", hinweis :: "Bitte gewünschte Dateien ankreuzen"; THESAURUS VAR dateinamen := menusome (ALL myself, kopf, hinweis, FALSE); IF not empty (dateinamen) THEN cursor on; formatiere dateien; cursor off; FI; regenerate menuscreen. formatiere dateien: INT VAR zaehler; FOR zaehler FROM 1 UPTO highest entry (dateinamen) REP IF name (dateinamen, zaehler) <> "" THEN lineform (name (dateinamen, zaehler)) FI PER END PROC zeilen formatieren; #ib#5.15 Aktivieren und Deaktivieren von Menupunkten#ie# Daß Verarbeitungsfunktionen aktiviert und deaktiviert werden können, haben Sie schon in unserem Archiv-Pull-Down-Menu gesehen. Deaktivierte Menupunkte sind durch ein vorgestelltes '-'-Zeichen gekennzeichnet; diese Menufunktionen werden übersprungen, wenn Sie versuchen, darauf zu positionieren. Zur Aktivierung und Deaktivierung von Menupunkten stehen die Prozeduren '#ib#activate#ie# (TEXT CONST menupunktname)' und '#ib#deactivate#ie# (TEXT CONST menupunktname)' zur Verfügung. Zu beachten ist, daß diese Prozeduren nicht ständig aufrufbar sind - der jeweils angegebene 'menupunktname' muß sich nämlich auf das aktuelle Pull- Down-Menu beziehen! Als Menupunktname muß jeweils der Name angegeben wer­ den, der bei der entsprechenden Menufunktion als 2. Parameter übergeben wurde. Ist der angegebene 'menupunktname' im aktuellen Pull-Down-Menu nicht enthalten, so wird die Anweisung ignoriert! Auch bei den Prozeduren' activate (INT CONST punktnummer)' und 'deactivate (INT CONST punktnummer)' gilt diese Einschränkung. Die beiden Prozeduren arbeiten schneller als die eben aufgezeigten, denn es muß im aktuellen Pull-Down-menu nicht mehr nach der jeweiligen Position gesucht werden. Die Positionen werden von oben nach unten durchgezählt. Beachten Sie aber unbedingt, daß die Trennlinien mitgezählt werden müssen! Die Prozeduren "zeigen nur dann Wirkung", wenn sie von einer Verarbeitungsfunk­ tion des aktuell entfalteten Pull-Down-Menus aus aufgerufen werden (das geschieht im Archivmenu z.B. aus den beiden Menufunktionen 'Reservieren' und 'Initialisieren' heraus) oder wenn Sie beim Einstieg in ein Pull-Down-Menu bzw. beim Ausstieg daraus aufgerufen werden; d.h. aus einer Prozedur heraus, die bei 'oberbegriff' als 2./3. Parameter in das Menukarten-Generierungsprogramm eingetragen ist. Beim Archiv-Pull-Down-Menu besorgt das die Prozedur 'menu archiv grundeinstellung' (sehen Sie dazu auch Kapitel 6.1).