#block##pageblock# #pagenr("%",1)##setcount(1)##count per page# #headeven# gs-Menu-Generator #center#____________________________________________________________ #end# #headodd# #right#gs-Menu-Generator #center#____________________________________________________________ #end# #bottomeven# #center#____________________________________________________________ 7 - % #right#ERGOS #end# #bottomodd# #center#____________________________________________________________ ERGOS #right# 7 - % #end# #ib#7  Eigene Fenster und Fensteroperationen #ie# In Kapitel 5.11 haben wir Ihnen gezeigt, wie Sie innerhalb des Menus ein Fenster (das Menufenster) öffnen können. Innerhalb dieses Bereichs stehen Ihnen die wesentlichen Ein- und Ausgabeoperationen zur Verfügung, die Sie auch sonst vom Bildschirm her kennen. Auf die Größe des Menufensters können Sie allerdings keinen Einfluß nehmen, da die Fenstergröße automatisch vom System (gs-DIALOG) festge­ legt wird - je nachdem, ob Sie mit einem Menu oder mit geschachtelten Menus arbeiten. Auf die Einschränkungen bzw. Abweichungen gegenüber den Möglichkeiten, die Sie bei Benutzung des ganzen Bildschirms haben, haben wir Sie ausdrücklich hingewie­ sen: So ist es nicht möglich, den Text innerhalb eines Fensters zu rollen (scrolling); statt dessen wird bei Überschreiten der unteren Fenstergrenze der Fensterinhalt gelöscht und die Ausgabe oben im "neuen" Fenster fortgesetzt. Als wir gs-DIALOG konzipierten und die ersten Anwendungen unter dieser Benutzer­ schnittstelle entwarfen, fiel uns auf, daß es sehr günstig für die Strukturierung des Bildschirms innerhalb der Anwendungsprogramme ist, wenn man den Bildschirm in Bereiche (Fenster) einteilen und den Fenstern entsprechende Funktionen zuweisen kann (z.B. Eingabe-, Informations-, Kontroll-Fenster etc.). Sinnvoll ist es dann, auch die entsprechenden Ein-/Ausgaberoutinen zur Verfügung zu haben, die sich auf die einzelnen Fenster beziehen. In diesem Kapitel werden wir Ihnen zeigen, wie Sie eigene Fenster definieren und darin Ein- und Ausgaben realisieren können. Für die Fenster gelten die gleichen Einschränkungen wie für das Menufenster - d.h. ein Rollen des Textes (scrolling) ist nicht möglich. Die Fensterposition und -größe innerhalb des Bildschirms können Sie aber festlegen. #ib#7.1 Definition von Fenstern ('window')#ie# Das Fensterkonzept in gs-DIALOG ist sehr einfach gehalten: Durch die Definition des Fenters werden nur Bereiche auf dem Bildschirm festgelegt, auf die sich bestimmte Ein-/Ausgabeprozeduren beziehen. Wir wollen Ihnen die Verwendung von Fenstern wieder an einem kleinen Beispiel verdeutlichen - bleiben wir dazu bei unserer Textverarbeitung: Für die Seitenforma­ tierung müßte der Benutzer den oberen und linken Rand, die Schreibfeldbreite und die Schreibfeldlänge festlegen. Dazu wollen wir dem Benutzer die aktuellen Werte anzeigen und ggf. eine Neueinstellung vornehmen lassen. Ein Programm dazu könnte so aussehen: WINDOW VAR info :: window ( 2, 2, 32, 9), frage :: window (36, 2, 40, 3), daten :: window (36, 7, 40, 4); TEXT VAR oberer rand :: " 2.54", linker rand :: " 2.54", feldbreite :: "16.00", feldlaenge :: "24.50"; zeige aktuelle werte an; frage nach neueinstellung. zeige aktuelle werte an: page; show (info); out (info, center (info, invers ("Aktuell eingestellte Werte:"))); cursor (info, 2, 4); out (info, "Oberer Rand : " + oberer rand + " cm"); cursor (info, 2, 5); out (info, "Linker Rand : " + linker rand + " cm"); cursor (info, 2, 7); out (info, "Schreibfeldbreite : " + feldbreite + " cm"); cursor (info, 2, 8); out (info, "Schreibfeldlänge : " + feldlaenge + " cm"). frage nach neueinstellung: show (frage); cursor (frage, 1, 1); out (frage, center (frage, invers ("Papierformat einstellen:"))); cursor (frage, 2, 3); IF yes ("Neueinstellung vornehmen") THEN neue werte erfragen FI. neue werte erfragen: show (daten); erfrage oberen rand; erfrage linken rand; erfrage feldbreite; erfrage feldlaenge. erfrage oberen rand: REAL VAR neuer oberer rand; cursor (daten, 1, 1); out (daten, center (daten, invers ("Oberen Rand einstellen:"))); cursor (daten, 2, 3); out (daten, "Bitte den neuen Wert: "); get (daten, neuer oberer rand); oberer rand := text (neuer oberer rand, 5, 2); cursor (info, 23, 4); out (info, oberer rand). erfrage linken rand: (* analog zu 'erfrage oberen rand *). erfrage feldbreite: (* analog zu 'erfrage oberen rand *). erfrage feldlaenge: (* analog zu 'erfrage oberen rand *). Am Anfang des Programms werden drei Fenster definiert. Das "Infofenster" erscheint links oben auf dem Bildschirm, in ihm werden die aktuell eingestellten Werte ange­ zeigt. Das "Fragefenster" erscheint neben dem ersten Fenster oben rechts auf dem Bildschirm. Beantwortet der Benutzer die dort ausgegebene Frage 'Neueinstellung vornehmen (j/n)?' mit 'ja', dann erscheint unter dem zweiten Fenster ein drittes ("Datenfenster"). Innerhalb dieses Fensters können nacheinander die neuen Werte eingelesen werden (nicht alle Prozeduren sind hier ausgeführt!). Die Definition eines Fensters erfolgt in folgender Weise: #ib#WINDOW#ie# VAR fenstername :: #ib#window#ie# ( x, y, xsize, ysize); Der Fenstervariablen wird durch 'window' eine Größe zugeordnet. Mit den ersten beiden Werten legen Sie die linke obere Ecke des Fensters ('x' bezeichnet die Spalten, 'y' die Zeilen) auf dem Gesamtbildschirm fest. Mit 'xsize' bestimmen Sie die Fenster­ breite (Spaltenzahl), mit 'ysize' die Höhe des Fensters (Zeilenzahl). Der Fenster­ cursor hat die Position (1,1). Die linke obere Ecke des ersten Fensters im Programm hat also die Position ( 2, 2). Das Fenster ist 32 Spalten breit und 9 Zeilen hoch; es kann unter dem Namen 'info' angesprochen werden. Bei der Festlegung der Fenstermaße ist der Rahmen des Fensters nicht berücksich­ tigt - er gehört nicht zum Fenster dazu! Haben Sie die Absicht, das Fenster mit Rahmen auszugeben, dann sollten Sie das bei der Fensterdefinition berücksichtigen. Wir haben es im Beispielprogramm auch gemacht: Die linke obere Ecke hat gerade die Position (2,2) erhalten, damit noch der Rahmen Platz hat. Mit Rahmen ist unser Fenster also 34 Spalten breit und 11 Zeilen hoch. Die linke obere Ecke des zweiten Fensters ('frage') legen wir deshalb in die 36. Spalte und 2. Zeile, damit auch hier Platz für den Rahmen bleibt. Eine wichtige Einschränkung sollten Sie unbedingt berücksichtigen: Da manche Terminals mit Beschreiben der Position (80,24) automatisch den Bildschirm löschen, haben wir die maximale Ausdehnung eines umrandeten Fensters auf (2, 2, 77, 22) festgelegt. Überschreiten Sie irgendwo diese Grenzen, dann wird kein Rah­ men mehr erzeugt. Der Rahmen wird auch dann nicht erzeugt, wenn er in der 0. Zeile, 0.Spalte, 25 Zeile oder 80 Spalte zu liegen käme - erst recht natürlich nicht, wenn diese Werte noch unter- bzw. überschritten werden. #ib#7.2 Anzeigen/Löschen von Fenstern#ie# ('#ib#show#ie#', '#ib#page#ie#', '#ib#erase#ie#', '#ib#out frame#ie#') Mit dem Befehl 'show (WINDOW VAR w)' wird das Fenster 'w' angezeigt. Der Fenster­ variablen müssen natürlich zuvor die Maße des Fensters zugewiesen sein. Durch den Befehl wird um den angegebenen Fensterbereich ein Rahmen gezogen und der "Innenbereich" des Fensters gelöscht. Möchten Sie das Fenster ohne Rahmen ange­ zeigt haben, so verwenden Sie nur den Befehl 'page (WINDOW VAR w)'. Durch die­ sen Befehl wird nur der "Innenbereich" des Fensters gelöscht. Haben Sie das Fenster einmal mit 'show' ausgegeben und wollen den Fensterinhalt löschen, so verwenden Sie auch hier den Befehl 'page (WINDOW VAR w)', denn der Rahmen braucht ja nicht erneut ausgegeben zu werden. Möchten Sie ein Fenster und den zugehörigen Rahmen löschen, dann steht Ihnen der Befehl 'erase (WINDOW VAR w) zur Verfügung: Durch den Befehl wird sowohl der "Innenbereich" des Fensters als auch der Rahmen gelöscht. Sie können natürlich auch selbst einen Rahmen um ein Fenster setzen. Dafür steht der Befehl 'out frame (WINDOW VAR w)' zur Verfügung. Der Rahmen wird ebenfalls um den durch 'w' bestimmten Fensterbereich gezogen - der "Innenbereich" bleibt unberührt! Sollten Sie ein Fenster mit dem Befehl 'show' ausgeben (oder mit 'out frame' einen Rahmen erzeugen) wollen, aber kein Rahmen auf dem Bildschirm erscheint, so haben Sie die zulässigen Fenstergrenzen überschritten. Sehen Sie dazu auch Kapitel 7.1. #ib#7.3 Operationen innerhalb des Fensters#ie# Innerhalb des selbstdefinierten Fensters stehen Ihnen die gleichen Operationen zur Verfügung wie innerhalb des Menufensters. Bezieht sich eine Operation auf ein Fenster, so wird der interne Fensterbezeichner als erster Parameter übergeben. #ib#7.3.1 Datei anzeigen/editieren #ie#('#ib#edit#ie#', '#ib#show#ie#') Zum Anzeigen einer Datei steht die Prozedur 'show' zur Verfügung. Dabei kann einmal ein FILE angegeben werden ('show (WINDOW VAR w, FILE VAR f)') oder aber der Name der anzuzeigenden Datei ('show (WINDOW VAR w, TEXT VAR dateiname)'). Die Datei kann nur eingesehen, nicht aber schreibend verändert werden. Die Prozedur 'edit' gibt es ebenfalls in den zwei Ausprägungen. Hier kann die Datei im Gegensatz zu 'show' auch schreibend verändert werden. Durch diesen Befehl wird jeweils innerhalb des angegebenen Fensters die Datei ausgegeben. Sofern die Lage des Fensters es zuläßt, wird automatisch ein Rahmen um das Dateifenster gezogen. #ib#7.3.2 Positionierungen im Fenster#ie# ('#ib#cursor#ie#', '#ib#get cursor#ie#', '#ib#line#ie#', '#ib#remaining lines#ie#') Mit 'cursor (WINDOW VAR w, INT CONST spalte, zeile)' können Sie den Cursor inner­ halb des angegebenen Fensters positionieren. Werden dabei die Fenstergrenzen über- oder unterschritten, so wird der Fensterinhalt gelöscht und auf die Position (1, 1) innerhalb des Fensters positioniert. Mit der Prozedur 'get cursor (WINDOW VAR w, INT VAR spalte, zeile)' können Sie die aktuelle Cursorposition innerhalb des angegebenen Fensters erfragen. Wollen Sie an den Anfang der nächsten Zeile positionieren, dann verwenden Sie den Befehl 'line (WINDOW VAR w)' - wollen Sie gleich mehrere Zeilen vorwärtspositionie­ ren, dann benutzen Sie den Befehl 'line (WINDOW VAR w, INT VAR anzahl zeilen)'. Wird allerdings bei einem der beiden letzten Befehle die untere Fenstergrenze über­ schritten, so wird der Fensterinhalt gelöscht und die Operation in der ersten Zeile des neuen Fensters fortgesetzt. Die Informations-Prozedur 'remaining lines (WINDOW VAR w)' liefert Ihnen die Anzahl der unterhalb der aktuellen Zeile noch im Fenster vorhanden Zeilen. #ib#7.3.3 Ein- und Ausgaben innerhalb des Fensters#ie# ('#ib#out#ie#', '#ib#put#ie#', '#ib#putline#ie#', '#ib#get#ie#', '#ib#getline#ie#', '#ib#yes#ie#', '#ib#no#ie#') Mit der Prozedur 'out (WINDOW VAR w, TEXT CONST text)' können Sie einen Text innerhalb des angegebenen Fensters ausgeben. Paßt der Text nicht mehr in die aktuelle Zeile, so wird er in der nächsten Zeile fortgesetzt. Bedenken Sie, daß innerhalb der Fenster kein Wortumbruch realisiert ist. Ebenso­ wenig ist das Rollen (scrolling) des Fensterinhalts möglich: Erfolgt die Ausgabe eines Textes über die untere Fenstergrenze hinaus, so wird der Fensterinhalt gelöscht und die Ausgabe an der Position (1, 1) des Fensters fortgesetzt. Zur Ausgabe von Texten stehen noch die beiden Prozeduren 'put (WINDOW VAR w, TEXT CONST text)' und 'putline (WINDOW VAR w, TEXT CONST text)' zur Verfügung. Bei erstgenannter Prozedur wird gegenüber 'out' an die Ausgabe noch ein Leerzei­ chen angehängt, bei der zweiten wird zusätzlich an den Anfang der nächsten Zeile positioniert. Zahlenwerte können mit den Prozeduren 'put (WINDOW VAR w, INT CONST intwert)' und 'put (WINDOW VAR w, REAL CONST realwert)' ausgegeben werden. An die Zahlenwerte wird jeweils ein Leerzeichen angehängt. Für das Einlesen von Werten steht die Prozedur 'get' in mehreren Varianten zur Verfügung. Mit 'get (WINDOW VAR w, TEXT VAR text)' kann ein Text an der aktuellen Position des Fensters eingelesen werden. Stehen in der aktuellen Zeile des Fensters weniger als 5 Zeichenpositionen für die Eingabe zur Verfügung, so wird automatisch auf den Anfang der nächsten Zeile innerhalb des Fensters positioniert. Über einen dritten Parameter können noch zusätzliche Festlegungen getroffen wer­ den: Soll die Eingabe noch durch weitere Zeichen (außer Positionierungszeichen) abgeschlossen werden können, so werden die Zeichen als TEXT übergeben( 'get (WINDOW VAR w, TEXT VAR text, TEXT CONST separator)'), soll die Maximallänge des einzugebenden Textes festgelegt sein, so wird diese als INT übergeben ('get (WINDOW VAR w, TEXT VAR text, INT CONST laenge)'). Mit den Prozeduren 'get (WINDOW VAR w, INT VAR intwert)' und 'get (WINDOW VAR w, INT VAR realwert)' können auch Zahlenwerte innerhalb des Fensters eingelesen werden. Damit dem Anwender auch Vorschläge für der Eingabe gemacht werden können, steht die Prozedur 'editget' in zwei Variationen zur Verfügung. Bei 'editget' (WINDOW VAR w, TEXT VAR ausgabe) wird 'ausgabe zum Editieren ausgegeben. Daneben existiert noch ein 'editget' mit 7 Parametern, der detailliert bei der Zusammenstel­ lung der Befehle erläutert ist. Ebenso wie auf dem Gesamtbildschirm und innerhalb des Menufensters stehen auch hier die beiden Prozeduren 'yes (WINDOW VAR w, TEXT CONST frage)' und 'no (WINDOW VAR w, TEXT CONST frage)' zur Verfügung. #ib#7.3.4 Weitere Prozeduren #ie#('#ib#center#ie#', '#ib#stop#ie#') Mit 'center (WINDOW VAR w, TEXT CONST text)' werden vor dem angegebenen Text so viele Leerzeichen angehängt, daß der Text zentriert in der aktuellen Fensterzeile ausgegeben wird - wenn der Cursur bei der Ausgabe auf der ersten Position der Zeile steht. Dabei werden aber bereits vorhandene Zeileninhalte überschrieben. Durch die Prozedur 'stop (WINDOW VAR w)' wird innerhalb des angegebenen Fen­ sters an den Anfang der übernächsten Zeile positioniert und der Text " Zum Weiter­ machen bitte irgendeine Taste tippen!" ausgegeben. Möchten Sie nicht an den Anfang der übernächsten Zeile positionieren, so können Sie die Anzahl der Zeilen auch explizit festlegen durch 'stop (WINDOW VAR w, INT CONST zeilenzahl). #ib#7.4 Boxoperationen#ie# Innerhalb des Menufensters (sehen Sie Kapitel 5) stehen Ihnen die Prozeduren 'menuanswer', 'menuinfo', 'menuone', 'menusome', 'menuanswerone', 'menuanswersome', 'menuyes', 'menuno', 'menualternative', 'write menunotice' und 'menufootnote' zur Verfügung. Alle diese Prozeduren bezogen sich auf das von gs-DIALOG automatisch gesetzte Menufenster. Auch innerhalb der von Ihnen selbst definierten Fenster können Sie auf ähnliche Prozeduren zurückgreifen. Da wir die eben genannten Prozeduren in Kapitel 5 sehr detailliert beschrieben haben, werden wir hier nur auf die entsprechenden Beschreibungen verweisen und ggf. die Besonderheiten/Abweichnungen erwähnen. Zu beachten ist, daß innerhalb des Fensters weder die oberen noch die unteren zwei Zeilen von der "Box" beschrieben werden. Die oberen bleiben ständig frei - die unter­ en werden zur Ausgabe der zugehörigen Benutzerinformation (Fußnote) benutzt - das sollten Sie bei der Festlegung der Fenstergröße bzw. bei der Länge der zu über­ gebenden Texte berücksichtigen. Bei der Übergabe der Texte müssen Sie sich an die gs-DIALOG Syntax-Regeln halten, die in Kapitel 5.12 beschrieben sind. Die Prozedur '#ib#boxanswer#ie# (WINDOW VAR w, TEXT CONST ausgabetext, antwortvorgabe, INT CONST position)' arbeitet wie die Prozedur 'menuanswer (TEXT CONST ausgabe­ text, antwortvorgabe, INT CONST position)' nur innerhalb des Fensters 'w' (sehen Sie auch Kapitel 5.1). Die Prozedur '#ib#boxinfo#ie#' gibt es in zwei Ausführungen: 'boxinfo (WINDOW VAR w, TEXT CONST text)' arbeitet wie 'menuinfo (TEXT CONST text)', allerdings auf dem angege­ benen Fenster. Bei 'boxinfo (WINDOW VAR w, TEXT CONST text, INT CONST position, timelimit)' kann über den dritten Parameter noch die relative Position im angegebe­ nen Fenster (sehen Sie dazu Kapitel 5.12) und über den vierten Parameter die Zeit­ spanne festgelegt werden, für die die Information erscheint (sehen Sie auch Kap. 5.2). Die Prozedur '#ib#boxone#ie# (WINDOW VAR w, THESAURUS CONST thesaurus, TEXT CONST text1, text2, BOOL CONST mit reinigung)' arbeitet wie die Prozedur 'menuone (THESAURUS CONST thesaurus, TEXT CONST text1, text2, BOOL CONST mit reini­ gung)'. Zu bedenken ist hier, daß die Auswahl innerhalb des Fensters Platz finden muß. Der Aufruf dieser Prozedur ist daher nur möglich, wenn das angegebene Fen­ ster mindestens 60 Spalten breit und 17 Zeilen hoch ist. Ansonsten kommt es zu einer Fehlermeldung (sehen Sie auch Kap. 5.3). Die Prozedur '#ib#boxsome#ie# (WINDOW VAR w, THESAURUS CONST thesaurus, TEXT CONST text1, text2, BOOL CONST mit reinigung)' arbeitet wie die Prozedur 'menusome (THESAURUS CONST thesaurus, TEXT CONST text1, text2, BOOL CONST mit reinigung)'. Hinsichtlich der Fenstergröße gelten die gleichen Einschränkungen wie bei 'boxone' (sehen Sie auch Kap. 5.4). Die Prozeduren '#ib#boxanswerone#ie#' und '#ib#boxanswersome#ie#' entsprechen den Prozeduren 'menuanswerone' und 'menuanswersome'; es wird nur zusätzlich jeweils als erster Parameter das aktuelle Fenster übergeben. Hinsichtlich der Fenstergröße gelten die gleichen Einschränkungen wie bei 'boxone' (sehen Sie auch Kap. 5.5). Die Prozeduren '#ib#boxyes#ie#', '#ib#boxno#ie#' und '#ib#boxalternative#ie#' entsprechen den Prozeduren 'menuyes', 'menuno' und 'menualternative'; es wird nur zusätzlich jeweils als erster Parameter das aktuelle Fenster übergeben (sehen Sie auch Kap. 5.6 und 5.7). Die Prozedur '#ib#boxnotice#ie#' unterscheidet sich von der Prozedur 'write menunotice' erheblich: Letztgenannte Prozedur hat zwei Parameter. Durch den ersten wird der Ausgabetext übergeben, mit dem zweiten wird die relative Position innerhalb des Menubildschirms festgelegt. Sowohl Text als auch Position werden vom System ge­ speichert. Bei jedem Neuaufbau eines Pull-Down-Menus oder des Menubildschirms wird die Notiz neu mitaufgebaut. Die Prozedur 'boxnotice (WINDOW VAR w, TEXT CONST text, INT CONST position, INT VAR x, y, xsize, ysize) dagegen hat sieben Parameter. Über den ersten wird das aktuel­ le Fenster festgelegt. Die beiden nächsten Parameter entsprechen den beiden Para­ metern von 'write menunotice'. Über die letzten vier Parameter werden die Posi­ tion/Maße der Box geliefert, die ja erst durch das Aussehen der übergebenen Texte festgelegt werden. Weder Text noch Position der Boxnotiz werden vermerkt. Wollen Sie die Notiz löschen, so verwenden Sie eine der Prozeduren '#ib#page#ie# (INT CONST x, y, xsize, ysize)' oder '#ib#page up#ie# (INT CONST x, y, xsize, ysize)'. Im ersten Falle erscheint es dem Betrachter, als ob die Box von oben nach unten "aufgerollt" würde, im zweiten Falle von unten nach oben. Mit den Prozeduren '#ib#out footnote#ie# (WINDOW VAR w, TEXT CONST text)' wird in der untersten Zeile des Fensters 'w' der angegebene Text ausgegeben. In der vorletzten Zeile des Fensters wird eine Trennlinie ausgegeben. Die Fußnote incl. der Trennline kann durch den Befehl '#ib#erase footnote#ie#' gelöscht werden.