From 724cc003460ec67eda269911da85c9f9e40aa6cf Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Fri, 30 Sep 2016 16:57:23 +0200 Subject: Add extracted sources from floppy disk images Some files have no textual representation (yet) and were added as raw dataspaces. --- doc/basic/basic handbuch.1 | 1075 +++++++++ doc/basic/basic handbuch.2 | 2441 ++++++++++++++++++++ doc/basic/basic handbuch.3 | 698 ++++++ doc/basic/basic handbuch.index | 232 ++ doc/dialog/gs-dialog handbuch.impressum | 89 + doc/dialog/gs-dialog-1 | 107 + doc/dialog/gs-dialog-2 | 215 ++ doc/dialog/gs-dialog-3 | 683 ++++++ doc/dialog/gs-dialog-4 | 672 ++++++ doc/dialog/gs-dialog-5 | 176 ++ doc/dialog/gs-dialog-Inhaltsverzeichnis | 45 + doc/dynamo/dynamo handbuch | 1826 +++++++++++++++ doc/dynamo/dynamo handbuch.index | 69 + doc/dynamo/dynamo handbuch.inhalt | 131 ++ doc/eudas/abb.1-1 | 94 + doc/eudas/abb.4-1 | 43 + doc/eudas/abb.4-2 | 46 + doc/eudas/abb.6-1 | 75 + doc/eudas/abb.6-2 | 77 + doc/eudas/abb.7-1 | 46 + doc/eudas/abb.9-1 | 41 + doc/eudas/abb.9-2 | 96 + doc/eudas/abb.9-3 | 113 + doc/eudas/abb.9-4 | 98 + doc/eudas/abb.9-5 | 51 + doc/eudas/bildergenerator | 25 + doc/eudas/eudas.hdb.1 | 267 +++ doc/eudas/eudas.hdb.10 | 510 ++++ doc/eudas/eudas.hdb.11 | 674 ++++++ doc/eudas/eudas.hdb.12 | 446 ++++ doc/eudas/eudas.hdb.13 | 757 ++++++ doc/eudas/eudas.hdb.14 | 724 ++++++ doc/eudas/eudas.hdb.15 | 286 +++ doc/eudas/eudas.hdb.16 | 350 +++ doc/eudas/eudas.hdb.2 | 178 ++ doc/eudas/eudas.hdb.3 | 515 +++++ doc/eudas/eudas.hdb.5 | 386 ++++ doc/eudas/eudas.hdb.6 | 394 ++++ doc/eudas/eudas.hdb.7 | 687 ++++++ doc/eudas/eudas.hdb.8 | 211 ++ doc/eudas/eudas.hdb.9 | 556 +++++ doc/eudas/eudas.hdb.inhalt | 133 ++ doc/eudas/eudas.hdb.macros | 80 + doc/eudas/eudas.hdb.titel | 99 + doc/eudas/eudas.hdb.vorwort | 89 + doc/eudas/eudas.ref.1 | 326 +++ doc/eudas/eudas.ref.10 | 406 ++++ doc/eudas/eudas.ref.11 | 347 +++ doc/eudas/eudas.ref.2 | 830 +++++++ doc/eudas/eudas.ref.3 | 270 +++ doc/eudas/eudas.ref.4 | 441 ++++ doc/eudas/eudas.ref.5 | 432 ++++ doc/eudas/eudas.ref.6 | 399 ++++ doc/eudas/eudas.ref.7 | 447 ++++ doc/eudas/eudas.ref.8 | 454 ++++ doc/eudas/eudas.ref.9 | 194 ++ doc/eudas/eudas.ref.fehler | 139 ++ doc/eudas/eudas.ref.inhalt | 120 + doc/eudas/eudas.ref.macros | 73 + doc/eudas/eudas.ref.proz | 205 ++ doc/eudas/eudas.ref.reg | 436 ++++ doc/eudas/eudas.ref.titel | 91 + doc/eudas/eudas.ref.vorwort | 81 + doc/eudas/ref.abb.1-1 | 42 + doc/eudas/register | 490 ++++ doc/eudas/uedas.hdb.4 | 686 ++++++ doc/graphic/Altes Handbuch - Teil 10 - Graphik | 831 +++++++ doc/graphic/GRAPHIK.book | 897 +++++++ doc/graphic/graphik beschreibung | 661 ++++++ ...Doku: gs-Herbert und Robbi - Inhaltsverzeichnis | 45 + .../A5 - Doku: gs-Herbert und Robbi - Kapitel 1 | 93 + .../A5 - Doku: gs-Herbert und Robbi - Kapitel 2 | 389 ++++ .../A5 - Doku: gs-Herbert und Robbi - Kapitel 3 | 199 ++ .../A5 - Doku: gs-Herbert und Robbi - Kapitel 4 | 1312 +++++++++++ .../A5 - Doku: gs-Herbert und Robbi - Kapitel 5 | 167 ++ .../A5 - Doku: gs-Herbert und Robbi - Kapitel 6 | 73 + .../gs-Herbert und Robbi handbuch.impressum | 87 + doc/lisp/lisp handbuch | 2260 ++++++++++++++++++ doc/menugenerator/menu-generator handbuch.1 | 100 + doc/menugenerator/menu-generator handbuch.2 | 87 + doc/menugenerator/menu-generator handbuch.3 | 155 ++ doc/menugenerator/menu-generator handbuch.4 | 424 ++++ doc/menugenerator/menu-generator handbuch.5 | 975 ++++++++ doc/menugenerator/menu-generator handbuch.6 | 235 ++ doc/menugenerator/menu-generator handbuch.7 | 367 +++ doc/menugenerator/menu-generator handbuch.8 | 1676 ++++++++++++++ .../menu-generator handbuch.impressum | 88 + doc/menugenerator/menu-generator handbuch.index | 258 +++ doc/menugenerator/menu-generator handbuch.inhalt | 72 + .../A5 - Doku: gs-MP BAP - Inhaltsverzeichnis | 50 + doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 1 | 119 + doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 2 | 302 +++ doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 3 | 237 ++ doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 4 | 638 +++++ doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 5 | 699 ++++++ doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 6 | 53 + doc/mp-bap/gs-MP BAP handbuch.impressum | 104 + doc/programming/programmierhandbuch.1 | 650 ++++++ doc/programming/programmierhandbuch.2a | 1845 +++++++++++++++ doc/programming/programmierhandbuch.2b | 1395 +++++++++++ doc/programming/programmierhandbuch.3 | 728 ++++++ doc/programming/programmierhandbuch.4 | 1692 ++++++++++++++ doc/programming/programmierhandbuch.5 | 1329 +++++++++++ doc/programming/programmierhandbuch.5b | 1481 ++++++++++++ doc/programming/programmierhandbuch.6 | 1441 ++++++++++++ doc/programming/programmierhandbuch.index | 449 ++++ doc/programming/programmierhandbuch.inhalt | 249 ++ doc/programming/programmierhandbuch.titel | 52 + doc/prolog/prolog handbuch | 581 +++++ doc/prozess/Anhang Prozess | 92 + doc/prozess/Inhalt Prozess | 84 + doc/prozess/gs-Prozess handbuch.impressum | 104 + doc/prozess/gs-Prozess-2 | 255 ++ doc/prozess/gs-Prozess-3 | 346 +++ doc/prozess/gs-Prozess-4 | 173 ++ doc/prozess/gs-prozess-1 | 99 + doc/prozess/gs-prozess-5 | 819 +++++++ doc/prozess/gs-prozess-6 | 641 +++++ doc/prozess/gs-prozess-7 | 1121 +++++++++ doc/prozess/gs-prozess-8 | 377 +++ doc/prozess/gs-prozess-9 | 477 ++++ doc/system/systemhandbuch.1 | 1685 ++++++++++++++ doc/system/systemhandbuch.2 | 1351 +++++++++++ doc/system/systemhandbuch.3 | 1366 +++++++++++ doc/system/systemhandbuch.4 | 1185 ++++++++++ doc/user/benutzerhandbuch.1 | 580 +++++ doc/user/benutzerhandbuch.2 | 443 ++++ doc/user/benutzerhandbuch.3 | 2019 ++++++++++++++++ doc/user/benutzerhandbuch.4 | 2242 ++++++++++++++++++ doc/user/benutzerhandbuch.5a | 1446 ++++++++++++ doc/user/benutzerhandbuch.5b | 1632 +++++++++++++ doc/user/benutzerhandbuch.5c | 711 ++++++ doc/user/benutzerhandbuch.5d | 211 ++ doc/user/benutzerhandbuch.5e | 223 ++ doc/user/benutzerhandbuch.6 | 474 ++++ doc/user/benutzerhandbuch.anhang | 484 ++++ doc/warenhaus/Anhang Warenhaus | 65 + doc/warenhaus/Inhalt Warenhaus | 50 + doc/warenhaus/gs-Warenhaus handbuch.impressum | 89 + doc/warenhaus/gs-Warenhaus-1 | 124 + doc/warenhaus/gs-Warenhaus-2 | 72 + doc/warenhaus/gs-Warenhaus-3 | 309 +++ doc/warenhaus/gs-Warenhaus-4 | 378 +++ doc/warenhaus/gs-Warenhaus-5 | 1468 ++++++++++++ doc/warenhaus/gs-Warenhaus-6 | 589 +++++ doc/warenhaus/gs-Warenhaus-7 | 235 ++ 146 files changed, 73079 insertions(+) create mode 100644 doc/basic/basic handbuch.1 create mode 100644 doc/basic/basic handbuch.2 create mode 100644 doc/basic/basic handbuch.3 create mode 100644 doc/basic/basic handbuch.index create mode 100644 doc/dialog/gs-dialog handbuch.impressum create mode 100644 doc/dialog/gs-dialog-1 create mode 100644 doc/dialog/gs-dialog-2 create mode 100644 doc/dialog/gs-dialog-3 create mode 100644 doc/dialog/gs-dialog-4 create mode 100644 doc/dialog/gs-dialog-5 create mode 100644 doc/dialog/gs-dialog-Inhaltsverzeichnis create mode 100644 doc/dynamo/dynamo handbuch create mode 100644 doc/dynamo/dynamo handbuch.index create mode 100644 doc/dynamo/dynamo handbuch.inhalt create mode 100644 doc/eudas/abb.1-1 create mode 100644 doc/eudas/abb.4-1 create mode 100644 doc/eudas/abb.4-2 create mode 100644 doc/eudas/abb.6-1 create mode 100644 doc/eudas/abb.6-2 create mode 100644 doc/eudas/abb.7-1 create mode 100644 doc/eudas/abb.9-1 create mode 100644 doc/eudas/abb.9-2 create mode 100644 doc/eudas/abb.9-3 create mode 100644 doc/eudas/abb.9-4 create mode 100644 doc/eudas/abb.9-5 create mode 100644 doc/eudas/bildergenerator create mode 100644 doc/eudas/eudas.hdb.1 create mode 100644 doc/eudas/eudas.hdb.10 create mode 100644 doc/eudas/eudas.hdb.11 create mode 100644 doc/eudas/eudas.hdb.12 create mode 100644 doc/eudas/eudas.hdb.13 create mode 100644 doc/eudas/eudas.hdb.14 create mode 100644 doc/eudas/eudas.hdb.15 create mode 100644 doc/eudas/eudas.hdb.16 create mode 100644 doc/eudas/eudas.hdb.2 create mode 100644 doc/eudas/eudas.hdb.3 create mode 100644 doc/eudas/eudas.hdb.5 create mode 100644 doc/eudas/eudas.hdb.6 create mode 100644 doc/eudas/eudas.hdb.7 create mode 100644 doc/eudas/eudas.hdb.8 create mode 100644 doc/eudas/eudas.hdb.9 create mode 100644 doc/eudas/eudas.hdb.inhalt create mode 100644 doc/eudas/eudas.hdb.macros create mode 100644 doc/eudas/eudas.hdb.titel create mode 100644 doc/eudas/eudas.hdb.vorwort create mode 100644 doc/eudas/eudas.ref.1 create mode 100644 doc/eudas/eudas.ref.10 create mode 100644 doc/eudas/eudas.ref.11 create mode 100644 doc/eudas/eudas.ref.2 create mode 100644 doc/eudas/eudas.ref.3 create mode 100644 doc/eudas/eudas.ref.4 create mode 100644 doc/eudas/eudas.ref.5 create mode 100644 doc/eudas/eudas.ref.6 create mode 100644 doc/eudas/eudas.ref.7 create mode 100644 doc/eudas/eudas.ref.8 create mode 100644 doc/eudas/eudas.ref.9 create mode 100644 doc/eudas/eudas.ref.fehler create mode 100644 doc/eudas/eudas.ref.inhalt create mode 100644 doc/eudas/eudas.ref.macros create mode 100644 doc/eudas/eudas.ref.proz create mode 100644 doc/eudas/eudas.ref.reg create mode 100644 doc/eudas/eudas.ref.titel create mode 100644 doc/eudas/eudas.ref.vorwort create mode 100644 doc/eudas/ref.abb.1-1 create mode 100644 doc/eudas/register create mode 100644 doc/eudas/uedas.hdb.4 create mode 100644 doc/graphic/Altes Handbuch - Teil 10 - Graphik create mode 100644 doc/graphic/GRAPHIK.book create mode 100644 doc/graphic/graphik beschreibung create mode 100644 doc/hamster/A5 - Doku: gs-Herbert und Robbi - Inhaltsverzeichnis create mode 100644 doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 1 create mode 100644 doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 2 create mode 100644 doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 3 create mode 100644 doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 4 create mode 100644 doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 5 create mode 100644 doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 6 create mode 100644 doc/hamster/gs-Herbert und Robbi handbuch.impressum create mode 100644 doc/lisp/lisp handbuch create mode 100644 doc/menugenerator/menu-generator handbuch.1 create mode 100644 doc/menugenerator/menu-generator handbuch.2 create mode 100644 doc/menugenerator/menu-generator handbuch.3 create mode 100644 doc/menugenerator/menu-generator handbuch.4 create mode 100644 doc/menugenerator/menu-generator handbuch.5 create mode 100644 doc/menugenerator/menu-generator handbuch.6 create mode 100644 doc/menugenerator/menu-generator handbuch.7 create mode 100644 doc/menugenerator/menu-generator handbuch.8 create mode 100644 doc/menugenerator/menu-generator handbuch.impressum create mode 100644 doc/menugenerator/menu-generator handbuch.index create mode 100644 doc/menugenerator/menu-generator handbuch.inhalt create mode 100644 doc/mp-bap/A5 - Doku: gs-MP BAP - Inhaltsverzeichnis create mode 100644 doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 1 create mode 100644 doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 2 create mode 100644 doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 3 create mode 100644 doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 4 create mode 100644 doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 5 create mode 100644 doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 6 create mode 100644 doc/mp-bap/gs-MP BAP handbuch.impressum create mode 100644 doc/programming/programmierhandbuch.1 create mode 100644 doc/programming/programmierhandbuch.2a create mode 100644 doc/programming/programmierhandbuch.2b create mode 100644 doc/programming/programmierhandbuch.3 create mode 100644 doc/programming/programmierhandbuch.4 create mode 100644 doc/programming/programmierhandbuch.5 create mode 100644 doc/programming/programmierhandbuch.5b create mode 100644 doc/programming/programmierhandbuch.6 create mode 100644 doc/programming/programmierhandbuch.index create mode 100644 doc/programming/programmierhandbuch.inhalt create mode 100644 doc/programming/programmierhandbuch.titel create mode 100644 doc/prolog/prolog handbuch create mode 100644 doc/prozess/Anhang Prozess create mode 100644 doc/prozess/Inhalt Prozess create mode 100644 doc/prozess/gs-Prozess handbuch.impressum create mode 100644 doc/prozess/gs-Prozess-2 create mode 100644 doc/prozess/gs-Prozess-3 create mode 100644 doc/prozess/gs-Prozess-4 create mode 100644 doc/prozess/gs-prozess-1 create mode 100644 doc/prozess/gs-prozess-5 create mode 100644 doc/prozess/gs-prozess-6 create mode 100644 doc/prozess/gs-prozess-7 create mode 100644 doc/prozess/gs-prozess-8 create mode 100644 doc/prozess/gs-prozess-9 create mode 100644 doc/system/systemhandbuch.1 create mode 100644 doc/system/systemhandbuch.2 create mode 100644 doc/system/systemhandbuch.3 create mode 100644 doc/system/systemhandbuch.4 create mode 100644 doc/user/benutzerhandbuch.1 create mode 100644 doc/user/benutzerhandbuch.2 create mode 100644 doc/user/benutzerhandbuch.3 create mode 100644 doc/user/benutzerhandbuch.4 create mode 100644 doc/user/benutzerhandbuch.5a create mode 100644 doc/user/benutzerhandbuch.5b create mode 100644 doc/user/benutzerhandbuch.5c create mode 100644 doc/user/benutzerhandbuch.5d create mode 100644 doc/user/benutzerhandbuch.5e create mode 100644 doc/user/benutzerhandbuch.6 create mode 100644 doc/user/benutzerhandbuch.anhang create mode 100644 doc/warenhaus/Anhang Warenhaus create mode 100644 doc/warenhaus/Inhalt Warenhaus create mode 100644 doc/warenhaus/gs-Warenhaus handbuch.impressum create mode 100644 doc/warenhaus/gs-Warenhaus-1 create mode 100644 doc/warenhaus/gs-Warenhaus-2 create mode 100644 doc/warenhaus/gs-Warenhaus-3 create mode 100644 doc/warenhaus/gs-Warenhaus-4 create mode 100644 doc/warenhaus/gs-Warenhaus-5 create mode 100644 doc/warenhaus/gs-Warenhaus-6 create mode 100644 doc/warenhaus/gs-Warenhaus-7 (limited to 'doc') diff --git a/doc/basic/basic handbuch.1 b/doc/basic/basic handbuch.1 new file mode 100644 index 0000000..2e604cb --- /dev/null +++ b/doc/basic/basic handbuch.1 @@ -0,0 +1,1075 @@ +____________________________________________________________________________ + + +#on("b")##on ("u")# +#center#Betriebssystem E U M E L +#off ("u")# + + +#center#Basic + + + + +#off("b")# +#center#Lizenzfreie Software der +#on ("b")# + +#center#Gesellschaft für Mathematik und Datenverarbeitung mbH, +#center#5205 Sankt Augustin + + +#off("b")# +#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für +#center#nichtkommerzielle Zwecke gestattet. + +#center#Gewährleistung und Haftung werden ausgeschlossen + + +____________________________________________________________________________ +#page# +#page nr ("%", 1)# +#head# +EUMEL-BASIC-Compiler Inhalt % +#end# + +Inhalt + +1 Einleitung 3 + +2 Installation des BASIC-Compilers 4 + +3 Aufruf und Steuerung des BASIC-Compilers 5 + +4 Umgang mit dem BASIC-Compiler 7 +4.1 Erläuterungen zur Syntax 7 +4.2 Datentypen und Konstanten 10 +4.3 Variablen und Felder 12 +4.4 Operatoren 14 +4.5 Funktionen 19 +4.6 Typanpassung 22 +4.7 Aufruf von EUMEL-Prozeduren in BASIC-Programmen 23 + +5 Steuerung der Bildschirmausgaben 25 + +6 Grenzen des Compilers 26 + +7 Fehlerbehandlung 28 +7.1 Fehler zur Übersetzungszeit 28 +7.2 Fehler zur Laufzeit 30 + +8 Übersicht über die Anweisungen und Funktionen 31 + +9 Anpassung von Programmen an den EUMEL-BASIC-Compiler 96 +9.1 Unterschiede zwischen BASIC-Interpretern + und dem EUMEL-BASIC-Compiler 96 +9.2 Abweichungen von ISO 6373-1984 (Minimal-BASIC) 97 +9.3 Anpassung von Microsoft-BASIC Programmen + an den EUMEL-BASIC-Compiler 98 + +Anhang A: Reservierte Wörter 100 +Anhang B: Vom Scanner erkannte Symboltypen 103 +Anhang C: Übersicht über die Fehlermeldungen 106 +Anhang D: ELAN-Prozeduren des Compilers 113 +#page# + + +#page nr ("%", 3)# +#head# +EUMEL-BASIC-Compiler 1. Einleitung % + +#end# + +1. Einleitung + + +BASIC entspricht heute nicht mehr den Vorstellungen von einer modernen Program­ +miersprache. Dennoch wurde für das EUMEL-Betriebssystem ein Compiler für BASIC +entwickelt. Er soll vor allem dazu dienen, schon bestehende BASIC-Programme - +gegebenenfalls nach entsprechender Anpassung - auch unter EUMEL verfügbar zu +machen. +Der Compiler ist weitgehend an die ISO-Norm 6373 für Minimal-BASIC angelehnt. +Die Syntax und Bedeutung der Anweisungen orientiert sich in den meisten Fällen an +Microsoft-BASIC. Anweichungen treten insbesondere an den Stellen auf, an denen +Prinzipien des Betriebssystems EUMEL verletzt würden. +Verglichen mit dem ELAN-Compiler des EUMEL-Systems ist der BASIC-Compiler +beim Übersetzen recht langsam. Auch aus diesem Grund scheint es nicht sinnvoll, +den BASIC-Compiler zur Neuentwicklung größerer Programme einzusetzen. + +Sinn dieses Handbuchs ist es vor allem, Kenntnisse über den Umgang mit dem +EUMEL-BASIC-Compiler zu vermitteln. Das Handbuch ist auf keinen Fall als Ein­ +führung in die Programmiersprache BASIC gedacht, sondern es soll dem Benutzer mit +BASIC-Erfahrung die Arbeit mit dem EUMEL-BASIC-Compiler ermöglichen und +erleichtern. Neben Erfahrung in BASIC setzt dieses Buch an einigen Stellen auch +Grundkenntnisse über das EUMEL-System voraus. + + + +Zur #ib(4)#Notation#ie(4)# in dieser Beschreibung + +Bei der Beschreibung der Anweisungen und Funktionen und auch an anderen Stellen +werden in dieser Beschreibung Syntaxregeln für BASIC-Programme oder Teile davon +angegeben. Dabei werden folgende Zeichen mit besonderer Bedeutung verwendet: + +[ ] optionale Angabe +[...] beliebig häufige Wiederholung der letzten optionalen Angabe +| alternative Angabe, d.h. entweder die letzte links stehende Angabe oder + die nächste rechts stehende Angabe, aber nicht beide +< > in spitzen Klammern stehende Begriffe sind entweder definiert (z.B. ) oder werden hinter der Syntaxregel erläutert + +Die Notation der exportierten ELAN-Prozeduren des Compilers (besonders in An­ +hangD) entspricht der in den EUMEL-Handbüchern üblichen Prozedurkopf- +Schreibweise. +#page# +#head# +EUMEL-BASIC-Compiler 2. Installation des BASIC-Compilers % + +#end# + +2. #ib(3)#Installation des BASIC-Compilers#ie(3)# + + +Der EUMEL-BASIC-Compiler wird auf zwei Disketten mit jeweils 360 KByte +Speicherkapazität ausgeliefert. +Auf der Diskette "BASIC.1" befindet sich das #ib(3)#Generatorprogramm#ie(3)#("gen.BASIC") zur +Installation des EUMEL-BASIC-Systems. +Legen Sie diese Diskette in das Laufwerk ihres Rechners ein und geben Sie in der +Task, in der das BASIC-System installiert werden soll, folgende Zeile nach 'gib +kommando :' (oder 'maintenance :') ein: + +archive ("BASIC.1"); fetch ("gen.BASIC", archive); run + +Lassen Sie die Diskette 'BASIC.1' im Laufwerk und antworten Sie auf die Frage +"Archiv "BASIC.1" eingelegt(j/n)?" mit "j". Das Generatorprogramm holt nun einige +Dateien von der Diskette. Nach Zugriff auf das Archiv erscheint die Meldung "Archiv +abgemeldet!" und die Frage "Archiv 'BASIC.2' eingelegt(j/n)?". Legen Sie nun statt +des Archivs 'BASIC.1' das Archiv 'BASIC.2' in das Laufwerk ein und drücken Sie bitte +wiederum "j". Nach weiteren Archivoperationen erscheint dann wieder die Meldung +"Archiv abgemeldet". Sie können nun die Diskette "BASIC.2" aus dem Laufwerk +entnehmen. +Das Generatorprogramm insertiert nun alle Programme des BASIC-Systems in der +Task. Dieser Vorgang nimmt einige Zeit in Anspruch. Zum Abschluß erscheint die +Meldung "BASIC-System installiert". +Der EUMEL-BASIC-Compiler steht Ihnen nun in der Task (und in nachfolgend +eingerichteten Söhnen) zur Verfügung. +#page# +#head# +EUMEL-BASIC-Compiler 3. Aufruf und Steuerung des BASIC-Compilers % + +#end# + +3. #ib(4)#Aufruf und #ib(3)#Steuerung des BASIC-Compilers#ie(3)##ie(4)# + + + + +Übersetzen von BASIC-Programmen + +Ein BASIC-Programm, das vom Compiler übersetzt werden soll, muß sich dazu in +einer EUMEL-Textdatei befinden (Syntax vgl. Kap. 4.). Steht das BASIC-Programm +zum Beispiel in der Datei "Programm.17+4", so wird der Compiler mit + + #ib(3)#basic#ie(3)# ("Programm.17+4") + +zum Übersetzen dieses Programms aufgerufen. +In einem Vordurchlauf werden die Zeilennummern des Programms auf Richtigkeit +überprüft. Beim eigentlichen Compilerdurchlauf wird das BASIC-Programm dann mit +Hilfe des EUMEL-Coders in einen von der EUMEL-0-Maschine ausführbaren Code +übersetzt. + +Das Programm wird mit 'check on' (Zeilennummergenerierung) übersetzt. +Ein 'runagain' wie bei ELAN-Programmen ist bei BASIC-Programmen zur Zeit +leider nicht möglich. + + + +Insertieren von BASIC-Programmen + +Der BASIC-Compiler kann BASIC-Programme auch insertieren. Das ganze Pro­ +gramm bildet dabei eine Prozedur, die nach dem Insertieren wie eine 'normale' +ELAN-Prozedur aufgerufen werden kann. +Zum Insertieren wird der Compiler mit einem zusätzlichen Text-Parameter aufge­ +rufen: + + #ib(3)#basic#ie(3)# ("Programm.17+4", "blackjack") + +Das Programm wird übersetzt und, falls keine Fehler gefunden wurden, fest einge­ +tragen ('insertiert'). Gestartet wird das Programm aber nicht. +"blackjack" ist nun der Prozedurname, unter dem das BASIC-Programm nach erfolg­ +reichem Insertieren aufgerufen werden kann. +Bei 'packets' erscheint jetzt der Eintrag 'BASIC.blackjack' in der Liste der insertierten +Pakete, und ein 'help ("blackjack")' zeigt, daß eine Prozedur 'blackjack' nun tatsäch­ +lich in der Task bekannt ist. Die Prozedur 'bulletin' funktioniert für insertierte +BASIC-Programme nicht. Sie ist aber auch nicht nötig, da das 'Paket' mit dem +BASIC-Programm ohnehin nur eine Prozedur enthält und ihr Name ja schon aus +dem Namen des Paketes hervorgeht. + +#on ("b")# +Beachten Sie: + - Der Prozedurname muß der Syntax für ELAN-Prozedurnamen entsprechen, darf + aber #on ("b")#keine Leerzeichen enthalten. + - Die BASIC-Programme können über den Prozedurnamen nur aufgerufen wer­ + den; die Übergabe von Parametern ist ebenso wie Wertlieferung nicht möglich. + - Jedes Insertieren belegt Speicherplatz im Codebereich der Task. Weil der Coder + und der Compiler ebenfalls recht viel Code belegen, kann es (vor allem, wenn + die BASIC-Programme lang sind) schnell zu einem Code-Überlauf kommen + (Compiler Error 305). Es sollten daher nur die Programme insertiert werden, für + die dies wirklich nötig ist. + - Achten Sie bei der Wahl des Namens für die gelieferte Prozedur darauf, daß sie + nicht ungewollt Prozeduren des Betriebssystems überdecken. (Der Aufruf 'ba­ + sic("tadellos","help")' wäre z.B. gar nicht tadellos, denn 'help' wäre nach dem + Insertieren überdeckt). + - Auch beim Insertieren werden die BASIC-Programme mit 'check on' übersetzt. +#off ("b")# + + +Ausgabe der übersetzten Zeilen während des +Compilierens +Mit '#ib(3)#basic list#ie(3)# (TRUE)' wird der Compiler so eingestellt, daß beim Übersetzen die +aktuelle Programmzeile ausgegeben wird. Diese Ausgabe kann auch mit '#ib(3)#sysout#ie(3)#' +umgeleitet werden. Zum Beispiel: + + sysout ("Fehlerprotokoll"); basic ("Programm.17+4") + +Dies kann beim #ib(3)#Debugging#ie(3)# von BASIC-Programmen eine wertvolle Hilfe sein, da in +der Ausgabedatei die Fehler sofort hinter der betreffenden Programmzeile vermerkt +werden. Das 'sysout' muß in Monitortasks ('gib kommando:') direkt vor dem Aufruf +des Compilers gegeben werden, weil der Monitor 'sysout' sonst wieder zurücksetzt. + +Mit 'basic list (FALSE)' kann die Ausgabe der Programmzeilen beim Übersetzen +wieder ausgeschaltet werden. + +#page# +#head# +EUMEL-BASIC-Compiler 4. Umgang mit dem BASIC-Compiler % + +#end# + +4. Umgang mit dem BASIC-Compiler + + + +4.1. Erläuterungen zur #ib(3)#Syntax#ie(3)# + + +Ein zu übersetzendes Programm muß dem BASIC-Compiler in Form einer +#ib(3)#EUMEL-Textdatei#ie(3)# übergeben werden. (Es gelten somit auch die für EUMEL-Text­ +dateien üblichen Begrenzungen, z.B. höchstens 32000 Zeichen pro Zeile und höch­ +stens 4075 Dateizeilen pro Datei.) +BASIC-Programme setzen sich aus Programmzeilen zusammen; jede Dateizeile der +#ib(3)#Programmdatei#ie(3)# bildet eine BASIC-Programmzeile. Die Syntax für ein Programm sieht +damit so aus: + + +[][...]EOF + +Dabei bedeutet #ib(3)#EOF (end of file)#ie(3)# das Ende der Programmdatei. + +Eine #ib(3)#Programmzeile#ie(3)# hat folgende Syntax: + + +[][][:][...][:]EOL + +Die #ib(3)#Zeilennummer#ie(3)# dient unter anderem als Sprungadresse an den Anfang der Pro­ +grammzeile während der Laufzeit des Programms (vgl. 'GOTO' und 'GOSUB'). Sie ist +fakultativ (d.h. sie muß nicht geschrieben werden). Durch sparsame Verwendung von +Zeilennummern (nämlich nur da, wo sie benötigt werden) kann eine gewisse Steige­ +rung der #ib(3)#Übersichtlichkeit von BASIC-Programmen#ie(3)# erreicht werden. Hat eine Pro­ +grammzeile keine Zeilennummer, so wird bei Fehlermeldungen (sowohl während der +Übersetzung als auch zur Laufzeit des Programms) die letzte Zeilennummer mit +angegeben, die davor auftrat. +Zeilennummern dürfen im Bereich von 1 bis 32767 liegen und müssen unbedingt in +aufsteigender Reihenfolge vergeben werden. Zeilennummern dürfen keine Leerzeichen +enthalten und müssen mit einem Leerzeichen abgeschlossen werden. Um spätere +Ergänzungen zu ermöglichen, ist eine Numerierung im Abstand zehn empfehlenswert. + +Hier ein Beispiel, wie ein BASIC-Programm in einer EUMEL-Datei aussehen +könnte: + + +...........................Einmaleins............................ +10 CLS: PRINT "Kleines Einmaleins" + FOR zahl% = 1 TO 10 + PRINT + 'Erzeugung einer Zeile + FOR faktor% = 1 TO 10 + PRINT TAB (faktor% * 5); + PRINT USING "\#\#\#"; faktor% * zahl%; + NEXT faktor% + NEXT zahl% + + + + +Die Syntax der Anweisungen, die vom EUMEL-BASIC-Compiler übersetzt werden +können, ist ausführlich im Kapitel 8 beschrieben. + +Der #ib(3)#Doppelpunkt#ie(3)# dient als Trennzeichen zwischen Anweisungen. Ihm muß nicht +unbedingt eine Anweisung folgen. Er kann somit als explizites "Ende der +Anweisung"-Symbol aufgefaßt werden (#ib(3)#EOS, "end of statement"#ie(3)#). + +#ib(3)#EOL (end of line)#ie(3)# ist das Ende einer Dateizeile. (Dieses "Zeichen" ist ebenso wie +EOF beim Editieren der Datei nicht sichtbar.) +Das #ib(3)#Hochkomma#ie(3)# ("'", Code 39) wird vom Compiler ebenfalls als EOL interpretiert. +Alle dem Hochkomma in der Dateizeile folgenden Zeichen werden überlesen. Dies +ermöglicht das Schreiben von Kommentaren ohne Verwendung der +'REM'-Anweisung. + +Es sei hier bereits bemerkt, daß sich durch die Realisierung des Übersetzers als +#on ("b")#Compiler gewisse Unterschiede gegenüber Interpretern #off ("b")#ergeben (siehe hierzu Kap. 9). +Der wesentliche Unterschied ist, daß der Interpreter dem Programmtext analog zum +Programmablauf folgt, der Compiler das Programm aber von vorne bis hinten Zeile für +Zeile übersetzt. Dies hat zur Folge, daß z.B. die Dimensionierungen von Feldvariablen +#on ("b")#textuell vor der Verwendung der Variablen stattfinden müssen#off ("b")# und nicht, wie bei +Interpretern, nur im Ablauf des Programms vorher ausgeführt werden müssen. + + + +Weitere Schreibregeln + +#on ("b")# +1. #ib(3)#Groß-/Kleinschreibung#ie(3)##off ("b")# +Für den BASIC-Compiler bestehen zwischen kleinen und großen Buchstaben keiner­ +lei Unterschiede, es sei denn es handelt sich um Textdenoter (Textkonstanten). +Daher können alle #ib(3)#Schlüsselwörter#ie(3)# und #ib(3)#Variablennamen#ie(3)# mit kleinen oder großen +Buchstaben geschrieben werden. Aus der Tatsache, daß zwischen großen und kleinen +Buchstaben nicht unterschieden wird, folgt aber bespielsweise auch, daß die Variab­ +lennamen (vgl. 4.3.) 'hallo' und 'HALLO' ein und dieselbe Variable bezeichnen. + +#on ("b")# +2. #ib(3)#Reservierte Wörter#ie(3)##off ("b")# +Der BASIC-Compiler erkennt eine ganze Reihe #on("i")#reservierter Wörter#off("i")#. Es handelt sich +hierbei im wesentlichen um die Namen der Anweisungen und Funktionen. Sie sollten +im eigenen Interesse darauf achten, daß sich sowohl vor als auch hinter reservier­ +ten Wörtern stets mindestens ein #on ("b")##ib(3)#Leerzeichen#ie(3)##off ("b")# (Blank) befindet. Der #ib(3)#Scanner#ie(3)# (ver­ +gleiche AnhangB) erkennt zwar manchmal die reservierten Wörter auch ohne Leer­ +zeichen, aber unter bestimmten Umständen kann es auch zu erkannten oder - noch +schlimmer - vom Compiler unerkannten Fehlern kommen. +Hierzu zwei Beispiele: +Die Anweisung 'IF a > b THENPRINT "größer"' führt beim Compilieren zur Fehler­ +meldung "Syntaxfehler: THEN oder GOTO erwartet". +Wesentlich gefährlicher ist da schon die Programmzeile + "LEThallo = 3 : PRINT hallo", +denn die unerwartete Wirkung ist die Ausgabe von "0" auf dem Bildschirm. Der Wert +"3" wurde nämlich nicht der Variablen mit dem Namen "hallo" zugewiesen, sondern +einer Variablen namens "LEThallo". + +#on ("b")# +3. Bedeutung der #ib(3)#Leerstelle#ie(3)# ("Blank") für den Compiler#off("b")# +Wie schon aus dem vorhergehenden Punkt ersichtlich kann das Fehlen von trennen­ +den Leerstellen unschöne Effekte haben, denn der #ib(3)#Scanner#ie(3)# (vgl. AnhangB) des +BASIC-Compilers erkennt anhand der Leerstelle (Code 32) beim Durchlauf durch das +Programm, daß ein #ib(3)#Symbol#ie(3)# zu Ende ist. +Es kommt somit immer dann zu Fehlern, wenn zwei Symbole (z.B. reservierte Wörter, +Konstanten, Variablen etc.) nicht durch Leerzeichen getrennt sind, und der Scanner +sie als ein Symbol "versteht". +Beispiel: + "a = 3 : b = 4 : PRINT a b" erzeugt die Ausgabe "34". + "a = 3 : b = 4 : PRINT ab" erzeugt hingegen die Ausgabe "0", denn der +Compiler sieht "ab" als #on ("b")#einen Variablennamen an. #off ("b")# + + + +4.2. #ib(3)#Datentypen#ie(3)# und #ib(3)#Konstanten#ie(3)# + + +Der EUMEL-BASIC-Compiler unterscheidet grundsätzlich zwischen zwei Daten­ +typen, nämlich zwischen #ib(3)#Texte#ie(3)#n und #ib(3)#Zahlen#ie(3)#. + +#on ("b")# +#ib(3)#Datentyp TEXT#ie(3)# #off ("b")# +Texte dürfen alle Zeichen enthalten (Codes 0 bis 255) und bis zu 32000 Zeichen lang +sein. +Die zugehörigen Konstanten werden von #ib(3)#Anführungszeichen#ie(3)# begrenzt, z.B.: + "Anzahl Einträge: " + "2.32 DM" + "General-Musik-Direktor" +Anführungszeichen (Code 34) dürfen #on("i")#innerhalb#off("i")# von Text-Konstanten nicht vor­ +kommen. + +Bei Zahlen unterscheidet der Compiler noch zwischen #ib(3)#INTs#ie(3)# (#ib(3)#Ganzzahlen#ie(3)#) und REALs +(#ib(3)#Gleitkommazahlen#ie(3)#). Diese entsprechen im Hinblick auf den Wertebereich genau den +in ELAN bekannten INTs und REALs. + +#on ("b")# +#ib(3)#Datentyp INT#ie(3)# #off ("b")# +INT-Werte dürfen zwischen -32768 und 32767 liegen. INT-Konstanten dürfen aber +#on("i")#nur#off("i")# aus Ziffern und einem optionalen '%'-Zeichen am Ende bestehen. Das bedeutet, +daß die INT-Konstanten im Bereich von 0 bis 32767 liegen können. +Ein nachgestelltes '%'-Zeichen kennzeichnet eine Konstante nochmals explizit als +INT. (Diese Option wurde aus Kompatibilitätsgründen implementiert.) + +#on ("b")# +#ib(3)#Datentyp REAL#ie(3)# #off ("b")# +REALs können Werte zwischen -9.999999999999*10#u#126#e# und +9.999999999999*10#u#126#e# annehmen. +Die kleinste positive von Null verschiedene Zahl ist 9.999999999999*10#u#-126#e#. +Der kleinste REAL-Wert mit x + 1.0 > 1.0 ist gleich 10#u#-12#e#. +REAL-Konstanten werden gebildet aus Vorkommastellen, Dezimalpunkt, Nachkom­ +mastellen, Zeichen "E" oder "D" (jeweils auch klein) für den #ib(3)#Exponent#ie(3)#en gefolgt vom +Vorzeichen und den Ziffern des Exponenten. +Dabei müssen nicht für jede REAL-Konstante alle diese Elemente benutzt werden. +Unverzichtbar sind #on("i")#entweder#off("i")# der Dezimalpunkt #on("i")#oder#off("i")# der Exponent. Ebenso müssen +zumindest entweder Vor- oder Nachkommastellen vorhanden sein. + +Beispiele für gültige REAL-Konstanten sind: + 0. + .01 + 1E-17 + 2.9979D8 + .3e-102 + 100.e+7 + +Nicht erlaubt sind dagegen folgende Schreibweisen für REAL-Konstanten: + e12 (#ib(3)#Mantisse#ie(3)# fehlt) + 100 (ist INT-Konstante) + . (weder Vor- noch Nachkommastellen) + .E-12 (dito) + 1exp-3 ('exp' nicht erlaubt) + -1.99e30 (Mantisse hat Vorzeichen) + +Das letzte Beispiel zeigt, daß auch vor REAL-Konstanten keine #ib(3)#Vorzeichen#ie(3)# erlaubt +sind. Da normalerweise keine REAL-Konstanten, sondern vielmehr numerische +Ausdrücke verlangt werden, können durch Voranstellen des Operators '-' (vgl. 4.4.) +auch #ib(3)#negative Zahlenwerte#ie(3)# leicht erzeugt werden. + +An REAL-Konstanten darf eines der Zeichen "!" und "\#" angehängt werden. Diese +Option wurde aus Kompatibilitätsgründen eingebaut. Wird ein "!" oder "\#" an eine +INT-Konstante angehängt, so verwandelt es diese in eine REAL-Konstante. +Beispiel: 10000! oder 10000\# entspricht 10000. oder 1E4 + + +#page# + +4.3. Variablen und Felder + + +Variablen + +Der BASIC-Compiler stellt für die in 4.2. vorgestellten Datentypen TEXT, INT und +REAL auch Variablen zur Verfügung. +Die #ib(3)#Variablennamen#ie(3)# müssen folgenden Bedingungen genügen: +- Ein Variablenname muß mit einem Buchstaben beginnen. +- Variablennamen dürfen ab der zweiten Stelle außer Buchstaben auch Ziffern, Dezi­ + malpunkte sowie die Zeichen "!", "\#", "$" und "%" enthalten. Leerzeichen dürfen + in Variablennamen dagegen nicht vorkommen. +- Variablennamen dürfen nicht mit FN beginnen (vgl. 4.5. benutzer-definierte Funk­ + tionen). +- #ib(3)#Reservierte Wörter#ie(3)# (siehe Anhang A) dürfen kein Variablenname sein. Als Teiltexte + dürfen reservierte Wörter aber in Variablennamen enthalten sein (auch am Anfang). + +Variablennamen dürfen beliebig lang sein, und alle Zeichen eines Variablennamens +sind signifikant. + +Welchen Typ eine Variable hat, entscheidet der Compiler nach folgenden #ib(3)#Kriterien#ie(3, " für den Typ einer Variablen")# (in +der Reihenfolge ihrer Beachtung): +- Ist das letzte Zeichen des Namens ein "!" oder "\#", so bezeichnet er eine + REAL-Variable. +- Ist das letzte Zeichen ein "%", so handelt es sich um eine INT-Variable. +- Ist das letzte Zeichen des Namens ein "$", so ist die Variable vom Typ TEXT. +- Liegt das erste Zeichen des Namens im Bereich der mit einer #ib(3)#DEFINT#ie(3)#-Anweisung + (vgl. Kap. 8) festgelegten Buchstaben, so ist die Variable eine INT-Variable. +- Liegt das erste Zeichen im Bereich der mit einer #ib(3)#DEFSTR#ie(3)#-Anweisung (vgl. Kap. 8) + festgelegten Buchstaben, so handelt es sich um eine TEXT-Variable. +- Wenn keine der obigen Bedingungen erfüllt ist, dann bezeichnet der Name eine + Variable des Datentyps REAL. + +Variablen, denen noch kein Wert zugewiesen wurde, haben den Inhalt null (bei INT +und REAL) beziehungsweise Leertext (bei TEXT). + + + +Felder (#ib(4)#Arrays#ie(4)#) + +Ein Feld (Array) ist eine Ansammlung von mehreren Variablen gleichen Typs. Jedes +Feld hat einen Namen. Für die #ib(3)#Feldnamen#ie(3)# gelten die gleichen Regeln wie für die +Namen von normalen Variablen. Auch die Datentypen werden nach den gleichen +Kriterien bestimmt wie bei einfachen Variablen. +In einem Feld können die Elemente in bis zu 100 #ib(3)#Dimensionen#ie(3)# abgelegt werden. Auf +ein Element eines Feldes wird über den Feldnamen und den Index / die #ib(3)#Indizes#ie(3)# des +Elements zugegriffen. Beim Zugriff auf das Element müssen so viele Indizes ange­ +geben werden, wie das Feld Dimensionen hat. +Beispiel: +Das Feld 'tabelle' habe zwei Dimensionen. Mit 'tabelle (3, 5)' wird auf das Element +mit dem Index 3 in der ersten Dimension und dem Index 5 in der zweiten Dimension +zugegriffen. + +Beim ersten Zugriff auf ein Element eines Feldes wird anhand der Zahl der Indizes +die Anzahl der Dimensionen festgestellt und das Feld so eingerichtet, daß in jeder +Dimension der größte Index zehn ist. +Soll ein Feld mit anderen größten Indizes eingerichtet werden, so muß hierzu die +#ib(3)#DIM#ie(3)#-Anweisung verwendet werden (siehe Kapitel 8). + +Der kleinste Index ist voreingestellt auf null, kann aber mit der #ib(3)#OPTION BASE#ie(3)#- +Anweisung (vgl. Kap. 8) auch auf eins eingestellt werden. + +Die Elemente eines Feldes sind, wie auch die einfachen Variablen, mit den Werten +null (INT und REAL) beziehungsweise Leertext (TEXT) vorbesetzt, sofern ihnen noch +nichts zugewiesen wurde. + +#page# + +4.4. Operatoren + +Nachfolgend sind alle Operatoren aufgelistet, die vom EUMEL-BASIC-Compiler +übersetzt werden. + + +Arithmetische #ib(4)#Operatoren#ie(4, ", arithmetische")# + +#ib(3)##ie(3, "+")##ib(3)##ie(3, "-")##ib(3)##ie(3, "*")##ib(3)##ie(3, "/")# +#ib(3)##ie(3, "\")##ib(3)##ie(3, "MOD")##ib(3)##ie(3, "^")# + + Operand(en) Zweck Ergebnistyp + + + INT positives Vorzeichen INT + REAL positives Vorzeichen REAL + + INT, INT INT-Addition INT + REAL, REAL REAL-Addition REAL + + - INT negatives Vorzeichen INT + REAL negatives Vorzeichen REAL + + INT, INT INT-Subtraktion INT + REAL, REAL REAL-Subtraktion REAL + + * INT, INT INT-Multiplikation INT + REAL, REAL REAL-Multiplikation REAL + + / (INT, INT) #linefeed (0.5)# + REAL-Division REAL + REAL, REAL #linefeed (1.0)# + + \ INT, INT #linefeed (0.5)# + INT-Division INT + (REAL, REAL) #linefeed (1.0)# + +MOD INT, INT INT-Divisionsrest INT + REAL, REAL Divisionsrest nach REAL + Runden auf Ganzzahl (nicht INT) + + ^ (INT, INT) #linefeed (0.5)# + Potenzierung REAL + REAL, REAL #linefeed (1.0)# + + +#on ("b")# +Hinweis: #off ("b")# +Wird ein Operator mit numerischen Operanden unterschiedlichen Typs (also INT und +REAL) aufgerufen, so wird der INT-Operand nach REAL konvertiert und der Operator +mit den beiden REAL-Operanden aufgerufen. +Sind die Operandtypen in Klammern angegeben, so werden vor Ausführung der Ope­ +ration die Operanden zu den nicht eingeklammerten Typen konvertiert. +Da jede #ib(3)#Konvertierung#ie(3)# Zeit benötigt, sollte der Benutzer darauf achten, daß möglichst +wenig konvertiert werden muß. +Hierzu ein (etwas extremes, aber nicht seltenes) Beispiel: +Der Aufruf a%\b bewirkt zunächst eine Konvertierung von a% nach REAL: +CDBL(a%)\b. Intern wird die Berechnung dann aber wieder mit INTs ausgeführt: +CINT(CDBL(a%))\CINT(b). Das Ergebnis wird also erst nach drei Konvertierungen +geliefert. Schreibt man dagegen sofort a%\CINT(b), dann reicht eine Konvertierung +aus. + +Es muß außerdem bei den Operatoren +, - und * für INTs darauf geachtet werden, +daß das Ergebnis innerhalb des INT-Wertebereichs liegen muß, da es sonst zu +einem #ib(3)#INT-Überlauf#ie(3)# kommt. + + + +Text-Operator #ib(4)#+#ie(4)# + +#ib(3)##ie(3, "Operatoren, Text-")# +Für Text-Manipulationen wird der Operator '+' mit zwei TEXT-Operanden zur +Verfügung gestellt. Mit '+' werden zwei Texte aneinandergehängt (konkateniert). + + + +Vergleichsoperatoren#ib(4)##ie(4, "Operatoren, Vergleichs-")# + +Im EUMEL-BASIC gibt es folgende Vergleichsoperatoren: + +#ib(3)#=#ie(3)# gleich +#ib(3)#<>#ie(3)# ungleich +#ib(3)#<#ie(3)# kleiner +#ib(3)#>#ie(3)# größer +#ib(3)#<=#ie(3)# kleiner oder gleich +#ib(3)#>=#ie(3)# größer oder gleich + +Bei den numerischen Datentypen werden mit den Vergleichsoperatoren die Zahlen­ +werte verglichen. +Sollen ein INT und ein REAL verglichen werden, dann wird der INT vorher nach +REAL konvertiert und ein REAL-Vergleich vorgenommen. + +Bei Texten dienen die Vergleichsoperatoren zum Vergleich der Zeichencodes. Dies +ermöglicht zum Beispiel ein alphabetisches Sortieren von Wörtern, mit der Einschrän­ +kung, daß Groß- und Kleinbuchstaben unterschiedliche Zeichencodes haben (ver­ +gleiche EUMEL-Zeichensatz-Tabelle im Benutzerhandbuch) und somit verschieden +eingeordnet werden. +Es gilt a$ < b$, wenn die Zeichenkette in a$ codemäßig vor der Zeichenkette in b$ + steht: "a" < "b" (TRUE) "aa"< "a" (FALSE) + + +Die Vergleichsoperatoren liefern, je nachdem ob die Aussage wahr oder falsch ist, die +INT-Werte 0 (falsch) oder -1 (wahr). +Anhand des Ergebnisses einer Vergleichsoperation kann zum Beispiel der Programm­ +ablauf gesteuert werden (siehe Kapitel 8, IF-Anweisung). + + + +Logische Operatoren + +#ib(3)##ie(3, "Operatoren, logische")# +Die logischen Operatoren haben zwei Aufgaben: +1. logische (Boolsche) Verknüpfung von #ib(3)#Wahrheitswerte#ie(3)#n, die zum Beispiel von + Vergleichsoperationen geliefert werden und +2. bitweise Ausführung von logischen Verknüpfungen auf den internen (Zweierkom­ + plement-) Darstellungen von INT-Werten. + +Da für beide Aufgaben die gleichen Operatoren benutzt werden, wurden für die Wahr­ +heitswerte die INT-Werte 0 für falsch (Bitmuster: 0000000000000000) und -1 für +wahr (Bitmuster: 1111111111111111) gewählt. + + Operand(en) Zweck insbesondere gilt + +#ib(3)#NOT#ie(3)# INT #linefeed (0.5)# NOT0->-1 + #ib(3)#Negation#ie(3)# + (REAL) #linefeed (1.0)# NOT-1->0 + +#ib(3)#AND#ie(3)# INT, INT #ib(3)#UND-Verknüpfung#ie(3)# 0AND0->0 + 0AND-1->0 + -1AND0->0 + -1AND-1->-1 + + #ib(3)#OR#ie(3)# INT, INT #ib(3)#ODER-Verknüpfung#ie(3)# 0OR0->0 + 0OR-1->-1 + -1OR0->-1 + -1OR-1->-1 + +#ib(3)#XOR#ie(3)# INT, INT #ib(3)#Exklusiv-ODER-Verknüpfung#ie(3)# 0XOR0->0 + 0XOR-1->-1 + -1XOR0->-1 + -1XOR-1->0 + +#ib(3)#EQV#ie(3)# INT, INT #ib(3)#Äquivalenz-Verknüpfung#ie(3)# 0EQV0->-1 + 0EQV-1->0 + -1EQV0->0 + -1EQV-1->-1 + +#ib(3)#IMP#ie(3)# INT, INT #ib(3)#Implikations-Verknüpfung#ie(3)# 0IMP0->-1 + 0IMP-1->-1 + -1IMP0->0 + -1IMP-1->-1 + + + +Prioritäten der Operanden + + +Hier die Übersicht über alle Operatoren in der Reihenfolge ihrer Ausführung + + + Operator Priorität + + ^ Potenzierung 13 + +, - positives/negatives Vorzeichen 12 + *, / Multiplikation, REAL-Division 11 + \ INT-Division 10 + MOD Divisionsrest- (MOD-) Operation 9 + +, - Addition, Subtraktion 8 + =, <>, <, >, <=, >= Vergleichsoperatoren 7 + NOT Negation 6 + AND UND-Verknüpfung 5 + OR ODER-Verknüpfung 4 + XOR Exklusiv-ODER-Verknüpfung 3 + EQV Äquivalenz-Verknüpfung 2 + IMP Implikations-Verknüpfung 1 + + +Die Reihenfolge der Auswertung von Ausdrücken kann durch Klammern geändert +werden. + +Beachten Sie, daß der Operator '=' in BASIC die Funktion eines Vergleichsoperators +und des #ib(3)#Zuweisungsoperators#ie(3)##ib(3)##ie(3, "Operator, Zuweisungs-")# (siehe Kapitel 8, LET-Anweisung) hat. + +#page# + +4.5. #ib(3)#Funktionen#ie(3)# + + + +Standard-Funktionen + +Der EUMEL-BASIC-Compiler unterstützt eine ganze Reihe von Funktionen. Diese +Funktionen liefern Werte und können in Ausdrücken zusammen mit Konstanten, +Variablen und Operatoren verwendet werden. +Viele der eingebauten Funktionen arbeiten mit Argumenten, das heißt es werden den +Funktionen Werte übergeben. +In Kapitel 8 dieses Handbuches sind alle Funktionen ausführlich beschrieben. +Beispiele für #ib(3)#Funktionsaufrufe#ie(3)#: + SQR (17) Dieser Ausdruck liefert die Wurzel von 17 als REAL. + RIGHT$ (text$, 5) Dieser Ausdruck liefert die letzten fünf Textzeichen +#right#aus 'text$' als TEXT. + + + +Benutzer-definierte Funktionen + +Neben der Verwendung der standardmäßig verfügbaren Funktionen besteht für den +Benutzer die Möglichkeit, selbst Funktionen innerhalb eines Programms zu definieren. + +#on ("b")# +#ib(3)#Definition benutzer-definierter Funktionen#ie(3)# #off ("b")# +Hierzu dient die #ib(3)#DEF FN#ie(3)#-Anweisung (vergleiche Kapitel 8). +Die Syntax der DEF FN-Anweisung lautet: + +DEFFN[([,][...])]= +#right# + +: Zeichenfolge, die der Syntax für Variablennamen ent­ + sprechen muß. + FN bilden zusammen den Namen der neuen + Funktion. +<#ib(3)#Parameter#ie(3)#>: Zeichenfolge, die der Syntax für Variablennamen ent­ + sprechen muß. +: Ausdruck, der Konstanten, Variablen, die Parameter der + Funktion und Aufrufe anderer Funktionen enthalten + darf. + +- Die benutzer-definierten Funktionen ("user functions") liefern, genau wie die + Standard-Funktionen, Werte. +- Das letzte Zeichen des Funktionsnamens gibt den Typ des Wertes an, den die + Funktion liefert. Soll die Funktion einen TEXT liefern, so muß der Name mit "$" + enden. Soll ein INT geliefert werden, muß der Name mit "%" enden. Für alle + anderen Endungen wird eine REAL-liefernde Funktion eingetragen. +- Die Syntax der Parameternamen entspricht der Syntax für die Namen von einfachen + Variablen. +- Die Parameter haben nur bei der Definition Gültigkeit. Hierbei 'überdecken' sie (für + diese Zeile) eventuell im BASIC-Programm vorhandene gleichnamige Variablen. +- Jeder Parameter darf in der Parameterliste nur einmal vorkommen. +- Bezeichnet der Funktionsname eine TEXT-liefernde Funktion, so muß auch die + Funktionsdefinition ein Ergebnis vom Typ TEXT liefern. Zwischen INTs und REALs + findet eine Typanpassung statt. +- Eine Funktion darf nicht in ihrer eigenen Definition erscheinen. +- Eine Funktion ist allein durch ihren Namen gekennzeichnet. Generische Funktionen + (gleicher Name, aber unterschiedliche Parameter) können somit nicht definiert wer­ + den. + +Beispiele für gültige Funktionsdefinitionen: + DEF FNPI = 3.1415927 + DEF FNumfang (radius) = 2.0 * FNPI * radius (Enthält Aufruf von FNPI) + DEF FNhallo$ (dummy$) = "Hallo " + name$ (name$ kommt im + #right#BASIC-Programm vor) + DEF FNheavyside% (x) = ABS (SGN (x) = 1) + +Beispiele für ungültige Funktionsdefinitionen: + DEF FNfunct (a, b, a) = a ^ 2 + b (a kommt zweimal als Parameter vor) + DEF FNfr (x) = x * FNfr (x - 1) (rekursive Definition) + + +#on ("b")# +#ib(3)#Aufruf benutzer-definierter Funktionen#ie(3)# #off ("b")# + +FN [ ( [, ] [...] ) ] + +<#ib(3)#Argument#ie(3)#> : Ausdruck, der für den entsprechenden Parameter bei der Evaluation + (Auswertung) der Funktion eingesetzt werden soll + +- Beim Funktionsaufruf werden die Argumente in der Reihenfolge ihres Auftretens für + die Parameter eingesetzt. Für TEXT-Parameter müssen die Argumente ebenfalls + TEXTe liefern. Zwischen INTs und REALs findet eine Typanpassung statt. +- Die Anzahl der Argumente muß genau mit der Anzahl der Parameter übereinstim­ + men. +- Für in der Funktionsdefinition vorkommende Variablen wird der zum Zeitpunkt des + Funktionsaufruf gültige Wert eingesetzt. +- Die Definition der Funktion muß dem ersten Aufruf der Funktion textuell voraus­ + gehen. +- Eine Definition gilt für alle textuell folgenden Aufrufe, bis die Funktion wieder neu + definiert wird. + +Beispiele für korrekte Funktionsaufrufe (bezogen auf obige Beispiel-Definitionen): + PRINT FNPI / 2.0 (Ausgabe: 1.570796) + PRINT FNumfang (20) (Ausgabe: 125.6637) + LET name$ = "Purzelbär":PRINT FNhallo$ ("") (Ausgabe: Hallo Purzelbär) + PRINT heavyside% (-17.3) (Ausgabe: 0) + +Beispiele für falsche Funktionsaufrufe (bezogen auf obige Beispiel-Definitionen): + PRINT FNPI (10) (kein Argument erwartet) + PRINT FNumfang (Argument erwartet) + PRINT FNhallo$ (zahl%) (Falscher Typ des Arguments) + PRINT FNheavyside (17.4, -12.3) (Zu viele Argumente) + + +#page# + +4.6. #ib(3)#Typanpassung#ie(3)# + + +In BASIC wird, im Gegensatz zu ELAN, nicht sehr streng zwischen den numerischen +Datentypen unterschieden, sondern es finden häufig automatische Typanpassungen +statt. Zu solchen Typanpassungen kommt es vor allem bei der Zuweisung, bei Opera­ +toren und bei Funktionen, aber auch bei einigen Anweisungen. +Die automatische Typanpassung hat zwei Nachteile: +1. Die Typkonvertierung von INT nach REAL und umgekehrt kostet Zeit während der + Programmausführung. +2. Es kann zu sehr unangenehmen Laufzeitfehlern kommen, wenn eine REAL- + INT-#ib(3)#Konvertierung#ie(3)# mit Fehler abbricht, weil der REAL-Wert außerhalb des + INT-Wertebereichs liegt. + +Allgemein gilt also, daß sich der Programmierer auch in BASIC über die Typen der +verwendeten Objekte im klaren sein sollte. Außerdem ist zu beachten, daß bei Konver­ +tierungen von REAL nach INT immer gerundet wird. + +Genaueres zur Typanpassung bei der Zuweisung finden Sie in Kapitel 8 bei der +LET-Anweisung. +Über Typkonvertierung bei Operatoren informiert Kapitel 4.4. +Informationen über die Funktionen betreffenden Typkonvertierungen befinden sich am +Anfang von Kapitel 8 und direkt bei der Beschreibung der jeweiligen Funktionen +(ebenfalls in Kapitel 8). + +#page# + +4.7. Aufruf von EUMEL-Prozeduren in + BASIC-Programmen + + + +Der EUMEL-BASIC-Compiler bietet die Möglichkeit, insertierte ELAN-Prozeduren +(und auch insertierte BASIC-Programme) in BASIC-Programmen aufzurufen. Hierzu +werden die beiden Anweisungen #ib(3)#CALL#ie(3)# und #ib(3)#CHAIN#ie(3)# (identisch) sowie die Funktion +#ib(3)#USR#ie(3)# zur Verfügung gestellt. +Mit der CALL-Anweisung (siehe auch Kapitel 8) können Prozeduren aufgerufen +werden, die keinen Wert liefern und nur die BASIC-Datentypen INT, REAL und/oder +TEXT als Parameter benötigen. +Beispiele: + CALL list + CALL taskstatus ("PUBLIC") + CALL cursor (10, 21) + CALL getcursor (x%, y%) + +Das letzte Beispiel zeigt, daß auch #ib(3)#VAR-Parameter#ie(3)# im ELAN-Sinne übergeben +werden können. + +Die Funktion USR dient im Gegensatz zu CALL zum Aufruf von #ib(3)#wertliefernden Pro­ +zeduren#ie(3)#. Die Prozeduren dürfen allerdings nur einen der BASIC-Datentypen INT, +REAL oder TEXT liefern. Es gilt auch bei USR, wie bei CALL, daß die aufgerufenen +Prozeduren nur Parameter der Typen INT, REAL oder TEXT haben dürfen. +Beispiele: + PRINT USR e (Ausgabe: 2.718282) + PRINT USR compress (" EUMEL ") (Ausgabe: EUMEL) + +#on ("b")# +Wichtige Hinweise zu CALL, CHAIN und USR: #off ("b")# +1. Bei den Parametern finden keinerlei Typkonvertierungen statt (ELAN- + Prozeduren werden ja gerade anhand der Typen ihrer Parameter eindeutig identifi­ + ziert). +2. Die Prozedurnamen nach CALL, CHAIN und USR dürfen keine Leerzeichen ent­ + halten, weil die Prozedur sonst nicht identifiziert werden kann. + Beispiel: CALLlernsequenzauftastelegen(...) statt + CALLlernsequenzauftastelegen(...) +3. Die Prozedurnamen können (nach BASIC-Konvention) auch Großbuchstaben + enthalten. + Beispiel: CALLcursor(17,4) ist äquivalent zu + CALLCURSOR(17,4) + + +Wie in Kapitel 3 erläutert kann ein BASIC-Programm auch insertiert werden. Somit +können mit der CALL-Anweisung auch andere (vorher insertierte) BASIC- +Programme aufgerufen werden. +Beispiel: +CALL blackjack ('blackjack' sei der Prozedurname, unter dem ein BASIC- + Programm zuvor insertiert wurde.) + +Die sonst in einigen BASIC-Dialekten vorhandene Möglichkeit, Programme oder +#ib(3)#Programmsegmente#ie(3)# nachzuladen, kann so durch Aufrufe von insertierten Programmen +nachgebildet werden. +#page# +#head# +EUMEL-BASIC-Compiler 5. Steuerung der Bildschirmausgaben % + +#end# + +5. #ib(4)#Steuerung der #ib(3)#Bildschirmausgaben#ie(3)##ie(4)# + + + +Die Ausgaben von BASIC-Programmen ('PRINT' und 'WRITE') werden im Paket +'basic output' behandelt. Dieses Paket ermöglicht unter anderem, daß die Ausgabe +auf das Terminal mit der Prozedur + + PROC #ib(3)#basic page#ie(3)# (BOOL CONST status) + +gesteuert werden können. Wird dabei 'TRUE' eingestellt, so wartet die Ausgabe bei +Erreichen der letzten Terminalzeile auf die Eingabe eines Zeichens, bevor sie fortfährt. +Das Eingabezeichen wird nach Ausgabe von ">>" in der rechten unteren Ecke des +Bildschirms erwartet und wie folgt interpretiert: + +#linefeed (1.5)# + Löschen des Bildschirms und Ausgabe der nächsten Bildschirmseite + Ausgabe der nächsten Zeile + Abbruch des Programms mit der Fehlermeldung "'halt' vom Terminal" + 'basic page' wird auf 'FALSE' gesetzt #linefeed (1.0)#und mit der normalen Ausgabe + weitergemacht + +Alle anderen Tasten bewirken eine Ausgabe der nächste Bildschirmseite (#ib(3)#Scrolling#ie(3)#). + +Ist 'basic page' auf 'FALSE' gesetzt, so kann durch Eingabe von vor einem Zei­ +lenwechsel 'basic page' auf 'TRUE' gesetzt werden. +#page# +#head# +EUMEL-BASIC-Compiler 6. Grenzen des Compilers % + +#end# + +6. #ib(3)#Grenzen des Compilers#ie(3)# + + +Es gibt verschiedene Grenzen, die bei der Benutzung des BASIC-Compilers erreicht +werden können. + +#on ("b")# +Grenzen des #ib(3)#EUMEL-Coder#ie(3)#s #off ("b")# +Da ein BASIC-Programm vom Compiler als eine Prozedur im Coder eingetragen +wird, darf der Code für ein BASIC-Programm die #ib(3)#Modulgrenze#ie(3)# von 7500 Byte Code +nicht überschreiten. +Sollte dies doch einmal der Fall sein (#ib(3)#Compiler Error 308#ie(3)#), so gibt es folgende +Abhilfe-Möglichkeiten: +- Zerlegen des BASIC-Programms in mehrere BASIC-Programme, wobei ein + Programm das andere während der Ausführung aufrufen kann (vgl.4.7.). + Bei dieser Methode können die Teilprogramme aber nicht mit gemeinsamen Variab­ + len arbeiten. +- Auslagerung von Programmteilen (z.B. Unterprogrammen) in ELAN-Prozeduren, + die insertiert und vom BASIC-Programm aufgerufen werden können (vgl.4.7.). + Dieses Verfahren bietet die Möglichkeit, Variablen zwischen BASIC-Programm und + ELAN-Prozedur über die Prozedurschnittstelle auszutauschen. + +Neben der Begrenzung des Codes ist auch die Größe des Datenspeicherbereichs pro +BASIC-Programm begrenzt. Insgesamt dürfen die Datenobjekte eines BASIC- +Programms nicht mehr als 32 KByte Speicherplatz belegen. Andernfalls kommt es +zum #ib(3)#Compiler Error 307#ie(3)#. + +Eine weitere Grenze des EUMEL-Coders stellt die maximal zulässige Anzahl der +#ib(3)#Labels#ie(3)# (interne Sprungadressen) dar. Es können nur höchstens 2000 Labels vom +Coder verwaltet werden. Der BASIC-Compiler vergibt für jede gefundene Zeile mit +Zeilennummer ein Label und benötigt auch bei Schleifen (FOR-NEXT, WHILE- +WEND), Fallunterscheidungen (IF-Anweisung), Unterprogramm-Aufrufen (GOSUB) +und bei der Definition von benutzer-definierten Funktionen (DEF) Labels. +Beim Auftreten des #ib(3)#Compiler Errors 304#ie(3)# (zu viele Label) ist Abhilfe relativ leicht +dadurch möglich, daß Zeilennummern nur den Zeilen vergeben werden, die tatsächlich +angesprungen werden (d.h. zu denen es GOTOs oder GOSUBs gibt). + +#on ("b")# +Grenzen des BASIC-Compilers #off ("b")# +Die interne #ib(3)#Namenstabelle#ie(3)# des BASIC-Compilers kann etwa 4240 Einträge aufneh­ +men. Ein Eintrag in dieser Tabelle wird für jede Variable, für jedes Feld, für jede +benutzer-definierte Funktion und für jeden Parameter einer benutzer-definierten +Funktion sowie für jede Konstante erzeugt. Numerische Konstanten erhalten, sofern +sie konvertiert werden müssen, sogar zwei Einträge in der Namenstabelle. +Bei Auftreten des seltenen Fehlers "volle Namenstabelle" kann durch eine Aufteilung +des BASIC-Programms in Teilprogramme oder eine Auslagerung von Unterprogram­ +men in ELAN-Prozeduren Abhilfe geschaffen werden. + +#on ("b")# +Sonstige EUMEL-Grenzen #off ("b")# +Außer den bisher genannten Begrenzungen sei nochmals auf die Begrenzung des +#ib(3)#Codebereichs pro Task#ie(3)# hingewiesen (maximal 256 KByte Code). +Da der EUMEL-Coder und der BASIC-Compiler recht viel Code belegen, sollte +"vorsichtig" insertiert werden, also nur das, was wirklich benötigt wird. +Auch die übrigen Grenzen des EUMEL-Systems sind zu beachten (vergleiche hierzu +die Aufstellung der möglichen Compiler Errors im EUMEL-Benutzerhandbuch)! + +#page# +#head# +EUMEL-BASIC-Compiler 7. Fehlerbehandlung % + +#end# + +7. #ib(3)#Fehlerbehandlung#ie(3)# + + +7.1. #ib(3)#Fehler zur Übersetzungszeit#ie(3)# + +Endeckt der BASIC-Compiler bei der Übersetzung eines BASIC-Programms Fehler, +so werden diese auf dem Bildschirm angezeigt und ins #ib(3)#Notebook#ie(3)# eingetragen. +Nur (syntaktisch) fehlerfreie Programme werden zur Ausführung gebracht beziehungs­ +weise insertiert. +Im #ib(3)#Vordurchlauf#ie(3)# werden die Zeilennummern auf Richtigkeit überprüft. Falls bereits +hiebei Fehler festgestellt werden, bricht der Compiler die Übersetzung nach dem +Vordurchlauf ab. +Im #ib(3)#Hauptdurchlauf#ie(3)# wird das Programm Zeile für Zeile auf syntaktische Richtigkeit +überprüft und gleichzeitig übersetzt. Wird dabei in einer Programmzeile ein Fehler +entdeckt, so wird er angezeigt und die Übersetzung des Programms #on("i")#in der nächsten +Programmzeile#off("i")# fortgesetzt. Eine Ausnahme von dieser Regel bildet nur die #ib(3)#DEF FN#ie(3)#- +Anweisung, bei der bei gewissen Fehlern die Übersetzung fortgesetzt wird. (Der +Grund hierfür liegt darin, daß die Folgefehlerzahl besonders bei der DEF FN- +Anweisung sehr groß wäre, wenn beim Auftreten eines Fehlers die Übersetzung der +Zeile sofort abgebrochen würde. Die Parameter würden dann nämlich nicht oder +falsch abgelegt, und bei jedem Aufruf der Funktion würde ein Fehler gemeldet.) + +Eine Übersicht über alle verwendeten Fehlermeldungen zur Übersetzungszeit befindet +sich im AnhangC. + + + +Interne Compilerfehler + +Neben den "normalen" Fehlern (siehe oben) kann es in seltenen Fällen möglicher­ +weise auch zu internen Fehlern kommen. +Es gibt zwei verschiedene Sorten von internen Fehlern: +1. interne Fehler, die das Compilerprogramm selbst feststellt. + Solche Fehler bewirken die Meldung "Interner Fehler !" (meist mit näherer Erläu­ + terung) und die Fortsetzung der Übersetzung in der nächsten Programmzeile. +2. Fehler, die in anderen Paketen des BASIC-Systems oder des EUMELs (z.B. im + EUMEL-Coder) während der Übersetzungszeit ausgelöst werden (siehe auch + Kapitel 6: "Grenzen des Compilers"). + Solche Fehler werden mit "#ib(3)#BASIC-Compiler ERROR#ie(3)#" und eventuell näheren + Angaben gemeldet. Beim Auftreten eines solchen Fehlers wird die Übersetzung + des gesamten Programms abgebrochen. + +Sollten bei Ihrer Arbeit mit dem EUMEL-BASIC-Compiler interne Fehler auftreten, +die nicht auf das Überschreiten von Compilergrenzen zurückzuführen sind, dann +wären wir Ihnen für eine Meldung der Fehler dankbar. Bitte senden Sie eine Fehler­ +beschreibung an: + + Gesellschaft für Mathematik und Datenverarbeitung + Schloß Birlinghoven + Postfach 1240 + 5205 Sankt Augustin 1 + +Die Fehlerbeschreibung sollte nach Möglichkeit folgende Informationen enthalten: +- verwendete Hardware +- Urlader-Version +- EUMEL-Version +- Programmtext des Programms, das den Fehler auftreten ließ +- genaue Angabe der ausgegebenen Fehlermeldung + + +#page# + +7.2. #ib(3)#Fehler zur Laufzeit#ie(3)# + +Treten während der Laufzeit eines BASIC-Programms Fehler auf, so wird die Ausfüh­ +rung des Programms mit einer entsprechenden Fehlermeldung abgebrochen. +Da die meisten Laufzeit-Fehlermeldungen durch Prozeduren des EUMEL-Systems +(und nicht des BASIC-Systems) erzeugt werden, entsprechen sie oft nicht der +BASIC-Terminologie. (Beispielsweise führt ein zu großer Feldindex zu der Fehlermel­ +dung "Ueberlauf bei Subskription".) + +Die bei Laufzeitfehlern gemeldete #ib(3)#Fehlerzeile#ie(3)# bezieht sich nicht (wie bei ELAN-Pro­ +grammen) auf die Nummer der Dateizeile, sondern auf die letzte der Programmzeile +vorangegangene BASIC-Zeilennummer. + +Fast alle ausgelösten Laufzeitfehler erzeugen auch #ib(3)#Fehlercodes#ie(3)#. Dabei liefern Fehler +aus EUMEL-Betriebssystem-Prozeduren die EUMEL-Standard-Fehlercodes (vgl. +Systemhandbuch), zum Beispiel wird beim Fehler "INT-Ueberlauf" der Fehlercode 4 +geliefert. +Laufzeitfehler, die in Prozeduren des BASIC-Systems ausgelöst werden, liefern dage­ +gen den in Microsoft-BASIC üblichen Fehlercode plus 1000. So liefert die Meldung +"Keine Daten mehr für READ" den Fehlercode 1004 (MS-BASIC: "Out of data", +Fehlercode 4). +Es läßt sich so anhand des gelieferten Fehlercodes ermitteln, ob der Fehler im +BASIC-System oder an einer anderen Stelle des EUMEL-Systems ausgelöst wurde. + +Eine Übersicht über die innerhalb des BASIC-Systems erzeugten Fehlermeldungen +enthält Anhang C. + diff --git a/doc/basic/basic handbuch.2 b/doc/basic/basic handbuch.2 new file mode 100644 index 0000000..1379e9e --- /dev/null +++ b/doc/basic/basic handbuch.2 @@ -0,0 +1,2441 @@ +#page nr ("%", 31)# +#head# +EUMEL-BASIC-Compiler 8. Übersicht über die Befehle und Funktionen % + +#end# + +8. Übersicht über die Anweisungen und Funktionen + + + +In diesem Kapitel sind alle Anweisungen und Funktionen des vom Compiler übersetz­ +baren BASIC-Sprachumfangs in alphabetischer Reihenfolge aufgeführt. +Auch die Anweisungsbestandteile (z.B. ELSE und TO) sind mit einem Hinweis auf die +zugehörige Anweisung eingeordnet. +Sind bei Funktionen INT- oder REAL-Ausdrücke als Argumente angegeben, so ist +dies als Hinweis auf den Sinn der Funktion zu verstehen. Es können auch Ausdrücke +des jeweils anderen Datentyps eingesetzt werden. Wird statt eines INT-Ausdrucks +ein REAL-Ausdruck angegeben, so darf dessen Wert aber nur innerhalb des +Wertebereichs für INTs liegen, da der REAL-Wert bei der Ausführung der Funktion +in einen INT-Wert konvertiert wird. + + + +Funktion : ABS + +Zweck : Berechnung des Betrages (Absolutwertes) einer Zahl + +Syntax : ABS () + +Erklärung : Liefert den Betrag des numerischen Ausdrucks. + Das Ergebnis ist vom gleichen Typ wie das Argument. + + +Beispiel : 10 a = -12.74 + 20 PRINT ABS (a) + Ausgabe: 12.74 + +Vergleiche : SGN-Funktion + + + +Operator : AND + +Siehe Kapitel 4.4. (Operatoren) + + + +Anweisungsbestandteil : AS + +Siehe NAME-Anweisung + + + +Funktion : ASC + +Zweck : Ermittlung des ASCII-Codes eines Textzeichens + +Syntax : ASC () + +Erklärung : Die Funktion liefert den ASCII-Code des ersten Zeichens des + TEXT-Ausdrucks. + Der Code wird als INT geliefert. + + +Beispiel : 10 a$ = "Guten Tag !" + 20 PRINT ASC (a$) + Ausgabe: 71 + +Vergleiche : CHR$-Funktion (Komplementärfunktion) + + + +Funktion : ATN + +Zweck : Berechnung des Arcustangens + +Syntax : ATN () + +Erklärung : Die Funktion liefert den Arcustangens des + numerischen Ausdrucks in Radiant. + + +Beispiel : 10 LET x = 4 + 20 PRINT ATN (x) + Ausgabe: 1.325818 + +Vergleiche : TAN-Funktion (Komplementärfunktion), SIN, COS + + + +Anweisungsbestandteil : BASE + +Siehe OPTION BASE-Anweisung + + + +Anweisung : CALL + +Zweck : Aufruf einer insertierten Prozedur + +Syntax : CALL #right#[ ( [, ] [...] ) ] + +Erklärung : : Folge aus Zeichen, die für Prozeduren im + EUMEL-System zugelassen sind (also Buchstaben und - ab der + zweiten Stelle - Zahlen), aber keine Leerzeichen. + + : | + + : Ausdruck (genau des von der Prozedur + benötigten Typs) + : Variable (genau des von der Prozedur benö­ + tigten Typs) + + Die Prozedur mit dem angegebenen wird mit den + angegebenen Parametern aufgerufen. + Die aufgerufene Prozedur darf keinen Wert liefern (vgl. USR-Funk­ + tion). + + Mögliche Fehlerfälle: + - Eine Prozedur mit dem Namen und den an­ + gegebenen Parametern gibt es nicht. + - Die Prozedur liefert einen Wert. + - Die Prozedur benötigt Parametertypen, die in BASIC nicht bekannt + sind (z.B. BOOL, FILE, TASK, QUIET). + - Ein Parameter ist CONST, es wird aber ein VAR-Parameter ver­ + langt. + + Weitere Informationen finden Sie in Kapitel 4.7. + +Hinweis : 1. Bei den Parametern wird keine Typkonvertierung vorgenommen. + 2. Der Prozedurname muß (entgegen der ELAN-Gewohnheit) ohne + Leerzeichen angegeben werden. + 3. Statt des Anweisungswortes CALL kann auch CHAIN geschrieben + werden. CALL und CHAIN werden im EUMEL-BASIC nicht wie + in Microsoft-BASIC benutzt. + + +Beispiel : 10 CALL sysout ("Meine Datei") + 20 PRINT "Dieser Text geht nun in die Datei" + 30 CALL sysout ("") + 40 PRINT "Wieder auf den Bildschirm" + + +Vergleiche : USR-Funktion + + + +Funktion : CDBL + +Zweck : Konvertierung in den Datentyp REAL + +Syntax : CDBL () + +Erklärung : Das Ergebnis des numerischen Ausdrucks wird als REAL geliefert. + + +Beispiel : 10 LET a! = 17 + 20 PRINT USR max (CDBL (a!), 152.3) + 30 REM max benötigt zwei REALs als Parameter + + +Vergleiche : CINT-Funktion + + + +Anweisung : CHAIN + +Vollkommen identisch mit der CALL-Anweisung (Erklärung siehe dort !) + + + +Funktion : CHR$ + +Zweck : Erzeugung eines Textzeichens mit einem bestimmten ASCII-Code + +Syntax : CHR$ () + +Erklärung : Die Funktion liefert das Zeichen mit dem ASCII-Code, den der + INT-Ausdruck angibt. + Das Zeichen wird als TEXT geliefert. + Die Leistung der Funktion ist nur für Werte im Bereich 0 bis 255 + definiert. + + +Beispiel : 10 PRINT CHR$ (61) + Ausgabe: = + +Vergleiche : ASC-Funktion (Komplementärfunktion) + + + +Funktion : CINT + +Zweck : Konvertierung in den Datentyp INT + +Syntax : CINT () + +Erklärung : Das Ergebnis des numerischen Ausdrucks wird als INT geliefert. + REALs werden gerundet. Werte außerhalb des INT-Bereichs führen + zu einem INT-Überlauf. + + +Beispiel : 10 LET a = 17.625 + 20 PRINT CINT (a); CINT (-a) + Ausgabe: 18 -18 + +Vergleiche : CDBL-, FIX-, INT-Funktionen + + + +Anweisung : CLS + +Zweck : Löschen des Bildschirms + +Syntax : CLS + +Erklärung : Löscht den Bildschirm und positioniert den Cursor in die linke obere + Bildschirmecke (Position 1, 1). + + +Beispiel : 10 CLS + 20 PRINT "PROGRAMMBEGINN" + + + + +Funktion : COS + +Zweck : Berechnung des Cosinus eines Radiantwertes + +Syntax : COS () + +Erklärung : : REAL-Ausdruck, der den Winkel in Radiant angibt. + Die Funktion liefert den Cosinus des Winkels als REAL. + + +Beispiel : 10 PI = 3.141593 + 20 PRINT COS (PI/4) + Ausgabe: .7071067 + +Vergleiche : SIN-, TAN-Funktionen + + + +Funktion : CSRLIN + +Zweck : Ermittlung der aktuellen Cursorzeile + +Syntax : CSRLIN + +Erklärung : Geliefert wird die Nummer der Zeile (als INT), in der sich der Cursor + auf dem Bildschirm befindet. Die oberste Zeile hat die Nummer 1. + + +Beispiel : 10 CLS + 20 PRINT + 30 PRINT CSRLIN + Ausgabe: 2 + +Vergleiche : POS-Funktion + + + +Funktion : CVD, CVI + +Zweck : Decodierung von in Texten verschlüsselten Zahlenwerten + +Syntax : CVD () + CVI () + +Erklärung : INTs und REALs können (mit MKI$ und MKD$) zu Texten codiert + werden. + CVD decodiert einen in 8 TEXT-Zeichen codierten REAL-Wert. + CVI decodiert einen in 2 TEXT-Zeichen codierten INT-Wert. + Es wird beim ersten Zeichen des TEXT-Ausdrucks mit der Dekodie­ + rung begonnen. + Ist der TEXT zu kurz, so wird mit der Meldung "Ueberlauf bei Subs­ + kription" abgebrochen. + + +Beispiel : 10 zahl$ = MKD$ (3.1415) + 20 PRINT CVD (zahl$) + Ausgabe: 3.1415 + +Vergleiche : MKD$-, MKI$- Funktionen (Komplementärfunktionen) + + + +Anweisung : DATA + +Zweck : Ablegen von Konstanten + +Syntax : DATA [] [, []] [...] + +Erklärung : : | + : von Anführungszeichen umschlossene Zeichen­ + folge, die alle Zeichen außer Anführungs­ + zeichen enthalten darf + : Zeichenfolge, die alle Zeichen außer Komma + und Doppelpunkt enthalten darf + + Eine DATA-Anweisung stellt einen Datenspeicher dar, der mit READ + (s.d.) ausgelesen werden kann. + In der DATA-Anweisung können "quoted strings" oder "unquo­ + ted strings" angegeben werden. "quoted strings" können später nur + noch als Texte ausgelesen werden. + Bei "unquoted strings" wird der Datentyp in der DATA-Anweisung + dagegen nicht festgelegt. Sie können also als INTs, REALs oder + TEXTe ausgelesen werden. Sollen "unquoted strings" Zahlenwerte + darstellen, so müssen sie den in BASIC üblichen Schreibregeln für + die numerischen Konstanten des jeweiligen Typs genügen. Es sind + allerdings zusätzlich noch Vorzeichen erlaubt. + Wenn die nicht angegeben sind, so wird ein "nil-Datum" + abgelegt. Dieses bewirkt bei einem READ mit numerischer Variable + die Lieferung des Wertes null und bei einem READ mit TEXT-Vari­ + able die Lieferung eines Leertextes. + + Die DATA-Anweisungen können an beliebiger Stelle im Programm + (vor oder hinter den zugehörigen READ-Anweisungen) stehen. + + Alle DATA-Anweisungen eines Programms bilden zusammen einen + großen sequentiellen Speicher, auf den mit READ der Reihe nach + zugegriffen wird. Intern wird ein sogenannter READ-DATA-Zeiger + geführt, der immer auf das nächste auszulesende Element zeigt. + Die RESTORE-Anweisung (s.d.) ermöglicht es, den READ- + DATA-Zeiger auf das erste Element einer bestimmten DATA-Zeile + zu setzen. + + +Beispiel : 2020 PRINT "Stadt", "Land", "Fluß" + 2030 READ stadt$, land$, fluß$ + 2040 PRINT stadt$, land$, fluß$ + . + 5000 DATA Paris, Frankreich, Seine + + +Vergleiche : READ-, RESTORE-Anweisungen + + + +Funktion : DATE$ + +Zweck : Abrufen des aktuellen Tagesdatums + +Syntax : DATE$ + +Erklärung : Das Tagesdatum wird als Text in der Form TT.MM.JJ geliefert. + + +Beispiel : 10 PRINT "Heute ist der " + DATE$ + Ausgabe (z.B.): Heute ist der 28.08.87 + +Vergleiche : TIME$-Funktion + + + +Anweisung : DEFDBL, DEFINT, DEFSNG, DEFSTR + +Zweck : Definition von Anfangsbuchstaben zur Kennzeichnung bestimmter + Variablentypen + +Syntax : DEFDBL [ - ] + #right#[, [ - ] ] [...] + DEFINT [ - ] + #right#[, [ - ] ] [...] + DEFSNG [ - ] + #right#[, [ - ] ] [...] + DEFSTR [ - ] + #right#[, [ - ] ] [...] + + +Erklärung : Mit den aufgeführten Anweisungen ist es möglich, bestimmte Buch­ + staben festzulegen, die, wenn sie als Anfangsbuchstaben eines + Variablennamens verwendet werden, der Variablen einen bestimmten + Typ zuordnen. + + Die Typfestlegung durch Kennzeichnung mit den Zeichen '!', '\#', '%' + oder '$' hat jedoch Vorrang vor den festgelegten Anfangsbuchstaben. + Eine genaue Erläuterung, nach welchen Kriterien der BASIC-Compi­ + ler den Typ einer Variablen feststellt, befindet sich in Kapitel 4.3. + + Die DEFINT-Anweisung legt Anfangsbuchstaben für INT-Variablen + fest. + Mit der DEFSTR-Anweisung werden Anfangsbuchstaben von + TEXT-Variablen festgelegt. + Die Anweisungen DEFDBL- und DEFSNG- wurden nur aus Kom­ + patibilitätsgründen implementiert. Sie werden zwar auf syntaktische + Richtigkeit überprüft, aber ansonsten vom Compiler nicht beachtet. + + Werden bei den Anweisungen ganze Buchstabenbereiche angegeben, + so muß der Buchstabe vor dem Bindestrich auch im Alphabet vor + dem Buchstaben hinter dem Bindestrich stehen. + +Hinweis : 1. Die oben beschriebenen Anweisungen gelten stets erst für die im + weiteren Text neu benutzten (also neu eingerichteten) Variablen. + 2. Die beschriebenen Anweisungen dürfen auch mehr als einmal in + einem Programm vorkommen. Die Buchstaben, die in der zweiten + und in den folgenden Anweisungen festgelegt werden, werden + #on("izusätzlich#off("i zu den in der ersten Anweisung festgelegten Buchsta­ + ben als Kennzeichen für den betreffenden Datentyp vom Compiler + vermerkt. + 3. Der Compiler überprüft nicht, ob gleiche Buchstaben als Kennzei­ + chen für mehr als einen Variablentyp angegeben werden (siehe + Kapitel 4.3.). Der Benutzer ist also selbst dafür verantwortlich, daß + solche Überschneidungen nicht vorkommen. + + +Beispiel : 10 DEFSTR s - z + 20 DEFINT a - h, n + 30 DIM tabelle (17) 'TEXT-Feld + 40 LET c = 4 'INT-Variable + 50 LET nummer = 17 'INT-Variable + 60 LET ueberschrift = "Willkommen" 'TEXT-Variable + 70 LET reellezahl = 19.563 'REAL-Variable + 80 LET aha\# = -1.36E17 'REAL-Variable + + + + +Anweisung : DEF FN + +Zweck : Definition einer benutzer-definierten Funktion + +Syntax : DEF FN [ ( [, ] #right# [...] ) ] = + +Erklärung : : Zeichenfolge, die der Syntax für Variablennamen + entsprechen muß + FN bilden zusammen den Namen der + neuen Funktion + : Zeichenfolge, die der Syntax für Variablennamen + entsprechen muß + : Ausdruck, der Konstanten, Variablen, die + Parameter der Funktion und Aufrufe + anderer Funktionen enthalten darf + + Mit der DEF FN-Anweisung wird eine benutzer-definierte Funktion + ("user function") mit dem Funktionsnamen FN definiert + (vergleiche hierzu auch Kapitel 4.5.). + Die benutzer-definierte Funktion liefert, genau wie die standard­ + mäßig eingebauten Funktionen, einen Wert, der sich aus der Auswer­ + tung des unter angegebenen Ausdrucks + ergibt. + Das letzte Zeichen des Funktionsnamens gibt den Typ des Wertes + an, den die Funktion liefert. Soll die Funktion einen TEXT liefern, so + muß der Name mit "$" enden. Soll ein INT geliefert werden, muß der + Name mit "%" enden. Für alle anderen Endungen wird eine REAL- + liefernde Funktion eingetragen. + Bezeichnet der Funktionsname eine TEXT-liefernde Funktion, so + muß auch die Funktionsdefinition ein Ergebnis vom Typ TEXT liefern. + Zwischen INTs und REALs findet eine Typanpassung statt. + + Die Parameter stehen für die beim Aufruf der Funktion übergebenen + Argumente. + Sie haben nur bei der Definition Gültigkeit. Hierbei 'überdecken' sie + (für diese Zeile) eventuell im BASIC-Programm vorhandene gleich­ + namige Variablen. + Die Syntax der Parameternamen entspricht der Syntax der Namen + von einfachen Variablen. + Jeder Parameter darf in der Parameterliste nur einmal vorkommen. + + In der Definition dürfen auch Aufrufe von zuvor definierten anderen + "user functions" erscheinen, nicht aber die zu definierende Funktion + selbst (rekursive Definition). + + Die Funktionen sind allein durch ihre Namen gekennzeichnet. Gene­ + rische Funktionen (gleicher Name, aber unterschiedliche Parameter) + können somit nicht definiert werden. + +Hinweis : 1. Die Definition einer "user function" muß ihrem ersten Aufruf + immer textuell vorausgehen. + 2. "user functions" können auch mehrfach definiert werden. Der + Compiler gibt in einem solchen Fall aber eine Warnung aus, da + die neue Definition nur für die textuell folgenden Aufrufe gültig ist. + + +Beispiel : 10 LET pi = 3.1415927 + 20 DEF FNkreisflaeche (radius) + #right#= 4.0 * pi * radius * radius + 1010 PRINT FNkreisflaeche (1.75) + Ausgabe: 38.48451 + + + +Anweisung : DIM + +Zweck : Dimensionierung eines Feldes + +Syntax : DIM [, ] [...] + +Erklärung : : ( + #right#[, ] [...] ) + : Name des Feldes (Syntax wie Name von einfachen + Variablen, vgl. 4.3.) + + Mit der DIM-Anweisung wird ein Feld dimensioniert, das heißt die + Anzahl seiner Dimensionen sowie der kleinste und größte Index in + jeder Dimension werden festgelegt und der Speicherplatz für seine + Elemente (siehe 4.3.) wird reserviert. + + Der kleinste Index in allen Dimensionen richtet sich nach der letzten + vorausgegangenen OPTION BASE-Anweisung. + Geht der Dimensionierung die Anweisung OPTION BASE 0 textuell + voraus oder ist keine OPTION BASE-Anweisung vor der Dimensio­ + nierung vorhanden, so ist der kleinste Index in allen Dimensionen + null. + Wenn der Dimensionierung aber eine OPTION BASE 1-Anweisung + vorausgeht, dann ist der kleinste Index in allen Dimensionen eins. + + Der größte Feldindex wird für jede Dimension durch die in Klammern + stehenden INT-Konstanten angegeben. Die Anzahl dieser INT-Kon­ + stanten bestimmt auch, wie viele Dimensionen das dimensionierte + Feld hat. + + Wird auf ein Element einer Feldvariablen zugegriffen, ohne daß die + Feldvariable vorher dimensioniert wurde, dann wird das Feld automa­ + tisch dimensioniert, wobei die Anzahl der Dimensionen anhand der + Anzahl der Indizes beim Aufruf ermittelt wird. Der größte Feldindex + wird bei dieser automatischen Dimensionierung in jeder Dimension + auf zehn gesetzt. Der kleinste Index richtet sich nach den vorausge­ + gangenen OPTION BASE-Anweisungen (siehe oben). + + Fehlerfälle bei der Dimensionierung: + - "Das Feld ist bereits dimensioniert": + Das Feld wurde bereits explizit, oder automatisch durch den Zugriff + auf ein Feldelement dimensioniert . + - "Die Obergrenze muß >= 1 sein": + Es wurde versucht, 0 als größten Index in einer Dimension festzu­ + legen, obwohl mit OPTION BASE der kleinste Index auf eins fest­ + gelegt wurde. + + Fehlerfälle beim Zugriff auf ein Feldelement: + - "Dimensioniert in ... Dimensionen, gefundene Anzahl Indizes ...": + Beim Zugriff wurde eine Anzahl von Indizes gefunden, die nicht mit + der Anzahl der Dimensionen übereinstimmt (Fehler zur Über­ + setzungszeit). + - "Ueberlauf bei Subskription" oder "Unterlauf bei Subskription": + Der Index ist zu groß beziehungsweise zu klein (Fehler zur Lauf­ + zeit). + + +Beispiel : 10 DIM a% (20, 10), text$ (30, 40) + 20 DIM tabelle (5, 7, 25) + 30 LET element = matrix (1, 7) + + Zeile 30 führt eine automatische Dimensionierung durch, die einem + DIM matrix (10, 10) entspricht. + + + +Anweisungsbestandteil : ELSE + +Siehe IF-Anweisung + + + +Anweisung : END + +Zweck : Beenden der Programmausführung eines BASIC-Programms + +Syntax : END + +Erklärung : END beendet die Programmausführung des BASIC-Programms ohne + eine Meldung (im Gegensatz zu STOP, s.d.). + END-Anweisungen dürfen im Programm an beliebiger Stelle stehen, + und es darf auch mehr als eine END-Anweisung in einem + Programm vorkommen. + Der Compiler übersetzt ein Programm auch nach Erreichen einer + END-Anweisung weiter. + Nach der letzten Anweisung eines Programms muß kein END stehen. + + +Beispiel : 2020 PRINT "Das war's !" + 2030 REM Hiernach hört's auf + 2040 END + + +Vergleiche : STOP-Anweisung + + + +Anweisungsbestandteil : EOF + +Siehe INPUT-Anweisung + + + + +Operator : EQV + +Siehe Kapitel 4.4. (Operatoren) + + + +Funktion : ERL + +Zweck : Ermittlung der letzten Fehlerzeile + +Syntax : ERL + +Erklärung : Die Nummer der Zeile, in der der letzte Fehler auftrat, wird als INT + geliefert. + +Hinweis : ERL ist realisiert durch Aufruf der Prozedur 'errorline' des Betriebs­ + systems. + Da die Fehlerbehandlungs-Anweisung ON ERROR nicht zur Verfü­ + gung steht, ist diese Funktion nicht im üblichen BASIC-Sinne + brauchbar. + +Vergleiche : ERM$, ERR-Funktionen, ERROR-Anweisung + + + +Funktion : ERM$ + +Zweck : Ermittlung der letzten Fehlermeldung + +Syntax : ERM$ + +Erklärung : Die letzte Fehlermeldung wird als TEXT geliefert. + +Hinweis : ERM$ ist realisiert durch Aufruf der Prozedur 'errormessage' des + Betriebssystems. + Da die Fehlerbehandlungs-Anweisung ON ERROR nicht zur Verfü­ + gung steht, ist diese Funktion nicht im üblichen BASIC-Sinne + brauchbar. + +Vergleiche : ERL-, ERR-Funktionen, ERROR-Anweisung + + + +Funktion : ERR + +Zweck : Ermittlung des letzten Fehlercodes + +Syntax : ERR + +Erklärung : Der Code des letzten aufgetretenen Fehlers wird als INT geliefert. + +Hinweis : ERR ist realisiert durch Aufruf der Prozedur 'errorcode' des Betriebs­ + systems. + Da die Fehlerbehandlungs-Anweisung ON ERROR nicht zur Verfü­ + gung steht, ist diese Funktion nicht im üblichen BASIC-Sinne + brauchbar. + +Vergleiche : ERL-, ERM$-Funktionen, ERROR-Anweisung + + + +Anweisung : ERROR + +Zweck : Auslösen eines Fehlers mit bestimmtem Fehlercode + +Syntax : ERROR + +Erklärung : Es wird ein Fehler mit dem durch den INT-Ausdruck bestimmten + Fehlercode ausgelöst. + +Hinweis : ERROR ist realisiert durch Aufruf der Prozedur 'errorstop' des Be­ + triebssystems. + Da die Fehlerbehandlungs-Anweisung ON ERROR nicht zur Verfü­ + gung steht, ist diese Anweisung nicht im üblichen BASIC-Sinne + brauchbar. + +Vergleiche : ERL-, ERM$-, ERR-Funktionen + + + +Funktion : EXP + +Zweck : Berechnung einer Potenz der Eulerschen Zahl + +Syntax : EXP () + +Erklärung : Die Funktion liefert e (die Basis des natürlichen Logarithmus) poten­ + ziert mit dem Wert des REAL-Ausdrucks. + Bei zu großen Werten kommt es zum Fehler 'REAL-Ueberlauf'. + Das Ergebnis der Funktion wird als REAL geliefert. + + +Beispiel : 10 PRINT EXP (10.0) + Ausgabe: 22026.47 + +Vergleiche : LOG-Funktion (Komplementärfunktion) + + + +Funktion : FIX + +Zweck : Ermittlung der Vorkommastellen einer REAL-Zahl + +Syntax : FIX () + +Erklärung : Die Funktion schneidet die Nachkommastellen ab und liefert nur die + Vorkommastellen des REAL-Ausdrucks. + Die Vorkommastellen werden ebenfalls als REALs geliefert. + + +Beispiel : 10 zahl = 1.2345E2 + 20 PRINT FIX (zahl) + Ausgabe: 123 + +Vergleiche : CINT-, INT-Funktionen + + + +Anweisung : FOR + +Zweck : Beginn einer Zählschleife + +Syntax : FOR = #ib(3)#TO#ie(3)# + #right#[ #ib(3)#STEP#ie(3)# ] + + + +Erklärung : : INT- oder REAL-Variable + : numerischer Ausdruck + : numerischer Ausdruck + : numerischer Ausdruck + : Folge von Programmzeilen + + Die FOR-Anweisung erlaubt die komfortable Programmierung von + automatischen Zählschleifen (sogenannten FOR-NEXT-Schleifen). + Gelangt das Programm während der Ausführung an eine FOR-An­ + weisung, so werden zunächst die Ausdrücke , + sowie gegebenenfalls ausgewertet. Der + Anfangswert wird dann der Variablen zugewiesen. + Wenn der Wert der Variablen größer ist als der Endwert (bzw. kleiner + als der Endwert bei negativer Schrittweite), dann wird das Programm + mit der nach dem korrespondierenden NEXT (s.d.) folgenden + Anweisung fortgesetzt. + Ist dies jedoch nicht der Fall, werden die Anweisungen des ausgeführt. Erreicht das Programm nun die zum FOR + gehörige NEXT-Anweisung (gleiche Variable), so wird der Wert der + Variablen um die Schrittweite erhöht beziehungsweise erniedrigt (je + nach Vorzeichen), und wieder an den Anfang der Schleife verzweigt. + Hier findet dann wieder der Vergleich des Variableninhalts mit dem + Endwert statt (siehe oben). + + Die Laufvariable darf innerhalb der Schleife in Ausdrücken vorkom­ + men. Sie darf sogar verändert werden (, was aber zu unübersichtli­ + chen Effekten führen kann). Auch eine Schachtelung mehrerer + Schleifen mit der gleichen Laufvariable ist syntaktisch möglich, sollte + aber #on("iunter allen Umständen#off("i vermieden werden. + + FOR-NEXT-Schleifen dürfen (auch mit WHILE-WEND-Schleifen, + s.d.) geschachtelt werden. Überschneidungen von FOR-NEXT- + Schleifen und WHILE-WEND-Schleifen sind aber nicht zulässig. + + +Beispiel : 10 DIM name$ (5) + 20 FOR i = 1 TO 5 + 30 PRINT "Bitte geben Sie den " + STR$ (i) + #right#+ ". Namen ein:"; + 40 INPUT name$ (i) + 50 NEXT i + + + Es werden die fünf Elemente des Feldes 'name$' eingelesen. + +Vergleiche : NEXT-, WHILE-, IF-Anweisungen + + + +Funktion : FRE + +Zweck : Ermittlung des verfügbaren Speicherplatzes + +Syntax : FRE () + FRE () + +Erklärung : Die Funktion liefert die Anzahl der freien Bytes. + FRE veranlaßt außerdem ein 'collect heap garbage' (EUMEL- + Systemprozedur). + + Das Ergebnis der Funktion wird als REAL geliefert. + Der Argument-Ausdruck ist ein Dummy-Argument (hat keinen + Einfluß auf den gelieferten Wert). + +Hinweis : Bei der EUMEL M+ Version wird ein korrektes Ergebnis geliefert + (vgl.'storage info'). + + +Beispiel : 10 PRINT FRE (0) + Ausgabe (z.B.): 5324800 + + + +Anweisungsbestandteil : GO + +Siehe GOSUB und GOTO + + + +Anweisung : GOSUB + +Zweck : Unterprogramm-Aufruf + +Syntax : GOSUB + +Erklärung : : INT-Konstante + Statt GOSUB darf auch GO #ib(3)#SUB#ie(3)# geschrieben werden. + + Die Programmausführung wird in der Zeile mit der angegebenen + Zeilennummer fortgesetzt. Die Zeile mit der Zeilennummer muß im + Programm existieren. + Wird im weiteren Programmablauf die Anweisung RETURN gefunden, + so wird hinter dem letzten abgearbeiteten GOSUB die Programm­ + ausführung fortgesetzt. + GOSUB dient zum Aufruf von #on("iUnterprogrammen#off("i, die von mehr als + einer Stelle im Programm (und auch in anderen Unterprogrammen) + aufgerufen werden können. + +Hinweis : Es wird empfohlen, Unterprogramme im Programm deutlich als solche + zu kennzeichnen und (durch END, STOP oder GOTO) sicherzustel­ + len, daß nur mit GOSUB zu ihnen verzweigt wird, da es sonst leicht + zu der (Laufzeit-) Fehlermeldung "RETURN ohne GOSUB" kommen + kann. + + +Beispiel : 140 GOSUB 10000 'Zeige Uhrzeit + . + . + 370 GOSUB 10000 'Zeige Uhrzeit + 9990 END + 10000 REM Unterprogramm Zeige Uhrzeit + 10010 PRINT "Es ist " + TIME$ + " Uhr" + 10020 RETURN + + +Vergleiche : RETURN-, ON-, GOTO- Anweisungen + + + +Anweisung : GOTO + +Zweck : Sprung zu einer angegebenen Zeile + +Syntax : GOTO + +Erklärung : : INT-Konstante + Statt GOTO darf auch GO #ib(3)#TO#ie(3)# geschrieben werden. + + Die Programmausführung wird in der Zeile mit der angegebenen + Zeilennummer fortgesetzt. Die Zeile mit der Zeilennummer muß im + Programm existieren. + + +Beispiel : 10 INPUT "Monat (1-12)", monat% + 20 IF monat% < 1 OR monat% > 12 THEN GOTO 10 + + +Vergleiche : ON-, IF-, GOSUB- Anweisungen + + + +Funktion : HEX$ + +Zweck : Erzeugung der hexadezimalen Darstellung einer Zahl als Text + +Syntax : HEX$ () + +Erklärung : Die Funktion liefert die hexadezimale (Zweierkomplement-) Darstel­ + lung der Zahl, die sich aus dem INT-Ausdruck ergibt. + + +Beispiel : 10 PRINT HEX$ (10000) + Ausgabe: 2710 + +Vergleiche : OCT$-Funktion + + + +Anweisung : IF + +Zweck : Sprung zu einer angegebenen Zeile + +Syntax : IF + #right#[,] #ib(3)#THEN#ie(3)# | + #right#[ [,] #ib(3)#ELSE#ie(3)# |] + IF [,] GOTO + #right#[ [,] ELSE |] + +Erklärung : : numerischer Ausdruck + : Eine oder mehrere BASIC-Anweisungen, wobei + mehrere wie gewohnt durch ':' zu trennen sind + : INT-Konstante + Statt GOTO darf auch GO TO geschrieben werden. + + Anhand der Bedingung wird entschieden, ob die Abarbeitung des + Programms mit dem THEN- oder ELSE-Zweig fortgesetzt werden + soll. Mit dem THEN-Zweig wird das Programm fortgesetzt, wenn die + Bedingung erfüllt ist (, d.h. der numerische Ausdruck ungleich null + ist). Im anderen Fall (Bedingung nicht erfüllt, numerischer Ausdruck + gleich null) wird das Programm mit dem ELSE-Teil fortgesetzt. Ist + kein ELSE-Teil angegeben, so wird die Abarbeitung des + Programmes in der folgenden #on("iZeile#off("i (nicht nach ':') fortgesetzt. + + Sind statt Anweisungen Zeilennummern nach THEN oder ELSE + angegeben, so entspricht dies einem GOTO (s.d.) zu diesen Zeilen­ + nummern. + + +Hinweis : Auch eine IF-Anweisung muß in #on("ieiner#off("i Programmzeile stehen. + + +Beispiel : 10 IF a >= b THEN IF a > b THEN + #right#PRINT "a größer b" ELSE PRINT "a gleich b" + #right#ELSE PRINT "a kleiner b" + + + Das Beispiel zeigt, daß bei geschachtelten IF-Anweisungen die + ELSE-Teile immer auf das letzte vorhergehende IF bezogen werden, + für das noch kein ELSE-Teil gefunden wurde. + + + +Vergleiche : GOTO-, GOSUB-, ON-Anweisungen + + + +Operator : IMP + +Siehe Kapitel 4.4. (Operatoren) + + + +Funktion : INKEY$ + +Zweck : Holen eines Zeichens von der Tastatur + +Syntax : INKEY$ + +Erklärung : Die Funktion liefert ein Textzeichen aus dem Tastaturzeichenpuffer. + Wurde kein Zeichen eingegeben, so wird ein Leertext (niltext) gelie­ + fert. + Die gelieferten Zeichen erscheinen nicht auf dem Bildschirm. + + +Beispiel : 10 REM Schreibmaschine + 20 LET a$ = INKEY$ + 30 IF ASC (a$) = 27 THEN STOP + 40 PRINT a$; + 50 GOTO 20 + + + Die eingegebenen Zeichen werden ausgegeben. Abbruch mit ESC. + +Vergleiche : INPUT$-Funktion, INPUT-Anweisung + + + +Anweisung : INPUT + +Zweck : Einlesen von Daten von der Tastatur + +Syntax : INPUT [;] [ ,|; ][ #ib(3)#EOF#ie(3)# + ] + #right# [, ] [...] + +Erklärung : : TEXT-Konstante + : INT-Konstante + : Variable, der der eingelesene Werte + zugewiesen werden soll + + Mit der INPUT-Anweisung werden Daten zur Laufzeit des + Programms von der Tastatur in Variablen eingelesen. + + Folgt dem INPUT-Statement ein Semikolon, so wird nach + Beendigung der Eingabe kein Zeilenwechsel vorgenommen. + + Fehlt die , so wird "? " als Eingabe­ + aufforderung ausgegeben. + Folgt der ein Semikolon, so wird "? " noch zusätzlich ausge­ + geben. Bei einem Komma wird dieser Standard-Prompt unter­ + drückt. + + Folgt der die Zeichenfolge 'EOF', so wird + bei Eingabe eines Leertextes zu der nach 'EOF' angegebenen + Zeilennumer verzweigt. + + Sollen mehrere Variablen eingelesen werden, so muß der Benutzer + auch entsprechend viele Daten (durch Kommata getrennt) zur Verfü­ + gung stellen. + + Wird nichts eingegeben beziehungsweise nur die richtige Anzahl von + Kommata, so wird den entsprechenden Variablen 0, 0.0 bzw. 'niltext' + zugewiesen. + + Bei der Eingabe für eine Textvariable können alle Zeichen (außer + Steuerzeichen) eingegeben werden. Beginnt eine Eingabe mit dem + Anführungszeichen oder endet sie damit, dann muß sie auch damit + enden beziehungsweise beginnen. Diese beiden Anführungszeichen + werden nicht mit zugewiesen. Innerhalb dieser Texteingabe dürfen + Anführungszeichen stehen, aber keine Kommata. + + Eingaben für numerische Variablen müssen in der für Konstanten + üblichen Schreibweise erfolgen. Vorzeichen sind allerdings zusätzlich + erlaubt. + + Vor Zuweisung der eingegebenen Werte an die Variablen werden + Anzahl und Typ(en) und die Anzahl überprüft. + Dabei können folgende Fehlerfälle auftreten: + - "falscher Typ": + Es wurde ein Text statt einer Zahl eingegeben, es wurde ein REAL + statt eines INTs eingegeben oder eine Texteingabe ist fehlerhaft. + - "zu wenig Daten" + - "zu viele Daten" + - "Überlauf": + Es wurde eine zu große (oder zu kleine) Zahl eingegeben. + + Kommt es zu einem Fehler, dann wird nach der Meldung "?Eingabe + wiederholen ! ()" die Eingabe zum Editieren + angeboten. + +Hinweis : Bei Eingabe von 'ESC k' kann die letzte Eingabezeile zum Editieren + zurückgeholt werden. + + Die Eingabe kann mit der Systemprozedur 'sysin' aus einer Datei + erfolgen. Aus der Eingabedatei wird für jedes INPUT-Statement eine + Zeile eingelesen. Die Ausgabe der Eingabeaufforderung und der + Zeilenwechsel nach der Eingabe werden unterdrückt. Sind die + Eingabedaten fehlerhaft, so wird das Programm mit 'errorstop' + abgebrochen. + + Wird die Ausgabe mit 'sysout' umgeleitet, so werden die Eingabe­ + aufforderung, die Eingabezeichenfolge und der Zeilenwechsel nach + der Eingabe auf den Bildschirm und in die Ausgabedatei ausgegeben, + auch dann, wenn der Text der Eingabe aus einer Datei eingelesen + wurde. + + +Beispiel : 1990 INPUT "Name, Vorname, Alter"; + #right#name$, vorname$, alter% + + +Vergleiche : INKEY$-, INPUT$-Funktionen + + + +Funktion : INPUT$ + +Zweck : Holen einer Zeichenfolge von der Tastatur + +Syntax : INPUT$ () + +Erklärung : : INT-Ausdruck + + Die Funktion liefert eine Folge von Textzeichen + aus dem Tastaturzeichenpuffer. Enthält der Puffer nicht alle ge­ + wünschten Zeichen, so wird auf weitere Zeichen von der Tastatur + gewartet. + Die gelieferten Zeichen erscheinen nicht auf dem Bildschirm. + + +Beispiel : 10 PRINT "Bitte drei Zeichen eingeben !" + 20 LET a$ = INPUT$ (3) + 30 PRINT "Danke schön !" + + +Vergleiche : INKEY$-Funktion, INPUT-Anweisung + + + +Funktion : INSTR + +Zweck : Suchen einer Zeichenfolge in einer anderen + +Syntax : INSTR ( [,] , + #right#) + +Erklärung : : INT-Ausdruck + + Die Funktion liefert die Position, ab der der TEXT-Ausdruck 2 das + erste Mal im TEXT-Ausdruck 1 vorkommt. + Die Position wird als INT geliefert. + + +Beispiel : 10 LET a$ = "hallihallo" + 20 LET b$ = "all" + 30 PRINT INSTR (a$, b$); INSTR (5, a$, b$) + Ausgabe: 2 7 + + + +Funktion : INT + +Zweck : Ermittlung der nächstkleineren ganzen Zahl + +Syntax : INT () + +Erklärung : Die Funktion liefert die größte ganze Zahl, für die gilt: + n kleiner gleich . + Bei positiven Werten bedeutet das, daß die Nachkommastellen abge­ + schnitten werden. + Das Ergebnis wird als REAL geliefert. + + +Beispiel : 10 PRINT INT (11.74); INT (-11.74) + Ausgabe: 11 -12 + +Vergleiche : CINT-, FIX-Funktionen + + + +Anweisung : KILL + +Zweck : Löschen einer Datei in der Task + +Syntax : KILL + +Erklärung : : TEXT-Ausdruck + Die Datei wird (ohne Nachfrage) gelöscht. + + +Beispiel : 2110 KILL "Scratchdatei" + + + + +Funktion : LEFT$ + +Zweck : Erzeugung eines Teiltextes aus einem anderen Text + +Syntax : LEFT$ (, ) + +Erklärung : : INT-Ausdruck + + Die Funktion liefert die ersten Textzeichen des + TEXT-Ausdrucks. + + +Beispiel : 10 LET a$ = "hallihallo" + 20 PRINT LEFT$ (a$, 4) + Ausgabe: hall + +Vergleiche : MID$-, RIGHT$-Funktionen, LSET-, MID$-, RSET- + Anweisungen + + + +Funktion : LEN + +Zweck : Ermittlung der Länge eines Textes + +Syntax : LEN () + +Erklärung : Die Funktion liefert die Anzahl der im TEXT-Ausdruck enthaltenen + Zeichen (also die Länge des Textes). Die Länge wird als INT + geliefert. + Ein Leertext (niltext, "") hat die Länge null. + + +Beispiel : 10 LET a$ = "hallihallo" + 20 PRINT LEN (a$) + Ausgabe: 10 + + + +Anweisung : LET + +Zweck : Zuweisung eines Wertes an eine Variable + +Syntax : [LET] = + +Erklärung : Die LET-Anweisung ermöglicht das Zuweisen von Werten an Variab­ + len (dazu gehören auch die Elemente von Feldern). + + Das Schlüsselwort LET ist optional, d.h. eine Zuweisung wird auch + ohne dieses Schlüsselwort erkannt. + + #on("iZuweisung an TEXT-Variablen:#off("i + LET = oder + Die numerische Konstante wird automatisch in einen TEXT umge­ + wandelt (vgl. STR$-Funktion) + + #on("iZuweisung an INT-Variablen:#off("i + LET = + Ist der numerische Ausdruck ein REAL-Ausdruck, so wird automa­ + tisch nach INT konvertiert (vgl. CINT-Funktion). + + #on("iZuweisung an REAL-Variablen:#off("i + LET = + Ist der numerische Ausdruck ein INT-Ausdruck, so wird automatisch + nach REAL konvertiert (vgl. CDBL-Funktion). + + +Beispiel : 10 LET t$ = "murmel marmel" + 20 LET t$ = 1245.3 'wie "1245.3" + 30 LET i% = 852 + 40 LET i% = 12.73 'aufgerundet: 13 + 50 LET r = 564 'wie 564. + 60 LET r = 157.36 + + + + +Anweisung : LINE INPUT + +Zweck : Einlesen einer Eingabe von der Tastatur in eine TEXT-Variable + +Syntax : LINE INPUT [;] [;] + #right# + +Erklärung : Die LINE INPUT-Anweisung ermöglicht das Einlesen von Eingaben + in TEXT-Variablen, aber im Gegensatz zu INPUT ohne Beachtung + von Trennzeichen (z.B. ","). + + Steht direkt nach LINE INPUT ein Semikolon, so wird nach Beendi­ + gung der Eingabe der Zeilenwechsel unterdrückt. + + Der eingegebene Text wird (bis auf das CR-Zeichen) der TEXT- + Variablen zugewiesen. + + +Beispiel : 2110 LINE INPUT "Name: ";name$ + + + Der Benutzer könnte nun auch folgendes eingeben: + Neumann, Alfred E. + +Vergleiche : INPUT-Anweisung + + + +Funktion : LOG + +Zweck : Berechnung des natürlichen Logarithmus einer Zahl + +Syntax : LOG () + +Erklärung : Die Funktion liefert den natürlichen Logarithmus des Wertes des + REAL-Ausdrucks. + Bei nicht-positiven Werten kommt es zu einem Fehler in der + EUMEL-Prozedur 'log2'. + Das Ergebnis der Funktion wird als REAL geliefert. + + +Beispiel : 10 PRINT LOG (10.0) + Ausgabe: 2.302585 + +Vergleiche : EXP-Funktion (Komplementärfunktion) + + + +Funktion : LPOS + +Zweck : Ermittlung der aktuellen Druckspalte + +Syntax : LPOS () + +Erklärung : Geliefert wird die Nummer der Spalte (als INT), in die das nächste + nächste Zeichen mit LPRINT ausgegeben wird. Die Spalte ganz links + hat die Nummer 1. + Der Argument-Ausdruck ist ein Dummy-Argument (hat keinen + Einfluß auf den gelieferten Wert). + + +Beispiel : 3010 IF LPOS (0) > 65 THEN LPRINT + 3020 LPRINT name$ + + + Falls die Druckposition hinter Spalte 65 liegt, wird eine neue Druck­ + zeile begonnen. + +Vergleiche : LPRINT-Anweisung, TAB-, POS-Funktion + + + +Anweisung : LPRINT + +Zweck : Ausgabe in eine Druckdatei + +Syntax : LPRINT [#ib(3)#USING#ie(3)# ;] + #right#[ #ib(3)#TAB#ie(3)# () | , | ; | ] [...] + +Erklärung : : TEXT-Ausdruck für USING (vgl. PRINT) + : INT-Ausdruck (vgl. PRINT) + : TEXT-Ausdruck oder numerischer Ausdruck + + Die LPRINT-Anweisung arbeitet wie PRINT (siehe dort), mit dem + Unterschied, daß LPRINT die Zeichen nicht auf den Bildschirm, son­ + dern in eine Datei mit dem Namen "BASIC LPRINT OUTPUT" + ausgibt. Diese Datei wird automatisch eingerichtet, falls sie noch + nicht existiert. Ist sie schon vorhanden, so werden die auszugeben­ + den Zeichen am Ende der Datei angefügt. + Nach oder bei Ablauf des Programms kann die Datei (evtl. nach + vorheriger Aufbereitung durch Textverarbeitungsprogramme) mit + 'print', wie im EUMEL-System üblich, an den Drucker geschickt + werden. Der Benutzer ist selbst dafür verantwortlich, daß er die + Druckdatei, sofern die Daten nicht mehr benötigt werden, vor einem + neuen Programmlauf leert oder löscht. Versäumt er dies, so bleiben + die alten Daten in der Druckdatei, und die neuen Ausgaben werden + hinten angefügt. Das Löschen der Druckdatei kann zum Beispiel + durch das BASIC-Programm mit der KILL-Anweisung erreicht + werden. + + Die Art der Ausgabe und die Syntax ist sonst analog zur PRINT- + Anweisung (siehe Erläuterungen dort). + + +Beispiel : 2110 LPRINT "Dieser Text geht in die Druckdatei" + 2120 LPRINT TAB (12); "Datum: " DATE$ + 2130 LPRINT 1, 2, 3 + + +Vergleiche : PRINT-Anweisung, LPOS-Funktion + + + +Anweisung : LSET + +Zweck : Ersetzen von Zeichen eines Textes von links her + +Syntax : LSET = + +Erklärung : Das Ergebnis des TEXT-Ausdrucks wird, links beginnend, in der + TEXT-Variablen eingesetzt. Es werden höchstens so viele Zeichen + ersetzt, wie bisher schon in der Variablen vorhanden waren, das heißt + die Länge des Textes in der Variablen ändert sich nicht. + + +Beispiel : 210 LET a$ = "12345" + 220 LSET a$ = "ABCDEFG" + 230 PRINT a$, + 240 LSET a$ = "abc" + 250 PRINT a$ + Ausgabe: ABCDE abcDE + +Vergleiche : MID$-, RSET-Anweisungen, LEFT$-, MID$-, RIGHT$-Funk­ + tionen + + + +Anweisung : MID$ + +Zweck : Ersetzen von Zeichen innnerhalb eines Textes + +Syntax : MID$ (, + #right#[, ] ) = + +Erklärung : : INT-Ausdruck + : INT-Ausdruck + + Das Ergebnis des TEXT-Ausdrucks wird, bei + beginnend, in der TEXT-Variablen eingesetzt. Es werden höch­ + stens LEN Textzeichen ersetzt. Ist keine + angegeben, so werden so viele Zeichen des + TEXT-Ausdrucks wie möglich in der TEXT-Variablen eingetragen. + Außerdem gilt: Es wird nicht über das bisherige Ende des Variablen­ + inhalts ersetzt, das heißt die Länge des Textes in der Variablen + ändert sich nicht. + + +Beispiel : 210 LET a$ = "12345" + 220 MID$ (a$, 3) = "ABCDEFG" + 230 PRINT a$, + 240 MID$ (a$, 2, 1) = "abc" + 250 PRINT a$ + Ausgabe: 12ABC 1aABC + +Vergleiche : LEFT$-, MID$-, RIGHT$-Funktionen, LSET-, RSET- + Anweisungen + + + +Funktion : MID$ + +Zweck : Erzeugung eines Teiltextes aus einem anderen Text + +Syntax : MID$ (, + #right# [, ]) + +Erklärung : : INT-Ausdruck + : INT-Ausdruck + + Die Funktion liefert höchstens Textzeichen des + TEXT-Ausdrucks von Position an. + Wird nicht angegeben, so werden alle Zeichen + ab Startposition geliefert. + Werden rechts von keine Zeichen mehr gefunden + oder ist gleich null, so wird ein Leertext geliefert. + + +Beispiel : 10 LET a$ = "hallihallo" + 20 PRINT MID$ (a$, 4, 4), + 30 PRINT MID$ (a$, 6) + Ausgabe: liha hallo + +Vergleiche : LEFT$-, RIGHT$-Funktionen, LSET-, MID$-, RSET- + Anweisungen + + + +Funktion : MKD$, MKI$ + +Zweck : Codierung von Zahlenwerten in Texte + +Syntax : MKD$ () + MKI$ () + +Erklärung : Mit MKD$ und MKI$ können INTs und REALs zu Texten codiert + werden. + + Die Funktion MKD$ liefert einen 8 Zeichen langen TEXT, der den + Wert des REAL-Ausdrucks codiert enthält. + Vergleichbar arbeitet MKI$, das einen 2 Zeichen langen TEXT liefert, + der den Wert des INT-Ausdrucks darstellt. + + Mit MKD$ und MKI$ codierte Werte können mit CVD und CVI (s.d.) + wieder decodiert werden. + + +Beispiel : 10 zahl$ = MKD$ (3.1415) + 20 PRINT CVD (zahl$) + Ausgabe: 3.1415 + +Vergleiche : CVD-, CVI-Funktionen + + + +Operator : MOD + +Siehe Kapitel 4.4. (Operatoren) + + + +Anweisung : NAME + +Zweck : Umbenennen einer Datei + +Syntax : NAME AS + +Erklärung : : TEXT-Ausdruck + : TEXT-Ausdruck + + NAME benennt die Datei in um. + + +Beispiel : 10 NAME "Käufer" AS "Kunden" + + + + +Anweisung : NEXT + +Zweck : Markierung des Endes einer FOR-Schleife + +Syntax : NEXT [] [, ] [...] + +Erklärung : NEXT markiert das Ende einer FOR-Schleife (vergleiche FOR- + Anweisung). + + Wird keine Variable angegeben, so bezieht sich das NEXT auf das + letzte textuell vorhergehende FOR. + Wird eine Laufvariable angegeben, so muß sie mit der im letzten + FOR verwendeten Laufvariable übereinstimmen. + Werden mehrere Variablen angegeben, so werden durch die + NEXT-Anweisung mehrere FOR-Schleifen abgeschlossen. + Beachten Sie, daß FOR-Schleifen sich nicht überschneiden dürfen, + sondern nur Schachtelungen zulässig sind. Es kommt daher auf die + Reihenfolge der Variablen bei den NEXT-Anweisungen an. Die + letzte (innerste) FOR-Schleife muß als erste wieder mit dem zuge­ + hörigen NEXT abgeschlossen werden. + +Vergleiche : FOR-, WHILE-Anweisungen + + + +Operator : NOT + +Siehe Kapitel 4.4. (Operatoren) + + + +Funktion : OCT$ + +Zweck : Erzeugung der oktalen Darstellung einer Zahl als Text + +Syntax : OCT$ () + +Erklärung : Die Funktion liefert die oktale (Zweierkomplement-) Darstellung der + Zahl, die sich aus dem INT-Ausdruck ergibt. + + +Beispiel : 10 PRINT OCT$ (10000) + Ausgabe: 23420 + +Vergleiche : OCT$-Funktion + + + +Anweisung : ON + +Zweck : Ausführung eines "berechneten" Sprungs oder Unterprogramm- + Aufrufs + +Syntax : ON GOTO | GOSUB + #right# [, ] [...] + +Erklärung : : INT-Ausdruck + : INT-Konstante + + ON ermöglicht die Verzweigung des Programms an eine von mehre­ + ren Stellen abhängig vom Ergebnis eines INT-Ausdrucks. + Gelangt das Programm an eine ON-Anweisung, dann wird zunächst + der Wert des INT-Ausdrucks berechnet. Dieses Ergebnis bildet dann + die Nummer n des Sprungziels. Danach wird zur n-ten Zeilen­ + nummer, die nach GOTO beziehungsweise GOSUB steht, verzweigt. + Die maximale Anzahl von Zeilennummern, die nach GOTO oder + GOSUB angegeben werden dürfen, ist 512. + Nimmt einen Wert an, zu dem keine Zeile in der + Liste gefunden wird (z.B. Werte kleiner gleich null oder Werte größer + als die Anzahl der angegebenen Zeilennummern), so wird das Pro­ + gramm mit der der ON-Anweisung folgenden Programmzeile fortge­ + setzt. + + Statt GOTO und GOSUB darf auch GO TO beziehungsweise + GO SUB geschrieben werden. + +Hinweis : Die ON-Anweisung muß in #on("ieiner#off("i Programmzeile stehen. + + +Beispiel : 260 INPUT "Menüpunkt 1, 2 oder 3", a + 270 ON VAL (a) GOTO 300, 400, 500 + 280 GOTO 260 + 300 PRINT "Menüpunkt 1" + . + . + 400 PRINT "Menüpunkt 2" + . + . + 500 PRINT "Menüpunkt 3" + + + Entsprechend der Eingabe wird nach 300, 400 oder 500 verzweigt. + Bei Fehleingaben wird Zeile 280 ausgeführt. + +Vergleiche : GOSUB-, GOTO-, IF-Anweisungen + + + +Anweisung : OPTION BASE + +Zweck : Festlegung des kleinsten Wertes für Feldindizes + +Syntax : OPTION BASE 0|1 + +Erklärung : OPTION BASE legt fest, ob die nachfolgend dimensionierten Felder + Elemente mit dem Index 0 erhalten, oder ob der niedrigste Index 1 + ist. Voreingestellt ist OPTION BASE 0. + +Hinweis : Der niedrigste Feldindex kann für jedes Feld individuell eingestellt + werden. Die OPTION BASE-Anweisung gilt für alle Felder, deren + Dimensionierung ihr textuell nachfolgen. Eine erneute OPTION + BASE-Anweisung kann dann die Untergrenze für die #on("iihr#off("i folgenden + Dimensionierungen festlegen. + + +Beispiel : 10 DIM a (100) 'Indizes 0-100 + 20 OPTION BASE 1 + 30 b$ (3) = "hallo" 'Indizes 1-10 + 40 DIM a% (5) 'Indizes 1-5 + 50 OPTION BASE 0 + 60 DIM c% (9) 'Indizes 0-9 + 70 LET d (4) = 12.3 'Indizes 0-10 + + +Vergleiche : DIM-Anweisung + + + +Operator : OR + +Siehe Kapitel 4.4. (Operatoren) + + + +Funktion : POS + +Zweck : Ermittlung der aktuellen Cursorspalte + +Syntax : POS () + +Erklärung : Geliefert wird die Nummer der Spalte (als INT), in der sich der Cursor + auf dem Bildschirm befindet. Die Spalte ganz links hat die Num­ + mer 1. + Der Argument-Ausdruck ist ein Dummy-Argument (hat keinen + Einfluß auf den gelieferten Wert). + + +Beispiel : 10 CLS + 20 PRINT "testtext"; + 30 PRINT POS (0) + Ausgabe: testtext 9 + + +Vergleiche : CSRLIN-, LPOS-Funktionen + + + +Anweisung : PRINT + +Zweck : Ausgabe auf den Bildschirm + +Syntax : PRINT [#ib(3)#USING#ie(3)# ;] + #right#[ #ib(3)#TAB#ie(3)# () | , | ; | ] [...] + +Erklärung : : TEXT-Ausdruck für USING (s. u.) + : INT-Ausdruck (s. u.) + : TEXT-Ausdruck oder numerischer Ausdruck, der + ausgegeben werden soll. + + PRINT dient der Ausgabe von Zeichen auf dem Bildschirm. + Numerische Werte werden mit sieben signifikanten Ziffer ausgege­ + ben. Bei Exponentendarstellung werden für den Exponent maximal 3 + Ziffern ausgegeben. Hinter allen numerischen Werten und vor posi­ + tiven numerischen Werten wird jeweils ein Leerzeichen ausgegeben. + + TAB bewirkt eine Positionierung des Cursors auf die angegebene + Spalte (die Spalte ganz links hat die Nummer 1). Ist die Spaltenzahl + größer als die mit WIDTH eingestellte Ausgabebreite, so wird auf die + Spalte mit der Nummer Spalte MODULO Ausgabebreite positioniert. + Eine Spaltennummer kleiner gleich null bewirkt eine entsprechende + Warnung. + Ist die Spalte mit der angegebenen Nummer in der aktuellen Zeile + bereits überschritten, dann wird auf die nächste Zeile positioniert. + + Ein Semikolon bewirkt, daß der Cursor an der gerade erreichten + Position bleibt. + + Ein Komma bewirkt die Positionierung auf die nächste gültige Spal­ + te, für deren Nummer gilt: Nummer MODULO 16 ist 1. + Das Komma dient also der Ausgabe in 16 Zeichen breiten Zonen. + + Endet die PRINT-Anweisung mit TAB (), einem Komma + oder einem Semikolon, dann wird kein Zeilenvorschub ausgelöst. + + #onbold#USING + Der EUMEL-BASIC-Compiler unterstützt auch die PRINT + USING-Anweisung für formatierte Ausgaben. + Der nach dem Wort USING angegebene TEXT-Ausdruck spezifi­ + ziert das Ausgabeformat für eine PRINT USING-Anweisung. + + Formatierung von Texten: + "!": Nur das erste Zeichen einer Zeichenfolge wird ausgegeben + "\n Leerzeichen\": Es werden die 2 + n ersten Zeichen einer + Zeichenfolge ausgegeben + "&": Alle Zeichen einer Zeichenfolge werden ausgegeben + + Formatierung von Zahlen: + "\#": bezeichnet eine Ziffernposition + ".": Position des Dezimalpunkts + "+": (vor oder nach Zahlen) Ausgabe des Vorzeichens + "-": (nach Zahlen) gegebenenfalls Ausgabe von "-" hinter der + Zahl + "**": Führende Leerstellen werden mit Sternchen aufgefüllt; wirkt + außerdem wie "\#\#". + "$$": Es wird ein Dollarzeichen links vor der formatierten Zahl ausgegeben; + wirkt außerdem wie "\#\#". + "**$": Führende Leerstellen werden mit Sternchen ausgefüllt und direkt vor + der formatierten Zahl wird ein Dollarzeichen ausgegeben; wirkt + außerdem wie "\#\#\#". + ",": (vor Dezimalpunkt) Unterteilung der Vorkommastellen in Dreier­ + gruppen mittels Komma + "^^^^": Position des Exponenten + "_": Ein Zeichen, das einem Unterstreichungsstrich folgt, wird unverändert + ausgegeben + + Ist der Format-Ausdruck fehlerhaft, so kommt es zum Fehler "USING- + Format fehlerhaft". + Überschreitet eine auszugebende Zahl in irgendeiner Hinsicht die im + Format-Ausdruck für sie vorgesehene Stellenzahl, so wird das Zeichen "%" + ausgegeben, um den Fehler anzuzeigen. + + +Hinweis : 1. PRINT (und PRINT USING) richtet sich bei allen Ausgaben nach + der mit WIDTH eingestellten Ausgabebreite. + 2. Alle Ausgaben von PRINT können mit der Systemprozedur + 'sysout' in eine Datei umgeleitet werden. Dann wird nichts auf + das Terminal ausgegeben. + 3. Das Verhalten beim Erreichen der letzten Bildschirmzeile kann + mit der Prozedur 'basic page' gesteuert werden. Vergleiche + hierzu Kapitel 5, "Steuerung der Bildschirmausgabe". + + +Beispiel : 10 PRINT "hallo", 2 ^ 32 TAB (33) "Ende"; + + Ausgabe: hallo 4.294967E+09 Ende + Position: 1234567890123456789012345678901234567890 + + +Vergleiche : WRITE-, LPRINT-Anweisungen, POS-, CSRLIN-, SPC- + Funktionen + + + +Anweisung : RANDOMIZE + +Zweck : Festlegung eines Anfangswertes für den Zufallszahlengenerator + +Syntax : RANDOMIZE [] + +Erklärung : Mit RANDOMIZE erhält der Zufallszahlengenerator einen bestimmten + Startwert. + Ist kein numerischer Ausdruck angegeben, so wird während des + Programmlaufs die Meldung "Startwert des Zufallszahlen­ + generators ?" ausgegeben und ein Startwert eingelesen. + + Wird der Zufallszahlengenerator immer mit dem gleichen Wert gestar­ + tet, so liefert er auch immer die gleichen Zufallszahlen. Soll er immer + verschiedene Werte liefern, so kann er zum Beispiel mit der System­ + uhr auf zufällige Startwerte gesetzt werden (RANDOMIZE TIMER). + + +Beispiel : 10 RANDOMIZE 4711 + 20 FOR i = 1 TO 5 + 30 PRINT INT (RND * 10); + 40 NEXT i + Ausgabe: 5 6 2 9 6 + +Vergleiche : RND-Funktion + + + +Anweisung : READ + +Zweck : Auslesen von Daten aus DATA-Anweisungen + +Syntax : READ [, ] [...] + +Erklärung : : numerische Variable oder TEXT-Variable + + Die READ-Anweisung liest die nächsten Elemente aus der aktuellen + DATA-Anweisung (s.d.) in die angegebenen Variablen ein. + + In TEXT-Variablen können sowohl "quoted strings" als auch "un­ + quoted strings" (vgl. DATA-Anweisung) eingelesen werden. + In numerische Variablen können dagegen nur "unquoted strings" + eingelesen werden. Außerdem müssen die Zeichen des "unquoted + string" eine gültige Darstellung einer numerischen Konstanten (even­ + tuell mit Vorzeichen) sein. Sind diese Bedingungen nicht erfüllt, so + kommt es bei der Ausführung des Programms zu entsprechenden + Fehlern. + + Eine READ-Anweisung kann Daten aus vorangehenden und nach­ + folgenden DATA-Anweisungen lesen. + Alle DATA-Anweisungen eines Programms bilden zusammen einen + großen sequentiellen Speicher, auf den mit READ der Reihe nach + zugegriffen wird. Intern wird ein sogenannter READ-DATA-Zeiger + geführt, der immer auf das nächste auszulesende Element zeigt. + + Die RESTORE-Anweisung (s.d.) ermöglicht es, den READ-DATA- + Zeiger auf das erste Element einer bestimmten DATA-Zeile zu + setzen. + + Sind keine Daten mehr für READ vorhanden, so wird die Ausführung + des Programms mit der Fehlermeldung "Keine Daten mehr für + READ" abgebrochen. + + +Beispiel : 2020 PRINT "Stadt", "Land", "Fluß" + 2030 READ stadt$, land$, fluß$ + 2040 PRINT stadt$, land$, fluß$ + . + 5000 DATA Köln, Bundesrepublik Deutschland, Rhein + + +Vergleiche : DATA-, RESTORE-Anweisungen + + + +Anweisung : REM + +Zweck : Ermöglicht das Einfügen von Kommentaren in ein Programm + +Syntax : REM + +Erklärung : : Beliebige Folge von Zeichen + + Wird eine REM-Anweisung gefunden, so wird der Rest der Pro­ + grammzeile nicht weiter beachtet. Die Compilierung wird in der fol­ + genden Zeile fortgesetzt. + Es empfielt sich, von Kommentarzeilen möglichst oft Gebrauch zu + machen, weil sie den Programmtext dokumentieren und strukturieren. + +Hinweis : Nach REM können keine weiteren Anweisungen mehr in einer Pro­ + grammzeile stehen, da sie nicht übersetzt werden. Auch der Doppel­ + punkt wird nach REM nicht beachtet. + + +Beispiel : 1000 REM Ausgabe des Feldes + 1010 FOR i = 1 TO feldgroesse% + 1020 PRINT "Eintrag"; i; feld (i) + 1030 NEXT i + + + +Anweisung : RESTORE + +Zweck : Setzen des READ-DATA-Zeigers auf den Anfang einer angegebe­ + nen Zeile + +Syntax : RESTORE [] + +Erklärung : : INT-Konstante + + Der READ-DATA-Zeiger (vgl. DATA-Anweisung) wird auf die Zeile + gesetzt. + Wird keine Zeilennummer angegeben, so wird für + 1 eingesetzt. + + Existiert die Programmzeile nicht oder ist in ihr + keine DATA-Anweisung vorhanden, so wird der Zeiger auf die + nächste textuell folgende DATA-Anweisung gesetzt. + Folgt der angegebenen Zeilennummer im Programm keine DATA- + Anweisung mehr, kommt es zu der Fehlermeldung "RESTORE: Keine + DATA-Anweisung in oder nach Zeile gefunden !" + + +Beispiel : 10 READ a, b, c + 20 RESTORE + 30 READ d, e, f + 40 DATA 2, 3, 5 + 50 PRINT a; b; c; d; e; f + Ausgabe: 2 3 5 2 3 5 + +Vergleiche : DATA-, READ-Anweisungen + + + +Anweisung : RETURN + +Zweck : Rücksprung aus einem Unterprogramm + +Syntax : RETURN + +Erklärung : RETURN bewirkt einen Rücksprung aus dem Unterprogramm hinter + die aufrufende GOSUB-Anweisung. + + Es dürfen auch mehrere RETURN-Anweisungen in einem Unterpro­ + gramm vorkommen, um es an verschiedenen Stellen zu verlassen. + + Wird ein RETURN gefunden, ohne daß ein GOSUB durchlaufen + wurde, so wird mit der Fehlermeldung "RETURN ohne GOSUB" + abgebrochen. + + +Beispiel : 140 GOSUB 10000 'Zeige Uhrzeit + . + . + 370 GOSUB 10000 'Zeige Uhrzeit + 9990 END + 10000 REM Unterprogramm Zeige Uhrzeit + 10010 PRINT "Es ist " + TIME$ + " Uhr" + 10020 RETURN + + +Vergleiche : GOSUB-, ON-Anweisungen + + + +Funktion : RIGHT$ + +Zweck : Erzeugung eines Teiltextes aus einem anderen Text + +Syntax : RIGHT$ (, ) +Erklärung : : INT-Ausdruck + + Die Funktion liefert die letzten Textzeichen des + TEXT-Ausdrucks. + Ist größer gleich der Länge des TEXT- + Ausdrucks, so wird der gesamte Ausdruck geliefert. + + +Beispiel : 10 LET a$ = "hallihallo" + 20 PRINT RIGHT$ (a$, 5) + Ausgabe: hallo + +Vergleiche : LEFT$-, MID$-Funktionen, LSET-, MID$-, RSET-Anweisungen + + + +Funktion : RND + +Zweck : Erzeugung von Zufallszahlen + +Syntax : RND [] + +Erklärung : Wird kein Argument angegeben, so wird ein Wert größer null für den + Ausdruck angenommen. + + RND (x) liefert + + für x > 0: + eine neue Zufallszahl. Es gilt immer: 0 <= RND < 1. Der Betrag + des Arguments hat keinen Einfluß auf das Ergebnis. + + für x = 0: + die letzte gelieferte Zufallszahl noch einmal. + + für x < 0: + eine neue Zufallszahl. Vorher wird aber RANDOMIZE x (s.d.) ausge­ + führt. + + Die Zufallszahlen werden als REALs geliefert. + Der Zufallszahlengenerator kann mit der RANDOMIZE-Anweisung + auf bestimmte Startwerte eingestellt werden. + + +Beispiel : 10 FOR i = 1 TO 5 + 20 PRINT INT (RND * 10) + 30 NEXT i + Ausgabe (z.B.): 7 9 9 5 0 + +Vergleiche : RANDOMIZE-Anweisung + + + +Anweisung : RSET + +Zweck : Ersetzen von Zeichen eines Textes von rechts her + +Syntax : RSET = + +Erklärung : Das Ergebnis des TEXT-Ausdrucks wird, rechts beginnend, in der + TEXT-Variablen eingesetzt. Es werden höchstens so viele Zeichen + ersetzt, wie bisher schon in der Variablen vorhanden waren, das heißt + die Länge des Textes in der Variablen ändert sich nicht. + Soll ein Text eingesetzt werden, der länger ist als der Text in der + Variablen, so wird die Variable nicht verändert. + + +Beispiel : 210 LET a$ = "ABCDEFG" + 220 RSET a$ = "12345" + 230 PRINT a$, + 240 RSET a$ = "abc" + 250 PRINT a$ + Ausgabe: AB12345 AB12abc + +Vergleiche : LSET-, MID$-Anweisungen, LEFT$-, MID$-, RIGHT$-Funk­ + tionen + + + +Funktion : SGN + +Zweck : Ermittlung des Vorzeichens einer Zahl + +Syntax : SGN () + +Erklärung : SGN (x) liefert + für x > 0: 1 + für x = 0: 0 + für x < 0: -1 . + + +Beispiel : 10 a = -12.74 + 20 PRINT SGN (a); SGN (-a); SGN (0 * a) + Ausgabe: -1 1 0 + +Vergleiche : ABS-Funktion + + + +Funktion : SIN + +Zweck : Berechnung des Sinus eines Radiantwertes + +Syntax : SIN () + +Erklärung : : REAL-Ausdruck, der den Winkel in Radiant angibt. + Die Funktion liefert den Sinus des Winkels als REAL. + + +Beispiel : 10 PI = 3.141593 + 20 PRINT SIN (PI/4) + Ausgabe: .7071068 + +Vergleiche : COS-, TAN-Funktionen + + + +Funktion : SPACE$ + +Zweck : Erzeugung einer bestimmten Anzahl von Leerzeichen + +Syntax : SPACE$ () + +Erklärung : Die SPACE$-Funktion liefert einen TEXT, der aus so vielen Leerzei­ + chen (Code 32) besteht, wie der Wert des INT-Ausdrucks angibt. + + +Beispiel : 10 PRINT "123456789" + 20 PRINT "^" + SPACE$ (7) + "^" + + Ausgabe: 123456789 + ^ ^ + + +Vergleiche : STRING$-Funktion + + + +Funktion : SPC + +Diese Funktion entspricht exakt der SPACE$-Funktion und wurde nur aus Kompatibi­ +litätsgründen implementiert. + + + +Funktion : SQR + +Zweck : Berechnung der Quadratwurzel einer Zahl + +Syntax : SQR () + +Erklärung : SQR (x) liefert die Quadratwurzel des durch den numerischen Aus­ + druck angegebenen Wertes. + Das Ergebnis wird als REAL geliefert. + + +Beispiel : 10 PRINT SQR (100); + 20 PRINT SQR (2); + 30 PRINT SQR (17.453) + Ausgabe: 10 1.414214 4.177679 + + + +Anweisungsbestandteil : STEP + +Siehe FOR-Anweisung + + + +Anweisung : STOP + +Zweck : Beenden der Programmausführung eines BASIC-Programms mit + Meldung + +Syntax : STOP + +Erklärung : STOP beendet die Programmausführung des BASIC-Programms. + Im Gegensatz zu END (s.d.) erzeugt STOP dabei die Meldung "STOP + beendet das Programm in Zeile ...". + + STOP-Anweisungen dürfen im Programm an beliebiger Stelle + stehen, und es darf auch mehr als eine STOP-Anweisung in einem + Programm vorkommen. + Der Compiler übersetzt ein Programm auch nach Erreichen einer + STOP-Anweisung weiter. + + +Beispiel : 3220 IF eingabe$ = "Ende" THEN STOP + + +Vergleiche : END-Anweisung + + + +Funktion : STR$ + +Zweck : Konvertierung einer Zahl in einen Text + +Syntax : STR$ () + +Erklärung : Die Funktion liefert die Darstellung des Wertes des numerischen + Ausdrucks als TEXT. + Die Zahlen werden so als Text geliefert, wie sie bei einer PRINT- + Anweisung auf dem Bildschirm erscheinen würden. + + +Beispiel : 10 LET zahl$ = STR$ (1e6) + 20 PRINT zahl$; LEN (zahl$) + Ausgabe: 1000000 7 + +Vergleiche : VAL-Funktion (Komplementärfunktion) + + + +Funktion : STRING$ + +Zweck : Erzeugung eines Textes mit mehreren gleichen Zeichen + +Syntax : STRING$ (, |) + +Erklärung : : INT-Ausdruck + : INT-Ausdruck (Wert im Bereich 0 bis 255) + + Die Funktion liefert mal das Zeichen, + - das den ASCII-Code hat oder + - das am Anfang vom Ergebnis des TEXT-Ausdrucks steht. + + +Beispiel : 10 LET pfeil$ = STRING$ (10, "=") + ">" + 20 PRINT pfeil$;" ";STRING$ (5, 35) '35 entspr. \# + Ausgabe: ==========> \#\#\#\#\# + +Vergleiche : SPACE$-Funktion + + + +Anweisungsbestandteil : SUB + +Siehe GOSUB-Anweisung + + + +Anweisung : SWAP + +Zweck : Tauschen der Inhalte zweier Variablen + +Syntax : SWAP , + +Erklärung : SWAP tauscht die Inhalte der beiden Variablen. + + Die beiden Variablen müssen vom gleichen Typ sein. + + +Beispiel : 3220 LET a = 10 + 3230 LET b = 20 + 3240 SWAP a, b + 3250 PRINT a; b + Ausgabe: 20 10 + + + +Anweisungsbestandteil : TAB + +Siehe PRINT- und LPRINT-Anweisung + + + +Funktion : TAN + +Zweck : Berechnung des Tangens eines Radiantwertes + +Syntax : TAN () + +Erklärung : : REAL-Ausdruck, der den Winkel in Radiant angibt. + Die Funktion liefert den Tangens des Winkels als REAL. + + +Beispiel : 10 PI = 3.141593 + 20 PRINT TAN (PI/4) + Ausgabe: 1 + +Vergleiche : COS-, SIN-Funktionen + + + +Anweisungsbestandteil : THEN + +Siehe IF-Anweisung + + + +Funktion : TIMER + +Zweck : Lesen der Systemuhr (CPU-Zeit der Task) + +Syntax : TIMER + +Erklärung : Die bisher von der Task verbrauchte CPU-Zeit (in Sekunden) wird + als REAL geliefert. + + TIMER eignet sich auch zum Starten des Zufallszahlengenerators + (vgl. RANDOMIZE-Anweisung). + + +Beispiel : 2010 LET starttime = TIMER + . + . + 2620 PRINT "Verbrauchte CPU-Zeit:"; + 2630 PRINT TIMER - starttime; "Sekunden" + + +Vergleiche : TIME$-Funktion + + + +Funktion : TIME$ + +Zweck : Abrufen der aktuellen Tageszeit + +Syntax : TIME$ + +Erklärung : Die Tageszeit wird als Text in der Form HH.MM.SS geliefert. + + +Beispiel : 10 PRINT "Es ist jetzt "; TIME$; " Uhr" + Ausgabe (z.B.): Es ist jetzt 10:51:17 Uhr + +Vergleiche : DATE$-, TIMER-Funktionen + + + +Anweisungsbestandteil : TO + +Siehe FOR- und GOTO-Anweisungen + + + +Anweisung : TRON / TROFF + +Zweck : Ein- und Ausschalten der TRACE-Funktion + +Syntax : TRON + TROFF + +Erklärung : Der TRACE-Modus dient der Suche nach logischen Fehlern bei der + Entwicklung von BASIC-Programmen. + + TRON schaltet den TRACE-Modus für die nachfolgend übersetzten + Programmzeilen ein. + + Ist der TRACE-Modus eingeschaltet, so wird für jede gefundene + Zeilennummer die Ausgabe dieser Zeilennummer in eckigen + Klammern mit in den erzeugten Code aufgenommen. Dies hat dann + während des Laufens den Effekt, daß immer bei Abarbeitung der im + TRACE-Modus übersetzten Zeilen die aktuelle Zeilennummer aus­ + gegeben wird. Es ist so leicht zu verfolgen, in welcher Reihenfolge + die Zeilen des Programms ausgeführt werden. + + TROFF schaltet den TRACE-Modus für die textuell folgenden Pro­ + grammzeilen wieder aus. + + +Beispiel : 5220 TRON + 5230 REM hier beginnt die kritische + 5240 REM Programmstelle + . + . + . + 5970 TROFF + + + Die Zeilen 5230 bis 5970 werden im TRACE-Modus übersetzt. + + + +Anweisungsbestandteil : USING + +Siehe PRINT-Anweisung + + + +Funktion : USR + +Zweck : Aufruf einer wertliefernden insertierten Prozedur + +Syntax : USR + #right#[ ( [, ] [...] ) ] + +Erklärung : : Folge aus Zeichen, die für Prozeduren im + EUMEL-System zugelassen sind (also Buchstaben und - ab der + zweiten Stelle - Zahlen), jedoch keine Leerzeichen. + + : | + + : Ausdruck (genau des von der Prozedur + benötigten Typs) + : Variable (genau des von der Prozedur benö­ + tigten Typs) + + Die Prozedur mit dem angegebenen und den + angegebenen Parametern wird aufgerufen. + Die USR-Funktion liefert nach Ausführung der Prozedur das von der + Prozedur übergebene Ergebnis (Typ INT, REAL oder TEXT). + + Mögliche Fehlerfälle: + - Eine Prozedur mit dem Namen und den ange­ + gebenen Parametern gibt es nicht. + - Die Prozedur liefert keinen Wert. + - Die Prozedur liefert einen Typ, der in BASIC unbekannt ist (zum + Beispiel BOOL). + - Die Prozedur benötigt Parametertypen, die in BASIC nicht bekannt + sind (z.B. BOOL, FILE, TASK, QUIET). + - Ein Parameter ist CONST, es wird aber ein VAR-Parameter ver­ + langt. + + Weitere Informationen finden Sie in Kapitel 4.7. + +Hinweis : 1. Bei den Parametern wird keine Typkonvertierung vorgenommen. + 2. Der Prozedurname muß (entgegen der ELAN-Gewohnheit) ohne + Leerzeichen angegeben werden. + 3. USR ist die einzige Funktion, bei der das Argument (nämlich der + Prozeduraufruf) nicht in Klammern stehen darf. + + +Beispiel : 10 LET euler = USR e + 20 PRINT euler + Ausgabe: 2.718282 + +Vergleiche : CALL-, CHAIN-Anweisungen + + + +Funktion : VAL + +Zweck : Konvertierung eines Texts in eine Zahl + +Syntax : VAL () + +Erklärung : Die Funktion liefert den Wert der Zahl, deren Darstellung in dem + übergebenen TEXT-Ausdruck enthalten ist. Führende Leerstellen + werden dabei überlesen. + Sobald ein nicht wandelbares Zeichen festgestellt wird, wird der bis + dahin ermittelte Wert (am Anfang null) geliefert. + + +Beispiel : 10 LET zahl$ = "-1.256E-63" + 20 PRINT VAL (zahl$) + Ausgabe: -1.256E-63 + +Vergleiche : STR$-Funktion (Komplementärfunktion) + + + +Anweisung : WEND + +Zweck : Markierung des Endes einer WHILE-Schleife + +Syntax : WEND + +Erklärung : WEND markiert das Ende einer WHILE-Schleife (vergleiche + WHILE-Anweisung). + +Vergleiche : WHILE-, FOR-Anweisungen + + + +Anweisung : WHILE + +Zweck : Beginn einer abweisenden Schleife + +Syntax : WHILE + + +Erklärung : : numerischer Ausdruck + : Folge von Programmzeilen + + Die WHILE-Anweisung erlaubt die komfortable Programmierung von + abweisenden Schleifen (sogenannten WHILE-WEND-Schleifen) in + BASIC. + Gelangt das Programm während der Ausführung an eine WHILE- + Anweisung, so wird zunächst der Bedingungs-Ausdruck ausge­ + wertet. Ist die Bedingung nicht erfüllt (falsch, Wert gleich null), so + wird das Programm mit der nächsten Anweisung hinter der korres­ + pondierenden WEND-Anweisung fortgesetzt. + Ist die Bedingung dagegen erfüllt (wahr, Wert ungleich null), so + werden die Anweisungen des Schleifenrumpfs abgearbeitet. Beim + Erreichen der WEND-Anweisung springt das Programm wieder zur + WHILE-Anweisung zurück, die Bedingung wird erneut überprüft und, + je nach Ergebnis, wird der Schleifenrumpf oder die Anweisung nach + WEND ausgeführt. + + WHILE-WEND-Schleifen dürfen (auch mit FOR-NEXT-Schleifen, + s.d.) geschachtelt werden. Überschneidungen von WHILE-WEND- + Schleifen und FOR-NEXT-Schleifen sind jedoch nicht zulässig. + + +Beispiel : 10 LET weiter$ = "j" + 20 WHILE LEFT$ (weiter$, 1) = "j" + 30 REM Hier beginnt das eigentliche Programm + . + . + 1650 INPUT "Weiter ? (j/n)", weiter$ + 1660 WEND + + + Das eigentliche Programm wird so lange ausgeführt, bis der Benutzer + etwas anderes als "j" an der ersten Stelle von 'weiter$' eingibt. + +Vergleiche : FOR-, IF-Anweisungen + + + +Anweisung : WIDTH + +Zweck : Einstellung der Bildschirmbreite + +Syntax : WIDTH + +Erklärung : : INT-Ausdruck + + Mit der WIDTH-Anweisung wird festgelegt, wie viele Zeichen pro + Zeile bei Ausgaben auf den Bildschirm oder in Dateien pro Zeile + ausgegeben werden sollen. + Soll für die Druckdatei eine andere Anzahl von Zeichen pro Zeile + gelten als für den Bildschirm, dann muß vor jeder Sequenz von + LPRINT-Anweisungen die gewünschte Anzahl mit WIDTH einge­ + stellt werden. + WIDTH gilt auch für Ausgaben in 'sysout'-Dateien. + Insbesondere bei der Ausgabe in Dateien kann ein Wert von mehr als + 80 Zeichen pro Zeile sinnvoll sein. + + +Beispiel : 10 REM es sollen nur 45 Zeichen pro Zeile + 20 REM ausgegeben werden + 30 WIDTH 45 + + +Vergleiche : PRINT-, LPRINT-, WRITE-Anweisungen + + + +Anweisung : WRITE + +Zweck : Ausgabe von Zahlen und Texten auf dem Bildschirm + +Syntax : WRITE [] [, ] [...] + +Erklärung : : numerischer Ausdruck oder TEXT-Ausdruck + + Die WRITE-Anweisung erlaubt die Ausgabe von Daten auf dem + Bildschirm. Die angegebenen Ausdrücke werden ausgewertet und + ausgegeben. Dabei werden numerische Werte im gleichen Format + wie bei der PRINT-Anweisung (s.d.) ausgegeben, mit der Einschrän­ + kung, daß den Zahlen keine Leerstelle folgt. + Die Ergebnisse von Text-Ausdrücken werden von Anführungszei­ + chen umschlossen ausgegeben. + Alle Einzelausgaben werden durch Kommata voneinander getrennt. + + Nach Ausgabe aller angegebenen Ausdrücke wird der Cursor an den + Anfang der nächsten Zeile positioniert. + + +Beispiel : 10 LET a = 10.7: b = 20 + 20 LET c$ = "Testtext" + 30 WRITE a, b, c$ + Ausgabe: 10.7, 20,"Testtext" + +Vergleiche : PRINT-, LPRINT-, WIDTH-Anweisungen + + + +Operator : XOR + +Siehe Kapitel 4.4. (Operatoren) + diff --git a/doc/basic/basic handbuch.3 b/doc/basic/basic handbuch.3 new file mode 100644 index 0000000..14cb499 --- /dev/null +++ b/doc/basic/basic handbuch.3 @@ -0,0 +1,698 @@ +#page nr ("%",97)# +#head# +EUMEL-BASIC-Compiler 9. Anpassung von Programmen an den EUMEL-BASIC-Compiler % + +#end# + +9. Anpassung von Programmen an den EUMEL-BASIC-Compiler + + +9.1. Unterschiede zwischen BASIC-Inter­ + pretern und dem EUMEL-BASIC- + Compiler + +Bei der Anpassung von Programmen für BASIC-Interpreter an den EUMEL- +BASIC-Compiler gibt es einige Besonderheiten zu beachten, die auf den unterschied­ +lichen Arbeitsweisen von Compilern gegenüber Interpretern beruhen. +Bei Interpretern fällt die Übersetzung und Ausführung des Quellprogramms zeitlich +zusammen (genau genommen gibt es ja gar keine Übersetzung, sondern das Quell­ +programm wird #on("i")#interpretiert#off("i")#). Dies hat zur Folge, daß auch nicht zur Ausführung +bestimmte Anweisungen (z.B. Dimensionierungen, Typfestlegungen etc.) erst während +der Ausführung des Programms erkannt und ausgewertet werden. +Bei Compilern hingegen muß deutlich zwischen der Übersetzungszeit (Compiletime) +und der Laufzeit (Runtime) eines Programms unterschieden werden. +Der wesentliche Unterschied zwischen Compilern und Interpretern liegt nun in der +Reihenfolge der Kenntnisnahme von den Anweisungen. Während der Interpreter von +den Anweisungen in der Reihenfolge ihres Auftretens entlang des Programmablaufs +Kenntnis nimmt, werden die Anweisungen vom Compiler in der Reihenfolge ihres +textuellen Auftretens zur Kenntnis genommen. +Da es sich bei dem EUMEL-BASIC-Compiler um einen One-Pass-Compiler +handelt, ist es zwingend notwendig, daß +- DIM-Anweisungen vor dem ersten Zugriff auf das zu dimensionierende Feld + stehen. +- OPTION BASE-Anweisungen vor den betreffenden Dimensionierungen stehen. +- DEF FN-Anweisungen vor dem ersten Aufruf der zu definierenden Funktion ste­ + hen. +- DEFINT- beziehungsweise DEFSTR-Anweisungen vor der ersten Verwendung der + betreffenden Variablen erscheinen. + +Einige Interpreter lassen sogar den Abschluß von FOR-NEXT- und WHILE- +WEND-Schleifen an mehreren Stellen im Programm zu (z.B. mehrere NEXT- +Anweisungen zu einer FOR-Anweisung). Auch solche "Kunstgriffe" gestattet der +EUMEL-BASIC-Compiler (aus den oben geschilderten Gründen) nicht. + + + + +9.2. Abweichungen von ISO 6373-1984 + (Minimal-BASIC) + + + +Der EUMEL-BASIC-Compiler weicht in folgenden Punkten von der ISO-Norm +6373-1984 für Minimal-BASIC ab: +- Treten bei der Auswertung von numerischen Ausdrücken Überläufe auf, so wird + nicht, wie im Standard vorgesehen, eine Warnung ausgegeben und mit bestimmten + Höchstwerten weitergerechnet, sondern die Ausführung des BASIC-Programms + wird mit einer entsprechenden Fehlermeldung abgebrochen. +- Nimmt die Sprungziel-Nummer bei der ON-Anweisung einen fehlerhaften Wert an + (Nummer < 1 oder Nummer > Anzahl Sprungziele), dann wird nicht, wie im + Standard empfohlen, mit einer Fehlermeldung abgebrochen, sondern es wird (wie + auch in Microsoft-BASIC üblich) das Programm mit der der ON-Anweisung fol­ + genden Anweisung fortgesetzt. +- Bei der DATA-Anweisung müssen nicht unbedingt Zeichenfolgen angegeben + werden. Werden sie weggelassen, dann wird bei Ausführung der READ- + Anweisung null beziehungsweise Leertext geliefert (vergleiche Kapitel 8, DATA- + Anweisung). +- Bei den Eingaben für eine INPUT-Anweisung können ebenfalls die Daten wegge­ + lassen werden. Auch hier wird null beziehungsweise Leertext geliefert (vergleiche + Kapitel 8, INPUT-Anweisung) + + +Die Erweiterungen gegenüber ISO 6373 sollen hier nicht im einzelnen aufgeführt +werden. Bitte vergleichen Sie in Zweifelsfällen die Normungsschrift mit dieser Doku­ +mentation! + + + + +9.3. Anpassung von Microsoft-BASIC Pro­ + grammen an den EUMEL-BASIC- + Compiler + + + +Bei der Entwicklung des EUMEL-BASIC-Compilers wurde zwar auf Übereinstim­ +mung mit Microsoft-BASIC Wert gelegt, von einer echten Kompatibilität kann aber +aufgrund einer ganzen Reihe fehlender Anweisungen und Funktionen nicht gespro­ +chen werden. +Gegenüber Microsoft-BASIC fehlen vor allem: +- alle "Direkt-Kommandos" (RUN, LIST, LOAD, SAVE, MERGE usw.). Die Aufgaben + dieser Anweisungen werden von den Prozeduren des EUMEL-Systems über­ + nommen. +- im weiteren Sinne "hardware-nahe" oder an Maschinensprache orientierte Anwei­ + sungen und Funktionen (CALL, PEEK, POKE, USR, WAIT usw.) +- die ERROR-Handling Anweisungen (ON ERROR, RESUME) +- die Dateiverarbeitungs-Anweisungen und -Funktion (INPUT\#, PRINT\# u.a.; die + INPUT- und PRINT-Anweisungen wurden aber auf Zusammenarbeit mit 'sysin' + und 'sysout' abgestimmt.) +- die Single-Precision-Variablen (Single- und Double-Precision-Variablen wer­ + den beide auf den Datentyp REAL abgebildet.) +- die hexadezimalen und oktalen Konstanten + +Anweisungen und Funktionen, die sich abweichend vom Microsoft-Standard verhal­ +ten, sind vor allem: +- CALL, CHAIN, USR +- ERROR, ERR, ERL +- LSET, RSET + +Wichtige Erweiterungen gegenüber Microsoft-BASIC sind: +- Möglichkeit des Aufrufs von ELAN-Prozeduren +- Maximale Anzahl von Zeichen pro Zeile: 32000 +- Maximale Anzahl von Zeichen pro TEXT-Objekt: 32000 +- OPTION BASE wirkt auf einzelne Felder (und nicht unbedingt auf ein ganzes + Programm) + +#on ("b")# +Hinweis zur Verwendung von MS-BASIC-Programmen im EUMEL-System#off ("b")# +Sollen Microsoft-BASIC-Programme in das EUMEL-Systemm übernommen wer­ +den, so ist dabei so vorzugehen: +1. Speichern Sie das Programm von MS-BASIC aus mit der ASCII-SAVE-Option + ab. + Beispiel: SAVE "PROGRAMM.BAS",A +2. Lesen Sie das Programm mittels "DOSDAT" (Programm zum Lesen von MS- + DOS-Dateien) im "file ascii"-Modus ein: + + reserve ("file ascii", /"DOS"); fetch ("PROGRAMM.BAS", /"DOS") + +Danach steht ihnen das BASIC-Program in der EUMEL-Textdatei +"PROGRAMM.BAS" zur Verfügung. + +#page# +#head# +EUMEL-BASIC-Compiler Anhang A: Reservierte Wörter % + +#end# + +Anhang A: #ib(4)#Reservierte Wörter#ie(4)# +Dieser Anhang enthält eine Übersicht über alle vom EUMEL-BASIC-Compiler +erkannten reservierten Wörter. + +ABS Funktion +AND Operator +AS Anweisungsbestandteil +ASC Funktion +ATN Funktion +BASE Anweisungsbestandteil +CALL Anweisung +CDBL Funktion +CHAIN Anweisung +CHR$ Funktion +CINT Funktion +CLEAR nicht implementiert +CLOSE nicht implementiert +CLS Anweisung +COMMON nicht implementiert +FIELD nicht implementiert +COS Funktion +CSRLIN Funktion +CVD Funktion +CVI Funktion +DATA Anweisung +DATE$ Funktion +DEF Anweisung +DEFDBL Anweisung +DEFINT Anweisung +DEFSNG Anweisung +DEFSTR Anweisung +DIM Anweisung +ELSE Anweisungsbestandteil +END Anweisung +EOF Anweisungsbestandteil +EQV Operator +ERL Funktion +ERM$ Funktion +ERR Funktion +ERROR Anweisung +EXP Funktion +FIX Funktion +FOR Anweisung +FRE Funktion +GET nicht implementiert +GO Anweisungsbestandteil +GOSUB Anweisung +GOTO Anweisung +HEX$ Funktion +IF Anweisung +IMP Operator +INKEY$ Funktion +INPUT Anweisung +INPUT$ Funktion +INSTR Funktion +INT Funktion +KILL Anweisung +LEFT$ Funktion +LEN Funktion +LET Anweisung +LINE Anweisungsbestandteil +LOC nicht implementiert +LOG Funktion +LPOS Funktion +LPRINT Anweisung +LSET Anweisung +MID$ Anweisung/Funktion +MKD$ Funktion +MKI$ Funktion +MOD Operator +NAME Anweisung +NEXT Anweisung +NOT Operator +OCT$ Funktion +ON Anweisung +OPEN nicht implementiert +OPTION Anweisung +OR Operator +OUT nicht implementiert +POS Funktion +PRINT Anweisung +PUT nicht implementiert +RANDOMIZE Anweisung +READ Anweisung +REM Anweisung +RESTORE Anweisung +RESUME nicht implementiert +RETURN Anweisung +RIGHT$ Funktion +RND Funktion +RSET Anweisung +SGN Funktion +SIN Funktion +SPACE$ Funktion +SPC Funktion +SQR Funktion +STEP Anweisungsbestandteil +STOP Anweisung +STR$ Funktion +STRING$ Funktion +SUB Anweisungsbestandteil +SWAP Anweisung +TAB Anweisungsbestandteil +TAN Funktion +THEN Anweisungsbestandteil +TIME$ Funktion +TIMER Funktion +TO Anweisungsbestandteil +TROFF Anweisung +TRON Anweisung +USING Anweisungsbestandteil +USR Funktion +VAL Funktion +WAIT nicht implementiert +WEND Anweisung +WHILE Anweisung +WIDTH Anweisung +WRITE Anweisung +XOR Operator +#page# +#head# +EUMEL-BASIC-Compiler Anhang B: Vom Scanner erkannte Symboltypen % + +#end# + +Anhang B: Vom #ib(3)#Scanner#ie(3)# erkannte #ib(3)#Symbol­ +typen#ie(3)# + + Der Scanner (ein Paket des EUMEL-BASIC-Systems) hat die Aufgabe, den Pro­ +grammtext Zeichen für Zeichen durchzugehen und auszulesen ('scannen'). Dabei +werden die Zeichen immer zu logischen Gruppen, sogenannten #on("i")#Symbolen#off("i")# zusammen­ +gefaßt. Diese Symbole werden dann dem eigentlichen Compilerprogramm geliefert. +Der Scanner entscheidet nach recht komplizierten Regeln, welche Zeichen aus der +Quelldatei zu einem Symbol zusammengefaßt werden. Dennoch soll in diesem An­ +hang der Begriff des Symbols etwas näher erklärt werden, da der Anwender (vor allem +bei den Fehlermeldungen) mit Symboltypen konfrontiert wird. + + + +Reservierte Wörter +#on ("b")# +Anfangszeichen:#off ("b")# Buchstaben +#on ("b")# +Folgezeichen:#off ("b")# Buchstaben +#on ("b")# +Beispiele:#off ("b")# PRINT, VAL, TAB, SUB, TO +#on ("b")# +Vergleiche:#off ("b")# Anhang A + + + +Operatoren ++ - * / \ ^ MOD +NOT AND OR XOR EQV IMP +< > = <= >= <> + +#on ("b")# +Vergleiche:#off ("b")# Kapitel 4.4. + + + +numerische Konstanten +#on ("b")# +Anfangszeichen:#off ("b")# Ziffern 0 bis 9, Dezimalpunkt '.' +#on ("b")# +Folgezeichen:#off ("b")# zusätzlich: 'd', 'D', 'e' oder 'E', am Schluß auch '%', '!' oder '\#' +#on ("b")# +Beispiele:#off ("b")# 1.0, 1.256d123, 12! +#on ("b")# +Vergleiche:#off ("b")# Kapitel 4.2. + + + +TEXT-Konstanten +#on ("b")# +Anfangszeichen:#off ("b")# Anführungszeichen +#on ("b")# +Folgezeichen:#off ("b")# Alle Zeichen, sogar Doppelpunkte, Apostrophe und Steuerzei­ + chen. Anführungszeichen dürfen #on("i")#innerhalb#off("i")# von + TEXT-Konstanten nicht vorkommen. Eine + TEXT-Konstante #on("i")#muß#off("i")# aber mit einem Anfüh­ + rungszeichen enden. +#on ("b")# +Beispiele:#off ("b")# "tadellos", "!?': alles mögliche" +#on ("b")# +Vergleiche:#off ("b")# Kapitel 4.2. + + + +Variablen +#on ("b")# +Anfangszeichen:#off ("b")# Buchstaben +#on ("b")# +Folgezeichen:#off ("b")# zusätzlich: Punkt '.', Ziffern 0 bis 9, Zeichen '$', '%', '!' und '\#' +#on ("b")# +Beispiele:#off ("b")# zeiger, A$, Zahl!, n%, var\#4.3% +#on ("b")# +Vergleiche:#off ("b")# Kapitel 4.3. + + + +Felder/Feldelemente +wie Variablen, jedoch gefolgt von '(', den Indexangaben und ')' +#on ("b")# +Beispiele:#off ("b")# zeiger (3), A$ (pointer), Zahl! (7), n% (a, b, c + d) +#on ("b")# +Vergleiche:#off ("b")# Kapitel 4.3. + + + +Benutzer-definierte Funktionen +#on ("b")# +Anfangszeichen:#off ("b")# FN +#on ("b")# +Folgezeichen:#off ("b")# Buchstaben, Punkt '.', Ziffern 0 bis 9, + Zeichen '$', '%', '!' und '\#' +#on ("b")# +Beispiele:#off ("b")# FNfunct, FNgauss%, FNf!4.5.6d\# +#on ("b")# +Vergleiche:#off ("b")# Kapitel 4.5. + + + +EOS (End of Statement, Anweisungsende) +Doppelpunkt ':' + +#on ("b")# +Vergleiche:#off ("b")# Kapitel 4.1. + + + +EOL (End of Line, Zeilenende) +Apostrophzeichen ' oder Ende der Dateizeile +EOL bedeutet gleichzeitig auch EOS + +#on ("b")# +Vergleiche:#off ("b")# Kapitel 4.1. + + + +EOF (End of File, Dateiende) +Ende der Quelldatei +EOF bedeutet gleichzeitig auch EOL (und somit auch EOS) + +#on ("b")# +Vergleiche:#off ("b")# Kapitel 4.1. + + + +Trennzeichen +Alle bisher nicht genannten Zeichen werden vom Scanner als Trennzeichen behan­ +delt. In BASIC benötigte Trennzeichen sind das Komma (','), das Semikolon (';') sowie +die beiden runden Klammern '(' und ')'. +Zeichen mit Codes kleiner als 32 (Steuerzeichen) werden vom Scanner überlesen. +#page# +#head# +EUMEL-BASIC-Compiler Anhang C: Übersicht über die Fehlermeldungen % + +#end# + +Anhang C: Übersicht über die Fehlermeldungen + + +Übersicht über die verwendeten Fehlermeldungen zur +Übersetzungszeit +Diese Übersicht enthält alle zur Übersetzungszeit möglichen Fehler, mit Ausnahme +der internen Fehler. +Die Erläuterungen geben die üblichen Ursachen für die Fehlermeldung an. Es wird +empfohlen, sich im Falle eines Fehlers außerdem in Kapitel 8 über die genaue Syntax +der betreffenden Anweisung beziehungsweise Funktion zu informieren. + + +#on ("b")#AS ohne NAME#off ("b")# +AS darf nur in NAME-Anweisungen vorkommen. + +#on ("b")#Accessrecht VAR erwartet, CONST gefunden#off ("b")# +Beim Aufruf einer ELAN-Prozedur (CALL, CHAIN oder USR) wurde ein VAR-Para­ +meter verlangt. Angegeben wurde aber ein CONST-Parameter (zum Beispiel ein +Ausdruck). + +#on ("b")#Ausdruck erwartet#off ("b")# +Es wurde ein numerischer oder TEXT-Ausdruck erwartet. Diese Fehlermeldung +erscheint zum Beispiel, wenn nach einem Operator kein Ausdruck mehr gefunden +wird. + +#on ("b")#BASE ohne OPTION#off ("b")# +BASE darf nur in OPTION BASE-Anweisungen vorkommen. + +#on ("b")#Bei SWAP nur gleiche Variablentypen erlaubt#off ("b")# +Mit SWAP können nur Variablen von genau dem gleichen Typ bearbeitet werden. + +#on ("b")#Das Feld ist bereits dimensioniert#off ("b")# +Diese Fehlermeldung erscheint bei DIM-Anweisungen, wenn das Feld vorher schon +explizit oder automatisch dimensioniert wurde. + +#on ("b")#ELSE ohne IF#off ("b")# +ELSE darf nur in IF-Anweisungen vorkommen. ELSE muß in der gleichen Zeile +stehen wie die zugehörige IF-Anweisung. + +#on ("b")#Falsche Felddimension: +Dimensioniert in ... Dimensionen, gefundene Anzahl Indizes: ...#off ("b")# +Beim Zugriff auf ein Feldelement wurden zu viele oder zu wenig Indizes angegeben. + +#on ("b")#FOR ohne NEXT#off ("b")# +Diese Fehlermeldung erscheint, wenn am Programmende für eine FOR-Anweisung +kein korrespondierendes NEXT gefunden wurde. + +#on ("b")#Falsche Reihenfolge der Zeilennummern#off ("b")# +Die Zeilennummern wurden nicht in aufsteigender Reihenfolge angegeben. + +#on ("b")#Falscher Typ#off ("b")# +Es wurde ein anderer Datentyp erwartet als angegeben, und es konnte keine automa­ +tische Konvertierung vorgenommen werden. + +#on ("b")#Falscher Typ der Operanden#off ("b")# +Bei einem dyadischen Operator wurden Operanden angegeben, für deren Typen +dieser Operator nicht definiert ist (vergleiche Kapitel 4.4.). + +#on ("b")#Falscher Typ des Operanden#off ("b")# +Bei einem monadischen Operator wurde ein Operand angegeben, für dessen Typ +dieser Operator nicht definiert ist (vergleiche Kapitel 4.4.). + +#on ("b")#Fehlerhafte Bereichsangabe#off ("b")# +Diese Fehlermeldung kann bei den Anweisungen DEFDBL, DEFINT, DEFSNG und +DEFSTR auftreten, wenn bei einer Bereichsangabe der Buchstabe vor dem Binde­ +strich im Alphabet nach dem Buchstaben hinter dem Bindestrich steht. + +#on ("b")#Fehlerhafte Dimensionierung: Die Obergrenze muß >= 1 sein#off ("b")# +Es wurde versucht, ein Feld mit dem größten Index null in einer Dimension zu +dimensionieren, obwohl die Index-Untergrenze mit OPTION BASE auf eins einge­ +stellt war. + +#on ("b")#Fehlerhafte Laufvariable#off ("b")# +Nach einer NEXT-Anweisung wurde eine Laufvariable gefunden, die nicht zur letzten +anhängigen FOR-Anweisung gehört. Der Fehler tritt auf, wenn Schleifen geschachtelt +wurden. + +#on ("b")#Fehlerhafte Zeilennummer#off ("b")# +Die Zeilennumer entspricht nicht der Syntax für Zeilennumern. + +#on ("b")#Fehlerhafter Funktionsaufruf#off ("b")# +- Die Prozedur liefert keinen Wert + Es wurde versucht, eine Prozedur mit USR aufzurufen, die keinen Wert liefert. +- Der Typ des Resultats ist nicht erlaubt, gefunden: ... + Es wurde versucht, eine Prozedur mit USR aufzurufen, die ein Objekt liefert, + dessen Datentyp in BASIC nicht bekannt ist. +- Kein Argument erwartet + Es wurde versucht, eine benutzer-definierte Funktion, die ohne Parameter definiert + wurde, mit Argument(en) aufzurufen. +- ... Argument(e) erwartet + Die Anzahl der angegebenen Argumente ist kleiner als die Anzahl der bei der + Funktionsdefinition angegebenen Parameter. +- Nur ... Argument(e) erwartet + Die Anzahl der angegebenen Argumente ist größer als die Anzahl der bei der Funk­ + tionsdefinition angegebenen Parameter. +- Kein Resultat erlaubt (gefunden: ...) + Bei CALL oder CHAIN wurde versucht, eine wertliefernde Prozedur aufzurufen. + +#on ("b")#Funktionsaufruf ohne Zusammenhang#off ("b")# +Es wurde ein Funktionsaufruf angegeben, wo eine Anweisung erwartet wurde. + +#on ("b")#GO ohne TO oder SUB#off ("b")# +Das reservierte Wort GO kann nur in GO SUB oder GO TO auftreten. + +#on ("b")#Interner Fehler#off ("b")# +Bei der Übersetzung wurde innerhalb des Compilerprogramms ein interner Fehler +ausgelöst. (vergleiche Kapitel 7.1.) + +#on ("b")#Nach OPTION BASE ist nur 0 oder 1 erlaubt#off ("b")# +Es wurde versucht, eine Zahl > 1 nach OPTION BASE anzugeben. + +#on ("b")#NEXT ohne FOR#off ("b")# +Es wurde eine NEXT-Anweisung gefunden, die keiner FOR-Anweisung zuzuordnen +ist, da keine "offenen" FOR-Schleifen mehr anhängig sind. + +#on ("b")#Nicht implementiert#off ("b")# +Einige reservierte Wörter werden vom BASIC-Compiler erkannt, obwohl die zugehö­ +rigen Anweisungen oder Funktionen nicht implementiert sind (vgl. Anhang A). + +#on ("b")#Parametervariable kommt mehrmals vor#off ("b")# +Bei der Definition einer "user function" kommt ein Parameter in der Parameterliste +mehr als einmal vor. + +#on ("b")#Rekursive Funktionsdefinition#off ("b")# +Es wurde versucht, in der Definition einer "user function" die zu definierende Funk­ +tion aufzurufen. + +#on ("b")#STEP ohne FOR#off ("b")# +STEP darf nur in FOR-Anweisungen vorkommen. + +#on ("b")#SUB ohne GO#off ("b")# +SUB darf nur in GOSUB vorkommen. + +#on ("b")#Syntaxfehler: #off ("b")# +Wenn dieser Fehler erscheint, wurde vom Compiler eine Angabe gefunden, die nach +den Syntaxregeln dort nicht erwartet wurde oder fehlerhaft ist. + +#on ("b")#TAB ohne (L)PRINT#off ("b")# +TAB darf nur in PRINT- und LPRINT-Anweisungen vorkommen. + +#on ("b")#THEN ohne IF#off ("b")# +THEN darf nur in IF-Anweisungen vorkommen. THEN muß in der gleichen Zeile +stehen wie die zugehörige IF-Anweisung. + +#on ("b")#TO ohne Zusammenhang#off ("b")# +TO darf nur in FOR-Anweisungen oder in GO TO vorkommen. + +#on ("b")#Text zu lang#off ("b")# +Dieser Fehler erscheint, wenn ein Anführungszeichen fehlt beziehungsweise ein +Anführungszeichen zu viel gefunden wird. + +#on ("b")#Unbekannte Funktion, Argument(e) angegeben: ...#off ("b")# +Es wurde versucht, eine Funktion mit einem Argument aufzurufen, für dessen Typ die +Funktion nicht definiert ist. + +#on ("b")#Unbekannte Prozedur, Parameter angegeben: ...#off ("b")# +Die angegebene Prozedur konnte mit den angegebenen Parametertypen nicht gefun­ +den werden. + +#on ("b")#Undefinierte 'user function'#off ("b")# +Es wurde versucht, eine benutzer-definierte Funktion aufzurufen, die (noch) nicht +definiert wurde. + +#on ("b")#USING ohne (L)PRINT#off ("b")# +USING darf nur in PRINT- und LPRINT-Anweisungen vorkommen. + +#on ("b")#WEND ohne WHILE#off ("b")# +Es wurde eine WEND-Anweisung gefunden, die keiner WHILE-Anweisung zuzuord­ +nen ist, da keine "offenen" WHILE-Schleifen mehr anhängig sind. + +#on ("b")#WHILE ohne WEND#off ("b")# +Diese Fehlermeldung erscheint, wenn am Programmende für eine WHILE-Anweisung +kein korrespondierendes WEND gefunden wurde. + +#on ("b")#Zeile mit dieser Nummer existiert nicht#off ("b")# +Es wurde versucht, mit GOTO oder GOSUB zu einer Zeilennumer zu verzweigen, die +im Programm nicht angegeben wurde. + + + + +Übersicht über die innerhalb des BASIC-Systems +ausgelösten Laufzeitfehler +Die meisten Laufzeitfehler werden auch bei BASIC-Programmen im EUMEL-System +erzeugt (vergleiche Kapitel 7.2.). Einige werden aber innerhalb des BASIC-Systems +erzeugt. Die nachfolgende Übersicht enthält die innerhalb des BASIC-Systems aus­ +gelösten Fehler mit Angabe des gelieferten Fehlercodes und der Fehlermeldung. + +#on ("b")#Fehlercode:#off ("b")# 1003 +#on ("b")#Fehlermeldung:#off ("b")# RETURN ohne GOSUB +Eine RETURN-Anweisung wurde gefunden, obwohl keine GOSUB-Anweisung mehr +anhängig war. + + +#on ("b")#Fehlercode:#off ("b")# 1004 +#on ("b")#Fehlermeldung:#off ("b")# RESTORE: Keine DATA-Anweisung in oder nach +#right#Zeile ... gefunden +Eine RESTORE-Anweisung konnte nicht ausgeführt werden, weil in oder nach der in +der Anweisung angegebenen Zeilennummer keine DATA-Anweisung mehr steht. + + +#on ("b")#Fehlercode:#off ("b")# 1005 +#on ("b")#Fehlermeldung:#off ("b")# bei ^: negative Basis, gebrochener Exponent: ... +Es wurde versucht, eine negative Zahl mit einer gebrochenen Zahl zu potenzieren. + + +#on ("b")#Fehlercode:#off ("b")# 1005 +#on ("b")#Fehlermeldung:#off ("b")# USING: kein Format gefunden +Bei einer PRINT USING-Anweisung wurde kein Format für die Ausgabe angegeben +oder die Formatzeichenkette enthält keine Formatzeichen. + + +#on ("b")#Fehlercode:#off ("b")# 1005 +#on ("b")#Fehlermeldung:#off ("b")# USING-Format fehlerhaft: ... +Bei einer PRINT USING-Anweisung wurde ein fehlerhaftes Format angegeben. + + +#on ("b")#Fehlercode:#off ("b")# 1004 +#on ("b")#Fehlermeldung:#off ("b")# Keine Daten mehr für READ +Es stehen keine Daten mehr für die READ-Anweisung zur Verfügung; der READ- +DATA-Zeiger zeigt hinter das Ende der letzten DATA-Anweisung. + + +#on ("b")#Fehlercode:#off ("b")# 1005 +#on ("b")#Fehlermeldung:#off ("b")# WIDTH: negative Angabe: ... +Nach WIDTH wurde eine negative Zahl gefunden. + + +#on ("b")#Fehlercode:#off ("b")# 1013 +#on ("b")#Fehlermeldung:#off ("b")# READ: Falscher Datentyp, ... ist kein INT +Einer INT-Variablen konnte kein Wert zugewiesen werden, da das aktuelle Objekt +aus der DATA-Liste keine gültige Darstellung eines INT-Wertes war oder ein +"quoted string" gefunden wurde. + + +#on ("b")#Fehlercode:#off ("b")# 1013 +#on ("b")#Fehlermeldung:#off ("b")# READ: Falscher Datentyp, ... ist kein REAL +Einer REAL-Variablen konnte kein Wert zugewiesen werden, da das aktuelle Objekt +aus der DATA-Liste keine gültige Darstellung eines REAL-Wertes war oder ein +"quoted string" gefunden wurde. + + +#on ("b")#Fehlercode:#off ("b")# 1051 (interner Fehler) +#on ("b")#Fehlermeldung:#off ("b")# variierend +Bei der Ausführung des Programms trat in einer Prozedur des BASIC-Systems ein +interner Fehler auf. (Vergleiche Kapitel 7.) + + +#on ("b")#Fehlercode:#off ("b")# 1080 +#on ("b")#Fehlermeldung:#off ("b")# INPUT-Fehler ( Fehlerart ) : > Eingabezeile < +Bei einer INPUT-Anweisung, die auf eine mit 'sysin' eingestellte Datei wirken sollte, +kam es zu einem Fehler der angegebenen Fehlerart. Nach dem Doppelpunkt wird die +Eingabezeile aus der Eingabedatei ausgegeben. +#page# +#head# +EUMEL-BASIC-Compiler Anhang D: ELAN-Prozeduren des Compilers % + +#end# + +Anhang D: ELAN-Prozeduren des Compilers + + #on ("b")#PROC #ib(3)#basic#ie(3)# (TEXT CONST dateiname)#off ("b")# + Das in der Datei 'dateiname' enthaltene BASIC-Programm wird dem BASIC- + Compiler zur Übersetzung übergeben. Werden keine Fehler gefunden, so wird das + Programm direkt nach der Übersetzung ausgeführt. + Beispiel: + + basic ("Mein liebstes BASIC-Programm")#off ("b")# + + + #on ("b")#PROC basic (TEXT CONST dateiname, prozedurname)#off ("b")# + Das in der Datei 'dateiname' enthaltene BASIC-Programm wird dem BASIC- + Compiler zur Übersetzung übergeben. Werden keine Fehler gefunden, dann wird + das Programm unter dem Namen 'prozedurname' dauerhaft eingetragen (inser­ + tiert). + Das Programm wird nicht ausgeführt. Beachten Sie, daß der Prozedurname den + Vorschriften für ELAN-Prozedurnamen entsprechen muß und außerdem #on ("b")#keine + Leerzeichen#off ("b")# enthalten darf. (Zur Namenswahl siehe auch Kapitel 3.) + Beispiel: + + basic ("Mein liebstes BASIC-Programm", "liebstesprogramm")#off ("b")# + + + + #on ("b")#PROC #ib(3)#basic list#ie(3)# (BOOL CONST status)#off ("b")# + Mit der Prozedur 'basic list' kann eingestellt werden, ob die gerade vom Compiler + übersetzten Programmzeilen angezeigt werden sollen oder nicht (vergleiche Kapitel + 3.). + + basic list (TRUE)#off ("b")#: Die übersetzten Zeile werden angezeigt + basic list (FALSE)#off ("b")#: Die übersetzten Zeile werden nicht angezeigt + + + #on ("b")#PROC #ib(3)#basic page#ie(3)# (BOOL CONST status)#off ("b")# + Mit der Prozedur 'basic page' kann eingestellt werden, wie die Ausgaben von + BASIC-Programmen behandelt werden, wenn der Bildschirm voll ist (vergleiche + Kapitel 5, Steuerung der Bildschirmausgaben). + + basic page (TRUE): Beim Erreichen des Bildschirmendes wird auf einen + Tastendruck gewartet (vgl. Kap. 5.) + basic page (FALSE): Beim Erreichen des Bildschirmendes wird 'gescrollt'. + diff --git a/doc/basic/basic handbuch.index b/doc/basic/basic handbuch.index new file mode 100644 index 0000000..4ac7e16 --- /dev/null +++ b/doc/basic/basic handbuch.index @@ -0,0 +1,232 @@ +#page nr ("%",115)# +#head# +EUMEL-BASIC-Compiler Stichwortverzeichnis % + +#end# + +Stichwortverzeichnis + +>= 15 +\ 14 +- 14 ++ 14 ++ 15 +<= 15 +* 14 +/ 14 += 15 +> 15 +< 15 +<> 15 +^ 14 +ABS 31 +AND 16 +Anführungszeichen 10 +Argument 21 +Arithmetische Operatoren 14 +Arrays 13 +ASC 32 +ATN 32 +Äquivalenz-Verknüpfung 17 +Aufruf benutzer-definierter Funktionen 21 +Aufruf und Steuerung des BASIC-Compilers 5 +basic 5, 113 +BASIC-Compiler ERROR 28 +basic list 6, 113 +basic page 25, 114 +benutzer-definierte Funktionen 19, 104 +Bildschirmausgaben 25 +CALL 23, 33 +CDBL 35 +CHAIN 23, 35 +CHR$ 35 +CINT 36 +CLS 36 +Codebereichs pro Task 27 +Compiler Error 304 26 +Compiler Error 307 26 +Compiler Error 308 26 +COS 37 +CSRLIN 37 +CVD, CVI 38 +DATA 38 +DATE$ 40 +Datentypen 10 +Datentyp INT 10 +Datentyp REAL 10 +Datentyp TEXT 10 +Debugging 6 +DEFDBL, DEFINT, DEFSNG, DEFSTR 40 +DEF FN 19, 28, 42 +Definition benutzer-definierter Funktionen 19 +DEFINT 12 +DEFSTR 12 +DIM 13, 43 +Dimensionen 13 +Doppelpunkt 8 +ELSE 54 +END 45 +EOF 56 +EOF (End of File, Dateiende) 7, 105 +EOL (End of Line, Zeilenende) 8, 105 +EOS (End of Statement, Anweisungsende) 8, 105 +EQV 17 +ERL 46 +ERM$ 47 +ERR 47 +ERROR 48 +EUMEL-Coder 26 +EUMEL-Textdatei 7 +Exklusiv-ODER-Verknüpfung 17 +EXP 49 +Exponent 10 +Fehlerbehandlung 28 +Fehlercodes 30 +Fehlerzeile 30 +Fehler zur Laufzeit 30, 111 +Fehler zur Übersetzungszeit 28, 106 +Felder (Arrays) 13 +Felder/Feldelemente 104 +Feldnamen 13 +FIX 49 +FOR 50 +FRE 51 +Funktionen 19 +Funktionsaufrufe 19 +Ganzzahlen 10 +Generatorprogramm 4 +Gleitkommazahlen 10 +GOSUB 52 +GOTO 53 +Grenzen des Compilers 26 +Groß-/Kleinschreibung 9 +Hauptdurchlauf 28 +HEX$ 54 +Hochkomma 8 +IF 54 +IMP 17 +Implikations-Verknüpfung 17 +Indizes 13 +INKEY$ 56 +INPUT$ 58 +INPUT 56 +Insertieren von BASIC-Programmen 5 +Installation des BASIC-Compilers 4 +INSTR 59 +INT 59 +Interne Compilerfehler 28 +INTs 10 +INT-Überlauf 15 +KILL 60 +Konstanten 10 +Konvertierung 15, 22 +Kriterien für den Typ einer Variablen 12 +Labels 26 +Leerzeichen 9 +LEFT$ 60 +LEN 61 +LET 61 +LINE INPUT 62 +LOG 63 +Logische Operatoren 16 +LPOS 63 +LPRINT 64 +LSET 65 +Mantisse 11 +MID$ 65, 66 +MKD$, MKI$ 67 +MOD 14 +Modulgrenze 26 +NAME 68 +Namenstabelle 27 +Negation 16 +negative Zahlenwerte 11 +NEXT 50, 68 +NOT 16 +Notation 3 +Notebook 28 +numerische Konstanten 103 +OCT$ 69 +ODER-Verknüpfung 17 +ON 69 +Operatoren 103 +Operatoren, arithmetische 14 +Operatoren, logische 16 +Operatoren, Text- 15 +Operatoren, Vergleichs- 15 +Operator, Zuweisungs- 18 +OPTION BASE 13, 71 +OR 17 +Parameter 19 +POS 72 +PRINT 72 +Prioritäten der Operanden 18 +Programmdatei 7 +Programmsegmente 24 +Programmzeile 7 +RANDOMIZE 75 +READ 75 +REM 77 +Reservierte Wörter 9, 12, 100, 103 +RESTORE 77 +RETURN 78 +RIGHT$ 79 +RND 80 +RSET 81 +Scanner 9, 103 +Schlüsselwörter 9 +Scrolling 25 +SGN 81 +SIN 82 +SPACE$ 82 +SPC 83 +SQR 83 +Standard-Funktionen 19 +STEP 50 +Steuerung der Bildschirmausgaben 25 +Steuerung des BASIC-Compilers 5 +STOP 84 +STR$ 84 +STRING$ 85 +SUB 52 +SWAP 86 +Symbol 9 +Symboltypen 103 +Syntax 7 +sysout 6 +TAB 64, 72 +TAN 86 +Texte 10 +TEXT-Konstanten 104 +Text-Operator + 15 +THEN 54 +TIME$ 88 +TIMER 87 +TO 50, 53 +Trennzeichen 105 +TRON / TROFF 88 +Typanpassung 22 +UND-Verknüpfung 16 +USING 64, 72 +USR 23, 90 +Übersetzen von BASIC-Programmen 5 +Übersichtlichkeit von BASIC-Programmen 7 +VAL 91 +Variablen 12, 104 +Variablennamen 9, 12 +VAR-Parameter 23 +Vergleichsoperatoren 15 +Vordurchlauf 28 +Vorzeichen 11 +Wahrheitswerte 16 +Weitere Schreibregeln 9 +WEND 92 +wertliefernden Prozeduren 23 +WHILE 92 +WIDTH 93 +WRITE 94 +XOR 17 +Zahlen 10 +Zeilennummer 7 +Zuweisungsoperator 18 + diff --git a/doc/dialog/gs-dialog handbuch.impressum b/doc/dialog/gs-dialog handbuch.impressum new file mode 100644 index 0000000..b470fe4 --- /dev/null +++ b/doc/dialog/gs-dialog handbuch.impressum @@ -0,0 +1,89 @@ +____________________________________________________________________________ + + +#on("b")##on ("u")# +#center#Betriebssystem E U M E L +#off ("u")# + + +#center#gs-Dialog + + + + +#off("b")# +#center#Lizenzfreie Software der +#on ("b")# + +#center#Gesellschaft für Mathematik und Datenverarbeitung mbH, +#center#5205 Sankt Augustin + + +#off("b")# +#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für +#center#nichtkommerzielle Zwecke gestattet. + +#center#Gewährleistung und Haftung werden ausgeschlossen + + +____________________________________________________________________________ +#page# + +#free (4.0)##on("b")# +#center#gs-Dialog + + +#center#Benutzerhandbuch + + +#center#Version 1.0 + + +#off("b")##center#copyright +#center#Eva Latta-Weber +#center#Software- und Hardware-Systeme, 1988 +#center#ERGOS GmbH, 1990 +#page# +#block# +#center#____________________________________________________________________________ + + +Copyright:  ERGOS GmbH   März 1990 + + Alle Rechte vorbehalten. Insbesondere ist die Überführung in + maschinenlesbare Form sowie das Speichern in Informations­ + systemen, auch auszugsweise, nur mit schriftlicher Einwilligung + der ERGOS GmbH gestattet. + + +#center#____________________________________________________________________________ + +Es kann keine Gewähr übernommen werden, daß das Programm für eine +bestimmte Anwendung geeignet ist. Die Verantwortung dafür liegt beim +Anwender. + +Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrektheit und +Vollständigkeit der Angaben kann keine Gewähr übernommen werden. Das +Handbuch kann jederzeit ohne Ankündigung geändert werden. + +Texterstellung :  Dieser Text wurde mit der ERGOS-L3 Textverarbeitung + erstellt und aufbereitet und auf einem Kyocera Laser­ + drucker gedruckt. + + + + +#center#___________________________________________________________________________ + + + +Ergonomic Office Software GmbH + +Bergstr. 7 Telefon: (02241) 63075 +5200 Siegburg Teletex: 2627-2241413=ERGOS + Telefax: (02241) 63078 + + +#center#____________________________________________________________________________ + + diff --git a/doc/dialog/gs-dialog-1 b/doc/dialog/gs-dialog-1 new file mode 100644 index 0000000..59b98c3 --- /dev/null +++ b/doc/dialog/gs-dialog-1 @@ -0,0 +1,107 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (3)# +#headodd# +#center#gs-DIALOG#right#% + +#end# +#headeven# +%#center#gs-DIALOG + +#end# + +#center#1 + +#center#Was kann gs-DIALOG? + + + + In diesem Kapitel wollen wir Ihnen erläutern, was +#on("b")#gs-DIALOG#off("b")# Ihnen für Vorteile bringen soll. Sie haben +sicher schon mit einem Computer gearbeitet und sich +mehrfach darüber geärgert, daß Sie mit jedem neuen Pro­ +gramm auch eine neue Bedienung erlernen müssen. Zwar +sind Sie als EUMEL-Anwender schon sehr verwöhnt, da das +System sehr homogen ist und bestimmte Systemelemente, +wie z.B. der Editor, mit immer gleicher Bedienung immer +wieder auftauchen. Für die jeweiligen Anwendungspro­ +gramme aber gibt es eine Reihe von Kommandos und Tasten­ +folgen, die Sie sich für die Bedienung merken müssen. +Brauchen Sie Informationen zu den einzelnen Programm­ +teilen, so müssen Sie zumeist in (den gerade nicht griff­ +bereiten) Handbüchern nachschlagen. + Und der Anfänger? Er ist am härtesten betroffen! Er +muß sich nicht nur mit der neuen Maschine auseinander­ +setzen, die technische Handhabung erlernen - von ihm +erwartet man, daß er sich innerhalb kurzer Zeit eine Rei­ +he von Kommandos einprägt, die für die Bedienung des +Grundsystems notwendig sind - und darüber hinaus noch +die Kommandos für die verschiedenen Anwendungsprogram­ +me. Viele resignieren nach den ersten Gehversuchen. + Und der Programmierer? Viele Anwender haben keine +Vorstellung davon, welche Arbeit in einem Programm +steckt. Einen großen Teil seiner Arbeit verwendet der +Programmierer darauf, die Benutzerschnittstelle zu ge­ +stalten - den Teil des Programms, mit dem der Anwender in +Kontakt kommt, über den er mit dem Programm kommuni­ +ziert, einen Dialog führt. Die Gestaltung und Pflege der +Benutzerschnittstelle kann dabei bis zu 50% der Gesamt­ +arbeit an einem Programm ausmachen. + + #on("b")#gs-DIALOG#off("b")# ist entwickelt worden, um diese Nachteile zu +beheben bzw. zumindest zu verringern. Grundelemente von +#on("b")#gs-DIALOG#off("b")# sind die Pull-Down-Menus (Klappmenus), in de­ +nen die zur Verfügung stehenden Funktionen übersicht­ +lich zur Auswahl angeboten werden. So ist es möglich, daß +eine Vielzahl von Funktionen verwaltet werden - ohne +daß der Anwender den Überblick verliert. Dabei können zu +jeder angebotenen Funktion noch Informationen abge­ +rufen werden, so daß ein Blättern in Handbüchern sich +zumeist erübrigt. + Zunächst einmal ist #on("b")#gs-DIALOG#off("b")# gar kein eigenständiges +Programm. Es ist vielmehr ein Baukastensystem, auf das +andere Programme zugreifen können. Davon können sowohl +der Programmierer und erst recht der Anwender profi­ +tieren: + Der Programmierer wird bei seiner Arbeit - insbeson­ +dere bei der Gestaltung der Benutzerschnittstelle we­ +sentlich entlastet, da er auf vorgefertigte Komponenten +zurückgreifen kann. Er kann sich mehr auf die inhalt­ +liche Ausgestaltung seiner Programme konzentrieren. + Sie als Anwender profitieren von der #on("u")#einfachen#off("u")# und +#on("u")#immer einheitlichen Bedienung#off("u")# solcher Programme. Aus +den Menupunkten können Sie auf einfache Weise auswählen +und den gewünschten Teil des Programms zur Ausführung +bringen. Durch diese Bedienung wird der Aufwand, sich in +ein neues Programmsystem einzuarbeiten, erheblich redu­ +ziert. Die zur Verfügung stehenden Programmfunktionen +können effektiver ausgenutzt werden, da sie jederzeit +offensichtlich sind. Informationen zu den einzelnen Pro­ +grammpunkten können Sie jederzeit abrufen, d.h. zumeist +können Sie auf ein Nachschlagen in den Handbüchern ver­ +zichten. + #on("b")#gs-DIALOG#off("b")# ist aber nicht nur ein Baukastensystem, auf +das andere Programme zugreifen können. Bei nahezu jeder +Anwendung ist es notwendig, Dateien auf das Archiv zu +schreiben oder von dort zu holen. Aus diesem Grunde ist +eine leistungsfähige, komfortable Archivbehandlung in +das Programmsystem integriert. + Ein Austausch von Dateien ist aber nicht nur mit dem +Archiv möglich. Sie können auch mit anderen Tasks inner­ +halb Ihres Systems (z.B. mit der Vatertask) oder sogar - +sofern installiert - mit einer Task irgendwo innerhalb +des EUMEL-Netzes Dateien austauschen. Daneben werden +noch Funktionen angeboten, die den Umgang mit den Da­ +teien vereinfachen (Verzeichnis, Umbenennen, Kopieren, +Löschen, Aufräumen etc.). + Diese Funktionen stehen Ihnen unabhängig von ande­ +ren Programmen zu Verfügung, sobald Sie #on("b")#gs-DIALOG#off("b")# in­ +stalliert haben. Andererseits finden Sie diese Funktionen +in immer gleicher Form auch in den meisten Programmen, +die auf der Basis von #on("b")#gs-DIALOG#off("b")# entwickelt worden sind +und entwickelt werden. + + + + + diff --git a/doc/dialog/gs-dialog-2 b/doc/dialog/gs-dialog-2 new file mode 100644 index 0000000..a25d35d --- /dev/null +++ b/doc/dialog/gs-dialog-2 @@ -0,0 +1,215 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (6)# +#headodd# +#center#gs-DIALOG#right#% + +#end# +#headeven# +%#center#gs-DIALOG + +#end# + +#center#2 + +#center#Installation von gs-DIALOG + + + + Bevor Sie #on("b")#gs-DIALOG#off("b")# auf Ihrem System benutzen kön­ +nen, müssen Sie das Programm zunächst installieren. Wenn +#on("b")#gs-DIALOG#off("b")# auf Ihrem System schon zur Verfügung steht, +können Sie dieses Kapitel ruhig überspringen. + + +2.1 Voraussetzungen: + + Um #on("b")#gs-DIALOG#off("b")# auf Ihrem Computer betreiben zu können, +muß das EUMEL-Betriebssystem installiert sein. #on("b")#gs-DIALOG#off("b")# +setzt die Multi-User-Version voraus und ist lauffähig ab +Version 1.7.5. + + +2.2 Lieferumfang + + #on("b")#gs-DIALOG#off("b")# wird auf einer Diskette geliefert, die alle +notwendigen Programme enthält. Um den Inhalt der Dis­ +kette feststellen zu können, starten Sie Ihr System und +bringen es dazu, daß 'gib kommando:' erscheint. Dann legen +Sie die Diskette ein und geben das Kommando: + + archive ("gs-DIALOG"); list (archive); + release (archive) + + Anschließend erscheint eine Übersicht der auf dem +Archiv vorhandenen Programme. Folgende Programme soll­ +ten sich in der Übersicht befinden: + + "gs-DIALOG MENUKARTEN MANAGER" + "gs-DIALOG MM/gen" + "gs-DIALOG 1" + "gs-DIALOG 2" + "gs-DIALOG 3" + "gs-DIALOG 4" + "gs-DIALOG 5" + "gs-DIALOG 6" + "gs-DIALOG 7" + "gs-MENUKARTE:Archiv" + "gs-DIALOG/gen" + + Eventuell können noch weitere Namen auf der Diskette +vorhanden sein. Wenn Sie den Inhalt der Diskette kon­ +trolliert haben und diese Programme auf der Diskette +vorhanden sind, können Sie #on("b")#gs-DIALOG#off("b")# installieren. + Sollten Sie statt der Übersicht eine Fehlermeldung +erhalten, überprüfen Sie bitte, ob die Diskette das rich­ +tige Format besitzt oder ob ihr Diskettenlaufwerk Pro­ +bleme macht. Sollten dagegen Programme fehlen, so rekla­ +mieren Sie die Diskette. + + +2.3 Installation + +Die Installation erfolgt in #on("u")#zwei Schritten#off("u")#: + #on("u")#Zunächst#off("u")# muß eine Task eingerichtet werden, in der +später alle Menukarten aufbewahrt werden. Diese Menu­ +karten enthalten alle Informationen, die #on("b")#gs-DIALOG#off("b")# für +den Aufbau und den Umgang mit den Menus benötigt. #on("u")#Der +Name dieser Task ist vorgegeben#off("u")# ('gs-MENUKARTEN'), da +#on("b")#gs-DIALOG#off("b")# später auf diese Task zugreift. Sollten Sie +hier einen anderen Namen wählen, so wird die Task vom +Generierungsprogramm automatisch umbenannt, um die +Funktionsfähigkeit von #on("b")#gs-DIALOG#off("b")# zu garantieren! + #on("u")#Anschließend#off("u")# kann das Programmsystem selbst in einer +anderen Task installiert werden. Wie nehmen hier an, daß +die Task den Namen 'MENU' erhalten soll. (Sie können für +diese Task auch einen beliebigen anderen Namen wählen.) + + +1) #on("u")#Einrichten der 'Menukarten - Task'#off("u")# + +#on("b")# + (Supervisor - Taste) +#off("b")# + + --> gib supervisor kommando: + +#on("b")# + begin ("gs-MENUKARTEN") +#off("b")# + + --> gib kommando: + + + (Arbeiten mehrere Personen mit dem Computer, dann ist +es sinnvoll, diese Task vor unbefugtem Zugriff durch ein +Passwort zu schützen. Wie das gemacht wird, können Sie in +Ihrem EUMEL-Benutzerhandbuch erfahren.) + Legen Sie dann die Archivdiskette ein, auf der sich +#on("b")#gs-DIALOG#off("b")# befindet, und geben Sie die folgenden Komman­ +dos: + +#on("b")# + archive("gs-DIALOG") + + fetch("gs-DIALOG MM/gen",archive) + + run +#off("b")# + + Sie haben damit das Generatorprogramm gestartet; die +Installation wird automatisch durchgeführt. Lassen Sie +während des gesamten Vorgangs die Archivdiskette einge­ +legt. Die Generierung ist beendet, wenn der EUMEL- +Eingangsbildschirm erscheint. + +2) #on("u")#Installation des Programmsystems#off("u")# + + +#on("b")# + (Supervisor - Taste) +#off("b")# + + --> gib supervisor kommando: + +#on("b")# + begin ("MENU") +#off("b")# + + --> gib kommando: + + + (Sichern Sie, wenn gewünscht, auch diese Task durch +ein Passwort vor unbefugtem Zugriff.) + Legen Sie die #on("b")#gs-DIALOG#off("b")#-Archivdiskette ein und geben +Sie die folgenden Kommandos: + +#on("b")# + archive("gs-DIALOG") + + fetch("gs-DIALOG/gen",archive) + + run +#off("b")# + + Sie haben damit das Generatorprogramm gestartet. Die +Generierung benötigt jetzt aber wesentlich mehr Zeit als +die zuvor! Lassen Sie während des gesamten Vorgangs die +Archivdiskette eingelegt. Die Generierung ist beendet, +wenn der EUMEL-Eingangsbildschirm erscheint. Die Task, +in der die Generierung stattfindet, wird automatisch zur +Managertask, das heißt, daß Söhne von ihr eingerichtet +werden können. Damit ist die Installation von #on("b")#gs-DIALOG#off("b")# +abgeschlossen - in allen Sohn- und Enkeltasks können +Sie nun mit dem Kommando: + +#on("b")# + archiv +#off("b")# + +die Archivverwaltung aufrufen. + + +2.4 Nutzung der 'Semi-Graphik-Zeichen' + + #on("b")#gs-DIALOG#off("b")# verwendet beim Aufbau der Rahmen inner­ +halb der Menus nur solche Zeichen, die auf jedem Computer +zur Verfügung stehen. Die meisten Computer/Terminals +verfügen aber über einen Zeichensatz, der es erlaubt, +solche Rahmen "schöner" darzustellen. #on("b")#gs-DIALOG#off("b")# ist dar­ +auf vorbereitet, diese Eigenschaften auszunutzen. + Allerdings ist der Aufruf dieser Graphikzeichen nicht +einheitlich festgelegt. Verfügen Sie über einen Computer, +der 'IBM - kompatibel' ist, oder über ein Terminal 'Beehive +FT20', dann können Sie die Graphikzeichen ganz einfach +nutzen, denn dafür sind im Programm bereits Befehle vor­ +bereitet. + +ibm  graphic char - Mit diesem Befehl stel­ + len Sie für #on("b")#gs-DIALOG#off("b")# + den 'IBM - Graphikzei­ + chensatz' ein. + +ft20 graphic char - Mit diesem Befehl stel­ + len Sie für #on("b")#gs-DIALOG#off("b")# + den 'Beehive FT20 - + Graphikzeichensatz' + ein. + +std  graphic char - Mit diesem Befehl stel­ + len Sie wieder den + 'Standard - Graphik­ + zeichensatz' ein. + + Nehmen Sie eine solche Einstellung in einer Task vor, +so erben alle Sohn- und Enkeltasks diese Einstellung. Sie +können auch in verschiedenen Task unterschiedliche Ein­ +stellungen wählen. + + Verfügen Sie über andere Computer- oder Terminalty­ +pen, die Grapikzeichen darstellen können, so können Sie +diese ebenfalls nutzen. Sie müßten sich allerdings ein +kleines ELAN-Programm schreiben. Aber auch das ist ganz +einfach, da #on("b")#gs-DIALOG#off("b")# auch darauf vorbereitet ist. Wie +das gemacht wird, wird aber erst in Kapitel 5 erläutert. + diff --git a/doc/dialog/gs-dialog-3 b/doc/dialog/gs-dialog-3 new file mode 100644 index 0000000..044720b --- /dev/null +++ b/doc/dialog/gs-dialog-3 @@ -0,0 +1,683 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (12)# +#headodd# +#center#gs-DIALOG#right#% + +#end# +#headeven# +%#center#gs-DIALOG + +#end# + +#center#3 + +#center#Umgang mit den Menus + + +#center#Eine Beispielsitzung + + + Wie schon oben erwähnt, ist in #on("b")#gs-DIALOG#off("b")# eine Archiv­ +verwaltung integriert. Anhand dieses Programms möchten +wir den Umgang mit und die Arbeitsweise von #on("b")#gs-DIALOG#off("b")# +vorstellen. Als Beispiel wollen wir eine Datei von einer +Ihrer Archivdisketten ins System holen. + Zunächst zu den Begriffen: Die Disketten, die Sie in den +Rechner einlegen können, um z.B. Dateien (und Programme) +von anderen Computern übernehmen zu können, bezeichnet +man als #on("u")#Archiv#off("u")#. Das Archiv (die Diskette) wird benutzt, um +Daten und Programme vor Beschädigung und Verlust zu +sichern. Es ist sehr wichtig, daß Sie Ihre Programme und +Daten auf Archivdisketten sichern, denn ein einziger +Hardwarefehler könnte die Arbeit von vielen Stunden +zunichte machen. + Da man diese Operationen, d.h. Programme und Daten +auf Disketten zu sichern und wieder von dort zu holen, +sehr häufig benötigt, ist die Archivbehandlung fest in +das #on("b")#gs-DIALOG#off("b")#-Programmsystem integriert und Bestandteil +nahezu jeden Programms, das unter #on("b")#gs-DIALOG#off("b")# entwickelt +wird. Unabhängig von anderen Programmen kann die +Archivbehandlung aber auch benutzt werden, sobald +#on("b")#gs-DIALOG#off("b")# installiert ist. Das wollen wir jetzt auspro­ +bieren. + + +3.1 Aufruf der Archivverwaltung: + + Richten Sie eine Task als Sohn der Task ein, in der Sie +#on("b")#gs-DIALOG#off("b")# installiert haben. Nehmen wir hier an, die neue +Task soll den Namen 'TEST' erhalten - die Task, in der +#on("b")#gs-DIALOG#off("b")# installiert ist, habe den Namen 'MENU'. + +#on("b")# + (Supervisor - Taste) +#off("b")# + --> gib supervisor kommando: +#on("b")# + begin ("TEST","MENU") +#off("b")# + + --> gib kommando: +#on("b")# + archiv +#off("b")# + + Mit dem Befehl 'archiv' können Sie jederzeit die Archiv­ +behandlung aufrufen - es erscheint dann folgendes Menu: + + +#on("b")# +ARCHIV: Dateien Archiv +-+-------------------+---------------------------------------------------- + | v Verzeichnis | + | --------------- | + | l Löschen | + | d Drucken | + | --------------- | + | k Kopieren | + | u Umbenennen | + | --------------- | + | s Speicherplatz | + | a Aufräumen | + +-------------------+ + + + + + + + +-------------------------------------------------------------------------- +Info:/ Wahl: Ausführen: Verlassen: +#off("b")# + + +3.2 Bedienung des Menusystems + +- Aufbau der Menus (Bildschirmaufbau) + + Ein Menu ist ein Angebot von Funktionen, die ein Pro­ +gramm ausführen kann. Aus diesem Angebot kann der Pro­ +grammbenutzer auswählen. In diesem Sinne ist ein solches +Menu durchaus vergleichbar mit einer Speisenkarte in +einem Restaurant. + Jedes Menu unter #on("b")#gs-DIALOG#off("b")# besitzt eine 'Kopfzeile' +und eine 'Fußzeile'. In der Kopfzeile ist ganz links der +Name des Programms angegeben, mit dem Sie gerade arbei­ +ten. Daneben enthält die Kopfzeile die 'Oberbegriffe', mit +denen die einzelnen Untermenus angesprochen werden +können. Maximal können hier zehn Oberbegriffe auftau­ +chen - in unserem Beispiel sind es nur zwei. + Besondere Bedeutung für die Bedienung der Menus +kommt der Fußzeile zu. Einerseits wird hier jeweils ange­ +zeigt, welche Tasten Sie zum jeweiligen Zeitpunkt benut­ +zen können, andererseits erhalten Sie über diese Fußzeile +auch Informationen, wenn #on("b")#gs-DIALOG#off("b")# "mit sich selbst be­ +schäftigt ist", d.h. Operationen ausführt. Wissen Sie also +nicht mehr weiter, so schauen Sie zuerst auf die Fußzeile +und beachten Sie die hier stehenden Informationen. + Im Bereich zwischen der Kopf- und Fußzeile werden die +Untermenus ausgegeben. Dieser Bereich wird auch dazu +benutzt, um Informationen an den Benutzer einzublenden, +Fragen an ihn zu richten, ihn aus einem Angebot (z.B. von +Dateien) auswählen zu lassen und vieles mehr. + Treiben wir den Vergleich mit der Speisenkarte in ei­ +nem Restaurant noch ein wenig weiter. Bei einem großen +Angebot kann eine Speisenkarte recht umfangreich wer­ +den. Denken Sie beispielsweise an eine Speisenkarte in +einem chinesischen Restaurant. Dazu sind neben den an­ +gebotenen Gerichten oft noch Zusatzinformationen (Zube­ +reitungsart, Zutaten etc.) angegeben. Um dem Gast die Aus­ +wahl zu erleichtern, ist die Speisenkarte aber zumeist +untergliedert; man findet Suppen, warme Vorspeisen, kalte +Vorspeisen, Gerichte mit Schweinefleisch, mit Rindfleisch, +mit Geflügel, mit Fisch etc. + Ein Computerprogramm kann, ebenso wie ein Restau­ +rant, dem Benutzer ein großes Angebot (an Programmfunk­ +tionen) machen. Von großem Nachteil ist allerdings, daß +ein Computerbildschirm - im Gegensatz zu einer umfang­ +reichen Speisenkarte - viel zu klein ist, um alle Angebote +und Informationen gleichzeitig darstellen zu können. +Außerdem würde ein nahezu vollständig beschriebener +Bildschirm sehr unübersichtlich sein. + Aus diesem Grunde haben wir uns entschlossen, immer +nur einen Teil des vorhandenen Angebotes an Funktionen +und der vorhandenen Informationen anzuzeigen - immer +nur soviel, daß Sie sich auf dem Bildschirm orientieren +können und den Überblick nicht verlieren. Dazu haben Sie +die Möglichkeit, jeweils zu bestimmen, auf welche Infor­ +mationen Sie Ihre Aufmerksamkeit richten wollen, was Sie +angezeigt bekommen möchten. + + +- Auswahl der Menupunkte + + Zu jedem Oberbegriff in der Kopfzeile gehört eine +Liste von Funktionen, die das Programm dazu zur Auswahl +anbietet. Allerdings ist immer nur eine Liste (ein Unter­ +menu) sichtbar. Das sichtbare Untermenu gehört immer zu +dem Oberbegriff in der Kopfzeile, der invers dargestellt +ist. Wir wollen uns zunächst das Untermenu zum zweiten +Oberbegriff ('Archiv') anzeigen lassen. Zum Wechsel zwi­ +schen den Oberbegriffen in der Kopfzeile benutzt man die +Pfeiltasten oder . Probieren Sie es einmal +aus. Es erscheint das folgende Bild auf dem Bildschirm: + + +#on("b")# +ARCHIV: Dateien Archiv +-------+-------------------------+---------------------------------------- + | r Reservieren | + | - Neue Diskette | + | --------------------- | + | - Schreiben | + | - Checken | + | - Kombination | + | - Holen/Lesen | + | - Löschen | + | --------------------- | + | - Verzeichnis | + | - Drucken | + | --------------------- | + | i Initialisieren | + | z Zieltask einstellen | + +-------------------------+ +---------------------+ + | Dateiaustausch mit: | + | Archiv | + | Archivname: | + | --- | + +---------------------+ +-------------------------------------------------------------------------- +Info:/ Wahl: Ausführen: Verlassen: +#off("b")# + + + Sie können jetzt sehen, daß ein anderer Oberbegriff in +der Kopfzeile aktiviert, d.h. invers dargestellt ist. Dane­ +ben wurde noch das sichtbare Untermenu "eingeklappt" +und ein anderes "ausgeklappt". Man könnte die Unterme­ +nus deshalb auch als 'Klappmenus' bezeichnen - gebräuch­ +lich ist allerdings die Bezeichnung 'Pull-Down-Menus', an +die wir uns auch halten wollen. + + Sicher haben Sie bemerkt, daß es einen Augenblick +gedauert hat, bis das Pull-Down-Menu unter dem Menu­ +punkt 'Archiv' erschien. Das hat auch seine Ursache, denn +#on("b")#gs-DIALOG#off("b")# muß einige Einstellungen vornehmen, die etwas +Zeit in Anspruch nehmen. Neben dem Pull-Down-Menu ist +unten rechts auf dem Bildschirm noch ein 'Kasten' sicht­ +bar geworden. Er dient Ihnen zur Information. Da +#on("b")#gs-DIALOG#off("b")# nicht nur den Austausch von Dateien mit dem +Archiv, sondern auch mit anderen Tasks ermöglicht, wird +hier immer angezeigt, mit welcher Task der Dateiaus­ +tausch zur Zeit erfolgt. Ist das Archiv eingestellt, so +wird auch noch der Name der Diskette angezeigt - aber +erst wenn das Archiv angemeldet worden ist, was ja mo­ +mentan noch nicht der Fall ist. Deshalb werden nur drei +Striche ausgegeben. + Sicher ist Ihnen das Grundprinzip der Menubehand­ +lung schon klar geworden: Sie müssen sich zuerst inner­ +halb der Kopfzeile für einen Oberbegriff entscheiden. +Zum gewählten Oberbegriff wird dann jeweils das Angebot +an zugehörigen Programmfunktionen im darunterstehen­ +den Pull-Down-Menu angezeigt. Dieses Vorgehen hat den +Vorteil, daß man den kleinen Bildschirm im Prinzip "mehr­ +fach nutzen kann". Die Pull-Down-Menus können sich ja +ruhig überlappen. Sie merken es gar nicht, da ja nicht +alle gleichzeitig angezeigt werden. + Noch ein Vorteil ist da, Sie können sich auf den Teil +konzentrieren, für den Sie sich gerade interessieren und +werden nicht durch andere Informationen abgelenkt. An­ +dererseits können Sie jederzeit auch an die Funktionen +und Informationen gelangen, die gerade nicht sichtbar +sind. + Sie haben sicher bemerkt, daß nicht nur innerhalb der +Kopfzeile ein Begriff invers dargestellt ist, sondern +auch einer innerhalb jedes Pull-Down-Menus. Nachdem man +sich für einen Oberbegriff entschieden hat, kann man +nämlich noch zwischen den Funktionen innerhalb des +Pull-Down-Menus wählen. + Da das Pull-Down-Menu zum Oberbegriff 'Archiv' noch +einige Besonderheiten aufweist, wollen wir uns die Funk­ +tionsweise zuerst am Pull-Down-Menu unter dem Oberbe­ +griff 'Dateien' verdeutlichen. Bitte wechseln Sie deshalb +durch Betätigung der Pfeiltaste oder zum +ersten Pull-Down-Menu zurück. + Ähnlich wie in der Kopfzeile, können Sie auch inner­ +halb des Pull-Down-Menus zu einem anderen Punkt wech­ +seln. Das geschieht durch die Pfeiltasten und +. Dabei werden 'Trennlinien' innerhalb des Pull- +Down-Menus, die nur der Untergliederung dienen, über­ +sprungen. Vom obersten Menupunkt gelangt man direkt +zum untersten und umgekehrt. Probieren Sie es einmal +aus. + + +- Informationen zu einem Menupunkt. + + Zu jedem Punkt eines Pull-Down-Menus können Sie In­ +formationen abrufen. Das ist ganz einfach, denn Sie +brauchen sich nur auf den gewünschten Menupunkt zu +begeben (die Pfeiltasten so betätigen, bis der betreffende +Menupunkt im Pull-Down-Menu invers dargestellt wird). +Anschließend betätigen Sie die Fragezeichentaste (). + Auf dem Bildschirm erscheint ein Kasten in den die +Informationen zum Menupunkt eingetragen sind. Zwar wird +dadurch ein Teil des Bildschirms überschrieben, doch kei­ +ne Angst - sobald Sie auf irgendeine Taste tippen, wird +der alte Bildschirmzustand wieder hergestellt! Ebenso wie +die Pull-Down-Menus sind diese Informationen normaler­ +weise verborgen. Auf Anforderung werden sie aber sicht­ +bar - ja es wäre gar nicht möglich alle vorhandenen In­ +formationen gleichzeitig auf dem Bildschirm darzustel­ +len. Es wäre auch unsinnig, denn man benötigt diese In­ +formationen zumeist nur, wenn man sich in das Programm +einarbeitet. Später, wenn Ihnen der Umgang mit dem Pro­ +gramm vertraut ist, sind diese Informationen überflüssig +und würden, wenn sie immer sichtbar wären, nur stören. + + +- Informationen zur Bedienung des Menus + + Alles das, was hier ausführlich beschrieben ist, kön­ +nen Sie auch in Kurzform auf dem Bildschirm erfahren, +denn auch die Informationen, wie das Menu bedient wird, +sind jeweils im Menu vorhanden. Möchten Sie diese Infor­ +mationen auf dem Bildschirm sehen, so tippen Sie die +Tastenfolge , d.h. erst die Taste 'ESC' und dann die +Fragezeichentaste. Danach erscheint folgender Kasten +auf dem Bildschirm: + +#on("b")# + +---------------------------------------+ + | gs-DIALOG | + | | + | e ... Erläuterungen (allgemein) | + | w ... Wahl eines Menupunktes | + | a ... Aktivieren des Menupunktes | + | b ... Besondere Tasten / Menuende | + | | + | z ... Zurück in das Menu | + | | + | e w a b z | + +---------------------------------------+ +#off("b")# + + Wenngleich die Informationen kurz gefaßt sind, so +haben sie doch nicht alle gleichzeitig auf dem Bildschirm +Platz. Aus diesem Grunde werden Sie aufgefordert, sich +weiter zu entscheiden, welche Informationen Sie haben +möchten. Sie können zwischen mehreren Alternativen wäh­ +len. Die Reihenfolge spielt keine Rolle; Sie können auch +Informationen mehrmals aufrufen. + Der Aufruf kann auf zweierlei Weise erfolgen: Entwe­ +der Sie bewegen mit den Pfeiltasten oder +die Markierung in der letzten Zeile des Kastens auf den +Buchstaben, der vor dem von Ihnen gewünschten Punkt +steht und tippen anschließend auf die -Taste +oder Sie tippen direkt die entsprechende Buchstabentaste +(z.B. ). Beide Vorgehensweisen sind zulässig und haben +die gleiche Wirkung. + Daraufhin werden die gewünschten Informationen +sichtbar. Durch Tippen irgendeiner Taste verschwinden +die Informationen wieder vom Bildschirm und sichtbar +wird wieder der oben abgebildete 'Verteiler'. Erst wenn +man den Punkt 'z ... Zurück in das Menu' wählt, verschwin­ +det auch dieser Kasten und man gelangt zurück in das +Menu. + + +- Aktivierbare und nicht aktivierbare Menupunkte + + Wir wollen jetzt endlich unserer Absicht nachgehen, +eine Datei vom Archiv zu holen. Dazu wechseln wir zuerst +wieder zum Oberbegriff 'Archiv' in der Kopfzeile. Nach +kurzer Zeit erscheint das Ihnen schon bekannte Pull- +Down-Menu. Wenn Sie hier versuchen, die einzelnen Menu­ +punkte innerhalb des Pull-Down-Menus anzusteuern, so +werden Sie feststellen, daß das nicht möglich ist. Alle +Menupunkte, die ein Minuszeichen ('-') vor der Bezeichnung +haben, können nicht angewählt werden. Diese Menupunkte +sind zur Zeit nicht aktivierbar. Solche Menupunkte kön­ +nen in Menus häufiger auftreten. + Das kann mehrere Ursachen haben: Einerseits könnte +auf diese Weise ein Programmierer ein komplettes Menu +entwerfen, das schon alle Funktionen zeigt, wenn auch die +zugehörigen Programme dazu noch nicht fertig sind. Das +ist aber in unserem Falle nicht so. Hier ist die Ursache +eine andere: Bevor man im EUMEL-System auf das Archiv­ +laufwerk zugreifen kann, muß man es erst für sich re­ +servieren. Dadurch wird sichergestellt, daß nicht gleich­ +zeitig mehrere Benutzer auf eine Archivdiskette zugrei­ +fen und ggf. Dateien unbeabsichtigt zerstören. Erst wenn +das Laufwerk reserviert worden ist, kann man auf die +Diskette zugreifen. Das wird im Menu durch die nicht ak­ +tivierbaren Punkte zum Ausdruck gebracht. + + +- Aktivieren von Menupunkten + + Wir müssen also zuerst das Archiv reservieren. Auch +hier gibt es (zumeist) zwei Möglichkeiten, den gewünsch­ +ten Menupunkt zu aktivieren. Entweder Sie sorgen durch +Bedienung der Pfeiltasten dafür, daß der gewünschte +Menupunkt invers dargestellt wird und betätigen an­ +schließend die -Taste oder - sofern vor dem Me­ +nupunkt ein einzelner Buchstabe oder eine Ziffer aufge­ +listet ist - tippen Sie einfach auf die zugehörige Buch­ +staben- oder Zifferntaste. Tippen Sie hier die Taste . + Warten Sie einen Moment, denn es wird überprüft, ob +das Laufwerk von einer anderen Task benutzt wird. Ist +dies der Fall, erhalten Sie darüber auf dem Bildschirm +eine Meldung. Ansonsten wird an Sie die Frage gerichtet, +ob die Diskette eingelegt ist. Wenn diese Frage erscheint, +befindet sich das Laufwerk schon "in Ihrem Besitz". Erst +jetzt ist es sinnvoll, wenn auch andere auf das Laufwerk +zugreifen können, die Diskette in das Laufwerk zu legen. +Erst wenn die Frage auf dem Bildschirm erscheint, können +Sie sicher sein, daß keine andere Task mehr auf das Lauf­ +werk zugreifen kann. Legen Sie also beim Erscheinen der +Frage eine Ihrer EUMEL-Archivdisketten in das Laufwerk +und bejahen Sie anschließend die gestellte Frage, indem +Sie die Taste tippen. (Sie können aber auch - wie schon +in vorausgehenden Situationen - die Inversdarstellung +innerhalb des Kastens, in dem die Frage auf dem Bild­ +schirm dargestellt wird, auf das 'Ja' positionieren und +anschließend die -Taste tippen.) + #on("b")#gs-DIALOG#off("b")# ermittelt jetzt den Namen der eingelegten +Diskette und zeigt diesen im Kasten rechts unten auf dem +Bildschirm an. Außerdem werden die zuvor nicht aktiver­ +baren Punkte aktivierbar gemacht. Das kann man daran +erkennen, daß auf dem Bildschirm die Minuszeichen vor +den betreffenden Menupunkten verschwinden (und Buch­ +staben sichtbar werden). + Lassen Sie sich zunächst ein Inhaltsverzeichnis der +Diskette anzeigen. Dazu brauchen Sie nur den Menupunkt +'v Verzeichnis' wählen. Wie das gemacht wird wissen Sie ja +schon. Sie können dabei beobachten, daß vor dem Menu­ +punkt das bisherige Zeichen verschwindet und ein Stern +(*) sichtbar wird. Daran kann man erkennen, daß #on("b")#gs-DIALOG#off("b")# +den Auftrag bereits ausführt. + Es dauert einen Moment, bis das Verzeichnis erstellt +ist - anschließend wird es auf dem Bildschirm ausgegeben. +Paßt das Verzeichnis nicht vollständig auf den Bild­ +schirm, so können Sie sich darin bewegen, blättern etc., +wie Sie es aus dem Editor gewohnt sind. Ebenso wird das +Verzeichnis auch wie der Editor verlassen - durch die +Tastenfolge (das wird übrigens auch auf dem +Bildschirm angezeigt!). + + +- Dateiauswahl + + Sie sollen jetzt eine Datei von der Archivdiskette in +das System holen, d.h. genauer gesagt von der Diskette +kopieren. Aktivieren Sie also auf gewohnte Weise den +Menupunkt 'h Holen/Lesen'. Warten Sie anschließend einen +Moment, denn #on("b")#gs-DIALOG#off("b")# erstellt eine Liste aller vorhan­ +denen Dateien auf der Diskette und bietet Sie Ihnen an­ +schließend so an, daß Sie komfortabel eine Auswahl tref­ +fen können. + Haben Sie die #on("b")#gs-DIALOG#off("b")#-Archivdiskette eingelegt, so +zeigt sich etwa der folgende Bildschirm: + + +#on("b")# +ARCHIV: Dateien Archiv +-------+-------------------------+-------------------------------------- + +--------------------------------------------------------------------+ + | Dateien holen/lesen (Archiv) | + | | + | Bitte alle Dateien ankreuzen, die 'geholt' werden sollen! | + |====================================================================| + | Auswahl m e h r e r e r Dateien durch Ankreuzen | + |....................................................................| + |==> o gs-DIALOG MENUKARTEN MANAGER" | + | o gs-DIALOG MM/gen | + | o gs-DIALOG 1 | + | o gs-DIALOG 2 | + | o gs-DIALOG 3 | + | o gs-DIALOG 4 | + | o gs-DIALOG 5 | + | o gs-DIALOG 6 | + | o gs-DIALOG 7 | + | o gs-MENUKARTE:Archiv | + |..................................................Weitere Dateien!..| + +--------------------------------------------------------------------+ +--|Info: Fertig: Abbrechen: | +In+--------------------------------------------------------------------+ +#off("b")# + + + Auf dem Archiv sind mehrere Dateien vorhanden. Alle +werden Ihnen zur Auswahl angeboten. In der obersten +Zeile wird zur Kontrolle die Funktion angezeigt, die Sie +gerade gewählt haben. Sie können jetzt die Dateien, auf +die sich die Operation beziehen sollen, in beliebiger Rei­ +henfolge ankreuzen. Wenn Sie abschließend die Auswahl +verlassen, werden die Dateien in der Ankreuzreihenfolge +bearbeitet (hier in die Task geholt). + Die Handhabung der Dateiauswahl ist ganz einfach. Der +Pfeil gibt jeweils an, welche Datei aktuell behandelt +wird. Zunächst wird vor den Namen jeweils nur ein 'o' aus­ +gegeben. Mit den Pfeiltasten und können +Sie nun mit dem Pfeil vor den Namen fahren, den Sie an­ +kreuzen möchten. Tippen Sie dann die Taste oder +, so erscheint in der Anzeige ein 'x' vor dem Na­ +men und eine Zahl, die angibt, die wievielte Datei Sie an­ +gekreuzt haben. Haben Sie sich versehen, so können Sie +das Kreuz auch wieder löschen. Dazu fahren Sie einfach +erneut vor den betreffenden Namen, wo ja jetzt ein 'x' +steht, und tippen die Taste (kleines 'o') oder . +Dadurch wird das Kreuz entfernt und gegebenenfalls eine +Umnumerierung der schon angekreuzten Dateinamen vor­ +genommen. Verlassen Sie jetzt die Auswahl mit der Tasten­ +folge , so werden die Dateien nacheinander in der +von Ihnen angekreuzten Reihenfolge in die Task kopiert. + Neben dieser Auswahl, in der #on("u")#m e h r e r e#off("u")# Dateien an­ +gekreuzt (ausgewählt) werden können, gibt es auch eine +Auswahl, in der nur jeweils #on("u")#e i n e#off("u")# Datei angekreuzt wer­ +den darf. Das ist durch die entsprechende Beschriftung +auf dem Bildschirm kenntlich gemacht. In einem solchen +Fall wird die Auswahl nach Ankreuzen eines Namens #on("u")#auto­ +matisch#off("u")# verlassen, d.h. man braucht nicht zu tip­ +pen!. + In einer Dateiauswahl können bis zu 200 Dateien ver­ +waltet werden. Da aber nicht alle Namen gleichzeitig auf +dem Bildschirm angezeigt werden können, wird jeweils in +der gepunkteten Zeile angezeigt, ob noch #on("u")#weitere Dateien#off("u")# +in der Liste vorausgehen oder folgen. In unserem Beispiel +geht als keine Datei voraus, es folgen aber noch weitere +Dateien hinter der zuletzt angezeigten Datei. + Damit Sie noch komfortabler mit dieser Dateiauswahl +arbeiten können, gibt es weitere Tastenfolgen die nütz­ +lich sein können. Wenn Sie die Fragezeichentaste () tip­ +pen, werden Sie auf dem Bildschirm angezeigt. Durch Tip­ +pen irgendeiner weiteren Taste können Sie weiterblättern +bzw. in die Auswahl zurückgelangen. Folgende Tastenkom­ +mandos stehen Ihnen zur Verfügung: + + + Positionierungen: + + hoch : zum vorausgehenden Namen + runter : zum folgenden Namen + HOP hoch : auf den ersten Namen der Seite + HOP runter : auf den letzten Namen der Seite + ESC 1 : auf den ersten Namen der Liste + ESC 9 : auf den letzten Namen der Liste + + + Auswahl treffen: + + RETURN / x : diesen Namen ankreuzen +(RUBOUT / o : Kreuz vor dem Namen löschen ) +(HOP RETURN/HOP x: alle folgenden Namen ankreuzen) +(HOP RUBOUT/HOP o: alle folgenden Namen löschen ) + + + Auswahl verlassen: + + ESC q : Auswahl verlassen + ESC h : Auswahl abbrechen + + + + Die in Klammern gesetzten Tastenfunktionen kann man +nur verwenden, wenn die Auswahl #on("u")#mehrerer#off("u")# Dateien zuge­ +lassen ist. + Wie Sie sehen, orientiert sich die Bedienung an den +Tastenfunktionen, die Ihnen schon aus dem Editor be­ +kannt sind. Haben Sie aus Versehen einen Menupunkt ge­ +wählt, so daß Ihnen eine solche Auswahl angeboten wird, +so können Sie die Auswahl durch (für 'halt') ab­ +brechen. + + +- Ja/Nein - Fragen + + An verschiedenen Stellen werden Fragen an Sie ge­ +richtet, die Sie mit 'ja' oder 'nein' beantworten müssen. +Tippen Sie dazu entsprechend je nach Entscheidung die +Taste (für 'ja') bzw. (für 'nein'). + + +- Eingaben + + An einigen Stellen werden Sie aufgefordert, eine Ein­ +gabe zu machen (z.B. einen Dateinamen einzugeben). Sofern +möglich wird Ihnen auch ein Vorschlag für die Eingabe +gemacht (z.B. wenn Sie Dateien kopieren oder umbenennen +wollen). Wenn Sie den gemachten Vorschlag akzeptieren, +dann brauchen Sie zur Bestätigung nur die - +Taste zu tippen. + Gefällt Ihnen der Vorschlag nicht oder wird Ihnen +kein Vorschlag gemacht, so machen Sie bitte die ge­ +wünschte Angabe. Zum Schreiben stehen Ihnen alle aus dem +Editor bekannten Funktionen zur Verfügung. Mit der +Taste können Sie Buchstaben löschen, mit + einfügen. Die Eingabe wird durch Tippen der +-Taste abgeschlossen. + Ist der von Ihnen gewünschte Name schon in Ihrer Task +vorhanden und steht in der Fußzeile der Hinweis 'Zeigen: +', dann können Sie sich auch alle vorhandenen +Namen zur Auswahl anbieten lassen und durch Ankreuzen +den beabsichtigten Namen auswählen. + + +- Alternativen + + Ihnen können auch mehrere Alternativen angeboten +werden, zwischen denen Sie wählen müssen. In der unter­ +sten Zeile eines solchen Kastens, in denen Ihnen die Al­ +ternativen auf dem Bildschirm eingeblendet werden, sind +die Möglichkeiten aufgeführt, die darüber beschreiben +sind. Mit den Pfeiltasten können sie die Markierung auf +die gewünschte Alternative positionieren und dann durch +die -Taste zur Ausführung bringen. (Manchmal +ist das auch durch Tippen der den Alternativen vorange­ +stellten Buchstaben oder Ziffern möglich). + + +- Verlassen des Menus + + Das Menu kann insgesamt mit der Tastenfolge +verlassen werden. Damit das nicht versehentlich ge­ +schieht, wird zur Sicherheit die Frage gestellt, ob Sie das +Menu tatsächlich verlassen wollen. Verneinen Sie die +Frage, verbleiben Sie im Menu, ansonsten gelangen Sie +zurück in die 'gib kommando:' - Ebene. + + Mit dieser Beispielsitzung haben Sie jetzt schon fast +alle Arten des Umgangs mit #on("b")#gs-DIALOG#off("b")# kennengelernt. +Sicher ist dies beim ersten Mal sehr verwirrend. Mit den +folgenden vier grundsätzlichen Regeln können Sie +#on("b")#gs-DIALOG#off("b")# aber immer bedienen: + + 1. Achten Sie darauf, welche Tastenkombinationen in + der Fußzeile angegeben sind. Halten Sie sich daran! + + 2. Rufen Sie - sofern vorhanden - die Hilfsfunktio­ + nen mit oder auf. Damit erhalten Sie + weitere Informationen. + + 3. Funktioniert eine Tastenkombination nicht (geben + Sie dem Rechner eine kurze Zeit zum Reagieren), + versuchen Sie die Tastenkombination (Ver­ + lassen) oder (Abbruch). Falls sich darauf­ + hin etwas ändert, verfahren Sie wie unter 1). + + 4. Erfolgt noch immer keine Reaktion, tippen Sie die + -Taste und versuchen Sie das Programm mit + 'halt' zu stoppen. Führt auch das nicht zum Erfolg, + hat sich der Rechner "aufgehängt". Wenn Sie keine + Erfahrungen mit einer solchen Situation haben, + wenden Sie sich an Ihren Systembetreuer. + + +3.3 Zusammenfassung/Kurzbeschreibung + +Menu: Sie können jede (aktive) Funktion inner­ + halb eines Pull-Down-Menus mit den + Pfeiltasten anwählen und durch Tippen + der -Taste zur Ausführung + bringen. (Ersatzweise kann - sofern vor + dem Menupunkt ein Buchstabe oder eine + Ziffer angegeben ist - die Funktion + durch Tippen der entsprechenden Taste + direkt zur Ausführung gebracht werden.) + Zu jeder Funktion kann durch Tippen der + Fragezeichentaste eine Hilfestellung + angefordert werden. Gibt man die Tasten­ + folge , so wird die Bedienung des + Menus auf dem Bildschirm kurz erläutert. + Mit der Tastenfolge wird das + Menu (nach einer Sicherheitsabfrage) + verlassen. + +Dateiauswahl: Hier können Sie die gewünschten Namen + mit ankreuzen und das Kreuz mit + wieder entfernen. Die Auswahl - sofern + mehrere Dateien ausgewählt werden kön­ + nen - wird durch die Tastenfolge + verlassen. Alle Möglichkeiten + der Bedienung werden angezeigt, wenn die + Fragezeichentaste getippt wird. Die Aus­ + wahl wird abgebrochen (ohne Kreuze!), + wenn die Tastenfolge eingege­ + ben wird. + +Eingabe: Hier können Sie eine Zeile eingeben oder + eine Vorgabe ändern (wie im Editor). Ein­ + fügen und Löschen mit RUBIN und RUBOUT. + Ist in der Fußzeile die Tastenfolge + ': Zeigen' angegeben, so können + Sie darüber auch eine Auswahl anfor­ + dern, in der Sie bereits vorhandene Na­ + men nur anzukreuzen brauchen. Zumeist + ist auch ein Abbruch der Eingabe durch + die Tastenfolge möglich. + +Frage: Beantworten Sie die an Sie gerichtete + Frage mit oder . Sie können auch + auf dem Bildschirm die Markierung auf + die gewünschte Antwort setzten und an­ + schließend die -Taste tippen. + +Alternativen: Aus den angegebenen Möglichkeiten kön­ + nen Sie eine auswählen, indem Sie entwe­ + der die der Alternative vorangestellte + Taste tippen oder in der letzten Zeile des + Kastens die Markierung auf die ge­ + wünschte Kennzeichnung positionieren + und anschließend die -Taste + tippen. + +Fehler: Die Meldung muß durch Tippen einer be­ + liebigen Taste quittiert werden. + +Bitte warten: Der Rechner ist beschäftigt - keine + Taste tippen! + + diff --git a/doc/dialog/gs-dialog-4 b/doc/dialog/gs-dialog-4 new file mode 100644 index 0000000..03d8dc4 --- /dev/null +++ b/doc/dialog/gs-dialog-4 @@ -0,0 +1,672 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (30)# +#headodd# +#center#gs-DIALOG#right#% + +#end# +#headeven# +%#center#gs-DIALOG + +#end# +#center#4 + +#center#Beschreibung der Menufunktionen + + +4.1 Menufunktionen zum Oberbegriff 'Dateien' + + In diesem Kapitel werden alle die Menufunktionen be­ +schrieben, die Ihnen unter dem Obergeriff 'Dateien' im +Menu angeboten werden. + +#on("u")##on("b")#v Verzeichnis#off("b")##off("u")# + Mit dieser Funktion können Sie sich einen Über­ + blick über die in Ihrer Task vorhandenen Dateien ver­ + schaffen. + Nach Aufruf dieser Funktion wird eine Liste der + Dateien auf dem Bildschirm ausgegeben, die sich in + Ihrer Task befinden. Da die Liste selbst eine Datei ist, + kann sie mit der Tastenkombination verlassen + werden - hierauf wird auch in der Kopfzeile der Datei + hingewiesen. Falls nicht alle Dateien auf den Bild­ + schirm passen, können Sie das Fenster mit + bzw. rollen. + +#on("u")##on("b")#l Löschen#off("b")##off("u")# + Mit dieser Funktion können Sie Dateien, die Sie + nicht mehr benötigen, die unnötig Platz belegen, lö­ + schen. Aber Vorsicht! Die Dateien verschwinden durch + diese Funktion unwiederbringlich! + Zunächst wird der Dateiname der Datei erfragt, die + gelöscht werden soll. Hier können Sie direkt den be­ + treffenden Namen eingeben und die Eingabe mit + abschließen. Sie können sich aber auch durch + die Tastenfolge (für 'zeigen') alle in der Task + vorhandenen Dateien zur Auswahl anbieten lassen und + dort einfach einen Namen ankreuzen. + Für jede einzelne Datei wird noch einmal zur + Sicherheit angefragt, ob diese auch tatsächlich ge­ + löscht werden soll. Zur Bestätigung tippen Sie bitte + die Taste ('ja') - zur Verhinderung die Taste + ('nein'). + + Fehlerfälle: + - Eine Datei mit dem angegebenen Namen existiert + nicht. + +#on("u")##on("b")#d Drucken#off("b")##off("u")# + Mit dieser Funktion können Sie Dateien über einen + angeschlossenen Drucker ausdrucken lassen. + Zunächst wird der Dateiname der Datei erfragt, die + gedruckt werden soll. Hier können Sie direkt den be­ + treffenden Namen eingeben und die Eingabe mit + abschließen. Sie können sich aber auch durch + die Tastenfolge (für 'zeigen') alle in der Task + vorhandenen Dateien zur Auswahl anbieten lassen und + dort einfach einen Namen ankreuzen. + Die Datei(en) wird/werden anschließend zum Drucker + geschickt. Der Vorgang wird auf dem Bildschirm proto­ + kolliert. + + Fehlerfälle: + - Eine Datei mit dem angegebenen Namen existiert + nicht. + - Die Druckdatei hat einen falschen Typ zum Drucken + (ist nicht editierbar). + - Der Drucker ist nicht funktionsbereit. + - Der Drucker wird nicht über die Task 'PRINTER' be­ + trieben. + - Auf Ihrem System werden die Druckkosten abge­ + rechnet. Sie müssen sich mit einer Codenummer + identifizieren. + +#on("u")##on("b")#k Kopieren#off("b")##off("u")# + Mit dieser Funktion können Sie sich eine (logische) + Kopie einer bereits im System vorhandenen Datei anle­ + gen. Das ist z.B. dann sinnvoll, wenn Sie sich einen + bestimmten Stand einer Datei aufbewahren wollen. + Zunächst wird der Dateiname der Datei erfragt, die + kopiert werden soll. Hier können Sie direkt den be­ + treffenden Namen eingeben und die Eingabe mit + abschließen. Sie können sich aber auch durch + die Tastenfolge (für 'zeigen') alle in der Task + vorhandenen Dateien zur Auswahl anbieten lassen und + dort einfach einen Namen ankreuzen. + Anschließend wird dieser Name angezeigt und der + Name für die Kopie erfragt. Es muß ein Name eingetra­ + gen werden, der in dieser Task noch nicht für eine + Datei vergeben wurde; ansonsten erfolgt ein Hinweis + darauf und es wird nicht kopiert! + Da man aber oft für die Kopie einen ähnlichen Na­ + men wie für das Original wählt, wird der 'alte' Name + vorgeschlagen. Aus genannten Gründen muß er aber + verändert werden. Sie können diesen Namen mit den + üblichen Editierfunktionen verändern oder mit + löschen und ganz neu eingeben. Auf + diese Weise sparen Sie aber eine Menge Tipparbeit, + wenn Sie einen langen Namen nur an einer Stelle än­ + dern wollen. + + Fehlerfälle: + - Eine Datei mit dem angegebenen Namen existiert + nicht. + - Eine Datei mit dem gewünschten Namen existiert + bereits in der Task. + +#on("u")##on("b")#u Umbenennen#off("b")##off("u")# + Mit dieser Funktion können Sie einer bereits vor­ + handenen Datei einen neuen Namen geben. + Zunächst wird der Dateiname der Datei erfragt, die + umbenannt werden soll. Hier können Sie direkt den + betreffenden Namen eingeben und die Eingabe mit + abschließen. Sie können sich aber auch durch + die Tastenfolge (für 'zeigen') alle in der Task + vorhandenen Dateien zur Auswahl anbieten lassen und + dort einfach einen Namen ankreuzen. + Anschließend wird dieser Name angezeigt und der + zukünftige Name für die Datei erfragt. Es muß ein + Name eingetragen werden, der in dieser Task noch + nicht für eine Datei vergeben wurde; ansonsten er­ + folgt ein Hinweis darauf und die Datei wird nicht + umbenannt! + Da man aber oft den 'neuen' Namen in Anlehnung an + den 'alten' Namen wählt, wird der 'alte' Name vorge­ + schlagen. Aus genannten Gründen muß er aber verän­ + dert werden. Sie können diesen Namen mit den üblichen + Editierfunktionen verändern oder mit + löschen und ganz neu eingeben. Auf diese Weise sparen + Sie aber eine Menge Tipparbeit, wenn Sie einen langen + Namen nur an einer Stelle ändern wollen. + + Fehlerfälle: + - Eine Datei mit dem angegebenen Namen existiert + nicht. + - Eine Datei mit dem gewünschten Namen existiert + bereits in der Task. + +#on("u")##on("b")#s Speicherplatz#off("b")##off("u")# + Mit dieser Funktionen können Sie sich zu Ihrer + Information den Speicherbedarf anzeigen lassen, den + eine Datei auf dem Speichermedium einnimmt. + Zunächst wird der Dateiname der Datei erfragt, + deren Speicherplatz ermittelt werden soll. Hier kön­ + nen Sie direkt den betreffenden Namen eingeben und + die Eingabe mit abschließen. Sie können sich + aber auch durch die Tastenfolge (für 'zeigen') + alle in der Task vorhandenen Dateien zur Auswahl + anbieten lassen und dort einfach einen Namen ankreu­ + zen. + Anschließend wird der belegte Speicherplatz der + ausgewählten Datei(en) auf dem Bildschirm angezeigt. + Die Größe wird in KB (Kilobyte) angegeben. Ein KB ent­ + spricht etwa 1000 Zeichen, also einer halb vollge­ + schriebenen Bildschirmseite. + + Fehlerfälle: + - Eine Datei mit dem angegebenen Namen existiert + nicht. + +#on("u")##on("b")#a Aufräumen#off("b")##off("u")# + Wenn in einer Datei viel geändert wurde, wird der + Platzbedarf dieser Datei erheblich vergrößert ("Text­ + leichen"). Dies tritt vor allem dann auf, wenn sehr + häufig eingefügt wurde. Da der Platzbedarf der Datei + zunimmt, sind mehr Speicherzugriffe notwendig, als es + dem Inhalt entspricht. Zudem führt die interne Orga­ + nisation einer solchen Datei zu Einbußen bei der Bear­ + beitungsgeschwindigkeit. + Mit dieser Funktion wird die Datei in eine "fri­ + sche" Datei gewandelt. Diesen Vorgang nennt man 'Re­ + organisieren' (Aufräumen). Anschließend belegt die + Datei zumeist (erheblich) weniger Speicherplatz als + zuvor. + Diese Funktion ist allerdings nur mit einer Ein­ + schränkung nutzbar. Sie läßt sich nur auf Textdateien + anwenden, nicht auf andere Dateitypen. Das System + nimmt aber die Unterscheidung in Dateitypen automa­ + tisch vor - allerdings kann es vorkommen, daß Sie den + Hinweis erhalten: "... kann nicht aufgeräumt werden!". + Zunächst wird der Dateiname der Datei erfragt, die + aufgeräumt (reorganisiert werden soll. Hier können + Sie direkt den betreffenden Namen eingeben und die + Eingabe mit abschließen. Sie können sich + aber auch durch die Tastenfolge (für 'zeigen') + alle in der Task vorhandenen Dateien zur Auswahl + anbieten lassen und dort einfach einen Namen ankreu­ + zen. + Anschließend wird/werden die ausgewählte(n) Da­ + tei(en) aufgeräumt (reorganisert). #on("u")#Achtung! Die Funk­ + tion ist zeitaufwendig!#off("u")# + + Fehlerfälle: + - Eine Datei mit dem angegebenen Namen existiert + nicht. +#page# +4.2 Menufunktionen zum Oberbegriff 'Archiv' + + In diesem Kapitel werden alle die Menufunktionen be­ +schrieben, die Ihnen unter dem Oberbegriff 'Archiv' im +Menu angeboten werden. Mit den Funktionen in diesem +Menu können Sie aber nicht nur Dateien auf dem Archiv +behandeln, sondern auch in anderen Tasks im Multi- +User-System oder über das EUMEL-Netz sogar auf anderen +Rechnern! + Wenn Sie das Pull-Down-Menu (siehe Seite 12) gerade +aufgeschlagen haben, sind nicht alle Funktionen akti­ +vierbar! Um weitere Funktionen zu aktivieren, muß erst +einer der aktivierbaren Menupunkte ausgeführt werden. + +#on("u")##on("b")#r Reservieren#off("b")##off("u")# (des Archivlaufwerks) + Im EUMEL-Multi-User-System haben normalerweise + mehrere Personen das Zugriffsrecht auf das Archiv­ + laufwerk. Allerdings muß der Zugriff so geregelt wer­ + den, daß sich die Beteiligten dabei nicht gegenseitig + "in die Quere kommen". Ein Zugriff auf das Archiv­ + laufwerk erfordert zunächst eine Anmeldung. Ist diese + Anmeldung erfolgt, kann von den anderen Beteiligten + nicht mehr auf das Laufwerk zugegriffen werden - bis + es wieder freigegeben worden ist. + Diese Anmeldung des Archivlaufwerkes erfolgt + über die Menufunktion 'r Reservieren'. Greift bereits + eine andere Task auf das Laufwerk zu, so erhalten Sie + darüber einen Hinweis auf dem Bildschirm. Ansonsten + wird an Sie die Frage gestellt, ob die Diskette einge­ + legt und das Laufwerk geschlossen ist. + Erst zu diesem Zeitpunkt ist sichergestellt, daß Sie + den alleinigen Zugriff auf das Laufwerk haben. Des­ + halb sollten Sie, wenn Sie mit mehreren Personen am + Computer arbeiten, erst zum Zeitpunkt der Fragestel­ + lung die Diskette ins Laufwerk einlegen. + Nachdem Sie die Diskette eingelegt und die Frage + bejaht haben, ermittelt das System selbständig den + Namen der eingelegten Diskette, zeigt den Namen auf + dem Bildschirm (im kleinen Kasten rechts unten) an und + aktiviert die anderen Menupunkte des Pull-Down- + Menus. + #on("u")#Beim Verlassen des Pull-Down-Menus, wenn eine + andere Zieltask eingestellt wird oder wenn das Menu + gänzlich verlassen wird, wird die Reservierung auto­ + matisch aufgehoben!#off("u")# + + Fehlerfälle: + - Das Laufwerk ist von einer anderen Task belegt. + - Die Diskette ist falsch eingelegt oder das Lauf­ + werk ist nicht richtig geschlossen. + - Die Diskette ist nicht formatiert bzw. initiali­ + siert. + - Die Diskette kann nicht gelesen werden (keine + EUMEL-Diskette, Diskette hat ein falsches Format, + Diskette ist verschmutzt...). + +#on("u")##on("b")#n Neue Diskette#off("b")##off("u")# (anmelden) + Der Dateiaustausch mit einer Diskette ist nur dann + möglich, wenn der im System eingestellte Diskettenna­ + me (auf dem Bildschirm im kleinen Kasten unten rechts + sichtbar) mit dem tatsächlichen Namen der Diskette + übereinstimmt. Nach einem Diskettenwechsel ist das + aber in der Regel nicht mehr der Fall. Greift man dann + auf die neu eingelegte Diskette zu, so erscheint die + Fehlermeldung: 'Falscher Archivname! Bitte neue Dis­ + kette anmelden!'. + Das Anmelden einer neuen Diskette - ohne einen + neuen Reserviervorgang - wird durch diese Menufunk­ + tion ermöglicht. Nach Aktivieren dieses Menupunktes + wird der Name der eingelegten Diskette ermittelt, im + System eingestellt und auf dem Bildschirm angezeigt. + Im Gegensatz zur Menufunktion 'r Reservieren' + greift #on("b")#gs-DIALOG#off("b")# ohne Anfrage an den Benutzer auf + das Archivlaufwerk zu (die Reservierung bleibt ja + bestehen). Ist das Archivlaufwerk reserviert, so ist + die Neuanmeldung einer Diskette über diese Menufunk­ + tion weniger zeitaufwendig. + + Fehlerfälle: + - wie unter 'r Reservieren' + +#on("u")##on("b")#s Schreiben#off("b")##off("u")# (Kopieren) + Alle Dateien der eigenen Task werden zur Auswahl + angeboten. Wenn Sie die Auswahl durch die Tastenfolge + verlassen, überprüft #on("b")#gs-DIALOG#off("b")# zunächst, ob + die Dateien in der eingestellten Zietask schon vor­ + handen sind. Ist das der Fall, erfragt #on("b")#gs-DIALOG#off("b")#, ob + die dort vorhandenen Dateien überschrieben, d.h. ge­ + löscht werden dürfen (s.u.). Anschließend werden alle + angekreuzten Dateien in der Reihenfolge, in der Sie + sie angekreuzt haben, in die eingestellte Zieltask + kopiert. Der Vorgang wird auf dem Bildschirm proto­ + kolliert. Die Originaldateien in der eigenen Task + bleiben dabei erhalten. + Wenn in der Zieltask schon eine Datei existiert, die + den gleichen Namen hat wie eine Datei, die Sie dorthin + kopieren möchten, so wird angefragt, ob die vorher + schon existierende Datei überschrieben (gelöscht!) + werden soll. Bejahen Sie diese Frage, so wird die be­ + reits in der Zieltask existierende Datei (unwieder­ + bringlich) gelöscht und die gewünschte Datei dorthin + transportiert. Ein Überschreiben aus Versehen ist + nicht möglich, wenn Sie die an Sie gestellte Frage + sorgfältig beantworten. + Verneinen Sie die Frage, so wird die Datei auch + nicht hinübertransportiert! Sie können die Datei aber + umbenennen (Menufunktion 'u Umbenennen' unter dem + Oberbegriff 'Dateien') und anschließend mit anderem + Namen hinüberschreiben. + Beachten Sie, daß beim Überschreiben einer Datei + auf einer Archivdiskette der Speicherplatz der alten + (überschriebenen) Version im allgemeinen nicht wie­ + derverwendet werden kann. In einem solchen Fall + könnte die Diskette voll geschrieben werden, obwohl + eigentlich genügend Platz vorhanden wäre. Zur Opti­ + mierung überprüft #on("b")#gs-DIALOG#off("b")# deshalb zuerst, ob die + angekreuzten Dateien schon in der Zieltask vorhanden + sind und löscht diese, wenn Sie Ihr Einverständnis + geben. Erst anschließend werden die Dateien insgesamt + kopiert. + Normalerweise ist als Zieltask das Archivlaufwerk + der eigenen Station eingestellt. Mit der Menufunktion + 'z Zieltask einstellen' kann diese Einstellung aber + verändert werden. + + Fehlerfälle: + - Die Diskette ist falsch eingelegt oder beschädigt. + - Die Diskette kann nicht beschrieben werden + (Schreibfehler) + - Die Diskette ist voll. + - Sehen Sie auch unter 'r Reservieren' + 'z Zieltask einstellen' + +#on("u")##on("b")#c Checken#off("b")##off("u")# + Diese Menufunktion kann nur ausgeführt werden, + wenn der Dateiaustausch mit einem Archiv(manager) + erfolgt - ansonsten ist diese Menufunktion auch + nicht aktivierbar. Die Menufunktion dient dazu, auf + Diskette geschriebene Dateien auf Lesefehler hin zu + prüfen. Es empfiehlt sich, diese Prüfroutine auf neu + auf die Diskette geschriebene Dateien anzuwenden. + Sehen Sie dazu auch 'k Kombination' + Alle Dateien der eingestellten Zieltask (Archiv) + werden zur Auswahl angeboten. Wenn Sie die Auswahl + durch die Tastenfolge verlassen, werden alle + angekreuzten Dateien in der Reihenfolge, in der Sie + sie angekreuzt haben, "gecheckt", d.h. auf Lesefehler + hin überprüft. Der Vorgang wird auf dem Bildschirm + protokolliert. + + Fehlerfälle: + - Lesefehler auf dem Archiv + - Sehen Sie auch unter 'r Reservieren' + +#on("u")##on("b")#k Kombination#off("b")##off("u")# + Diese Menufunktion ist eine Kombination aus den + beiden Menufunktionen 's Schreiben' und 'c Checken' + (Sehen Sie weitere Informationen auch dort!). + Alle Dateien der eigenen Task werden zur Auswahl + angeboten. Wenn Sie die Auswahl durch die Tastenfolge + verlassen, werden alle angekreuzten Dateien + in der Reihenfolge, in der Sie sie angekreuzt haben, + in die eingestellte Zieltask kopiert (gegebenenfalls + müssen bereits vorhandene Dateien gleichen Namens in + der Zieltask gelöscht werden). Anschließend werden + alle Dateien, die gerade geschrieben wurden, gecheckt, + d.h. auf Lesefehler hin untersucht. Beide Vorgänge + werden auf dem Bildschirm protokolliert. + Da die 'Check' - Operation nur bei Archivmanagern + zulässig ist, ist diese Menufunktion ebenfalls nur bei + Archivmanagern aktivierbar. Zur Erläuterung sehen + Sie bitte auch unter 'z Zieltask einstellen'. + +#on("u")##on("b")#h Holen/Lesen#off("b")##off("u")# + Die Menufunktion dient dazu, Dateien, die bereits + auf einer Archivdiskette oder in einer anderen Task + existieren, in die eigene Task zu kopieren. + Alle Dateien der eingestellten Zieltask werden zur + Auswahl angeboten. Anschließend werden Kopien der + angekreuzten Dateien in der Reihenfolge des Ankreu­ + zens in die eigene Task geholt. Das Original in der + Zieltask bleibt dabei unverändert! Der Vorgang wird + auf dem Bildschirm protokolliert. + Sind in der eigenen Task schon Dateien mit glei­ + chem Namen vorhanden, so wird gefragt, ob die 'alten' + Dateien überschrieben (gelöscht) werden dürfen. Nur + wenn Sie zustimmen, werden die in Ihrer Task existie­ + renden Dateien (unwiederbringlich!) gelöscht und Ko­ + pien der gleichnamigen Dateien aus der Zieltask ange­ + fertigt. + Stimmen Sie dem Löschvorgang nicht zu, dann blei­ + ben die bisherigen Dateien in Ihrer Task erhalten - + die Dateien aus der Zieltask werden dann aber auch + nicht in Ihre Task kopiert! Um dennoch die Kopien zu + erhalten, können Sie die namensgleichen Dateien in + Ihrer Task umbenennen und dann erst die Dateien aus + der anderen Task anfordern. + Normalerweise werden die Dateien vom Archiv der + eigenen Station geholt. Mit dem Menupunkt 'z Zieltask + einstellen' kann diese Einstellung verändert werden. + + Fehlerfälle: + - Lesefehler auf dem Archiv + - Sehen Sie auch unter 'r Reservieren' + 's Schreiben' + 'z Zieltask einstellen' + +#on("u")##on("b")#l Löschen#off("b")##off("u")# + Die Menufunktion dient dazu, Dateien in der Ziel­ + task (unwiederbringlich!) zu löschen. Dazu werden alle + Dateien der eingestellten Zieltask zur Auswahl ange­ + boten. Anschließend werden die angekreuzten Dateien + in der Reihenfolge ihres Ankreuzens gelöscht. Zur + Sicherheit muß noch einmal für jede einzelne Datei + bestätigt werden, daß sie auch tatsächlich gelöscht + werden soll. + Beachten Sie, daß beim Löschen einer Datei auf ei­ + ner Archivdiskette der Speicherplatz im allgemeinen + nicht wieder verwendet werden kann. In einem solchen + Fall könnte die Diskette voll geschrieben werden, + obwohl eigentlich genügend Platz vorhanden wäre. + Diese Probleme treten bei anderen Tasks, die keine + Archivmanager sind, nicht auf, da deren Speicherplatz + intelligenter verwaltet wird. + Normalerweise ist als Zieltask das Archiv der eige­ + nen Station eingestellt. Mit dem Menupunkt 'z Zieltask + einstellen' kann diese Einstellung verändert werden. + + Fehlerfälle: + - Sehen Sie auch unter 'r Reservieren' + 's Schreiben' + 'z Zieltask einstellen' + +#on("u")##on("b")#v Verzeichnis#off("b")##off("u")# + Mit dieser Menufunktion können Sie sich einen + Überblick über die in der Zieltask (z.B. auf dem Archiv) + vorhandenen Dateien verschaffen. + Nach Aufruf der Funktion wird eine Liste der Da­ + teien auf dem Bildschirm ausgegeben, die sich in der + Zieltask (z.B. auf dem Archiv) befinden. Ist die Zieltask + ein Archiv(manager), so wird auch angezeigt, wieviel + Platz auf der Diskette belegt ist. Da die Liste selbst + eine Datei ist, kann sie mit der Tastenkombination + verlassen werden. Falls nicht alle Dateinamen + auf den Bildschirm passen, können Sie das Fenster mit + und rollen. + + Fehlerfälle: + - Sehen Sie unter 'z Zieltask einstellen' + +#on("u")##on("b")#d Drucken#off("b")##off("u")# + Das Verzeichnis der Dateien in der Zieltask, das + man mit der Menufunktion 'v Verzeichnis' auf dem Bild­ + schirm angezeigt bekommt, kann mit dieser Menufunk­ + tion ausgedruckt werden. + Zur Sicherheit fragt #on("b")#gs-DIALOG#off("b")# an, ob wirklich ein + solches Dateiverzeichnis der Zieltask gedruckt werden + soll. Bejaht man die Frage, so wird ein Dateiverzeich­ + nis erstellt und zum Drucker geschickt. + + Fehlerfälle: + - Der Drucker ist nicht funktionsbereit. + - Der Drucker wird nicht über die Task 'PRINTER' be­ + trieben. + - Auf Ihrem System werden die Druckkosten abge­ + rechnet. Sie müssen sich mit einer Codenummer + identifizieren. + +#on("u")##on("b")#i Initialisieren#off("b")##off("u")# + Diese Menufunktion gestattet es, frische Disketten + zu formatieren, zu initialisieren bzw. beschriebene + Disketten vollständig zu löschen und ggf. dabei umzu­ + benennen. Bei Aufruf dieser Menufunktion wird - so­ + fern noch nicht geschehen - das Archivlaufwerk auto­ + matisch reserviert. + Wenn Sie eine fabrikneue Diskette aus der Verpak­ + kung nehmen, müssen Sie diese zunächst #on("u")#formatieren#off("u")#. + Dabei wird die Diskette auf ein festgelegtes physika­ + lisches Format eingestellt. Ohne daß diese Operation + vorausgegangen ist, kann eine Diskette weder be­ + schrieben noch gelesen werden. + Prinzipiell braucht eine Diskette nur ein einziges + Mal formatiert zu werden. Sie können Sie jedoch jeder­ + zeit wieder formatieren - z.B. wenn Sie Disketten ha­ + ben, von denen Sie nicht genau wissen, für welche + Zwecke sie zuvor verwendet wurden. + Wenn Sie diese Menufunktion aktivieren, werden Sie + zunächst gefragt, ob Sie die Diskette auch formatie­ + ren wollen. Bejahen Sie die Frage, so werden Ihnen + mehrere Formate zur Auswahl angeboten: + +#on ("b")# + +------------------------------------+ + | Formatieren einer Diskette | + | | + | Dies sind die möglichen Formate: | + | | + | 1 ..... 40 Spur - 360 KB | + | 2 ..... 80 Spur - 720 KB | + | 3 ..... 5 1/4" - 1,2 MB | + | 4 ..... 3 1/2" - 1,4 MB | + | s ..... Standard - Format | + | | + | 1 2 3 4 s | + +------------------------------------+ +#off("b")# + + Erkundigen Sie sich bei Ihrem Händler, welches + Format Sie bei Ihrem Rechner und den von Ihnen ver­ + wendeten Disketten einstellen müssen. Manche Rechner + unterstützen diese Operation innerhalb des EUMEL- + Systems auch gar nicht, das Formatieren muß dann ir­ + gendwie anders außerhalb des EUMEL-Systems gesche­ + hen. + Wenn Sie die Formatierung abgeschlossen oder auch + übersprungen haben, beginnt die eigentliche Initiali­ + sierung der Diskette. Dabei wird als erstes der Ar­ + chivname auf die Diskette geschrieben. Alle alten Da­ + ten, die sich ggf. auf der Diskette befinden, werden + auch bei diesem Vorgang unwiederbringlich (!) ge­ + löscht. + Zur Sicherheit überprüft #on("b")#gs-DIALOG#off("b")# in jedem Falle, + ob es sich um eine EUMEL - Diskette handelt, und er­ + fragt Ihr Einverständnis, ob die Diskette wirklich + initialisiert werden soll. Geben Sie hierzu Ihr Ein­ + verständnis, dann erfragt #on("b")#gs-DIALOG#off("b")# noch den (neuen) + Archivnamen. Hatte die Diskette schon einen Namen, + dann wird dieser zum Überschreiben angeboten. Wollen + Sie den alten Archivnamen beibehalten, so brauchen + Sie nur die -Taste zu tippen, ansonsten kön­ + nen Sie den Namen auch zuvor verändern oder einen + ganz neuen Namen hinschreiben. Anhand des ausgege­ + benen Namens können Sie auch überprüfen, ob Sie die + richtige Diskette eingelegt haben. + Das Initialisieren funktioniert natürlich nur, + wenn Sie als Zieltask einen Archivmanager eingestellt + haben - ansonsten ist diese Menufunktion gesperrt + (nicht aktivierbar!). + + Fehlerfälle: + - Formatieren ist nicht auf dem System möglich + - Sehen Sie auch unter 'r Reservieren' + 'z Zieltask einstellen' + +#on("u")##on("b")#z Zieltask einstellen#off("b")##off("u")# + Mit dieser Menufunktion können Sie festlegen, mit + welcher Zieltask Sie kommunizieren, d.h. z.B. Dateien + austauschen möchten. Normalerweise ist hier das Archiv + am eigenen Rechner eingestellt. Das wird auch nach + Aufklappen des Pull-Down-Menus im Kasten rechts + unten angezeigt. + Sie können aber auch eine andere Task einstellen + (z.B. die Vatertask oder die Task 'PUBLIC'), um mit diesen + Dateien auszutauschen oder um sich auch nur einen + Überblick über die dort vorhandenen Dateien zu ver­ + schaffen. Wenn Sie mit Ihrem Rechner in ein EUMEL-Netz + integriert sind, können Sie auch auf Tasks anderer + Rechner zugreifen oder auch Disketten von Laufwerken + anderer Rechner einlesen (z.B. wenn Sie Disketten ande­ + rer Formate haben, die von Ihrem Rechner nicht gelesen + werden können). + Dabei werden zwei Anforderungen an die Zieltask + gestellt: Sie muß existieren und bereit für den Datei­ + austausch sein, d.h es muß eine Managertask sein, auf + die Sie Zugriff haben. Versuchen Sie auf andere Tasks + zuzugreifen, so erhalten Sie entsprechende (Fehler-)­ + Meldungen. + Zu beachten ist noch, daß es im EUMEL-System ver­ + schiedene Arten von Managertasks gibt - Archivmana­ + ger und normale Dateimanager. Der Unterschied besteht + darin, daß ein Archivmanager vom Benutzer vor dem + Zugriff reserviert werden muß - anschließend hat nur + dieser Benutzer (bis zur Aufgabe der Reservierung) ein + Zugriffsrechts auf den Manager. Normale Dateimanager + können dagegen von mehreren Benutzern in beliebiger + Reihenfolge angesprochen werden. + Ein Archivmanager kann auch auf bestimmte Disket­ + tenformate spezialisert sein (z.B. auf das Lesen von + DOS-Disketten). Manche Rechner haben auch mehrere + Archivmanager für verschiedene Laufwerke etc. Durch + Einstellen unterschiedlicher Archivmanager können + Sie dann auf verschiedenen Laufwerken archivieren. + Nach Aktivieren dieses Menupunktes werden Ihnen + die folgenden Alternativen angeboten: + +#on ("b")# + +-------------------------------------------+ + | Dateiaustausch gewünscht mit: | + | | + | a ... Archiv (Eigene Station) | + | | + | v ... Vatertask | + | | + | p ... 'PUBLIC' (Eigene Station) | + | | + | s ... Sonstige Task | + | | + | | + | Archiv Vatertask PUBLIC Sonstige | + +-------------------------------------------+ +#off("b")# + + Da der Dateiaustausch mit dem Standardarchiv der + eigenen Station (Task: 'ARCHIVE'), mit der Vatertask + und der Task 'PUBLIC' recht häufig in Anspruch genom­ + men wird, sind diese drei Optionen unter den Alterna­ + tiven direkt angegeben. Entscheiden Sie sich für eine + dieser drei Tasks, so nimmt #on("b")#gs-DIALOG#off("b")# alle notwendi­ + gen Einstellungen vor. Möchten Sie dagegen in Kon­ + takt mit einer anderen Task treten, so wählen Sie die + Alternative 's ... Sonstige Task'. + + In diesem Falle haben Sie noch 3 Angaben zu machen: + + - Zunächst werden Sie nach dem Namen der Zieltask + gefragt. Geben Sie den Namen der Zieltask - ohne + Anführungsstriche (!) - ein und schließen Sie die + Eingabe mit der -Taste ab. (Den ausgegebe­ + nen Namen der z.Z. eingestellten Task können Sie + dabei verändern bzw. überschreiben.) + - Dann wird die Nummer der Station im EUMEL-Netz + erfragt, auf der sich die Zieltask befindet. Die + Nummer Ihrer Station wird als Vorschlag ausgege­ + ben. Wollen Sie mit einer Task auf Ihrem Rechner + kommunizieren, so brauchen Sie diesen Vorschlag + nur durch Drücken der -Taste zu bestäti­ + gen; ansonsten tragen Sie zuvor die entsprechende + Stationsnummer ein. Ist Ihr Rechner nicht in ein + EUMEL-Netz integriert, so wird die Stationsnummer + 0 (Null) ausgegeben. Bitte bestätigen Sie diese Sta­ + tionsnummer durch Tippen der -Taste. + - Zum Abschluß müssen Sie noch angeben, ob die ein­ + gestellte Zieltask ein Archivmanager ist oder + nicht. + + #on("b")#gs-DIALOG#off("b")# versucht dann den Kontakt herzustellen. + Je nachdem, welche Einstellung Sie vorgenommen ha­ + ben, sind bestimmte Funktionen innerhalb des Menus + nicht aktivierbar. #on("b")#gs-DIALOG#off("b")# läßt nur die Funktionen + zu, die aufgrund Ihrer Einstellungen zulässig sind. + Im Kasten rechts unten auf dem Bildschirm wird + jeweils angezeigt, welche Zieltask eingestellt ist. + Erscheint in diesem Kasten auch ein Hinweis auf den + Archivnamen, so haben Sie einen Archivmanager einge­ + stellt. Ist dagegen vor dem Namen der Zieltask noch + eine Zahl und ein Schrägstrich angegeben, so haben + Sie eine Zieltask auf einem anderen Rechner einge­ + stellt. + Bedenken Sie, daß Operationen mit Tasks auf ande­ + ren Stationen länger andauern können - werden Sie + nicht ungeduldig! + Sie können die Einstellung der Zieltask jederzeit + wieder verändern! + + Fehlerfälle: + - Die eingestellte Zieltask existiert nicht. + - Die eingestellte Zieltask existiert zwar, ist aber + nicht empfangsbereit, d.h. ein Zugriff von Ihrer + Task aus ist nicht möglich! + - Das Netz ist nicht funktionsbereit (Collector-Task + fehlt). + - Die Kommunikation war nicht erfolgreich. + - Die gewünschte Operation kann mit der eingestell­ + ten Zieltask nicht ausgeführt werden (Zieltask ist + z.B. gar kein Archivmanager - Sie aber versuchen, + das Laufwerk zu reservieren) + diff --git a/doc/dialog/gs-dialog-5 b/doc/dialog/gs-dialog-5 new file mode 100644 index 0000000..f2b17cf --- /dev/null +++ b/doc/dialog/gs-dialog-5 @@ -0,0 +1,176 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (49)# +#headodd# +#center#gs-DIALOG#right#% + +#end# +#headeven# +%#center#gs-DIALOG + +#end# +#center#5 + +#center#Informationen für Lehrer/Programmierer + + +5.1 "Verschlüsselung" der Dateien auf der Diskette + + Wenn Sie sich die Inhalte der Dateien angesehen haben, +in denen die Programme für #on("b")#gs-DIALOG#off("b")# enthalten sind, +werden Sie festgestellt haben, daß der Code dicht gepackt +ist. Das war notwendig, um die gesamten Programme auf +einer Diskette unterzubringen. + Allerdings ist der Code #on("u")#nicht#off("u")# verschlüsselt - nur +dichter gepackt. Auf der gelieferten Diskette befindet +sich eine Datei mit Namen "gs-DIALOG decompress". In die­ +ser Datei ist das (einfache) Komprimier- und Dekompri­ +mierprogramm enthalten. Insertieren Sie dieses Programm +in einer Task. Anschließend stehen Ihnen zwei Befehle zur +Verfügung: + +PROC komprimiere (TEXT CONST dateiname): + Die angegebene Datei wird komprimiert; die Datei steht + anschließend unter gleichem Namen zur Verfügung. + +PROC dekomprimiere (TEXT CONST dateiname): + Eine zuvor mit 'komprimiere' bearbeitete Datei wird - + bis auf die Leerzeilen - in den Ursprungszustand über­ + führt. Die Datei steht anschließend wieder unter glei­ + chem Namen zur Verfügung. + + Dieser 'Service' ist vornehmlich für Lehrer gedacht. +So können Programmteile im Unterricht Gegenstand von +Betrachtungen sein; Schüler können nach optimaleren +Algorithmen für Teillösungen suchen - ggf. Anregungen +geben. Sinnvoll ist es, das eigentliche Programm nicht zu +verändern, um die Lauffähigkeit der unter #on("b")#gs-DIALOG#off("b")# +entwickelten Software nicht zu gefährden. + + +5.2 Nutzung der Graphikzeichen auf anderen Rechnern/ +Terminals + + Wie schon unter "2.4 Nutzung der 'Semi - Graphik - +Zeichen'" erwähnt, ist #on("b")#gs-DIALOG#off("b")# darauf vorbereitet, für +'IBM - kompatible Rechner' und für Terminals 'Beehive +FT20' die Umrahmungen der Kästen als durchgezogene Li­ +nien auszugeben - dadurch gewinnt die Bildschirmdar­ +stellung. + #on("b")#gs-DIALOG#off("b")# ist aber hinsichtlich der Graphikzeichen +nur für diese Endgeräte vorbereitet und benutzt in allen +anderen Fällen Zeichen des normalen Zeichensatzes. + Sie können sich aber, sofern Ihr Rechner/Terminal +über solche Semi - Graphikzeichen verfügt, leicht selbst +eine Anpassung dafür erstellen. Auch darauf ist +#on("b")#gs-DIALOG#off("b")# schon vorbereitet. Keine Angst, versuchen Sie +es ruhig einmal. Sie können nichts falsch machen; denn +sollte es Ihnen nicht gelingen, so können Sie jederzeit +mit dem Befehl 'std graphic char' und einem anschließen­ +den die Standardeinstellung wieder vornehmen. + Informieren Sie sich in Ihrer Terminal-/Rechner­ +beschreibung, welche Codes ausgegeben werden müssen, um +die Grahpikzeichen darzustellen. Folgende Zeichen werden +benötigt: + + Ecke oben links : ω (f) + Ecke oben rechts : � (g) + Ecke unten links : � (e) + Ecke unten rechts : � (h) + + Balken oben : � (n) + Balken unten : ̂ (o) + Balken links : ̄ (m) + Balken rechts : ̃ (l) + Kreuz : ̗ (i) + + waagerechte Linie : ̇ (k) + senkrechte Linie : � (j) + + --------------------------------------------- + + ( Cursor sichtbar : ( ESC . 1 ) ) + ( Cursor unsichtbar : ( ESC . 0 ) ) + + + #on("b")#gs-DIALOG#off("b")# müssen nun die speziellen Codes Ihres Rech­ +ners/Terminals mitgeteilt werden. Dafür stehen die fol­ +genden Prozeduren zur Verfügung: + +PROC ecke oben links (TEXT CONST zeichenkette); +PROC ecke oben rechts (TEXT CONST zeichenkette); +PROC ecke unten links (TEXT CONST zeichenkette); +PROC ecke unten rechts (TEXT CONST zeichenkette); +PROC balken oben (TEXT CONST zeichenkette); +PROC balken unten (TEXT CONST zeichenkette); +PROC balken links (TEXT CONST zeichenkette); +PROC balken rechts (TEXT CONST zeichenkette); +PROC waagerecht (TEXT CONST zeichenkette); +PROC senkrecht (TEXT CONST zeichenkette); +PROC kreuz (TEXT CONST zeichenkette); + +PROC cursor on (TEXT CONST zeichenkette); +PROC cursor off (TEXT CONST zeichenkette); + + Sofern möglich, kann auch noch ein Code eingegeben +werden, damit der Cursor auf dem Bildschirm sichtbar bzw. +unsichtbar ist. + Wie man sich selbst eine Anpassung schreiben kann, +wollen wir hier an einem Beispiel aufzeigen. Wir schrei­ +ben dazu eine Anpassung für das Terminal 'Ampex 210+'. + In der Terminalbeschreibung ist angegeben, wie das +Terminal konfiguriert sein muß - diese Konfiguartion +haben wir eingestellt. Weiterhin ist angegeben, daß auf +die Grapikzeichen durch die Zeichenfolge 'ESC $' umge­ +schaltet und durch die Zeichenfolge 'ESC %' auf den nor­ +malen Zeichensatz zurückgeschaltet wird. Für die jeweils +speziellen Graphikzeichen sind bestimmte Buchstaben an­ +zugeben (z.B. für die 'Ecke oben links' der Buchstabe 'f'). +Die Zeichen für dieses Terminal sind oben hinter den Gra­ +phikzeichen in Klammern angegeben. Für 'ESC' muß der Code +'27' ausgegeben werden. + +PACKET eigene graphikanpassung DEFINES + + private graphic char: + +PROC private graphic char: + ecke oben links (""27"$f"27"%"); + ecke oben rechts (""27"$g"27"%"); + ecke unten links (""27"$e"27"%"); + ecke unten rechts (""27"$h"27"%"); + balken oben (""27"$n"27"%"); + balken rechts (""27"$l"27"%"); + balken links (""27"$m"27"%"); + balken unten (""27"$o"27"%"); + waagerecht (""27"$k"27"%"); + senkrecht (""27"$j"27"%"); + kreuz (""27"$i"27"%"); + cursor on (""27".1"); + cursor off (""27".0"); +END PROC private graphic char; + +END PACKET eigene graphikanpassung; + + Nachdem das Programm insertiert und der Befehl +'private graphic char' gegeben ist, steht in dieser Task +und allen Söhnen davon die Graphikanpassung für das +Terminal 'Ampex 210+' zur Verfügung. + + +5.3 Fehlerbehandlung + + Haben Sie z.B. das Menu durch Tippen der -Taste +verlassen, so kann es vorkommen, daß anschließend das +Menu auf dem Bildschirm nicht ordnungsgemäß aufgebaut +wird. Verlassen Sie dann die Menuebene durch die Tasten­ +folge . + +Wenn 'gib kommando:' erscheint, geben Sie den Befehl + + reset dialog + + Dadurch wird das Menusystem in den Anfangszustand +gesetzt. Anschließend können Sie das von Ihnen ge­ +wünschte Programm (wieder) aufrufen. + diff --git a/doc/dialog/gs-dialog-Inhaltsverzeichnis b/doc/dialog/gs-dialog-Inhaltsverzeichnis new file mode 100644 index 0000000..741744f --- /dev/null +++ b/doc/dialog/gs-dialog-Inhaltsverzeichnis @@ -0,0 +1,45 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +Inhaltsverzeichnis + + +1 Was kann gs-DIALOG 3 + +2 Installation von gs-DIALOG 6 +2.1 Voraussetzungen 6 +2.2 Lieferumfang 6 +2.3 Installation 6 +2.4 Nutzung der 'Semi-Graphik-Zeichen' 10 + +3 Umgang mit den Menus; Eine Beispielsitzung 12 +3.1 Aufruf der Archivverwaltung 12 +3.2 Bedienung des Menusystems 14 + - Aufbau der Menus (Bildschirmaufbau) 14 + - Auswahl der Menupunkte 15 + - Informationen zu einem Menupunkt 18 + - Informationen zur Bedienung des Menus 19 + - Aktivierbare und nicht aktivierbare + Menupunkte 20 + - Aktivieren von Menupunkten 21 + - Dateiauswahl 22 + - Ja/Nein - Fragen 26 + - Eingaben 26 + - Alternativen 26 + - Verlassen des Menus 27 +3.3 Zusammenfassung/Kurzbeschreibung 28 + +4 Beschreibung der Menufunktionen 30 +4.1 Menufunktionen zum Oberbegriff 'Dateien' 30 +4.2 Menufunktionen zum Oberbegriff 'Archiv' 36 + +5 Informationen für Lehrer/Programmierer 49 +5.1 "Verschlüsselung" der Dateien auf der + Diskette 49 +5.2 Nutzung der Graphikzeichen auf andere + Rechnern/Terminals 50 +5.3 Fehlerbehandlung 53 + + + + + diff --git a/doc/dynamo/dynamo handbuch b/doc/dynamo/dynamo handbuch new file mode 100644 index 0000000..4012973 --- /dev/null +++ b/doc/dynamo/dynamo handbuch @@ -0,0 +1,1826 @@ +#block##pageblock##page (2)##setcount (1)##count per page# +#head# +#center#DYNAMO-Compiler +#center#____________________________________________________________ + +#end# +#bottom odd# +#center#____________________________________________________________ +GMD #right#DYNAMO - % +#end# +#bottom even# +#center#____________________________________________________________ +DYNAMO - % #right#GMD +#end# + +#ib#1. Einleitung#ie# + + + +Diese Handbuch beschreibt die Funktion des EUMEL-DYNAMO-Compilers in der +Version 3.3+ und seine Einschränkungen oder Änderungen gegenüber dem +DYNAMO-Sprachstandard. In keiner Weise kann diese Beschreibung eine Einfüh­ +rung in die Programmiersprache DYNAMO ersetzen! + +Die beschriebene Compilerversion enthält nun auch ein Modul zur Unterstützung von +hochauflösender Grafik durch die häufig in IBM-PC/AT-Kompatiblen eingesetzte +CGA-Grafikkarte. Dennoch ist es einfach möglich, diesen Grafikmodus auszuschal­ +ten, und somit die alte, zeichenorientierte Grafik weiter zu verwenden. + +Der DYNAMO-Compiler wurde 1983 von Robert Keil und Torsten Fröhlich (Helm­ +holtz-Gymnasium, Bonn) im Rahmen des MIKROS-Projektes am Informatik-Kolleg +der GMD entwickelt. Für Spezifikation und Betreuung der Entwicklung war Dr. Diether +Craemer verantwortlich, software-technische Unterstützung kam von Prof. John +Henize, Dr. Peter Heyderhoff, Rudolf Legde und Dipl.- Math. Lothar Oppor. Die +Grafik wurde von D.Giffeler beigesteuert. + + + + +#ib#1.1. Referenzliteratur#ie# + + + + + [1] Craemer, Diether + "Mathematisches Modellieren dynamischer Vorgänge" + e. Einf. in die Programmiersprache DYNAMO + Stuttgart, Teuber, 1985 + ISBN 3-519-02477-2 + + [2] Craemer, Diether + "Fluß und Zustand - Simulation dynamischer Vorgänge in DYNAMO" + in: LOGIN 5 (1985), Heft 1, S. 20-23 + + [3] Pugh, Alexander L. + "DYNAMO II User's Manual" + Cambridge, London 1973: MIT-Press + ISBN 0-262-66018-0 +#page# + +#ib#1.2. Die Programmiersprache DYNAMO#ie# + + + +DYNAMO wurde von einer Gruppe um Jay FORRESTER am Massachusetts Institute +of Technology (MIT) um 1960 entwickelt. Die Sprache basiert auf der #on ("i")# System +Dynamic#off ("i")# von FORRESTER. + +In DYNAMO (#on ("u")##on ("b")#Dyna#off ("b")##off ("u")#mic #on ("u")##on ("b")#Mo#off ("b")##off ("u")#delling Language) können Systeme, in denen Veränderun­ +gen kontinuierlich geschehen, modelliert und simuliert werden. + +Kontinuierliche Veränderungen von Größen werden über deren Veränderungsrate im +Wesentlichen nach folgender Gleichung berechnet + +Größe jetzt = Größe früher + DT * Veränderungsrate, + +dabei ist DT die Länge des Zeitintervalls von "früher" bis "jetzt". + +Außer diesen Gleichungen für Größen braucht man Gleichungen für die Verände­ +rungsraten, für Hilfsgrößen, zur Initialisierung von Größen, zur Definition von Konstan­ +ten und Tabellen, zu Angaben von Simulationsläufen und zur Wiedergabe von Ergeb­ +nissen in Zahlentabellen oder Diagrammen. + +Alle diese Gleichungen können einfach in der Form, wie man sie aus dem Mathema­ +tik-Unterricht der Sekundarstufe kennt, hingeschrieben werden, ohne sich Gedanken +über den Ablauf des Programms machen zu müssen. + +#on ("b")# +DYNAMO ist also eine einfache funktional-applikative, nicht-prozedurale Sprache.#off ("b")# + +Das macht ihren Reiz und ihre Leistungsfähigkeit aus, die zur Formulierung der be­ +kannten Weltmodelle von FORRESTER, MEADOWS ("Die Grenzen des Wachstums"), +PESTEL, MESAROVIC u.a. in dieser Sprache führten. + +Anwendungsgebiete der Sprache sind ökologische, gesellschaftliche, wirtschaftliche +und technische Systeme, deren dynamisches Verhalten der Modellbildner nachbilden +und studieren möchte. + +Im Allgemeinen verfolgt der Modellbildner mit seinem Modell einen Zweck (Verhaltens­ +änderung des nachgebildeten Systems), so daß auch neben gesicherten Fakten die +Wertvorstellungen des Modellbildners in das Modell eingehen. + + + + +#ib#1.3 Kurz-Einführung in die DYNAMO- +Schreibweise#ie# + + + +Die System Dynamic Methode benutzt als Analogie-Bild den Archetyp des Flusses: + + - Wasser fließt durch das Flußbett, kann in Seen gestaut und in der Ge­ + schwindigkeit durch Schleusen und Wehre reguliert werden. + + - Analog dazu "fließt" Geld auf dem Überweisungsweg, wird in Konten gestaut, + und die Liquidität kann durch Zinssätze reguliert werden. + + - Gedanken "fließen" auf Nervenbahnen, werden im Gehirn gespeichert, und + Gedankenströme werden über Synapsen reguliert. + + - Autos "fließen" über Straßen, werden auf Parkplätzen gestaut, und der Ver­ + kehrsfluß wird über Ampeln reguliert. + + - Menschen "fließen" über Wanderwege, halten sich in Wohnorten auf, und die + Bevölkerungsdynamik wird durch ein komplexes, rückgekoppeltes Zusammen­ + spiel von Ein- und Auswanderungsraten sowie Geburts- und Sterberaten + reguliert. + +Am letzten Beispiel wird deutlich, daß sich ein soziales Phänomen nur im Zusam­ +menwirken vieler netzartig miteinander verbundener Variablen beschreiben läßt (wenn +überhaupt). + +Solange jedoch einigen Variablen ZUSTANDS-CHARAKTER ("Wasserstand") und +anderen VERÄNDERUNGS-CHARAKTER ("Flußgeschwindigkeit") zugeordnet +werden kann, können die Größen für Berechnungen folgender Art verwendet werden: + + + Wasserstand jetzt = Wasserstand früher + vergangene Zeit * + (Zuflußrate - Abflußrate) + + +analog: + + Bevölkerung jetzt = Bevölkerung früher + vergangene Zeit * + (Geburtsrate - Sterberate) + + +Diese Schreibweise kann praktisch so in ein Computerprogramm übernommen wer­ +den. Mit geringfügigen Änderungen handelt es sich bei diesen Gleichungen schon um +gültige Zeilen in der Programmiersprache DYNAMO. + +In DYNAMO wird er Zeitpunkt "jetzt" durch das Anhängsel .K, der Zeitpunkt "früher" +durch das Anhängsel .J, die Zeitspanne von jetzt bis später durch das Anhängsel .KL, +die Zeitspanne von früher bis jetzt durch das Anhänsel .JK und die vergangene Zeit +mit DT (wie "Delta Tempus": Zeitdifferenz) bezeichnet. Die Variablen mit Zustands- +Charakter heißen LEVELS (Niveaus) und die Veränderungs-Charakter heißen RATES +(Veränderungsraten, Geschwindigkeiten). Die entsprechenden Gleichungen werden mit +L bzw. R gekennzeichnet. Es gib weitere Kennzeichnungen: + + C für Konstantendefinition (constant) + T für Tabellendefintion (table) + A für Hilfsgrößen (auxiliaries) + N für Anfangswerte (initial) + X für Folgezeile (extension) + PRINT für Ausgabe von Zahlen + PLOT für Ausgabe von Diagrammen + +Ein einfaches Bevölkerungsmodell könnte z.B. so geschriben werden: + + + L BEVÖLKERUNG.K=BEVÖLKERUNG.J+DT*(GEBURTENRATE.JK + X -STERBERATE.JK) + R STERBERATE.KL=5 + R GEBURTENRATE.KL=20 + N BEVÖLKERUNG=1000 + C DT=1 (jedes Jahr wird neu berechnet) + C LENGTH=60 (60 Jahre werden simuliert) + PRINT BEVÖLKERUNG + + +Für eine tiefere Einführung in DYNAMO sollte man die Referenzliteratur zu Rate +ziehen. + + + + +#ib#1.4 Eine erste, kleine Sitzung mit dem +DYNAMO-System#ie# + + + +Wir gehen davon aus, daß das DYNAMO-System in ihrer Task generiert worden ist +(siehe 2.). + + 1. Tippen Sie das obrige Programm mittels des EUMEL-Editors ab. + + 2. Verlassen Sie den Editor mit und starten Sie den DYNAMO- + Compiler durch die Eingabe des Befehls "dynamo". + + 3. Nach erfolgreichem Übersetzen sollte Ihnen nun das DYNAMO-Runtime- + System zur Verfügung stehen. Durch den Befehl 'run' wird das Programm aus­ + geführt und Sie erhalten eine Zahlenkolonne, die die Entwicklung der Bevöl­ + kerung in den zu untersuchenden 60 Jahren angibt. Falls Ihnen beim Abtippen + des Programms Fehler unterlaufen sein sollten, so kann das Programm nicht + fehlerfrei übersetzt werden. Fehlermeldunggen zur Compile-Zeit des + DYNAMO-Compilers werden im Paralleleditor angezeigt; das Programm kann + im oberen der beiden Editorfenster (in diesem befinden Sie sich auch nach + Fehlern) korrigiert werden. Danach können Sie erneut wie nach Punkt 2 ver­ + fahren. +#page# + + + +#ib#2. Generierung des DYNAMO-Compilers#ie# + + + +Der DYNAMO-Compiler, seine Funktionen und die Beispielprogramme werden auf +zwei Archiv-Disketten a#b#' 360 KB ausgeliefert. + +Zum Generieren des DYNAMO-Systems legen Sie bitte die erste Diskette in das +Dikettenlaufwerk Ihres Rechners und durch folgende Kommandozeile lesen Sie den +Generator vom Archiv und starten ihn: + + + archive ("dynamo"); fetch ("dyn.inserter", archive); run + + +Danach holt der Generator alle benötigten Dateien vom eingelegten Archiv bzw. von +dem zweiten Archiv (nachdem er Sie zum Wechseln der Diskette aufgefordert hat). +Anschließend wird der DYNAMO-Compiler insertiert. Am Ende der Generierung +werden Sie gefragt werden, ob Sie den Compiler mit Grafik#u##count ("Grafik")##e# oder ohne benutzen +wollen. Nach der Meldung "dynamo system generiert" können Sie den Compiler#foot# +#u##value ("Grafik")##e# Es kann z.Zt. nur eine CGA-Grafikkarte betrieben werden +#end# +nutzen. +#page# + + + +#ib#3. Der EUMEL-DYNAMO-Compiler#ie# + + + +Der im EUMEL-System implementierte DYNAMO-Compiler ist ein 2-Pass- +Compiler, der die DYNAMO-Programme zunächst in ELAN übersetzt. Der Vorteil +dieser Methode besteht darin, daß es möglich ist, übersetzte Programme unabhängig +vom DYNAMO-Compiler zur Ausführung bringen zu können. + +Die Notation der im folgenden aufgeführten ELAN-Prozeduren des Compilers ent­ +spricht der in den EUMEL-Handbüchern üblichen Prozedurkopf-Schreibweise. + +Als Beispiel: + + + dynamo ("dyn.grasshasenfuchs") + + +ein Beispiel für den Aufruf der Prozedur mit der Prozedurkopf-Schreibweise + + PROC dynamo (TEXT CONST filename) + +auf der Kommando-Ebene des Betriebssystems EUMEL. + +Der Prozedur 'dynamo' wird beim Aufruf der Dateiname (TEXT) 'filename' übergeben +und dadurch der Compiler auf die Datei mit dem Namen 'filename' angewendet. + + + + +#ib#3.1. Benutzung des DYNAMO-Compiler#ie# + + + +Um ein DYNAMO-Programm zu Übersetzen, gibt es grundsätzlich zwei Möglichkei­ +ten. Erst einmal kann man ein DYNAMO-Programm in ein ELAN-Programm um­ +wandeln, jedoch ohne es dabei zur Ausführung zu bringen. Dieses ELAN-Programm +kann man nun unabhängig vom eingentlichen Compiler starten. Die zweite, wohl öfter +angewendete Methode ist, ein DYNAMO-Programm in ein ELAN-Programm zu +compilieren, wobei es danach direkt ausgeführt wird. Ob danach ein ELAN- +Programm zur Verfügung stehen soll, kann der Benutzer selbst entscheiden. + + +PROC dynamo + + Zweck: Aufruf des DYNAMO-Compilers mit 'quelldatei' = 'last param', d.h. das + zu übersetzende Programm steht in der zuletzt bearbeiteten Datei. + + +PROC dynamo (TEXT CONST quelldatei) + + Zweck: Ruft den DYNAMO-Compiler für die Datei 'quelldatei' auf. Anmerkung: + Gleichbedeutend mit 'dynamo (quelltext, quelltext + ".elan", TRUE)', s. + nächste Prozedur. + + Beispiel: + + + dynamo ("dyn.grashasenfuchs") + + + Der DYNAMO-Compiler wird auf die Datei "dyn.grashasenfuchs" ange­ + wendet. + + +PROC dynamo (TEXT CONST quelldatei, zieldatei, + BOOL CONST pass2 ausfuehren) + + Zweck: Diese Prozedur startet den DYNAMO-Compiler. 'quelldatei' gibt den + Namen der Datei an, in welcher der DYNAMO-Quelltext enthalten ist, + 'zieldatei' ist der Name der Datei, die das erzeugte ELAN-Programm + beinhalten soll. Wenn 'pass2 ausfuehren' = TRUE, dann wird dieses auch + durch den ELAN-Compiler weiterverarbeitet (das Programm wird zur + Ausführung gebracht). + + Beispiel: + + + dynamo ("dyn.grashasenfuchs", + "grashasenfuchs.elanprogramm", FALSE) + + + Im obigen Beispiel wird der in der Datei "dyn.grashasenfuchs" enthaltene + DYNAMO-Quelltext in die Datei "grashasenfuchs.elanprogramm" als + ELAN-Programm geschrieben. Das ELAN-Programm wird nicht ausge­ + führt. + + +PROC erase (BOOL CONST erase option) + + Zweck: Wenn 'erase option' = TRUE, so werden die erzeugten ELAN-Programme + nach Beendigung der Ausführung gelöscht, bei 'erase option' = FALSE + bleiben sie erhalten (Voreinstellung: 'erase option' = FALSE). + + +PROC error listing (TEXT CONST fehlerdatei) + + Zweck: Falls gewünscht ist, die Fehlermeldungen, die ggf. beim Übersetzen ein­ + treten, auch in eine Datei zu schreiben, so können Sie hier unter 'fehler­ + datei' einen Dateinamen angeben. Bei der Angabe von "" wird die Umlei­ + tung in die Datei ausgeschaltet werden (Voreingestellt ist 'fehlerdatei' = + ""). + + +PROC graphic (BOOL CONST graphic option) + + Zweck: Mit dieser Prozedur läßt sich einstellen, ob bei der DYNAMO-Anweisung + PLOT die hochauflösende Grafik ('graphic option' = TRUE) oder die zei­ + chenorientierte Grafik ('grafik option' = FALSE) verwendet werden soll. Die + Voreinstellung wird bei der Installation des Compilers erfragt. + + +PROC protokoll (BOOL CONST protokoll option) + + Zweck: Bei 'protokoll option' = TRUE werden alle Textausgaben, die bei der + Laufzeit des DYNAMO-Programmes auftreten, nicht nur auf dem Bild­ + schirm dargestellt, sondern auch in eine Datei mit dem Namen "dyn.out" + protokolliert (voreingestellt ist 'protokoll option' = FALSE). Die Datei + "dyn.out" enthält auch Seitenvorschubbefehle ('\#page\#') und sollte nur mit + einem EUMEL-Printer ausgedruckt werden. + + + + +#ib#3.2. Abweichungen gegenüber dem + Sprachstandard#ie# + + + + - Die Länge der Namen ist nicht auf 7 Zeichen festgelegt, sondern praktisch be­ + liebig (32000). Dies ist eine Erweiterung; wer seine Programme auch auf ande­ + ren DYNAMO-Compilern laufen lassen will, sollte sich aber auf 7 Zeichen be­ + schränken. + + - Zahlen werden intern mit einer Mantisse von 13 Stellen abgespeichert, von denen + nur die ersten 7 bei der Ausgabe dargestellt werden. Die größte darstellbare Zahl + ist daher 9.999999999999e126. + + - Die maximale Anzahl der Gleichungen ist auf 950 festgelegt. + + - Der Compiler akzeptiert aus Gründen der besseren Lesbarkeit auch Programme, + die in Kleinschrift geschrieben sind. Dabei ist es sinnvoll, die Quellprogramme + konsistent zu halten (d.h. Groß- und Kleinschrift nicht zu vermischen). Man + sollte grundsätzlich Kleinschrift vorziehen, da diese vom Compiler auch effizienter + verarbeitet werden kann. + + - Quellprogramme dürfen eine beliebige Zahl von Leerzeilen enthalten. X - Befeh­ + le (Fortschreibungszeilen) werden davon nicht beeinflußt. + + - In der augenblicklichen Version 3.3 des Compilers gelten folgende Einschränkun­ + gen : + + 1. Bei der Verarbeitung von Array-Gleichungen werden Compilerseitig keine + Semantik-Überprüfungen auf eventuell unzureichende Initialisierung oder + Überlappung (d.h. mehrfaches Setzen desselben Elements) durchgeführt. + Defaultmäßig bekommen alle Elemente einer Array-Gleichung bei der Initiali­ + sierung den Wert '0.0' zugewiesen. + + 2. Die maximale Größe von Tables und Array-Gleichungen ist durch Verwen­ + dung des Vector-Pakets auf 4000 Elemente festgelegt. Da pro Table-Ele­ + ment aber zur Zeit eine Zeile im Zielprogramm generiert wird, sollte man dies + besser nicht ausnutzen. + + 3. Supplementary-Gleichungen werden aus Kompatibilitäts-Gründen korrekt + übersetzt, aber sonst wie Auxiliary-Gleichungen behandelt. + + 4. Print ('prtper')- und Plotperiode ('pltper') werden nur als Konstanten verarbei­ + tet. Falls Gleichungen für 'prtper' oder 'pltper' angegeben werden, so bewirken + diese keine Veränderung. + + 5. Array-Gleichungen dürfen nicht mehr als eine Dimension besitzen. + + 6. Für Gleichungen, die Makro-Aufrufe enthalten, sollten Initialisierungs (N)- + Gleichungen angegeben werden. + + + +#ib#3.3. Das DYNAMO Runtime-System#ie# + + + +Nach erfolgreicher Übersetzung wird vom Zielprogramm das Runtime-System aufge­ +rufen. In diesem Modus (das DYNAMO-Runtime-System meldet sich mit "dynamo +runtime system :") ist es möglich, Konstanten zu ändern und DynamoProgramme zur +Ausführung zu bringen. + +Im DYNAMO-Runtime-System stehen folgende Kommandos zur Verfügung (näheres +zur Notation siehe Kapitel 4, S. #to page ("Anweisungen und Funktionen")#). + + + run + + Zweck: Ausführen des übersetzten Programms + + + run + + Zweck: Ausführen des übersetzten Programms und retten des Konstantendaten­ + raums in des Datenraum mit dem Namen ".const". Existiert der + Datenraum bereits, werden die Konstanten aus dem Datenraum in den + Lauf übernommen. Somit ermöglicht der Compiler, Konstantenwerte aus + einem früheren Lauf wieder zu verwenden. + + + c =Wert [/=Wert [...]] + + Zweck: Änderung einer oder mehrerer Konstanten + + + ? + + Zweck: Anzeigen der Konstanten und ihrer Werte + + + quit + + Zweck: Verlassen des Runtime-Systems + + + help + + Zweck: Zeigt eine kurze Erklärung + + +Bei PRINT- und PLOT-Ausgaben sind folgende Kommandos möglich: + + + Nächster Bildschirm + o (Off), keine Unterbrechung der Ausgabe (nicht möglich bei hochauflösen­ + der Grafik) + e (End), Zurück zum Runtime System + p Phasendiagramm (nur bei hochauflösender Grafik möglich) + + + +#ib#3.4. Fehlermeldungen des + DYNAMO-Compilers#ie# + + + +Falls der Compiler einen Fehler im DYNAMO-Programm entdeckt, gibt er eine Feh­ +lermeldung nach dem folgenden Muster aus: +"Fehler in Zeile bei >> << : . + +Im folgenden sind alle Fehlermeldungen und Möglichkeiten zur Abhilfe aufgelistet, +sofern diese nicht klar ersichtlich sind: + + 1 GLEICHUNG DOPPELT DEFINIERT + + 2 DOPPELTE INITIALISIERUNG + + 3 FALSCHER ZEILENTYP + -> Erlaubt sind : a, c, l, n, r, s, print, plot, note, spec, *, x, macro, mend, + for, noise, run. + + 4 VERSCHACHTELTE MAKRO-DEFINITION + -> 'mend' - Befehl fehlt. + + 5 MAKRO-NAME ERWARTET + + 6 '(' ERWARTET + + 7 FORMALER PARAMETER ERWARTET + + 8 ')' NACH PARAMETERLISTE ERWARTET + + 9 BEI AUXILIARIES NUR SUBSKRIPTION MIT '.K' ERLAUBT + +10 BEI KONSTANTEN-DEFINITION NAME ERWARTET + +11 BEI LEVELS NUR SUBSKRIPTION MIT '.K' ERLAUBT + +12 BEI RATES NUR SUBSKRIPTTION MIT '.KL' ERLAUBT + +13 BEI TABLE-DEFINITIONEN KEINE SUBSKRIPTION ERLAUBT + +14 X - BEFEHL HIER NICHT ERLAUBT + +15 BEI FOR-DEFINITION NAME ERWARTET + +16 '=' NACH FOR-VARIABLE ERWARTET + +17 BEREICHSANGABE ERWARTET + +18 ',' ERWARTET + +19 LOKALE GLEICHUNG NUR IN MAKRO ERLAUBT + +20 BEI DEFINITION NAME ERWARTET + +21 '=' ERWARTET + +22 INDEX NICHT KORREKT + -> Als Index ist nur erlaubt : !, + !. + ::= "+"; "-". + +23 ')' NACH INDIZIERUNG ERWARTET + +24 PRTPER NICHT DEFINIERT + -> Wenn das Programm einen Print-Befehl enthält, muß 'prtper' (Printperiode) + als Konstante definiert werden. + +25 PLTPER NICHT DEFINIERT + -> Wenn das Programm einen Plot-Befehl enthält, muß 'pltper' (Plotperiode) + als Konstante definiert werden. + +26 '/' ODER ',' BEI PLOT ERWARTET + +27 NAME ALS PLOTPARAMETER ERWARTET + +28 DOPPELTE SCALE - ANGABE IN EINER GRUPPE + -> Wenn mehrere Plotparameter mit ',' getrennt werden (also die gleiche Ska­ + lierung erhalten), dürfen nicht mehrere feste Skalierungen angegeben wer­ + den. + +29 ERSTE SCALE - ANGABE ERWARTET + +30 ZWEITE SCALE - ANGABE ERWARTET + +31 ')' NACH SCALE - ANGABE FEHLT + +32 PRINTPARAMETER NICHT DEFINIERT + +33 PRINTPARAMETER ERWARTET + +34 TIME DARF NUR INITIALISIERT WERDEN + +35 DT NICHT DEFINIERT + +36 LENGTH NICHT DEFINIERT + +37 BEI KONSTANTEN - DEFINITION ZAHL ERWARTET + +38 BEI INITIALISIERUNG KONSTANTE ERWARTET + +39 LEVELS MUESSEN INITIALISIERT WERDEN + +40 KONSTANTE BEI TABLE ERWARTET + +41 '/' ODER "," ERWARTET + +42 TABLE - DEFINITION OHNE BENUTZUNG + +43 SIMULTANE GLEICHUNGEN + -> Bei dem Versuch, A, R, oder N - Gleichungen zu sortieren, trat eine + direkte oder indirekte Rekursion auf. + +44 FAKTOR ERWARTET + -> Erwartet : ; + ; + ; + ; + '(', , ')'; + , . + ::= '+'; '-'. + +45 TIME MUSS MIT '.J' ODER '.K' SUBSKRIBIERT WERDEN + +46 SYMBOL NICHT DEFINIERT + +47 FUNKTION NICHT DEFINIERT + +48 UNZULAESSIGE INDIZIERUNG + -> Die Indices auf beiden Seiten der Gleichung müssen immer gleich sein. + +49 FALSCHE PARAMETERANZAHL + +50 FALSCHES TRENNSYMBOL ZWISCHEN PARAMETERN + +51 ALS PARAMETER TABLE ERWARTET + +52 FALSCHER PARAMETER IN TABLEFUNKTION + +53 ZU VIELE AKTUELLE PARAMETER + +54 ')' NACH MAKROAUFRUF FEHLT + +55 REKURSIVER MAKROAUFRUF + +56 BEI N - GLEICHUNG KEINE SUBSKRIPTION ERLAUBT + +57 FALSCHE SUBSKRIPTION IN AUXILIARY - GLEICHUNG + +58 ')' ERWARTET + +59 FALSCHE SUBSKRIPTION IN LEVEL - GLEICHUNG + +60 FALSCHE SUBSKRIPTION IN RATE - GLEICHUNG + +61 FOR - VARIABLE NICHT DEFINIERT + -> Eine FOR - Variable muß vor der ersten Benutzung definiert werden. + +62 KONSTANTE ERWARTET + +63 FALSCHES REAL - FORMAT + -> Exponent fehlt + +64 GLOBALE GLEICHUNG IN MACRO NICHT ERLAUBT + +65 DOPPELTE DEFINITION BEI MEHRFACHEM MAKROAFRUF + +66 ALS NOISE - PARAMETER ZAHL ERWARTET +#page# + +#ib#4. Anweisungen und Funktionen des + EUMEL-DYNAMO-Compilers#ie# +#goal page ("Anweisungen und Funktionen")# + + +Dieses Kapitel gibt eine alphabetische Übersicht über die im EUMEL-DYNAMO- +Compiler realisierten Anweisungen und Funktionen (wertliefernde Algorithmen). + +Die Beschreibung der Anweisungen und Funktionen ist nach der DYNAMO- +Syntaxregel angegeben, wobei folgende Zeichen mit besonderer Bedeutung verwendet +werden: + + [] optionale Angabe + [...] beliebig häufige Wiederholung der letzten optionalen Angabe + < > in spitzen Klammern stehende Namen sind Variablen- bzw. Konstan­ + tennamen + steht für einen beliebigen Bezeichner gemäß der DYNAMO-Syntax + bezeichnet einen beliebigen Wert (also auch eine Ausdruck) + {} Alternative Angabe + + X DYNAMO Anweisung, kennzeichnet eine Fortsetzungsszeile der + vorhergegangenen Anweiung (S. #to page ("X")#) + +Alle Anweisungen und Funktionen werden nach dem gleichen Schema dargestellt: + + + +Funktionsname#right#Typ (Funkt. oder Anweisung) + + +Zweck: Schlagwort zur Wirkung + +Format: Beschreibung des Formates (spezielle Zeichen s.o.) + +Erklärung: kurze Beschreibung der Anweisung/Funktion + +Beispiel: Anwendung der Anweisung/Funktion + +Programm: Beispielprogramm, in welchem die Anweisung/Funktion angewendet wird. + +Referenz: Verweis auf ähnliche oder äquivalente Anweisungen/Funktionen im + Format ', Seitennummer'. + + +Eine oder mehrere dieser Felder können fehlen (z.B. wenn es keine Referenz oder +kein Beispielprogramm gibt). +#page# + + + +#ib#4.1. Übersicht über die Anweisungen und + Funktionen#ie# + + + +#goal page ("A")##ib (2)#A#ie (2)##on ("i")##right#Anweisung#off ("i")# + + +Zweck: Auxiliary-Gleichung (A-Gleichung, Hilfsgleichung) + +Format: A .K=#u##count ("Ausdruck")##e# +#foot# +#u##value ("Ausdruck")##e# genaueres über die Definition eines Ausdruckes siehe [1], S. 93 +#end# + +Erklärung: Mit Hilfe von Auxiliary-Gleichungen werden Level- und Hilfsgrößen + (Auxiliaries) zum selben Zeitpunkt verknüpft. + +Beispiel: A JM.K=MM.K/MEJ + +Programm: "dyn.workfluc" + + + +#ib (2)#ABS#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Absolutbetrag + +Format: ABS() + +Erklärung: Liefert den Absolutbetrag + + + IF >= 0 THEN + + ELSE + - + END IF + +Beispiel: N X=ABS(A*2.0) + + + +#goal page ("ARCTAN")#ARCTAN#on ("i")##right#Funktion#off ("i")# + + +Zweck: Berechnung der trigonometrischen Funktion Arcustangens + +Format: ARCTAN() + +Erklärung: Berechnet den Arcustangens von ; Ergebnis im Bogenmaß. + +Beispiel: N X=ARCTAN(TAN(1.3)) (X = 1.3) + + +Referenz: COSD, S. #to page ("COSD")# + SIN, S. #to page ("SIN")# + SIND, S. #to page ("SIND")# + TAN, S. #to page ("TAN")# + TAND, S. #to page ("TAND")# + ARCTAND, S. #to page ("ARCTAN")# + COS, S. #to page ("COS")# + + + +#goal page ("ARCTAND")##ib (2)#ARCTAND#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Berechnung der trigonometrischen Funktion Arcustangens + +Format: ARCTAND() + +Erklärung: Berechnet den Arcustangens von ; Ergebnis im Gradmaß + +Beispiel: N X=ARCTAND(TAND(45.0)) (X = 45.0) + + +Referenz: COSD, S. #to page ("COSD")# + SIN, S. #to page ("SIN")# + SIND, S. #to page ("SIND")# + TAN, S. #to page ("TAN")# + TAND, S. #to page ("TAND")# + COS, S. #to page ("COS")# + ARCTAN, S. #to page ("ARCTAND")# + + + +#goalpage ("C")##ib (2)#C#ie (2)##on ("i")##right#Anweisung#off ("i")# + + +Zweck: Konstantendefinition + +Format: C = + +Erklärung: Werte, die während eines Simulationslaufes gleich bleiben, können durch + die Konstantendefintion benannt werden (s. auch 'c' im Runtime- + System). + +Beispiel: C POPI=30.3 + +Programm: "dyn.wohnen" + + + +#goal page ("CLIP")##ib (2)#CLIP#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Wert nach Bedingung + +Format: CLIP(,,,) + +Erklärung: Liefert den Wert des ersten Argumentes, wenn das dritte Argument + größer oder gleich dem vierten Argument ist. Andernfalls wird der Wert + des zweiten Argumentes geliefert. + + + IF >= THEN + + ELSE + + END IF + +Beispiel: N X=CLIP(1.0,2.0,3.0,4.0) (X = 2.0) + + +Programm: "dyn.welt/forrester" + +Referenz: FIFGE, S. #to page ("FIFGE")# (äquivalente Funktion) + + + +#goalpage ("COS")#COS#on ("i")##right#Funktion#off ("i")# + + +Zweck: Berechnung der trigonometrischen Funktion Cosinus + +Format: COS() + +Erklärung: Es wird der Cosinus des Wertes , welcher im Bogenmaß vorlie­ + gen muß, geliefert. + +Beispiel: N X=COS(1.6) + +Referenz: COSD, S. #to page ("COSD")# + SIN, S. #to page ("SIN")# + SIND, S. #to page ("SIND")# + TAN, S. #to page ("TAN")# + TAND, S. #to page ("TAND")# + ARCTAN, S. #to page ("ARCTAN")# + ARCTAND, S. #to page ("ARCTAND")# + + + +#goal page ("COSD")##ib (2)#COSD#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Berechnung der trigonometrischen Funktion Cosinus + +Format: COSD() + +Erklärung: Es wird der Cosinus des Wertes , welcher im Gradmaß vorliegen + muß, geliefert. + +Beispiel: N X=COSD(33.5) + +Referenz: COS, S. #to page ("COS")# + SIN, S. #to page ("SIN")# + SIND, S. #to page ("SIND")# + TAN, S. #to page ("TAN")# + TAND, S. #to page ("TAND")# + ARCTAN, S. #to page ("ARCTAN")# + ARCTAND, S. #to page ("ARCTAND")# + + + +#goal page ("EXP")##ib (2)#EXP#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Exponentialfunktion zur Basis e + +Format: EXP() + +Erklärung: Liefert e#u##e# + +Beispiel: N X=EXP(1.0) (X = 2.71 = e) + + +Referenz: LN, S. #to page ("LN")# (Umkehrfunktion) + + + +#goal page ("FIFGE")##ib (2)#FIFGE#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Wert nach Bedingung (#on ("u")#f#off ("u")#irst #on ("u")#if#off ("u")# #on ("u")#g#off ("u")#reater or #on ("u")#e#off ("u")#qual) + +Format: FIFGE(,,,) + +Erklärung: Liefert den Wert des ersten Argumentes, wenn das dritte Argument + größer oder gleich dem vierten Argument ist. Andernfalls wird der Wert + des zweiten Argumentes geliefert. + + + IF >= THEN + + ELSE + + END IF + +Beispiel: N X=FIFGE(1.0,2.0,3.0,4.0) (X = 2.0) + + +Referenz: CLIP, S. #to page ("CLIP")# (äquivalente Funktion) + + + +#goal page ("FIFZE")##ib (2)#FIFZE#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Wert nach Bedingung (#on ("u")#f#off ("u")#irst #on ("u")#if#off ("u")# #on ("u")#ze#off ("u")#ro) + +Format: FIFZE(,,) + +Erklärung: Wenn der Parameter den Wert 0 hat, so wird + geliefert, andernfalls + + + IF = 0 THEN + + ELSE + + END IF + +Beispiel: N X=FIFZE(1.0,2.0,3.0) (X = 2.0) + + +Referenz: SWITCH, S. #to page ("SWITCH")# + + + +#goal page ("FLOOR")##ib (2)#FLOOR#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Vorkommastellen + +Format: FLOOR() + +Erklärung: Liefert die Vorkommastellen von + +Beipiel: N X=FLOOR(3.14) (X = 3.0) + + +Referenz: FRAC, S. #to page ("FRAC")# + + + +#ib (2)#FOR#ie (2)##on ("i")##right#Anweisung#off ("i")# + + +Zweck: Schleifen-Definition + +Format: FOR =, + +Erklärung: bezeichnet eine Schleifenvariable, die von bis + hochgezählt wird. Somit ist es möglich, gleiche Berechnungen + für die verschiedenen Werte einer Tabelle durchzuführen. + +Beispiel: FOR BERECHNUNGSZEITRAUM=1900,2100 + + +Programm: "dyn.bev" + + + +#goal page ("FRAC")##ib (2)#FRAC#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Nachkommastellen + +Format: FRAC() + +Erklärung: Liefert die Nachkommastellen von + +Beispiel: N X=FRAC(3.14) (X = 0.14) + + +Referenz: FLOOR, S. #to page ("FLOOR")# + + + +#goal page ("L")##ib (2)#L#ie (2)##on ("i")##right#Anweisung#off ("i")# + + +Zweck: Level-Gleichung + +Format: L .K=.J+ + + +Erklärung: Die Level-Gleichung stellt einen gegenwärtigen Wert in Bezug zu + seinem Wert in der Vergangenheit und seiner Veränderungsrate in der + bis dahin vergangenen Zeit (Vergangenheitsausdruck s. [1], S. 96). + +Beispiel: L HASEN.K=CLIP(HASEN.J+DT*(HGRATE.JK + X -HSRATE.JK),0,HASEN.J,0) + +Programm: "dyn.grashasenfuchs" + + + +#goal page ("LN")##ib (2)#LN#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Logarithmus-Funktion + +Format: LN() + +Erklärung: Berechnet den natürlichen Logarithmus von + +Beispiel: N X=LN(1.0) (X = 0.0) + + +Programm: "dyn.wasseröko" + +Referenz: LOG2, S. #to page ("LOG2")# + LOG10, S. #to page ("LOG10")# + EXP, S. #to page ("EXP")# + + + +#goal page ("LOG2")##ib (2)#LOG2#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Logarithmus-Funktion + +Format: LOG2() + +Erklärung: Berechnet den Logarithmus von zur Basis 2 + +Beispiel: N X=LOG2(8.0) (X = 3.0) + + +Referenz: LN, S. #to page ("LN")# + LOG10, S. #to page ("LOG10")# + + + +#goal page ("LOG10")##ib (2)#LOG10#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Logarithmus-Funktion + +Format: LOG10() + +Erklärung: Berechnet den Logarithmus von zur Basis 10 + +Beispiel: N X=LOG10(100.0) (X = 2.0) + + +Referenz: LOG2, S. #to page ("LOG2")# + LN, S. #to page ("LN")# + EXP, S. #to page ("EXP")# + + + +#goal page ("MACRO")##ib (2)#MACRO#ie (2)##on ("i")##right#Anweisung#off ("i")# + + +Zweck: Macro-Definition + +Format: MACRO ([,[...]]) + +Erklärung: Durch die Verwendung der MACRO-Anweisung können Sie einer oder + mehreren DYNAMO-Gleichungen einen Namen geben (). + Macros müssen durch MEND abgeschloßen werden und dürfen #on ("u")#nicht#off ("u")# + rekursiv aufgerufen werden (vergl. Refinements in ELAN). + +Beispiel: MACRO SMOOTH(IN,DEL) + L SMOOTH.K=SMOOTH.J+DT*(IN.J-SMOOTH.J)/DEL + N SMOOTH=IN + MEND + +Programm: "dyn.mac" (diese Datei enthält alle bisherigen Makros) + +Referenz: MEND, S. #to page ("MEND")# + + + +#goal page ("MAX")##ib (2)#MAX#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Maximum zweier Größen + +Format: MAX(,) + +Erklärung: Liefert die größere Zahl aus und + + + IF > THEN + + ELSE + + END IF + +Beispiel: N X=MAX(1.0,2.0) (X = 2.0) + + +Referenz: MIN, S. #to page ("MIN")# + + + +#goal page ("MEND")##ib (2)#MEND#ie (2)##on ("i")##right#Anweisung#off ("i")# + + +Zweck: Macro-Definition + +Format: MEND + +Erklärung: MEND beendet eine Macro-Definition + +Beispiel: MACRO SMOOTH(IN,DEL) + L SMOOTH.K=SMOOTH.J+DT*(IN.J-SMOOTH.J) + X /DEL + N SMOOTH=IN + MEND + +Programm: "dyn.mac" (diese Datei enthält alle bisherigen Makros) + +Referenz: MACRO, S. #to page ("MACRO")# + + + +#goal page ("MIN")##ib (2)#MIN#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Minimum zweier Größen + +Format: MIN(,) + +Erklärung: Liefert die kleinere Zahl aus und + +Beispiel: N X=MIN(1.0,2.0) (X = 1.0) + + +Programm: "dyn.forst7" + +Referenz: MAX, S. #to page ("MAX")# + + + +#goal page ("N")##ib (2)#N#ie (2)##on ("i")##right#Anweisung#off ("i")# + + +Zweck: Initialisierungsgleichung + +Format: N = + +Erklärung: Initialisert eine Variable mit dem Bezeichner auf den Wert + , d.h. es wird ihr ein Startwert zugewiesen. + +Beispiel: N X=1900 + +Programm: "dyn.grashasenfuchs" + + + +#goal page ("NOISE")##ib (2)#NOISE#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Pseudo-Zufallszahlen-Generator + +Format: NOISE() + +Erklärung: Diese Funktion liefert eine Pseudo-Zufallszahl zwischen -0.5 und +0.5 + und setzt einen neuen Startwert für den Generator fest. Der Parameter + wird nicht ausgewertet. + +Beispiel: N X=NOISE(0) + +Referenz: NORMRN, S. #to page ("NORMRN")# + + + +#goal page ("NORMRN")##ib (2)#NORMRN#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Pseudo-Zufallszahlen-Generator + +Format: NORM(,) + +Erklärung: Liefert einen Wert zwischen - * 2.4 und + + * 2.4. + +Beispiel: N X=NORM(1.0,10.0) + +Referenz: NOISE, S. #to page ("NOISE")# + + + +#ib (2)#NOTE#ie (2)##on ("i")##right#Anweisung#off ("i")# + + +Zweck: Kommentar + +Format: NOTE + +Erklärung: Die Zeilen, die mit NOTE gekennzeichnet sind, werden vom Compiler als + Kommentarzeilen erkannt und nicht beachtet. NOTE-Zeilen haben nur + dokumentierenden Charakter und sind für den Programmlauf ohne jede + Bedeutung. Dennoch sollte man, wenn immer möglich, Kommentare in + sein DYNAMO-Programm einfügen, denn sie sind in DYNAMO an­ + nähernd die einzige Möglichkeit, ein Programm lesbar zu machen, damit + es auch nach längerer Zeit noch korrigiert werden kann. + +Beispiel: NOTE Dies ist eine Kommentarzeile + +Programm: "dyn.welt/forrester" + + + +#goal page ("PLOT")##ib (2)#PLOT#ie (2)##on ("i")##right#Anweisung#off ("i")# + + +Zweck: Darstellen der Ergebnisse in Diagrammform + +Format: PLOT [=][(, + )][/...][,...] + +Erklärung: Durch diese Anweisung werden die Größen nach PLTPER Zeiteinheiten + in einem Diagramm ausgegeben. Die Angabe eines Druckzeichens ist + nur bei zeichenorientierten Grafik erforderlich, denn bei hochauflösender + Grafik werden die Graphen der verschiedenen Größen durch unterschied­ + liche Linientypen gezeichnet; fehlt bei der zeichenorientierten Grafik das + Druckzeichen, so werden die Graphen durch die Zahlen von 0...9 darge­ + stellt. Bei "/" werden verschiedene, bei "," gleiche Skalen benutzt. + +Beispiel: PLOT GRAS=G(995,1005)/HASEN=H(85,115) + X /FUECHS=F(15,35) + +Programm: "dyn.grashasenfuchs" + +Referenz: PRINT, S. #to page ("PRINT")# + + + +#goal page ("POWER")##ib (2)#POWER#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Potenzfunktion + +Format: POWER(,) + +Erklärung: Liefert #u##e# + +Beipiel: N X=POWER(2, 2) (X = 4) + + +Referenz: SQRT, S. #to page ("SQRT")# + + + +#goal page ("PRINT")##ib (2)#PRINT#ie (2)##on ("i")##right#Anweisung#off ("i")# + + +Zweck: Darstellung der Ergebnisse in Tabellenform + +Format: PRINT [/...][,...] + +Erklärung: Durch diese Anweisung werden die Werte () nach PRTPER + Zeiteinheiten in einer Tabelle ausgegeben. Die Ausgabe kann umgeleitet + werden (s. 'protokoll'). + +Beispiel: PRINT GBEV,BEV(1),BEV(40),BEV(60),BEV(63) + X ,BEV(65),ZBEV,PRENT + +Programm: "dyn.bev" + +Referenz: PLOT, S. #to page ("PLOT")# + + + +#goal page ("R")##ib (2)#R#ie (2)##on ("i")##right#Anweisung#off ("i")# + + +Zweck: Rate-Gleichung + +Format: R.KL= + +Erklärung: Eine Rate-Gleichung stellt die Veränderungsrate in Bezug zu den aktu­ + ellen Level-Größen. + +Beispiel: R FGRATE.KL=FGK*HASEN*FUECHS.K + + +Programm: "dyn.grashasenfuchs" + +Referenz: A, S. #to page ("A")# + C, S. #to page ("C")# + L, S. #to page ("L")# + + + +#ib (2)#RAMP#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Wert nach Bedingung + +Format: RAMP(,) + +Erklärung: Wenn TIME kleiner , dann liefert RAMP 0, andernfalls wird + * (TIME - ) geliefert. + + + IF TIME < THEN + 0 + ELSE + * (TIME - ) + END IF + + + +#goal page ("RUN")##ib (2)#RUN#ie (2)##on ("i")##right#Anweisung#off ("i")# + + +Zweck: Überschrift + +Format: RUN <Überschrift> + +Erklärung: Gibt dem aktuellen Lauf eine Überschrift. Gleichzeitig ist + "<Überschrift>.const" der Name eines Datenraums, in dem die Kon­ + stanten dieses Laufs aufgehoben werden (s. 'run' im Runtime-System). + +Beispiel: RUN Überschrift + +Referenz: *, S. #to page ("*")# + + + +#ib (2)#S#ie (2)##on ("i")##right#Anweisung#off ("i")# + + +Zweck: Supplementary-Gleichung + +Format: S .K= + +Erklärung: Gleichungen für Hilfsgrößen werden durch Supplementary-Gleichungen + ausgedrückt. + +Beispiel: S SCHADSTOFFVERHÄLTNIS.K=COZWEI.K/OZWEI.K + + + + +#ib (2)#SCLPRD#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Skalarprodukt + +Format: SCLPRD(,,,,) + +Erklärung: Liefert das Skalarprokukt der Tabellen und , + wobei und den Ausschnitt aus der ersten Tabelle + angeben und den Startindex für den Vektor in der zweiten + Tabelle angibt. + +Beispiel: GB.K=SCLPRD(BEV.K,15,44,GR,1)/2 + + +Programm: "dyn.bev" + + + +#goal page ("SIN")##ib (2)#SIN#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Berechnung der trigonometrischen Funktion Sinus + +Format: SIN() + +Erklärung: Berechnet den Sinus von , welche im Bogenmaß angegeben + wird. + +Beispiel: N X=SIN(0.5) + +Referenz: COS, S. #to page ("COS")# + COSD, S. #to page ("COSD")# + SIND, S. #to page ("SIND")# + TAN, S. #to page ("TAN")# + TAND, S. #to page ("TAND")# + ARCTAN, S. #to page ("ARCTAN")# + ARCTAND, S. #to page ("ARCTAND")# + + + +#goal page ("SIND")##ib (2)#SIND#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Berechnung der trigonometrischen Funktion Sinus + +Format: SIND() + +Erklärung: Berechnet den Sinus von , welche im Gradmaß angegeben wird. + +Beispiel: N X=SIND(45.0) + +Referenz: COS, S. #to page ("COS")# + SIN, S. #to page ("SIN")# + COSD, S. #to page ("COSD")# + TAN, S. #to page ("TAN")# + TAND, S. #to page ("TAND")# + ARCTAN, S. #to page ("ARCTAN")# + ARCTAND, S. #to page ("ARCTAND")# + + + +#ib (2)#SPEC#ie (2)##on ("i")##right#Anweisung#off ("i")# + + +Zweck: Lauf-Anweisung + + DT= +Format: SPEC { LENGTH= }[/...] + PLTPER= + PRTPER= + +Erklärung: Durch die Lauf-Anweisung werden die Systemkonstanten festgesetzt. + Sie darf pro Lauf nur einmal benutzt werden. + +Beispiel: SPEC DT=1/PLTPER=1/PRTPER=1/LENGTH=2000 + + +Referenz: C, S. #to page ("C")# (SPEC kann durch C-Def. ersetzt werden) + + + +#goal page ("SQRT")##ib (2)#SQRT#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Quadratwurzel + +Format: SQRT() + +Erklärung: Berechnet die Quadratwurzel aus + +Beispiel: N X=SQRT(4.0) (X = 2.0) + + +Referenz: POWER, S. #to page ("POWER")# + + + +#ib (2)#STEP#ie (2)##on ("i")##right#Funktion#off ("i")# + +Zweck: Wert nach Bedingung + +Format: STEP(,) + +Erklärung: Ist TIME kleiner , so wird 0 geliefert, ansonsten + + + IF TIME < THEN + 0.0 + ELSE + + END IF + +Beispiel: N X=STEP(12.0,12.0) + + + +#goal page ("SUM")##ib (2)#SUM#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Summierung einer Tabelle + +Format: SUM() + +Erklärung: Liefert die Summe der Einträge in einer Tabelle + +Beispiel: A GESAMTBEV.K=SUM(BEV.K) + +Programm: "dyn.bev" + +Referenz: SUMV, S. #to page ("SUMV")# + + + +#goal page ("SUMV")##ib (2)#SUMV#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Summierung einer Tabelle + +Format: SUMV(,,) + +Erklärung: Summierung der Einträge in der Tabelle von Element bis + Element + +Beispiel: A ZBEV.K=SUMV(BEV.K,16,59) Teilbevölkerung + + +Programm: "dyn.bev" + +Referenz: SUM, S. #to page ("SUM")# + + + +#goal page ("SWITCH")##ib (2)#SWITCH#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Wert nach Bedingung + +Format: SWITCH(,,) + +Erklärung: Wenn der Parameter den Wert 0 hat, so wird + geliefert, andernfalls (gleichbedeutend mit FIFZE). + + + IF = 0 THEN + + ELSE + + END IF + +Beispiel: N X=SWITCH(1.0,2.0,3.0) (X = 2.0) + + +Referenz: FIFZE, S. #to page ("FIFZE")# + + + +#goal page ("T")##ib (2)#T#ie (2)##on ("i")##right#Anweisung#off ("i")# + + +Zweck: Tabellen-Definition + +Format: T =[/[....]] + +Erklärung: Durch die T-Anweisung wird eine Tabelle definiert, die Elemente wer­ + den durch "/" getrennt hintereinander angegeben. + +Beispiel: T TABELLE=1/2/3/4/5/6/8/9/10/11/12 + + +Programm: "dyn.bev" + +Referenz: TABLE, S. #to page ("TABLE")# + TABHL, S. #to page ("TABHL")# + + + +#goal page ("TABHL")##ib (2)#TABHL#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Tabellenfunktion + +Format: TABHL(,,,) + +Erklärung: IF < THEN + () + ELIF <= AND <= THEN + TABLE (, , , ) + ELSE + () + END IF + +Beispiel: A BRMM.K=TABHL(BRMMT,MSL.K,0,5,1) + + +Programm: "dyn.welt/forrester" + +Referenz: T, S. #to page ("T")# + TABLE, S. #to page ("TABLE")# + + + +#goal page ("TABLE")##ib (2)#TABLE#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Tabellenfunktion + +Format: TABLE(,,,,) + +Erklärung: Verknüpft die Werte aus mit , wobei den + ersten und den letzten Tabelleneintrag angibt. stellt + die Schrittweite dar. + +Beispiel: T TABELLE=1/2/3/4/5 + A BEISP.K=TABLE(TABELLE,X.K,2,4,1) + +Programm: "dyn.welt/forrester" + +Referenz: T, S. #to page ("T")# + TABHL, S. #to page ("TABHL")# + + + +#goal page ("TAN")##ib (2)#TAN#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Berechnung der trigonometrischen Funktion Tangens + +Format: TAN() + +Erklärung: Berechnet den Tangens von , welche im Bogenmaß angegeben + wird. + +Beispiel: N X=TAN(0.5) + +Referenz: COS, S. #to page ("COS")# + SIN, S. #to page ("SIN")# + COSD, S. #to page ("COSD")# + SIND, S. #to page ("TAN")# + TAND, S. #to page ("TAND")# + ARCTAN, S. #to page ("ARCTAN")# + ARCTAND, S. #to page ("ARCTAND")# + + + +#goal page ("TAND")##ib (2)#TAND#ie (2)##on ("i")##right#Funktion#off ("i")# + + +Zweck: Berechnung der trigonometrischen Funktion Tangens + +Format: TAND() + +Erklärung: Berechnet den Tangens von , welche im Gradmaß angegeben + wird. + +Beispiel: N X=TAND(45.0) + +Referenz: COS, S. #to page ("COS")# + SIN, S. #to page ("SIN")# + COSD, S. #to page ("COSD")# + TAN, S. #to page ("TAN")# + SIND, S. #to page ("SIND")# + ARCTAN, S. #to page ("ARCTAN")# + ARCTAND, S. #to page ("ARCTAND")# + + + +#goalpage ("X")##ib (2)#X#ie (2)##on ("i")##right#Anweisung#off ("i")# + + +Zweck: Fortsetzungszeile + +Format: X + +Erklärung: Eine in der vorangegangenen Zeile nicht beendete Anweisung wird nach + einer X-Anweisung fortgesetzt (Es können beliebig viele X-Anweisun­ + gen nacheinander folgen). + +Beispiel: T TABELLE=1/2/3/4/5/6/7/8/9/10/11/12/13/14 + X /15/16/17/18/19 + +Programm: "dyn.bev" + + + +#goal page ("*")##ib (2)#*#ie (2)##on ("i")##right#Anweisung#off ("i")# + + +Zweck: Überschrift + +Format: * <Überschrift> + +Erklärung: Gibt dem aktuellen Lauf eine Überschrift + +Beispiel: * Überschrift + +Referenz: RUN, S. #to page ("RUN")# +#page# + +#ib#5. Makros in DYNAMO#ie# + + + + +Der DYNAMO-Compiler bietet die Möglichkeit, benutzereigene Funktionen zu definie­ +ren. Makros werden ähnlich wie Refinements in ELAN in das DYNAMO-Programm +eingesetzt. Beim EUMEL-DYNAMO-Compiler werden mit "zz" beginnende Namen +generiert, so daß Sie es vermeiden sollten, eigene Namen mit "zz" beginnen zu +lassen. Weiterhin sollte man als Namen der aktuellen Parameter nicht die Namen der +formellen Parameter verwenden. + +Folgende Makros werden standardmäßig vom DYNAMO-Compiler zur Verfügung +gestellt: + + macro delay1 (in, del) Verzögerung erster Ordnung + + macro delay3 (in, del) Verzögerung dritter Ordnung + Material + + macro delay3p (in, del, ppl) Verzögerung dritter Ordnung mit + Pipeline + + macro delinf3 (in, del) Verzögerung dritter Ordnung für + Information + + macro smooth (in, del) Verzögerung erster Ordnung für + Information + + + + +#ib#5.1. Insertieren von Makros#ie# + + + + +Makros werden durch folgende Prozedur in die Compilertabelle eingetragen: + + +PROC insert macro (TEXT CONST filename): + + Zweck: Fügt die in der Datei 'filename' enthaltenen Makros in die Makrotabelle ein. + Die Datei sollte zweckmäßigerweise nur Makrodefinitionen enthalten. Es ist + - im Gegensatz zu normalen DYNAMO-Programmen - nicht nötig, die + Systemkonstanten zu definieren (die Standard-Makros sind in der Datei + "dyn.mac" enthalten; diese Datei kann beliebig ergänzt werden). + + + + +#ib#5.2. Aufbau eines Makros#ie# + + + + +Makros beginnen in DYNAMO immer mit der Anweisung MACRO (s. auch Seite #to page ("MACRO")#) +und enden mit MEND (s. Seite #to page ("MEND")#). Dazwischen steht ein Makrorumpf, bestehend +aus einer oder mehreren DYNAMO-Gleichungen. Beim Makroaufruf können, soweit +vorher definiert, Parameter angegeben werden, jedoch rekursiv aufrufen kann man +Makros nicht. + +Beispiel: MACRO SMOOTH (IN, DEL) + L SMOOTH.K = SMOOTH.J + DT * (IN.J - SMOOTH.J) + X /DEL + N SMOOTH = IN + MEND + +Lokale Variablen in Makros beginnen mit einem $-Zeichen. Der Makro-Expandierer +ersetzt das $-Zeichen durch "zz" gefolgt von einer Zahl. Aus diesem Grund sollen +eigene Namen nicht mit "zz" beginnen. + +Falls Sie eine Fehlermeldung bekommen, die sich auf einen mit "zz" beginnenden +Namen bezieht, sollten Sie den Fehler in dem entsprechenden Makro suchen. + +#on ("b")# +Achtung: #off ("b")#Makros sollten nur von fortgeschrittenden DYNAMO-Programmieren + verwendet werden, da Makros Eigenschaften von Refinements (textuelle + Ersetzung) und Prozeduren (Parameterübergabe) vereinigen. Der daraus + folgende Effekt ist nicht ganz einfach zu durchschauen. +#page# + + + +#ib#6. Erweiterung des Sprachumfangs#ie# + + + + +Während Makros in DYNAMO geschrieben werden, ist es ferner möglich, die Menge +der Funktionen mittels der Sprache ELAN zu erweitern. + +Hierbei geht man wie folgt vor: + + 1. Schreiben einer Funktion in ELAN (näheres siehe unten) + + 2. Einbinden der Funktion in die Tabellen des DYNAMO-Compilers + + 2.1. Einschreiben des Namens der Funktion, gefolgt von den Typen der Ein­ + gabeparameter in die bestehende Datei "dyn.std", wobei folgende Typen + existieren: + + r real (Datentyp REAL) + t table (Datentyp TAB) + + Abgeschlossen wird die "dyn.std"-Datei durch die Zeichensequenz "/*". + + Beispiele: + + power rr table trrrr /* + + + 2.2. Laden der Funktion(en) mittels der Prozedur 'init std ("dyn.std")' + + +Eine zur Einbindung in den DYNAMO-Compiler vorgesehene ELAN-Funktion wird +unter Beachtung gewisser Regeln erstellt: + + 1. Die deklarierten ELAN-Prozeduren dürfen nur Parameter vom Typ REAL oder + TAB besitzen oder gänzlich ohne Parameter sein. + + 2. Der Typ des Resultaten muß vom Typ REAL sein. + +Zur Manipulation von Tabellen wurde der Datentyp TAB geschaffen, auf welchen man +wie auf das Standard-Vektorpaket zugreifen kann. + +Beispiel: + + REAL PROC abs (REAL CONST a): + IF a < 0.0 THEN + -a + ELSE + a + END IF + END PROC abs; + + PROC sumv (TAB CONST tab, REAL CONST erstes, letztes): + REAL VAR summe := 0.0; + INT VAR i; + FOR i FROM int (erstes) UPTO int (letztes) REPEAT + summe INCR wert (tab, i) + END REPEAT; + summe + END PROC sumv + + + + +#ib#6.1. Für fortgeschrittende ELAN-Program­ + mierer#ie# + + + +Der Quellcode des EUMEL-DYNAMO-Compilers wird mit ausgeliefert. Daher +können Einschränkungen (s. 3.2 Abweichungen gegenüber dem Sprachstandard) +leicht beseitigt werden. Wem z.B. die Anzahl der Gleichungen (950) zu wenig ist, der +kann im Quelltext des Compilers diesen Wert (annähernd) beliebig nach oben hin +erhöhen. + diff --git a/doc/dynamo/dynamo handbuch.index b/doc/dynamo/dynamo handbuch.index new file mode 100644 index 0000000..af77d79 --- /dev/null +++ b/doc/dynamo/dynamo handbuch.index @@ -0,0 +1,69 @@ +#block##pageblock##page (52)# +#head# +#center#DYNAMO-Compiler +#center#____________________________________________________________ + +#end# +#bottom odd# +#center#____________________________________________________________ +GMD #right#DYNAMO - % +#end# +#bottom even# +#center#____________________________________________________________ +DYNAMO - % #right#GMD +#end# +Anhang - Übersicht über Anweisungen und +Funktionen + + +#clear pos##l pos (0.0)##r pos (10.0)##fillchar (" ")# +#table# +A 21 +ABS 21 +ARCTAND 22 +C 23 +CLIP 23 +COSD 24 +EXP 25 +FIFGE 25 +FIFZE 26 +FLOOR 26 +FOR 27 +FRAC 27 +L 28 +LN 28 +LOG2 29 +LOG10 29 +MACRO 30 +MAX 31 +MEND 31 +MIN 32 +N 32 +NOISE 33 +NORMRN 33 +NOTE 34 +PLOT 35 +POWER 35 +PRINT 36 +R 36 +RAMP 37 +RUN 37 +S 38 +SCLPRD 38 +SIN 39 +SIND 39 +SPEC 40 +SQRT 40 +STEP 41 +SUM 41 +SUMV 42 +SWITCH 42 +T 43 +TABHL 43 +TABLE 44 +TAN 44 +TAND 45 +X 45 +* 46 +#table end# + diff --git a/doc/dynamo/dynamo handbuch.inhalt b/doc/dynamo/dynamo handbuch.inhalt new file mode 100644 index 0000000..2d1b1f3 --- /dev/null +++ b/doc/dynamo/dynamo handbuch.inhalt @@ -0,0 +1,131 @@ +____________________________________________________________________________ + + +#on("b")##on ("u")# +#center#Betriebssystem E U M E L +#off ("u")# + + +#center#DYNAMO + + + + +#off("b")# +#center#Lizenzfreie Software der +#on ("b")# + +#center#Gesellschaft für Mathematik und Datenverarbeitung mbH, +#center#5205 Sankt Augustin + + +#off("b")# +#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für +#center#nichtkommerzielle Zwecke gestattet. + +#center#Gewährleistung und Haftung werden ausgeschlossen + + +____________________________________________________________________________ +#page# +#block# +#center#____________________________________________________________________________ + + Copyright 1988 + + Selbstverlag GMD + Alle Rechte vorbehalten. + Insbesondere ist die Überführung in maschinenlesbare + Form, sowie das Speichern in Informationssystemen, auch + auszugsweise, nur mit schriftlicher Genehmigung der + GMD gestattet. +#center#____________________________________________________________________________ + + + Herausgeber: + + Gesellschaft für Mathematik und Datenverarbeitung mbH + + Postfach 1240, Schloß Birlinghoven + D-5205 Sankt Augustin 1 + Telefon(02241) 14-1, Telex 8 89 469 gmd d + Telefax(02241) 14 28 89, BTX *43900\# + Teletex 2627-224135=GMDVV + + +Autor: + + Christian Szymanski + +nach Anregungen von: + + Diether Craemer, Robert Keil + +überarbeitet von: + + Thomas Müller + +Texterstellung: + + Dieser Text wurde mit der EUMEL-Textverarbeitung erstellt und aufbereitet und + mit dem Agfa Laserdrucksystem P400 gedruckt. + + + + Hinweis: + +#on("italics")# + Diese Dokumentation wurde mit größtmöglicher Sorgfalt erstellt. Dennoch wird + für die Korrektheit und Vollständigkeit der gemachten Angaben keine Gewähr + übernommen. Bei vermuteten Fehlern der Software oder der Dokumentation + bitten wir um baldige Meldung, damit eine Korrektur möglichst rasch erfolgen + kann. Anregungen und Kritik sind jederzeit willkommen.#off("italics")# +#page# +#pagenr ("%", 1")##setcount (1)##block##pageblock##count per page# +#head# +#center#DYNAMO-Compiler +#center#____________________________________________________________ + +#end# +#bottom odd# +#center#____________________________________________________________ +GMD #right#DYNAMO - % +#end# +#bottom even# +#center#____________________________________________________________ +DYNAMO - % #right#GMD +#end# + +Inhalt + + + +#clear pos##lpos (0.0)##r pos (10.0)##fillchar (" ")# +#table# +1. Einleitung 2 + 1.1. Referenzliteratur 2 + 1.2. Die Programmiersprache DYNAMO 3 + 1.3. Kurz-Einführung in die DYNAMO-Schreibweise 4 + 1.4. Eine erste, kleine Sitzung mit dem DYNAMO-System 6 + +2. Generierung des DYNAMO-Compilers 7 + +3. Der EUMEL-DYNAMO-Compiler 8 + 3.1. Benutzung des DYNAMO-Compiler 8 + 3.2. Abweichungen gegenüber dem Sprachstandard 11 + 3.3. Das DYNAMO Runtime-System 12 + 3.4. Fehlermeldungen des DYNAMO-Compilers 14 + +4. Anweisungen und Funktionen des EUMEL-DYNAMO-Compilers 19 + 4.1. Übersicht über die Anweisungen und Funktionen 21 + +5. Makros in DYNAMO 47 + 5.1. Insertieren von Makros 48 + 5.2. Aufbau eines Makros 48 + +6. Erweiterung des Sprachumfangs 50 + 6.1. Für fortgeschrittende ELAN-Programmierer 51 + +Anhang - Übersicht über Anweisungen unf Funktionen 52 +#table end# + diff --git a/doc/eudas/abb.1-1 b/doc/eudas/abb.1-1 new file mode 100644 index 0000000..06c27fd --- /dev/null +++ b/doc/eudas/abb.1-1 @@ -0,0 +1,94 @@ +init dgs; +window (0.0, 0.0, 13.5, 7.1); (*viewport (0.0,0.0,13.5,7.1); *) +scale (1.0,1.0,0.0,0.0); +(*clear pixels;*) + +karteikasten (1.0, 3.5, "Kartei A", "Wegner", "Herbert"); +karteikasten (5.0, 0.5, "Kartei B", "Regmann", "Karin"); + +LET myname = "abb.1-1"; +save pixels (myname + ".p"); +FILE VAR f := sequential file (modify, myname + ".p"); +to line (f, 1); insert record (f); +write record (f, "#linefeed (0.8)#"); +insert record (f); write record (f, myname); +to eof (f); insert record (f); write record (f, myname); +to line (f, 1); +(* +pause (10000); +*) +PROC karteikasten (REAL CONST x, y, TEXT CONST name, t name, t vorname) : + + move (x - 0.1, y); + draw (x + 3.6, y); + draw (x + 3.6, y + 1.0); + draw (x - 0.1, y + 1.0); + draw (x - 0.1, y); + + move (x + 0.1, y + 1.1); + draw (x + 0.5, y + 1.5); + move (x + 0.1, y + 1.1); + draw (x + 3.6, y + 1.1); + move (x - 0.1, y + 1.0); + draw (x + 0.5, y + 1.6); + + move (x + 3.6, y); + draw (x + 5.2, y + 1.6); + draw (x + 5.2, y + 2.6); + draw (x + 3.6, y + 1.0); + move (x + 3.6, y + 1.1); draw (x + 5.0, y + 2.5); + move (x + 5.2, y + 2.6); draw (x + 5.0, y + 2.6); + + move (x + 0.5, y + 1.1); + draw (x + 0.5, y + 2.5); + draw (x + 4.0, y + 2.5); + draw (x + 4.0, y + 1.5); + move (x + 0.5, y + 2.5); + draw (x + 1.5, y + 3.5); + draw (x + 5.0, y + 3.5); + draw (x + 5.0, y + 2.5); + move (x + 5.0, y + 3.5); + draw (x + 4.0, y + 2.5); + REAL VAR x off := 0.1; + WHILE x off < 1.0 REP + move (x + 0.5 + xoff, y + 2.5 + x off); + draw (x + 4.0 + xoff, y + 2.5 + xoff); + draw (x + 4.0 + xoff, y + 1.5 + xoff); + x off INCR 0.1 + END REP; + font size (0.5); + font expansion (1.5); + move (x + 0.5, y + 0.2); draw (name); + font size (0.25); + move (x + 0.7, y + 2.10); draw ("Name"); + move (x + 0.7, y + 1.65); draw ("Vorname"); + move (x + 0.7, y + 1.20); draw ("Strasse"); + move (x + 2.1, y + 2.10); draw (": " + t name); + move (x + 2.1, y + 1.65); draw (": " + t vorname); + move (x + 2.1, y + 1.20); draw (":"); + +END PROC karteikasten; + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/eudas/abb.4-1 b/doc/eudas/abb.4-1 new file mode 100644 index 0000000..439e052 --- /dev/null +++ b/doc/eudas/abb.4-1 @@ -0,0 +1,43 @@ +init dgs; +window (0.0, 0.0, 13.5, 3.2); viewport (0.0,0.0,13.5,3.2); +(* scale (2.0,2.0,0.0,0.0); *) +(*clear pixels;*) + +font size (0.25); +font expansion (1.5); + +INT VAR i; +FOR i FROM 0 UPTO 4 REP + move (2.0, real (i) * 0.5); + draw (10.0, real (i) * 0.5); + move (2.1, real (i) * 0.5 + 0.1); + draw ("Feld " + code (code ("E") - i)); +END REP; +move (2.0, 2.5); +draw (10.0, 2.5); +move (2.0, 2.5); +draw (2.0, 0.0); +move (3.5, 3.0); +draw (10.0, 3.0); +FOR i FROM 1 UPTO 4 REP + move (2.0 + real (i) * 1.5, 3.0); + draw (2.0 + real (i) * 1.5, 0.0); + move (2.2 + real (i) * 1.5, 2.6); + draw ("Satz " + text (i)) +END REP; +move (9.5, 3.0); +draw (9.5, 0.0); +(* +pause (1000); +*) + +LET myname = "abb.4-1"; +save pixels (myname + ".p"); +FILE VAR f := sequential file (modify, myname + ".p"); +to line (f, 1); insert record (f); +write record (f, "#linefeed (0.8)#"); +insert record (f); write record (f, myname); +to eof (f); insert record (f); write record (f, myname); +to line (f, 1); + + diff --git a/doc/eudas/abb.4-2 b/doc/eudas/abb.4-2 new file mode 100644 index 0000000..a836def --- /dev/null +++ b/doc/eudas/abb.4-2 @@ -0,0 +1,46 @@ +init dgs; +window (0.0, 0.0, 13.5, 2.0); viewport (0.0,0.0,13.5,2.0); +(*scale (1.7,1.7,-1.6,0.0);*) +(* +clear pixels; +*) + +kasten (1.0, 0.0, 3.0, 1.5); +kasten (7.0, 0.0, 3.0, 1.5); +font size (0.4); font expansion (1.5); +move (1.8, 0.6); draw ("Menü"); +move (7.9, 0.6); draw ("Hilfe"); +move (4.5, 1.0); draw (6.5, 1.0); + draw (6.25, 1.25); move (6.5, 1.0); draw (6.25, 0.75); +move (6.5, 0.5); draw (4.5, 0.5); + draw (4.75, 0.75); move (4.5, 0.5); draw (4.75, 0.25); +font size (0.25); +move (5.0, 1.1); draw ("ESC '?'"); +move (5.0, 0.6); draw ("ESC 'q'"); +move (10.5, 1.0); draw (11.5, 1.0); draw (11.5, 0.5); draw (10.5, 0.5); + draw (10.75, 0.75); move (10.5, 0.5); draw (10.75, 0.25); +move (11.8, 0.9); draw ("ESC 'w'"); +move (11.8, 0.4); draw ("ESC 'z'"); + + +LET myname = "abb.4-2"; +save pixels (myname + ".p"); +FILE VAR f := sequential file (modify, myname + ".p"); +to line (f, 1); insert record (f); +write record (f, "#linefeed (0.8)#"); +insert record (f); write record (f, myname); +to eof (f); insert record (f); write record (f, myname); +to line (f, 1); +(* +pause (9000); +*) +PROC kasten (REAL CONST x anf, y anf, x l, y l) : + + move (x anf, y anf); + draw (x anf, y anf + y l); + draw (x anf + x l, y anf + y l); + draw (x anf + x l, y anf); + draw (x anf, y anf) + +END PROC kasten; + diff --git a/doc/eudas/abb.6-1 b/doc/eudas/abb.6-1 new file mode 100644 index 0000000..fb83242 --- /dev/null +++ b/doc/eudas/abb.6-1 @@ -0,0 +1,75 @@ +init dgs; +window (0.0, 0.0, 13.5, 4.0); viewport (0.0,0.0,13.5,4.0); +(*scale (1.0,1.0, 0.0,0.0);*) +(* +clear pixels; +*) + +move (2.25, 1.0); draw (4.75, 1.0); +move (2.25, 3.0); draw (4.75, 3.0); + move (2.5, 1.0); draw (2.5, 3.3); + move (3.0, 1.0); draw (3.0, 3.3); + move (3.5, 1.0); draw (3.5, 3.3); + move (4.0, 1.0); draw (4.0, 3.3); + move (4.5, 1.0); draw (4.5, 3.3); +font size (0.30); font expansion (1.5); +move (2.6, 3.1); draw ("4"); +move (2.6, 2.0); draw ("M"); +move (3.1, 3.1); draw ("5"); +move (3.1, 2.0); draw ("N"); +move (3.6, 3.1); draw ("6"); +move (3.6, 2.0); draw ("O"); +move (4.1, 3.1); draw ("7"); +move (4.1, 2.0); draw ("P"); + pfeil (3.75, 0.75); + +move (5.0, 2.0); draw (7.0, 2.0); draw (6.75, 2.25); + move (7.0, 2.0); draw (6.75, 1.75); +move (5.0, 2.1); draw ("Einfügen"); + +move (7.25, 1.0); draw (8.5, 1.0); move (9.0, 1.0); draw (10.25, 1.0); +move (7.25, 3.0); draw (8.5, 3.0); move (9.0, 3.0); draw (10.25, 3.0); + move (7.5, 1.0); draw (7.5, 3.3); + move (8.0, 1.0); draw (8.0, 3.3); + move (8.5, 1.0); draw (8.5, 3.3); + move (9.0, 1.0); draw (9.0, 3.3); + move (9.5, 1.0); draw (9.5, 3.3); + move (10.0, 1.0); draw (10.0, 3.3); +move (7.6, 3.1); draw ("4"); +move (7.6, 2.0); draw ("M"); +move (8.1, 3.1); draw ("5"); +move (8.1, 2.0); draw ("N"); +move (8.6, 3.1); draw ("6"); +move (9.1, 3.1); draw ("7"); +move (9.1, 2.0); draw ("O"); +move (9.6, 3.1); draw ("8"); +move (9.6, 2.0); draw ("P"); + +pfeil (8.75, 0.75); + +PROC pfeil (REAL CONST x spitze, y spitze) : + + move (x spitze, y spitze); + draw (x spitze + 0.25, y spitze - 0.25); + draw (x spitze + 0.1, y spitze - 0.25); + draw (x spitze + 0.1, y spitze - 0.5); + draw (x spitze - 0.1, y spitze - 0.5); + draw (x spitze - 0.1, y spitze - 0.25); + draw (x spitze - 0.25, y spitze - 0.25); + draw (x spitze, y spitze) + +END PROC pfeil; + + +LET myname = "abb.6-1"; +save pixels (myname + ".p"); +FILE VAR f := sequential file (modify, myname + ".p"); +to line (f, 1); insert record (f); +write record (f, "#linefeed (0.8)#"); +insert record (f); write record (f, myname); +to eof (f); insert record (f); write record (f, myname); +to line (f, 1); +(* +pause (9000) +*) + diff --git a/doc/eudas/abb.6-2 b/doc/eudas/abb.6-2 new file mode 100644 index 0000000..7771a29 --- /dev/null +++ b/doc/eudas/abb.6-2 @@ -0,0 +1,77 @@ +init dgs; +window (0.0, 0.0, 13.5, 5.0); viewport (0.0,0.0,13.5,5.0); +(*scale (1.4,1.4, 0.0,0.0);*) +(*clear pixels;*) + +move (2.5, 4.5); draw (12.4, 4.5); draw (12.4, 4.0); draw (11.0, 4.0); + draw (11.0, 3.5); move (10.5, 3.5); draw (10.5, 4.0); draw (2.5, 4.0); +move (13.5, 4.5); draw (12.5, 4.5); draw (12.5, 3.5); move (13.0, 3.5); + draw (13.0, 4.0); draw (13.5, 4.0); +move (2.5, 3.5); draw (13.5, 3.5); move (13.5, 3.0); draw (10.0, 3.0); + draw (10.0, 2.5); move (9.5, 2.5); draw (9.5, 3.0); draw (2.5, 3.0); +move (10.5, 3.0); draw (10.5, 2.5); move (11.0, 2.5); draw (11.0, 3.0); +move (12.5, 2.5); draw (12.5, 3.0); move (13.0, 3.0); draw (13.0, 2.5); +move (2.5, 2.5); draw (6.4, 2.5); draw (6.4, 2.0); draw (4.0, 2.0); + draw (4.0, 1.5); draw (6.5, 1.5); draw (6.5, 2.5); draw (13.5, 2.5); + move (13.5, 2.0); draw (7.0, 2.0); draw (7.0, 1.5); draw (9.0, 1.5); + draw (9.0, 1.0); draw (3.5, 1.0); draw (3.5, 2.0); draw (2.5, 2.0); +move (9.5, 2.0); draw (9.5, 1.0); draw (10.4, 1.0); draw (10.4, 1.5); + draw (10.0, 1.5); draw (10.0, 2.0); +move (10.5, 2.0); draw (10.5, 1.0); draw (13.0, 1.0); draw (13.0, 2.0); + move (11.0, 2.0); draw (11.0, 1.5); draw (12.5, 1.5); draw (12.5, 2.0); +move (4.5, 1.5); draw (4.75, 1.25); draw (4.5, 1.0); +move (5.5, 1.5); draw (5.75, 1.25); draw (5.5, 1.0); +move (7.5, 1.5); draw (7.75, 1.25); draw (7.5, 1.0); +move (11.5, 1.5); draw (11.75, 1.25); draw (11.5, 1.0); + +font size (0.25); font expansion (1.4); +move (2.5, 4.1); draw ("K0"); +move (2.5, 3.1); draw ("N0"); +move (2.5, 2.1); draw ("A0"); + +move (0.0, 4.1); draw ("'Kalender'"); +move (0.0, 3.1); draw ("'Namen'"); +move (0.0, 2.1); draw ("'Adressen'"); +move (0.0, 1.1); draw ("Arbeitskopie"); + +move (4.9, 1.1); draw ("A1"); +move (5.9, 1.1); draw ("A2"); +move (7.9, 1.1); draw ("A3"); +move (11.9, 1.1); draw ("K1"); + +x alignment (right); +move (13.5, 4.1); draw ("K1"); +move (13.5, 3.1); draw ("N0"); +move (13.5, 2.1); draw ("A2"); + +x alignment (normal); +font size (0.2); +INT VAR i; +FOR i FROM 0 UPTO 10 REP + time (2.5 + real (i) * 1.0, i) +END REP; + +PROC time (REAL CONST x pos, INT CONST nr) : + + move (x pos, 4.9); draw (x pos, 4.6); + move (x pos, 3.9); draw (x pos, 3.6); + move (x pos, 2.9); draw (x pos, 2.6); + move (x pos, 1.9); draw (x pos, 1.6); + move (x pos, 0.9); draw (x pos, 0.6); + move (x pos + 0.1, 0.6); draw (text (nr)) + +END PROC time; + + +LET myname = "abb.6-2"; +save pixels (myname + ".p"); +FILE VAR f := sequential file (modify, myname + ".p"); +to line (f, 1); insert record (f); +write record (f, "#linefeed (0.8)#"); +insert record (f); write record (f, myname); +to eof (f); insert record (f); write record (f, myname); +to line (f, 1); +(* +pause (9000); +*) + diff --git a/doc/eudas/abb.7-1 b/doc/eudas/abb.7-1 new file mode 100644 index 0000000..3536ad9 --- /dev/null +++ b/doc/eudas/abb.7-1 @@ -0,0 +1,46 @@ +init dgs; +window (0.0, 0.0, 13.5, 6.0); viewport (0.0,0.0,13.5,6.0); +(*scale (1.7,1.7, 0.0,0.0);*) +(*clear pixels;*) + +kasten (5.0, 4.5, 3.0, 1.0); +kasten (5.0, 1.5, 3.0, 1.0); +kasten (1.5, 3.0, 3.0, 1.0); +font size (0.35); font expansion (1.5); +x alignment (center); +move (6.5, 4.8); draw ("Druckmuster"); +move (6.5, 1.8); draw ("Druckdatei"); +move (3.0, 3.3); draw ("EUDAS-Datei"); +move (6.5, 0.0); draw ("Drucker"); + +move (6.5, 4.25); draw (6.5, 2.75); draw (6.25, 3.0); + move (6.5, 2.75); draw (6.75, 3.0); +move (4.75, 3.5); draw (6.25, 3.5); draw (6.0, 3.75); + move (6.25, 3.5); draw (6.0, 3.25); +move (6.5, 1.25); draw (6.5, 0.5); draw (6.75, 0.75); + move (6.5, 0.5); draw (6.25, 0.75); + + +PROC kasten (REAL CONST x anf, y anf, x l, y l) : + + move (x anf, y anf); + draw (x anf, y anf + y l); + draw (x anf + x l, y anf + y l); + draw (x anf + x l, y anf); + draw (x anf, y anf) + +END PROC kasten; + + +LET myname = "abb.7-1"; +save pixels (myname + ".p"); +FILE VAR f := sequential file (modify, myname + ".p"); +to line (f, 1); insert record (f); +write record (f, "#linefeed (0.8)#"); +insert record (f); write record (f, myname); +to eof (f); insert record (f); write record (f, myname); +to line (f, 1); +(* +pause (9000); +*) + diff --git a/doc/eudas/abb.9-1 b/doc/eudas/abb.9-1 new file mode 100644 index 0000000..774b78b --- /dev/null +++ b/doc/eudas/abb.9-1 @@ -0,0 +1,41 @@ +init dgs; +window (0.0, 0.0, 13.5, 4.0); viewport (0.0,0.0,13.5,4.0); +(*scale (1.7,1.7, 0.0,0.0);*) +(*clear pixels;*) + +move (1.5, 1.0); draw (8.75, 1.0); +move (1.5, 3.5); draw (8.75, 3.5); +INT VAR i; +FOR i FROM 0 UPTO 9 REP + move (1.75 + real (i) * 0.75, 3.7); + draw (1.75 + real (i) * 0.75, 1.0); +END REP; + +move (4.7, 3.7); draw (4.7, 1.0); + +font size (0.25); font expansion (1.5); +x alignment (center); +FOR i FROM 0 UPTO 8 REP + move (2.125 + real (i) * 0.75, 3.6); draw (text (i + 110)) +END REP; +FOR i FROM 1 UPTO 5 REP + move (2.125 + real (i + 3) * 0.75, 0.6); draw ("(" + text (i) + ")") +END REP; + +font size (0.35); x alignment (left); +move (2.0, 0.0); draw ("Datei A"); +move (5.0, 0.0); draw ("Datei B"); + + +LET myname = "abb.9-1"; +save pixels (myname + ".p"); +FILE VAR f := sequential file (modify, myname + ".p"); +to line (f, 1); insert record (f); +write record (f, "#linefeed (0.8)#"); +insert record (f); write record (f, myname); +to eof (f); insert record (f); write record (f, myname); +to line (f, 1); +(* +pause (9000) +*) + diff --git a/doc/eudas/abb.9-2 b/doc/eudas/abb.9-2 new file mode 100644 index 0000000..4e9444d --- /dev/null +++ b/doc/eudas/abb.9-2 @@ -0,0 +1,96 @@ +init dgs; +window (0.0, 0.0, 13.5, 6.5); viewport (0.0,0.0,13.5,6.5); +(*scale (1.7,1.7, 0.0,0.0);*) +(*clear pixels;*) + +INT VAR i; +move (4.0, 0.0); draw (4.0, 2.0); +move (5.5, 0.0); draw (5.5, 2.0); +FOR i FROM 0 UPTO 4 REP + move (4.0, real (i) * 0.5); + draw (5.5, real (i) * 0.5) +END REP; + +move (4.0, 3.0); draw (4.0, 6.0); +move (5.5, 3.0); draw (5.5, 6.0); +FOR i FROM 0 UPTO 6 REP + move (4.0, real (i) * 0.5 + 3.0); + draw (5.5, real (i) * 0.5 + 3.0) +END REP; + +move (7.5, 2.0); draw (7.5, 6.0); +move (9.0, 2.0); draw (9.0, 6.0); +FOR i FROM 0 UPTO 8 REP + move (7.5, real (i) * 0.5 + 2.0); + draw (9.0, real (i) * 0.5 + 2.0) +END REP; + +strichel (5.5, 6.0, 7.5, 6.0); +strichel (5.5, 3.0, 7.5, 3.0); +strichel (5.5, 1.0, 7.5, 3.0); +strichel (5.5, 0.0, 7.5, 2.0); + +move (5.5, 4.75); draw (6.0, 4.75); + draw (6.0, 1.75); draw (5.5, 1.75); +move (4.0, 3.75); draw (3.5, 3.75); + draw (3.5, 1.25); draw (4.0, 1.25); + +font size (0.4); font expansion (1.5); +move (0.0, 0.8); draw ("Koppeldatei"); +move (0.0, 4.3); draw ("Hauptdatei"); +move (10.0, 4.3); draw ("virtuelle"); +move (10.0, 3.4); draw ("Datei"); + +font size (0.3); +move (4.5, 0.1); draw ("H2"); +move (4.5, 0.6); draw ("H1"); +move (4.5, 1.1); draw ("B"); +move (4.5, 1.6); draw ("A"); +move (4.5, 3.1); draw ("F4"); +move (4.5, 3.6); draw ("B"); +move (4.5, 4.1); draw ("F3"); +move (4.5, 4.6); draw ("A"); +move (4.5, 5.1); draw ("F2"); +move (4.5, 5.6); draw ("F1"); +move (8.0, 5.6); draw ("F1"); +move (8.0, 5.1); draw ("F2"); +move (8.0, 4.6); draw ("A"); +move (8.0, 4.1); draw ("F3"); +move (8.0, 3.6); draw ("B"); +move (8.0, 3.1); draw ("F4"); +move (8.0, 2.6); draw ("H1"); +move (8.0, 2.1); draw ("H2"); + +PROC strichel (REAL CONST x anf, y anf, x end, y end) : + + REAL VAR laenge := x end - x anf; + INT VAR teile := int (abstand/ 0.4); + REAL VAR verhaeltnis := (y end - y anf) / laenge; + laenge := laenge / (real (2 * teile + 1)); + INT VAR i; + FOR i FROM 0 UPTO teile REP + move (x anf + real (i + i) * laenge, + y anf + verhaeltnis * real (i + i) * laenge); + draw (x anf + real (i + i + 1) * laenge, + y anf + verhaeltnis * real (i + i + 1) * laenge) + END REP . + +abstand : + sqrt ((y end - y anf) + (y end - y anf) + + (x end - x anf) * (x end - x anf)) . + +END PROC strichel; + + +LET myname = "abb.9-2"; +save pixels (myname + ".p"); +FILE VAR f := sequential file (modify, myname + ".p"); +to line (f, 1); insert record (f); +write record (f, "#linefeed (0.8)#"); +insert record (f); write record (f, myname); +to eof (f); insert record (f); write record (f, myname); +to line (f, 1); +(* +pause (9000); +*) + diff --git a/doc/eudas/abb.9-3 b/doc/eudas/abb.9-3 new file mode 100644 index 0000000..9b190ab --- /dev/null +++ b/doc/eudas/abb.9-3 @@ -0,0 +1,113 @@ +init dgs; +window (0.0, 0.0, 13.5, 7.0); viewport (0.0,0.0,13.5,7.0); +(*scale (1.7,1.7, 0.0,0.0);*) +(*clear pixels;*) + +x alignment (center); +font size (0.3); font expansion (1.2); +kasten (1.5, 5.0, 2.0, 1.5); +move (2.5, 5.9); draw ("EUDAS-"); +move (2.5, 5.3); draw ("Datei 1"); +move (3.5, 5.75); draw (4.0, 5.75); +kasten (4.0, 5.0, 2.0, 1.5); +move (5.0, 5.9); draw ("gekettete"); +move (5.0, 5.3); draw ("Datei A"); +move (6.0, 5.75); draw (6.5, 5.75); +kasten (6.5, 5.0, 2.0, 1.5); +move (7.5, 5.9); draw ("gekettete"); +move (7.5, 5.3); draw ("Datei B"); +kasten (1.5, 2.0, 2.0, 1.5); +move (2.5, 2.9); draw ("gekoppelte"); +move (2.5, 2.3); draw ("Datei C"); +kasten (4.0, 0.0, 2.0, 1.5); +move (5.0, 0.9); draw ("gekoppelte"); +move (5.0, 0.3); draw ("Datei D"); + +punkt (9.0, 5.75); +punkt (9.25, 5.75); +punkt (9.5, 5.75); + +strichel (1.0, 4.5, 10.0, 4.5); +strichel (1.0, 7.0, 10.0, 7.0); +strichel (1.0, 4.5, 1.0, 7.0); +x alignment (right); font size (0.4); +move (10.0, 3.9); +draw ("Hauptdatei"); + +punkt (2.5, 3.75); +punkt (2.5, 4.0); +punkt (2.5, 4.25); + +punkt (5.0, 1.75); +punkt (5.0, 2.0); +punkt (5.0, 2.25); +punkt (5.0, 2.5); +punkt (5.0, 2.75); +punkt (5.0, 3.0); +punkt (5.0, 3.25); +punkt (5.0, 3.5); +punkt (5.0, 3.75); +punkt (5.0, 4.0); +punkt (5.0, 4.25); + +PROC punkt (REAL CONST x pos, y pos) : + + LET p size = 0.025; + move (x pos, y pos + p size); + draw (x pos + p size, y pos); + draw (x pos, y pos - p size); + draw (x pos - p size, y pos); + draw (x pos, y pos + p size) + +END PROC punkt; + + +PROC strichel (REAL CONST x anf, y anf, x end, y end) : + + REAL VAR laenge := x end - x anf; + INT VAR teile := int (abstand/ 0.4); + REAL VAR senkrecht, verhaeltnis; + IF laenge <> 0.0 THEN + verhaeltnis := (y end - y anf) / laenge; senkrecht := 1.0 + ELSE + verhaeltnis := 1.0; senkrecht := 0.0 ; + laenge := y end - y anf + END IF; + laenge := laenge / (real (2 * teile + 1)); + INT VAR i; + FOR i FROM 0 UPTO teile REP + move (x anf + real (i + i) * laenge * senkrecht, + y anf + verhaeltnis * real (i + i) * laenge); + draw (x anf + real (i + i + 1) * laenge * senkrecht, + y anf + verhaeltnis * real (i + i + 1) * laenge) + END REP . + +abstand : + sqrt ((y end - y anf) * (y end - y anf) + + (x end - x anf) * (x end - x anf)) . + +END PROC strichel; + +PROC kasten (REAL CONST x anf, y anf, x l, y l) : + + move (x anf, y anf); + draw (x anf, y anf + y l); + draw (x anf + x l, y anf + y l); + draw (x anf + x l, y anf); + draw (x anf, y anf) + +END PROC kasten; + + +LET myname = "abb.9-3"; +save pixels (myname + ".p"); +FILE VAR f := sequential file (modify, myname + ".p"); +to line (f, 1); insert record (f); +write record (f, "#linefeed (0.8)#"); +insert record (f); write record (f, myname); +to eof (f); insert record (f); write record (f, myname); +to line (f, 1); +(* +pause (9000) +*) + diff --git a/doc/eudas/abb.9-4 b/doc/eudas/abb.9-4 new file mode 100644 index 0000000..e243265 --- /dev/null +++ b/doc/eudas/abb.9-4 @@ -0,0 +1,98 @@ +init dgs; +window (0.0, 0.0, 13.5, 6.0); viewport (0.0,0.0,13.5,6.0); +(*scale (1.7,1.7, 0.0,0.0);*) +(*clear pixels;*) + +kasten (2.0, 1.0, 1.4, 2.0); +kasten (3.5, 1.0, 1.4, 2.0); +kasten (6.5, 1.0, 1.4, 2.0); +kasten (2.0, 3.4, 1.4, 2.0); +kasten (5.0, 3.4, 1.4, 2.0); +kasten (6.5, 3.4, 1.4, 2.0); + strichel (3.5, 3.4, 3.5, 5.4); + strichel (3.5, 5.4, 4.9, 5.4); + strichel (4.9, 5.4, 4.9, 3.4); + strichel (4.9, 3.4, 3.5, 3.4); +move (1.9, 2.7); draw (1.5, 2.7); +draw (1.5, 4.6); draw (1.9, 4.6); + +x alignment (center); +font size (0.3); font expansion (1.4); + +move (2.7, 5.6); draw ("22-1"); +move (2.7, 4.9); draw ("X"); +move (2.7, 4.4); draw ("K"); +move (2.7, 2.5); draw ("K"); +move (2.7, 2.0); draw ("N1"); +move (2.7, 0.4); draw ("(114)"); + +move (4.2, 5.6); draw ("22-2"); +move (4.2, 4.9); draw ("X"); +move (4.2, 4.4); draw ("K"); +move (4.2, 2.5); draw ("K"); +move (4.2, 2.0); draw ("N2"); +move (4.2, 0.4); draw ("(209)"); + +move (5.7, 5.6); draw ("23-1"); +move (5.7, 4.9); draw ("Y"); +move (5.7, 4.4); draw ("L"); + +move (7.2, 5.6); draw ("24-1"); +move (7.2, 4.9); draw ("Z"); +move (7.2, 4.4); draw ("M"); +move (7.2, 2.5); draw ("M"); +move (7.2, 0.4); draw ("(17)"); + +font size (0.4); x alignment (normal); +move (8.5, 2.0); draw ("Koppeldatei"); +move (8.5, 4.4); draw ("Hauptdatei"); + +PROC strichel (REAL CONST x anf, y anf, x end, y end) : + + REAL VAR laenge := x end - x anf; + INT VAR teile := int (abstand/ 0.4); + REAL VAR senkrecht, verhaeltnis; + IF laenge <> 0.0 THEN + verhaeltnis := (y end - y anf) / laenge; senkrecht := 1.0 + ELSE + verhaeltnis := 1.0; senkrecht := 0.0 ; + laenge := y end - y anf + END IF; + laenge := laenge / (real (2 * teile + 1)); + INT VAR i; + FOR i FROM 0 UPTO teile REP + move (x anf + real (i + i) * laenge * senkrecht, + y anf + verhaeltnis * real (i + i) * laenge); + draw (x anf + real (i + i + 1) * laenge * senkrecht, + y anf + verhaeltnis * real (i + i + 1) * laenge) + END REP . + +abstand : + sqrt ((y end - y anf) * (y end - y anf) + + (x end - x anf) * (x end - x anf)) . + +END PROC strichel; + +PROC kasten (REAL CONST x anf, y anf, x l, y l) : + + move (x anf, y anf); + draw (x anf, y anf + y l); + draw (x anf + x l, y anf + y l); + draw (x anf + x l, y anf); + draw (x anf, y anf) + +END PROC kasten; + + +LET myname = "abb.9-4"; +save pixels (myname + ".p"); +FILE VAR f := sequential file (modify, myname + ".p"); +to line (f, 1); insert record (f); +write record (f, "#linefeed (0.8)#"); +insert record (f); write record (f, myname); +to eof (f); insert record (f); write record (f, myname); +to line (f, 1); +(* +pause (9000) +*) + diff --git a/doc/eudas/abb.9-5 b/doc/eudas/abb.9-5 new file mode 100644 index 0000000..c00655c --- /dev/null +++ b/doc/eudas/abb.9-5 @@ -0,0 +1,51 @@ +init dgs; +window (0.0, 0.0, 13.5, 7.0); viewport (0.0,0.0,13.5,7.0); +(*scale (1.7,1.7, 0.0,0.0);*) +(*clear pixels;*) + +kasten (1.5, 0.0, 3.5, 2.0); +kasten (7.0, 0.0, 3.5, 2.0); +kasten (4.0, 4.0, 4.0, 3.0); + kasten (5.0, 5.5, 2.0, 1.0); + +move (3.25, 2.25); draw (4.75, 3.75); + draw (4.5, 3.75); move (4.75, 3.75); draw (4.75, 3.5); + move (3.25, 2.25); draw (3.5, 2.25); + move (3.25, 2.25); draw (3.25, 2.5); +move (8.75, 2.25); draw (7.25, 3.75); + draw (7.5, 3.75); move (7.25, 3.75); draw (7.25, 3.5); + move (8.75, 2.25); draw (8.5, 2.25); + move (8.75, 2.25); draw (8.75, 2.5); + +x alignment (center); +font size (0.4); font expansion (1.4); + +move (3.25, 0.2); draw ("Benutzer A"); +move (8.75, 0.2); draw ("Benutzer B"); +move (6.0, 4.3); draw ("Manager"); +font size (0.3); +move (6.0, 5.6); draw ("Kunden"); + +PROC kasten (REAL CONST x anf, y anf, x l, y l) : + + move (x anf, y anf); + draw (x anf, y anf + y l); + draw (x anf + x l, y anf + y l); + draw (x anf + x l, y anf); + draw (x anf, y anf) + +END PROC kasten; + + +LET myname = "abb.9-5"; +save pixels (myname + ".p"); +FILE VAR f := sequential file (modify, myname + ".p"); +to line (f, 1); insert record (f); +write record (f, "#linefeed (0.8)#"); +insert record (f); write record (f, myname); +to eof (f); insert record (f); write record (f, myname); +to line (f, 1); +(* +pause (9000) +*) + diff --git a/doc/eudas/bildergenerator b/doc/eudas/bildergenerator new file mode 100644 index 0000000..8129476 --- /dev/null +++ b/doc/eudas/bildergenerator @@ -0,0 +1,25 @@ +PROC starten : + + command dialogue (FALSE); + disable stop; + fetch (name, /"DGS NEC"); + run (name); + save (name + ".p", /"DGS NEC"); + end (myself) + +END PROC starten; + +TEXT VAR name; + +PROC gen (TEXT CONST t) : + + name := t; + begin ("p", PROC starten, a); + TASK VAR a; + WHILE exists (a) REP pause (100) END REP + +END PROC gen; + +gen ("abb.4-2"); +gen ("abb.6-1"); + diff --git a/doc/eudas/eudas.hdb.1 b/doc/eudas/eudas.hdb.1 new file mode 100644 index 0000000..40b5a84 --- /dev/null +++ b/doc/eudas/eudas.hdb.1 @@ -0,0 +1,267 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (3)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +#center##on("b")#"Was kann EUDAS ? + + + +In diesem Kapitel wollen wir Ihnen erklären, was EUDAS Ihnen ei­ +gentlich bringen soll. Sie arbeiten sicher nicht nur aus Spaß am +Computer, sondern wollen ihn für bestimmte Aufgaben einsetzen. Ein +Computer kann bestimmte Aufgaben nur dann bearbeiten, wenn er +dafür programmiert worden ist. + EUDAS ist nun ein Programm, das allgemein Aufgaben der Da­ +tenverwaltung lösen kann. Zunächst wollen wir Ihnen erläutern, +wodurch dieses Anwendungsgebiet genau charakterisiert wird. + + +1.1 Textverarbeitung und Datenverwaltung + +Es gibt zwei Einsatzbereiche des Computers, die von fast jedem An­ +wender benötigt werden, egal auf welchem Spezialgebiet er tätig ist: +nämlich die #on("i")#Textverarbeitung#off("i")# und die #on("i")#Datenverwaltung#off("i")#. Durch die +Unterscheidung dieser beiden Bereiche werden die charakteristi­ +schen Merkmale der Datenverwaltung abgegrenzt. + +#on("b")#Textverarbeitung#off("b")# Die Textverarbeitung befaßt sich damit, +einen beliebigen Text auf einem Rechner zu erfassen und anschließend +über einen Drucker wieder auszugeben. Der Sinn dieser Arbeit liegt +darin, daß man einen einmal eingegebenen Text sehr einfach ändern +kann. Außerdem kann der Computer einige unangenehme Aufgaben +übernehmen, die beim Schreiben von Texten auftreten: die Auftei­ +lung auf Zeilen und Seiten, die Seitennumerierung und vieles mehr. + Charakteristisch für die Textverarbeitung ist, daß der Einfluß +des Computers sich auf kosmetische Details beschränkt. Die Spei­ +cherung und eventuelle Aufbereitung zum Drucken haben praktisch +nichts mit dem Inhalt des Textes zu tun. Dies wäre für den Rechner +auch sehr schwierig, da die im Text enthaltenen Informationen in +menschlicher Sprache vorliegen, die für einen Rechner nicht ver­ +ständlich ist. + +#on("b")#Datenverwaltung#off("b")# Bei der Datenverwaltung werden ebenfalls +textuelle Informationen gespeichert, diese liegen aber in einer aufberei­ +teten Form vor, die einen Teil des Inhalts für den Computer ver­ +ständlich macht. Bei der Datenverwaltung werden Objekte betrach­ +tet, die verschiedene Eigenschaften haben können. Ein solches +Objekt kann z.B. eine Person sein. Als Eigenschaften werden mit +dieser Person zusammenhängende Informationen betrachetet, die für +die jeweilige Anwendung wichtig sind. + Ein Beispiel für eine solche Betrachtungsweise ist der Arbeit­ +nehmer im Betrieb. Einige der typischerweise erfaßten Daten sind +Name, Adresse, Telefon, Geburtsdatum und Geschlecht. Alle diese +Daten sind Eigenschaften oder #on("i")#Attribute#off("i")#, die einem bestimmten +Menschen mehr oder weniger fest zugeordnet sind. + Die Betonung inhaltlicher Beziehungen erleichtert es dem Com­ +puter, die gespeicherten Daten in verschiedenen Variationen aus­ +zuwerten. + +#on("b")#Beispiel#off("b")# Um die Unterscheidung zwischen Textverarbeitung +und +Datenverwaltung deutlicher zu machen, werden im folgenden Bei­ +spiel die Informationen über eine Person in zwei unterschiedlichen +Formen dargeboten, die für den Menschen die gleiche Aussagekraft +haben: + + 1. Frau Magdalene Kant, geb. Hagedorn, wurde am 12. Januar + 1946 geboren. Sie wohnt in Bonn in der Meckenheimer Allee + 112. Seit 1977 arbeitet sie in unserer Firma. Sie ist tele­ + fonisch erreichbar unter der Nummer 0228/356782. + + 2. Name: Magdalene + Vorname: Kant + Geburtsname: Hagedorn + Geburtsdatum: 12.01.46 + Geschlecht: weiblich + Strasse: Meckenheimer Allee 112 + PLZ: 5200 + Wohnort: Bonn 1 + Vorwahl: 0228 + Telefon: 356782 + beschäftigt seit: 1977 + +Die Form der Darstellung wie in der ersten Alternative eignet sich +nur für den Menschen, da die gleiche Information auf viele ver­ +schiedene Weisen ausgedrückt werden könnte (z.B. unterschiedlicher +Satzbau). Die zweite Alternative beschränkt sich auf die für die +bestimmte Anwendung wesentlichen Zusammenhänge; der Computer +kann die Aufteilung der Information in einzelne Attribute ausnut­ +zen. + In dieser zweiten Form können Sie Daten mit EUDAS erfassen +und auch auswerten. Die Attribute können Sie jeweils passend zu +den erfaßten Daten selbst bestimmen. + Für Daten in der ersten Form steht Ihnen die EUMEL-Textver­ +arbeitung zur Verfügung. EUDAS wurde so entwickelt, daß Sie auch +Daten an die Textverarbeitung übergeben können. + Es ist nämlich möglich, einen freien Text aus der Attributdar­ +stellung automatisch zu erzeugen, indem Sie dem Computer den +Satzbau mit entsprechenden Platzhaltern vorgeben. Der Rechner +setzt die einzelnen Attribute dann an die angegebenen Stellen. +Diese Funktion ist ein Kernstück von EUDAS und wird in Abschnitt +1.3 näher erläutert. + + +1.2 EUDAS als Karteikasten + +Wie Sie vielleicht schon bemerkt haben, ähnelt die zweite Form der +Darstellung einer Karteikarte, auf der Platz für bestimmte Einträge +freigehalten wird. Anhand dieses Modells können Sie sich in vielen +Fällen die Arbeitsweise von EUDAS veranschaulichen. Sie sollten die +Analogie allerdings nicht zu weit treiben: EUDAS schaufelt ja nicht +wirklich mit Karteikarten herum. Manche Funktionen sind eben +computerspezifisch und ließen sich mit Karteikarten gar nicht +durchführen. + Mit EUDAS können Sie die möglichen Einträge auf den Karteikar­ +ten (also die Attribute) völlig frei bestimmen; die einzige Beschrän­ +kung besteht darin, daß Sie in einem Karteikasten nur Karten mit +völlig gleichem Aufbau verwenden können. Wenn Sie eine neue Kar­ +teikarte entwerfen wollen, brauchen Sie nur Namen für die einzel­ +nen Einträge anzugeben. EUDAS zeigt Ihnen dann quasi eine Karte +am Bildschirm, in der diese Einträge aufgeführt sind. + Sie können nun am Bildschirm Daten auf diese Karteikarten +schreiben. Dabei dürfen die Einträge fast beliebig lang sein; wenn +der Platz auf dem Bildschirm nicht reicht, können Sie sich Ihre +überdimensionale Karteikarte in Ausschnitten ansehen. + Die einmal eingegebenen Daten bleiben nun so lange gespei­ +chert, wie Sie wollen (bzw. bis Ihr Rechner zusammenfällt). Haben +Sie beim Eintragen Fehler gemacht, können Sie diese jederzeit kor­ +rigieren oder später noch weitere Informationen ergänzen. + +#free (7.5)# + +#center#Abb. 1-1 EUDAS als Karteikasten + + +#on("b")#Anwendungen#off("b")# Mit den gespeicherten Daten können Sie nun +ver­ +schiedene Dinge anstellen (bzw. vom Rechner anstellen lassen). Das +Einfachste ist natürlich das, was Sie mit einer Kartei auch machen +würden, sich nämlich einzelne Karteikarten anzuschauen. + Um eine bestimmte Karteikarte herauszufinden, geben Sie +EUDAS einfach den Inhalt vor, nach dem gesucht werden soll. Hier +zeigt sich bereits der erste Vorteil eines Computers: Die Suche in +der EUDAS-Kartei ist viel schneller, als Sie es von Hand könnten. +Außerdem kann der Rechner keine Karte zufällig übersehen. + EUDAS zeigt sich auch dann überlegen, wenn Sie einen ganz +bestimmten Teil der Kartei durchforsten müssen. Eine Bücherei muß +z.B. regelmäßig alle Bücher heraussuchen, deren Leihfrist über­ +schritten ist. Der Computer durchsucht in solchen Fällen ermü­ +dungsfrei auch große Datenmengen. + Wenn Sie die Karteikarten in einer bestimmten Reihenfolge +haben wollen, kann EUDAS auch das Sortieren übernehmen. Weitere +automatische Vorgänge betreffen z.B. das Rauswerfen überflüssiger +oder veralteter Karten. Die Einträge können auch nach einer be­ +stimmten Vorschrift alle geändert werden. Solche Aufgaben treten +z.B. in der Schule auf, wo die Schüler jedes Jahr versetzt werden +müssen (natürlich bis auf Ausnahmen). + Auch Beziehungen zwischen verschiedenen Karteien kann +EUDAS herstellen. Dies kann man noch einmal an dem Beispiel der +Bücherei illustrieren. Wenn ein Buch gefunden wurde, dessen Leih­ +frist überschritten ist, muß der zugehörige Ausleiher gefunden und +angeschrieben werden. Das Heraussuchen beider Karten kann EUDAS +in einem Arbeitsgang durchführen. + + +1.3 Drucken + +Eine besondere Stärke von EUDAS ist die Möglichkeit, die gespei­ +cherten Daten in schriftlicher Form auszuwerten. Dadurch, daß die +Daten in einer Form gespeichert sind, die den Inhalt widerspiegelt, +können die gleichen Daten in vielen verschiedenen Formen auf +Papier ausgegeben werden. + + + + + Karl Eudas + An Poltersdorf + XXXXXXXXXXX + XXXXXXXXXXX + + XXXX XXXXXXXXXXXX + + Lieber XXXXXXX ! + + Dies ist ein Beispiel für ein + Druckmuster. + + Viele Grüße + + + +#center#Abb. 1-2 Muster für die Druckausgabe + + +Zu diesem Zweck geben Sie EUDAS ein Muster des gewünschten Aus­ +drucks vor. Der Rechner setzt dann an entsprechend markierten +Leerstellen die gespeicherten Informationen ein und druckt das +Ergebnis aus. Auf diese Weise ersparen Sie sich die umfangreiche +Schreibarbeit, die anfällt, wenn die Informationen auf den Kartei­ +karten in anderer Form benötigt werden. + Natürlich müssen Sie zum Entwerfen des Formulars kein ge­ +wiefter Programmierer sein. Wenn Sie einen Rundbrief verschicken +wollen, schreiben Sie den Brief, als wollten Sie Ihn nur einmal +schicken. Lediglich im Adressfeld müssen Sie Platzhalter an den +Stellen vorsehen, an denen später die wirklichen Adressen stehen +sollen. + +#on("b")#Verwendungsmöglichkeiten#off("b")# Die Möglichkeiten für solche +Formulare +sind unbegrenzt. Beispiele sind Briefe, Adreßaufkleber, Überwei­ +sungsaufträge und sortierte Listen. Mit den Inhalten einer Kartei +können Sie beliebig viele verschiedene Ausgaben erzeugen. Bei dem +obigen Beispiel der Leihbücherei könnten Sie EUDAS dazu einsetzen, +nicht nur die säumigen Ausleiher herauszufinden, sondern die Mah­ +nung gleich fertig für einen Fensterbriefumschlag herzustellen. Für +den Bediener bliebe die einzige Tätigkeit, diesen Vorgang anzuwer­ +fen. + Wie weiter oben schon erwähnt, können Sie diese Ausgaben von +EUDAS auch zur Textverarbeitung übernehmen. So können Sie zum +Beispiel die Literaturliste für ein Buch mit EUDAS führen und Aus­ +züge später jeweils an die passenden Stellen einfügen. + +#on("b")#Berechnungen#off("b")# Die Druckfunktion von EUDAS kann jedoch nicht +nur +zum Ausfüllen von Formularen verwendet werden. Wenn Sie Berech­ +nungen anstellen oder Auswertungen vornehmen wollen, können Sie +im Druckmuster auch Anweisungen der Sprache ELAN verwenden. +Damit haben Sie eine komplette Programmiersprache für Ihre Muster +zur Verfügung. + Ehe Sie einen Schreck bekommen: Selbst für komplizierte Muster +brauchen Sie nur einen ganz kleinen Teil von ELAN zu beherrschen, +da die meiste Arbeit immer von EUDAS übernommen wird (Sie müssen +also nicht etwa selber ein ganzes Programm schreiben). + Anwendungen für diese Möglichkeit gibt es genug. Angefangen +von einfachen Zählungen bis hin zu statistischen Auswertungen, +von einfachen Summen bis zum kompletten Rechnungsschreiben. +Immer nimmt Ihnen EUDAS alles das ab, was automatisch ablaufen +kann. Sie versorgen EUDAS nur noch mit den passenden Formeln für +Ihre Anwendung. + + +1.4 Grenzen + +Natürlich können Sie nicht alle Probleme mit EUDAS gleichermaßen +gut lösen. EUDAS verwendet ein einfaches Modell (Karteikasten) und +versucht, mit möglichst wenig Informationen von Ihrer Seite auszu­ +kommen. Kompliziertere Sachverhalte verlangen auch kompliziertere +Strukturen, die Sie dann selbst entwerfen müssen. Eine einfache +Lösung mit EUDAS kann in solchen Fällen zu langsam oder zu um­ +ständlich sein. + Wenn Sie jedoch die wenigen Strukturprinzipien von EUDAS +verstanden haben, werden Sie sehr schnell viele Probleme mit +EUDAS lösen können. Zuerst erfassen Sie einfach alle Daten, die Sie +brauchen und überlegen sich erst dann, in welcher Form Sie diese +Daten haben wollen. Auch nachträglich können Sie jederzeit noch +neue Daten und Formulare hinzufügen, so daß Sie mit der Zeit +EUDAS gewinnbringend für viele Routineaufgaben benutzen werden. + diff --git a/doc/eudas/eudas.hdb.10 b/doc/eudas/eudas.hdb.10 new file mode 100644 index 0000000..442f575 --- /dev/null +++ b/doc/eudas/eudas.hdb.10 @@ -0,0 +1,510 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (97)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +10 Datenabfrage am Bildschirm + + + +10.1 Feldauswahl + +Da die Anzahl der möglichen Felder bei EUDAS-Dateien viel größer +ist als die Anzahl der zur Verfügung stehenden Zeilen auf dem +Bildschirm (255 gegenüber 22), muß es eine Möglichkeit geben, auch +die übrigen Felder anzusehen. + +#on("b")#Rollen#off("b")# Dazu kann man den Bildschirmausschnitt in +vertikaler +Richtung #on("i")#rollen#off("i")#. Sie müssen sich die Bildschirmanzeige als einen +Ausschnitt des wirklichen Satzes vorstellen. Um weitere Inhalte des +Satzes zu sehen, verschieben Sie den Ausschnitt einfach. + Dazu dienen die beiden Tastenkombinationen ESC OBEN und ESC +UNTEN. Diese Kombinationen wirken nur im Menü "Einzelsatz". An +der Bildschirmanzeige ändert sich natürlich nur dann etwas, wenn +es noch weitere Felder zum Anzeigen gibt. + Ob dies der Fall ist, können Sie an zwei Indikatoren ablesen. +Zum einen wird hinter dem letzten Feld eine markierte Abschluß­ +zeile ausgegeben. Ist diese nicht sichtbar, gibt es noch Felder, die +Sie mit ESC UNTEN hochholen können. Zum anderen steht die Num­ +mer der ersten Zeile in der Überschrift. Ist diese Nummer größer als +1, können Sie mit ESC OBEN noch Felder sichtbar machen. + Das Rollen ist oft auch dann notwendig, wenn sich ein Feld +über mehrere Zeilen erstreckt. In diesem Fall kann es passieren, +daß die erste Zeile des Feldes nicht mehr sichtbar ist, da sie ober­ +halb des Anzeigebereichs liegen würde. + +#on("b")#Feldauswahl#off("b")# Eine weitere Möglichkeit bei zu vielen Feldern +be­ +steht darin, nur die interessanten Felder zur Anzeige auszuwählen. +Dies geschieht mit der Funktion +#free (0.2)# + + F Feldauswahl + +#free (0.2)# +Ihnen werden alle Felder zur Auswahl angeboten. Kreuzen Sie die +Felder an, die Sie sehen wollen und denken Sie daran, daß die Rei­ +henfolge des Ankreuzens beachtet wird. Anschließend werden Ihnen +nur die ausgewählten Felder angezeigt. Falls Sie kein Feld ankreu­ +zen, bleibt die alte Feldauswahl bestehen. + Wollen Sie wieder alle Felder sehen, müssen Sie diese nicht alle +einzeln ankreuzen. Mit HOP 'x' in der Auswahl werden alle Felder +angekreuzt (die noch nicht angekreuzt waren). Diese Tastenkombi­ +nation können Sie allgemein bei einer Auswahl verwenden. Sie +können die Kreuzchen mit 'o' auch wieder löschen, um zum Beispiel +"alle außer einem" auszuwählen. + Beachten Sie, daß die Auswahl der anzuzeigenden Felder nichts +mit der eigentlichen Dateistruktur zu tun hat, sondern nur für die +Anzeige gilt. Den Verarbeitungsfunktionen (zum Beispiel Drucken) +stehen natürlich nach wie vor alle Felder zur Verfügung. + Unvermutete Effekte können dann entstehen, wenn Sie bei +einer eingestellten Feldauswahl ändern oder einfügen. Die nicht +ausgewählten Felder werden beim Ändern natürlich nicht geändert +und beim Einfügen einfach leer gelassen. + + +10.2 Satzeditor + +An dieser Stelle sollen noch einige weitere Funktionen des Satz­ +editors vorgestellt werden, die Sie noch nicht kennengelernt haben. + +#on("b")#Rollen im Satzeditor#off("b")# Sie können auch rollen, wenn Sie sich +im +Satzeditor befinden (also beim Suchen, Einfügen und Ändern). Den­ +ken Sie daran, daß Sie die Einzelsatzanzeige immer mit ESC OBEN +und ESC UNTEN rollen, während sonst (Editor, Auswahl von Datei­ +namen) immer mit HOP OBEN und HOP UNTEN gerollt wird. + Diese Diskrepanz hat technische Gründe und läßt sich leider +nicht vermeiden. Wie Sie sich vielleicht erinnern, führt das Blättern +mit HOP OBEN und HOP UNTEN im Satzeditor dazu, daß die Korre­ +spondenz zwischen Feldnamen und Feldinhalt verlorengeht. Daher +muß an dieser Stelle mit ESC statt HOP gearbeitet werden. + +#on("b")#Ähnliche Sätze#off("b")# Wenn Sie mehrere ähnliche Sätze eintragen +müssen, +bietet Ihnen EUDAS eine Erleichterung an. Sie können nämlich beim +Einfügen die Daten eines anderen Satzes übernehmen. + Dazu müssen Sie beim Ändern oder Einfügen des anderen Satzes +ESC 'p' drücken. Der Inhalt des Satzes wird dann in einen Zwischen­ +speicher gebracht. Beachten Sie, daß im Gegensatz zum EUMEL- +Editor kein Text markiert sein muß, sondern immer der ganze Satz +transportiert wird. + Beim Einfügen eines neuen Satzes können Sie diesen Satz dann +mit ESC 'g' in den Satzeditor übernehmen. Alle vorherigen Inhalte +werden überschrieben. Anschließend können Sie die Daten nach +Wunsch abändern. + Der Inhalt des Zwischenspeichers kann beliebig oft auf diese +Weise kopiert werden. Der Inhalt des Zwischenspeichers wird bei +Ändern der Feldauswahl oder beim Öffnen einer neuen Datei ge­ +löscht. + +#on("b")#Tagesdatum#off("b")# Im Satzeditor können Sie mit ESC 'D' das +aktuelle +Tagesdatum abfragen. Es wird an der aktuellen Cursorposition ein­ +getragen, als ob Sie es selbst getippt hätten. + Auf diese Weise können Sie Sätze einfach mit Datum versehen +oder nach Sätzen suchen, die mit dem Tagesdatum in Beziehung +stehen (zum Beispiel 'Fälligkeit = Heute'). + + +10.3 Suchmuster + +Die bisher genannten Möglichkeiten des Suchmusters sind noch +etwas beschränkt. Eine Bedingung in unserer Adressendatei, die wir +im Suchmuster noch nicht ausdrücken können, wäre zum Beispiel: +Suche alle Adressen der Personen, die Wegner oder Simmern heißen. + Diese Alternative, Wegner ODER Simmern, kann nun in EUDAS +durch ein Komma ausgedrückt werden: + + + Name Wegner,Simmern + Vorname + + +Beachten Sie, daß hinter dem Komma kein Leerzeichen folgen darf, +wie Sie es vielleicht gewohnt sind, in einem Text zu schreiben. +EUDAS kann nämlich nicht unterscheiden, ob Sie das Leerzeichen +nur aus optischen Gründen geschrieben haben, oder ob Sie danach +suchen wollen. + +#on("b")#Lokale Alternative#off("b")# Die eben beschriebene +Konstruktionsmethode +heißt #on("i")#lokale Alternative#off("i")#. Lokal deshalb, weil Sie nur innerhalb +eines Feldes gilt. Was das bedeuten soll, sehen Sie, wenn Sie die +Bedingung mit einer weiteren Bedingung für ein anderes Feld kom­ +binieren: + + + Name Wegner,Simmern + Vorname + Strasse + PLZ 5* + Ort + + +Dieses Muster hat die Bedeutung: Wähle alle Personen namens Weg­ +ner oder Simmern aus, die im PLZ-Bereich 5 wohnen. Die beiden +Bedingungen für den Namen sind mit der Bedingung für die PLZ mit +UND verknüpft - das heißt, eine der beiden ersten Bedingungen muß +zutreffen #on("i")#und#off("i")# die untere Bedingung. Dieses UND ist global, da es +Bedingungen für verschiedene Felder miteinander verbindet. + Natürlich können Sie für mehrere Felder gleichzeitig lokale +Alternativen angeben. Eine anderes Suchmuster könnte zum Beispiel +so aussehen: + + + Name Wegner,Simmern + Vorname + Strasse + PLZ 5,5000 + Ort + + +In diesem Fall muß eine ausgewählte Person Wegner oder Simmern +heißen und in Köln wohnen. + +#on("b")#Globale Alternative#off("b")# Es wird nun aber für bestimmte +Situationen +noch eine andere Art von Alternativen benötigt. Als Beispiel soll +ein Suchmuster dienen, das folgende Bedingung ausdrückt. Gesucht +ist eine weibliche Person mit Namen Simmern oder eine männliche +Person mit Namen Wegner. + Dieser Fall läßt sich mit unseren bisherigen Mitteln nicht lö­ +sen. Es wird nämlich eine Alternative zwischen zwei zusammen­ +gesetzten Bedingungen gefordert. Als Ausweg bietet sich an, prak­ +tisch mehrere Suchmuster anzugeben, die dann mit ODER verknüpft +werden. + Um diese verschiedenen Suchmuster optisch am Bildschirm zu +kennzeichnen, wird ein Semikolon als sogenannte #on("i")#globale Alternati­ +ve#off("i")# verwendet. Das Semikolon trennt das Suchmuster quasi in ver­ +schiedene Spalten auf, die jeweils eine eigene Bedingung enthalten +können. Unser gewünschtes Suchmuster würde also so aussehen: + + + Name Wegner;Simmern + Vorname + Strasse + PLZ + Ort + m/w m;w + + +Ebenso wie bei lokalen Alternativen darf hinter dem Semikolon kein +Leerzeichen folgen. Daher kann das zweite Semikolon auch nicht +direkt unter dem ersten stehen. Die Spalten werden also einfach nur +durchgezählt: nach dem ersten Semikolon beginnt die zweite Spal­ +te, nach dem zweiten Semikolon die dritte usw. + In Zeilen, in denen keine Bedingungen stehen, kann auch das +Semikolon weggelassen werden. Es kann ebenfalls weggelassen wer­ +den, wenn die weiteren Spalten leer sind. Steht ein Semikolon direkt +am Anfang der Zeile, so ist die erste Spalte leer. + Um dies zu illustrieren, sei hier noch ein weiteres Beispiel +angegeben: + + + Name Wegner + Vorname ;Anna-Maria + Strasse + + +In diesem Fall muß eine ausgewählte Person mit Nachnamen Wegner +oder mit Vornamen Anna-Maria heißen. + +#on("b")#Stern#off("b")# Bis jetzt haben Sie hauptsächlich Bedingungen +betrachtet, +die exakt zutreffen mußten. Sie wissen aber bereits, daß man auch +Bedingungen angeben kann, bei denen nur ein Teil des zu suchen­ +den Feldes bekannt ist, nämlich indem der unbekannte Teil mit +einem Stern markiert wird. + In Kapitel 5 haben Sie gelernt, daß der Stern nur am Anfang +und Ende des Musters stehen kann. Dies trifft nicht ganz zu, denn +Sie können den Stern auch inmitten eines Textes anwenden. So +trifft die Bedingung 'Si*n' auf alle Namen zu, die mit 'Si' beginnen +und mit 'n' enden. + Beachten Sie hier das "und" in der Formulierung der Bedingung. +Das Muster ist eigentlich eine Schreibweise für zwei Bedingungen +für ein Feld, die mit UND verknüpft sind. + Sie können auch noch weitere Sterne in das Muster aufnehmen. +Dabei gibt es jedoch eine Kleinigkeit zu beachten. Das Muster +'*x*y*' bedeutet: das Feld muß ein 'x' und ein 'y' enthalten. Über +die Reihenfolge der beiden Zeichen ist jedoch in dieser Bedingung +nichts gesagt, obwohl es vielleicht vom Aussehen suggeriert wird. + Denken Sie daran, keine zwei Sterne nebeneinander zu schrei­ +ben - eine solche Bedingung hätte keinen Sinn. + Es gibt eine weitere spezielle Bedingung, die mit Hilfe des +Sterns formuliert wird. Ein einzelner Stern bedeutet nämlich: Das +Feld ist nicht leer. Beachten Sie den kleinen Unterschied: ein Stern +in einem Muster kann für einen beliebigen Text stehen, der auch +leer sein kann. Ein einzelner Stern jedoch steht für einen beliebigen +Text, der nicht leer ist. + Damit Sie ein Gefühl für die Verwendung des Sterns bekommen, +hier noch ein paar Beispiele: + + +Mei*r* + + Der Name beginnt mit 'Mei' und enthält ein 'r'. Trifft zu auf + 'Meier', 'Meiring', aber nicht auf 'Meiling' oder 'Merzei'. + + +Donau*dampf*schiff*schaft + + Feld beginnt mit 'Donau', endet mit 'schaft' und enthält + 'dampf' und 'schiff'. Trifft zu auf 'Donaudampfschiffahrtsge­ + sellschaft', aber auch auf 'Donaugesellschiffdampffahrtschaft'. + + +Roller*erfahren + + Dieses Muster muß man ganz genau interpretieren. Es bedeutet: + der Inhalt beginnt mit 'Roller' und endet mit 'erfahren'. Das + Muster trifft nicht nur auf 'Roller erfahren' sondern auch auf + 'Rollerfahren' zu. Der Stern verliert also in diesem Fall seine + symbolische Bedeutung als Platzhalter für einen bestimmten + Text. + +#on("b")#Vergleiche#off("b")# Es gibt in EUDAS noch weitere Muster, die +einen gan­ +zen Bereich von Werten auswählen. Diese betreffen Bedingungen der +Art "größer als" und "kleiner als". Solche Vergleichsbeziehungen +werden durch zwei Punkte dargestellt. + So wählt das Muster 'K..' alle Felder aus, die in der alphabe­ +tischen Reihenfolge hinter 'K' liegen, wobei das 'K' selbst mit ein­ +geschlossen ist. Umgekehrt trifft '..K' auf alle Felder zu, die davor +liegen. + Sie können beide Bedingungen auch kombinieren. So trifft die +Bedingung 'A..K' auf alle Felder zu, die im Lexikon unter 'A' bis +'J' erscheinen (die Felder mit 'K' sind hier ausgeschlossen). Beach­ +ten Sie, daß die direkte Kombination wieder die Verknüpfung zweier +einzelner Bedingungen mit UND darstellt. + +#on("b")#Negation#off("b")# Um den Bereich möglicher Suchmuster noch zu +erweitern, +können Sie einzelne Bedingungen auch noch verneinen. Dies ge­ +schieht durch Voranstellen zweier Minuszeichen. So bedeutet das +Muster '--Meier', daß alle Personen ausgewählt werden, die nicht +Meier heißen. + Die Verneinung bezieht sich immer auf das unmittelbar folgende +Muster (bis zum nächsten Komma, Semikolon oder dem Zeilenende) +und nicht etwa auf eine ganze Zeile. Sie umfaßt jedoch die UND- +Verknüpfung der kombinierten Bedingungen. So sind zum Beispiel die +Muster '--E..M', '--E..,--..M' und '..E,M..' völlig gleichbedeu­ +tend. + +#on("b")#Feldvergleich#off("b")# Als letztes haben Sie im Suchmuster auch +noch die +Möglichkeit, ein Feld mit anderen Feldern des gleichen Satzes zu +vergleichen. Bisher hatten Sie ein Feld ja immer nur mit konstanten +Texten verglichen. + Um dies zu erreichen, geben Sie statt eines Vergleichstextes +den Feldnamen des Feldes an, mit dem Sie vergleichen wollen. Zur +Kennzeichnung müssen Sie dem Namen noch ein '&' voranstellen. +Diese Konstruktion funktioniert mit allen bisher besprochenen Ver­ +gleichen. Beispielsweise trifft + + + Feld1 ..&Feld2 + + +auf alle Sätze zu, in denen der Inhalt von Feld1 kleiner ist als der +Inhalt von Feld2. + Im Gegensatz zum Druckmuster dürfen in den Feldnamen zwar +Leerzeichen enthalten sein, nicht jedoch +#free (0.2)# + + .. * , ; + +#free (0.2)# +da diese Zeichen als reservierte Zeichen gelten und jeweils als +Begrenzer wirken. Die gleiche Beschränkung gilt dementsprechend +auch für konstante Vergleichstexte. + Beachten Sie, daß hinter dem '&' bis zum nächsten Begrenzer­ +zeichen ein gültiger (vorhandener) Feldname stehen muß. Anderen­ +falls wird der Text als konstantes Muster betrachtet. + Wie schon oben gesagt, kann der Feldvergleich mit allen Ver­ +gleichen verwendet werden. Auch gemischte Konstruktionen sind +zulässig, beispielsweise + + + Feld1 A..&Feld3,*&Feld9* + + +Diese Bedingung trifft zu, wenn Feld1 größer oder gleich 'A', aber +kleiner als der Inhalt von Feld3 ist, oder wenn der Inhalt von Feld9 +darin vorkommt. + +#on("b")#Optimierung#off("b")# Hier noch eine Bemerkung zur Geschwindigkeit +des +Suchens. Je mehr Bedingungen Sie angeben, desto mehr Vergleiche +müssen beim Suchen angestellt werden und desto länger dauert es. + Das erste Feld einer Datei erfährt jedoch eine Sonderbehand­ +lung. Wenn Sie für dieses Feld ein Muster für Übereinstimmung +angeben, kann der Suchvorgang enorm beschleunigt werden, da das +erste Feld einer Datei intern speziell verwaltet wird. Damit das +Verfahren funktioniert, dürfen keine globalen Alternativen oder +lokale Alternativen für das erste Feld verwendet werden. + Diese Suchoptimierung sollten Sie bereits beim Einrichten einer +Datei berücksichtigen. Geben Sie als erstes Feld das an, nach dem +am ehesten direkt gesucht wird. Typisches Beispiel hierfür ist der +Nachname, aber auch Artikelnummern sind sinnvoll. Wichtig ist, daß +das erste Feld nicht zu oft identisch ist und auch mehr als zwei +Buchstaben enthält, damit die Optimierung ihre volle Wirksamkeit +entfaltet. + Denken Sie daran, daß durch die Feldauswahl ein beliebiges +Feld als erstes auf dem Bildschirm stehen kann. Für die Optimierung +wird jedoch immer das Feld betrachtet, das beim Einrichten der +Datei als erstes angegeben wurde. + + +10.4 Markieren + +Manchmal entsteht die Situation, daß Sie eine Reihe von Sätzen +bearbeiten wollen, aber keine Suchbedingung formulieren können, +die auf alle diese Sätze zutrifft. In diesem Fall bietet EUDAS Ihnen +die Möglichkeit, solche Sätze von Hand zu markieren. + Ein Beispiel: Sie haben eine ganze Reihe von Sätzen geändert +und wollen diese Änderungen als Protokoll ausdrucken. Es läßt sich +aber nicht mit Hilfe eines Suchmusters feststellen, welche Sätze +geändert wurden. + Als Abhilfe wählen Sie bei jedem geänderten Satz die Funktion +#free (0.2)# + + M Markierung + +#free (0.2)# +Dadurch wird der bisher unmarkierte Satz markiert. Dies wird +kenntlich an der Anzeige 'MARK+' in der Überschrift. Sobald Sie den +ersten Satz markiert haben, erscheint bei jedem Satz, ob er markiert +ist oder nicht. + Haben Sie einen Satz irrtümlich markiert, können Sie die Mar­ +kierung mit der gleichen Funktion auch wieder entfernen. + Alle Funktionen, die bisher die durch das Suchmuster ausge­ +wählten Sätze bearbeitet haben, arbeiten nun nur noch auf den +markierten Sätzen. Somit können Sie anschließend mit der Druck­ +funktion die gewünschten Sätze drucken. Die Markierung hat also +Priorität über die eingestellte Suchbedingung. Lediglich die Bewe­ +gung am Bildschirm beachtet immer nur die Suchbedingung. + Sie können alle Markierungen der Datei mit der Funktion +#free (0.2)# + + Alle Markier. + L Löschen + +#free (0.2)# +im Menü 'Gesamtdatei' wieder entfernen. Anschließend wird beim +Drucken wieder das Suchmuster beachtet. Die Markierungen ver­ +schwinden auch, wenn eine neue Datei geöffnet wird. Die Markie­ +rungen sind also nicht permanent in einer Datei gespeichert, son­ +dern existieren nur, während die Datei geöffnet ist. + Bei Koppeldateien können Sie aus technischen Gründen immer +nur alle Kombinationen auf einmal markieren. Die Markierung einer +Kombination markiert auch alle anderen Kombinationen des gleichen +Satzes. + + +10.5 Übersicht + +Wie Sie bisher gesehen haben, zeigte EUDAS immer einen einzigen +Satz in dem Standardformular auf dem Bildschirm. Es gibt jedoch +auch eine Möglichkeit, mehrere Sätze gleichzeitig zu betrachten. +Dazu dient die Funktion +#free (0.2)# + + U Übersicht + +#free (0.2)# +im Menü 'Gesamtdatei'. + In der Übersicht nimmt jeder Satz nur eine Bildschirmzeile in +Anspruch. Die Feldinhalte werden, durch Komma getrennt, in der +Zeile nacheinander aufgezählt, bis kein Platz mehr vorhanden ist. +Am Anfang jeder Zeile steht die Satznummer und ob der jeweilige +Satz markiert ist (entweder '+' für markiert oder '-'). In der Über­ +schrift stehen in gleicher Weise die Feldnamen angegeben. + Der aktuelle Satz wird innerhalb der Übersichtsanzeige immer +durch eine inverse Satznummer dargestellt. Es werden nur die durch +das eingestellte Suchmuster ausgewählten Sätze gezeigt. Trifft die +Selektionsbedingung nicht auf den aktuellen Satz zu, wird an seiner +Stelle zur Information ein leerer Platzhalter angezeigt. Hinter dem +letzten Satz wird auch das Dateiende als besonders gekennzeichne­ +ter Satz angegeben. + +___________________________________________________________________________________________ + + ÜBERSICHT: Blättern: HOP OBEN, HOP UNTEN Ende: ESC q Hilfe: ESC ? + Satznr. Name, Vorname, PLZ, Ort, Strasse, m/w, + 1 - Wegner, Herbert, Krämergasse 12, 5000, Köln, m, + 2 - Sandmann, Helga, Willicher Weg 109, 5300, Bonn 1, w, + 3 - Katani, Albert, Lindenstr. 3, 5210, Troisdorf, m, + 4 - Ulmen, Peter, Mozartstraße 17, 5, Köln 60, m, + 5 - Regmann, Karin, Grengelweg 44, 5000, Köln 90, w, + 6 - Arken, Hubert, Talweg 12, 5200, Siegburg, m, + 7 - Simmern, Anna-Maria, Platanenweg 67, 5, Köln 3, w, + 8 - Kaufmann-Drescher, Angelika, Hauptstr. 123, 53, Bonn 2, w, + 9 - Fuhrmann, Harald, Glockengasse 44, 5000, Köln 1, m, + 10 - Seefeld, Friedrich, Kabelgasse, 5000, Köln-Ehrenfeld, m, + 11 - << DATEIENDE >> + +___________________________________________________________________________________________ + + +#center#Abb. 10-1 Übersicht + + +#on("b")#Feldauswahl#off("b")# Wenn Sie die Funktion aufrufen, haben Sie +zuerst +noch die Möglichkeit, nur einen Teil der vorhandenen Felder zur +Anzeige auszuwählen. Dazu bejahen Sie die Frage und können dann +die Felder in der gewünschten Reihenfolge ankreuzen. Analog zur +Funktion 'Feldauswahl' wird auch hier die zuletzt für die Übersicht +verwendete Feldauswahl beibehalten, wenn Sie die Frage verneinen +oder kein Feld ankreuzen. Die Feldauswahl für die Übersicht ist +unabhängig von der Feldauswahl für die normale Satzanzeige. + Von der Möglichkeit zur Feldauswahl sollten Sie Gebrauch ma­ +chen, denn durch die komprimierte Darstellung der Übersicht kann +meistens nur ein kleiner Teil eines Satzes dargestellt werden. + +#on("b")#Rollen#off("b")# Nachdem die Sätze auf dem Bildschirm erschienen +sind, +haben Sie wieder die Möglichkeit, die Darstellung zu rollen. Dazu +können Sie die Pfeiltasten OBEN und UNTEN sowie die Tastenkombi­ +nationen HOP OBEN und HOP UNTEN verwenden. Diese Funktionen +verschieben den invers dargestellten aktuellen Satz und funktio­ +nieren wie im Editor. Beachten Sie auch hier wieder den Unterschied +zum Rollen in der Einzelsatzanzeige. + Das Rollen wirkt wie ein Positionieren mit 'Weiter' oder 'Zu­ +rück'. Nach der Rückkehr aus der Übersicht können Sie sich also an +einer ganz anderen Stelle in der Datei befinden. + Es stehen Ihnen zum Rollen auch noch die folgenden Tasten­ +kombinationen zur Verfügung (wie im Editor): HOP RETURN macht +den aktuellen Satz zum ersten auf der Seite. ESC '1' zeigt den er­ +sten Satz der Datei, ESC '9' analog dazu den letzten. + Wenn Sie eine komplizierte Suchbedingung eingestellt haben +und EUDAS viele Sätze erfolglos überprüfen muß, dauert der Bild­ +aufbau natürlich entsprechend lange. EUDAS gibt zu Ihrer Informa­ +tion aber immer die Nummer des Satzes aus, der gerade überprüft +wird. Außerdem werden Tastenbefehle nach jeder Zeile angenommen, +so daß Sie schon weiterblättern können, wenn Sie den ersten Satz +gesehen haben. + +#on("b")#Markieren#off("b")# In der Übersicht können Sie auch Sätze +markieren. Mit +'+' markieren Sie den aktuellen Satz; mit '-' entfernen Sie die Mar­ +kierung wieder. So können Sie einfach die Sätze ankreuzen, die Sie +später bearbeiten wollen. + +#on("b")#Verlassen#off("b")# Mit ESC 'q' können Sie die Übersicht wieder +verlassen, +auch mitten beim Aufbau des Bildes. Haben Sie erkannt, daß EUDAS +sinnlos mit einer falschen Suchbedingung sucht, können Sie die +Funktion auch mit ESC 'h' (Halt) abbrechen und gegebenenfalls ein +neues Suchmuster einstellen. + diff --git a/doc/eudas/eudas.hdb.11 b/doc/eudas/eudas.hdb.11 new file mode 100644 index 0000000..6a59847 --- /dev/null +++ b/doc/eudas/eudas.hdb.11 @@ -0,0 +1,674 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (109)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +11 Funktionen zur Bearbeitung + + + +11.1 Sortieren + +Wenn Sie die Sätze in Ihrer EUDAS-Datei in einer bestimmten Rei­ +henfolge haben wollen (dies wird in vielen Fällen zum Drucken +verlangt), müssen Sie die Datei sortieren. Sie können EUDAS ange­ +ben, in welcher Reihenfolge die Sortierung erfolgen soll. Um die +aktuelle Datei zu sortieren, rufen Sie die Funktion +#free (0.2)# + + Akt. Datei + S Sortieren + +#free (0.2)# +auf. Falls die Datei noch nie sortiert wurde, wird Ihnen auf jeden +Fall die Sortierreihenfolge zum Auswählen angeboten. Anderenfalls +werden Sie gefragt, ob Sie die vorherige Sortierreihenfolge ändern +wollen. + Das Sortieren wird als Veränderung betrachtet und nur auf der +Arbeitskopie durchgeführt! + +#on("b")#Sortierreihenfolge#off("b")# Die Sortierreihenfolge gibt an, welche +Felder in +welcher Reihenfolge beim Vergleichen zweier Sätze benutzt werden +sollen. Zuerst wird das an erster Stelle angegebene Feld verglichen. +Sind die Inhalte hier unterschiedlich, wird die Einordnung der Sätze +nach diesem Feld bestimmt. + Sind die Inhalte in diesem Feld aber gleich, so wird nach dem +nächsten Feld verglichen. Ist kein weiteres Feld in der Sortierrei­ +henfolge angegeben, wird der Vergleich an dieser Stelle mit einem +zufälligen Ergebnis abgebrochen, das heißt, es kann nicht vorher­ +gesagt werden, welcher der beiden Sätze zuerst kommt. + Die Sortierreihenfolge können Sie in einer Menüauswahl einge­ +ben. Kreuzen Sie die Felder an, die Sie vergleichen wollen und ach­ +ten Sie auf die richtige Reihenfolge. Die eingegebene Reihenfolge +wird in der Datei gespeichert, um beim nächsten Sortiervorgang +wiederverwendet zu werden. + Nachdem Sie alle bei der Sortierung zu berücksichtigenden +angekreuzt haben, werden Sie für jedes dieser Felder gefragt, ob +nach dem Feld aufsteigend oder absteigend sortiert werden soll. + +#on("b")#Ablauf#off("b")# Der Ablauf des Sortierens wird durch Ausgabe von +Satz­ +nummern dargestellt. Bis zur ausgegebenen Satznummer sind alle +Sätze richtig sortiert. Bei Bedarf kann der Vorgang durch SV und +dann 'halt' abgebrochen werden. Die Datei bleibt dabei auf jeden +Fall intakt. + +#on("b")#Optimierung#off("b")# Die gespeicherte Sortierreihenfolge wird auch +noch zu +einer weiteren Optimierung benutzt. Wenn eine Datei sortiert war +und nur wenige Änderungen stattgefunden haben, brauchen beim +nächsten Sortiervorgang nur die wenigen veränderten Sätze einzeln +einsortiert zu werden. Das funktioniert natürlich nur unter der +Voraussetzung, daß die gleiche Sortierreihenfolge gewählt wird. Das +Sortieren braucht in diesem Fall erheblich weniger Zeit. + +#on("b")#Probleme#off("b")# Normalerweise werden die einzelnen Felder nach +dem +EUMEL-Zeichencode verglichen. Das bedeutet, daß sich die Reihen­ +folge der Zeichen nach dem EUMEL-Zeichencode richtet. Ein Zeichen +mit einem höheren Code wird also vor einem Zeichen mit einem +niedrigeren Code einsortiert. + In manchen Fällen ergeben sich mit diesem Vergleichsverfahren +aber auch Schwierigkeiten. Wenn in einem Feld Zahlen oder DM- +Beträge stehen, führt die Methode zu falschen Ergebnissen. Die '10' +wird zum Beispiel vor der '2' einsortiert. Warum? Texte werden +immer linksbündig geschrieben und verglichen. Bei Zahlen richtet +sich die Wertigkeit jedoch nach dem Abstand vom Komma. + Da bei Texten zuerst das erste Zeichen verglichen wird, ent­ +steht hier durch Vergleich von '1' und '2' der Eindruck, die '10' +käme vor der '2'. Korrigieren könnte man dies, indem man ein Leer­ +zeichen vor die '2' schreibt. Wenn also die (nicht geschriebenen) +Dezimalkommata direkt untereinanderstehen, werden Zahlen richtig +verglichen. + +#on("b")#Typ ZAHL#off("b")# EUDAS hat jedoch eine bequemere Art, dieses +Problem zu +behandeln. Ein Feld, das Zahlen enthalten soll, bekommt einen spe­ +ziellen Typ ZAHL zugewiesen, der zu einer richtigen Sortierung +führt. + Bei Feldern vom Typ ZAHL ignoriert EUDAS bei Vergleichen alle +nichtnumerischen Zeichen und vergleicht den Wert der Zahl. So +können Sie zum Beispiel in einem Satz '2,50 DM' und im anderen +Satz '10 DM' eintragen - EUDAS kann jetzt die richtige Reihenfolge +feststellen. + Übrigens: falls Sie numerische Werte lieber mit einem Dezi­ +malpunkt statt einem Dezimalkomma schreiben, können Sie EUDAS +das mit dem ELAN-Kommando + + + dezimalkomma (".") + + +mitteilen. Wenn Sie ein solches Kommando eingeben wollen, können +Sie im EUDAS-Menü ESC ESC drücken. In der Statuszeile erscheint +dann die Aufforderung: + + + Gib Kommando: + + +Hier können Sie wie im Editor oder im EUMEL-Monitor ein beliebiges +Kommando eingeben und ausführen. + Die Normaleinstellung für das Dezimalkomma erreichen Sie +wieder durch das Kommando + + + dezimalkomma (",") + + + +#on("b")#Typ ändern#off("b")# Die Feldtypen sind eine permanente Eigenschaft +einer +EUDAS-Datei. Beim Einrichten einer neuen Datei wird zunächst der +Standardtyp für alle Felder genommen. Sie erhalten jedoch Gelegen­ +heit, abweichende Feldtypen zu vergeben, wenn Sie die Frage + +___________________________________________________________________________________________ + + Feldnamen oder Feldtypen ändern (j/n) ? +___________________________________________________________________________________________ + + +bejahen. + Auch nachträglich können Sie die Feldtypen noch ändern. Dies +geschieht mit der Funktion +#free (0.2)# + + F Feldstrukt. + +#free (0.2)# +im Menü 'Öffnen'. Zunächst werden Sie gefragt, ob Sie noch weitere +Feldnamen anfügen wollen. So könnten Sie die Datei um weitere +Felder ergänzen, die bei allen Sätzen zunächst leer sind. Die neuen +Felder müssen Sie wie beim Einrichten der Datei untereinander im +Editor schreiben. + Als zweites erscheint dann die gleiche Frage wie oben. Wenn +Sie diese bejahen, wird Ihnen eine Auswahl der zu ändernden Fel­ +der mit Feldnamen und den zugehörigen Feldtypen angeboten. Kreu­ +zen Sie hier die Felder an, deren Feldtypen Sie ändern möchten. + Da Sie mit dieser Funktion sowohl Feldnamen als auch Feld­ +typen verändern können, wird Ihnen für jedes Feld zunächst der +Name zum Ändern angeboten. Sie können den Namen korrigieren oder +überschreiben. Die Namensänderung hat jedoch keine Auswirkung +auf den Feldinhalt! + Wenn Sie den Namen nicht ändern wollen, drücken Sie einfach +RETURN. Anschließend können Sie für das Feld den neuen Feldtyp +angeben. Tippen Sie einen der vier Feldtypen als Text ein und +drücken Sie RETURN. Anschließend hat das Feld einen neuen Typ. +Die verschiedenen möglichen Typen werden jetzt genau erklärt. + +#on("b")#Feldtypen#off("b")# TEXT ist der Standardtyp, der die Feldinhalte +nach +EUMEL-Zeichencode vergleicht. Den Typ ZAHL hatten wir schon +weiter oben kennengelernt. Daneben gibt es noch den Typ DATUM. + Dieser Typ vergleicht Daten der Form 'tt.mm.jj'. Soll ein sol­ +ches Datum richtig einsortiert werden, müßte es anderenfalls in der +Reihenfolge umgedreht werden (also 'jj.mm.tt'). Dies ist aber nicht +nötig, wenn das Feld den Typ DATUM bekommt. Beachten Sie, daß +alle Inhalte, die nicht die beschriebene Form haben, als gleich be­ +trachtet werden. + Der letzte Typ ist DIN. Dabei werden Texte nach DIN 5007 ver­ +glichen. Das bedeutet, daß Groß- und Kleinbuchstaben als gleich +angesehen werden, daß alle nichtalphabetischen Zeichen ignoriert +werden und die Umlaute ihren richtigen Platz bekommen (Umlaute +werden in normalen Texten hinter allen anderen Zeichen einsor­ +tiert). Da hierfür ein relativ großer Zeitaufwand notwendig ist, +sollte dieser Typ nur dann gewählt werden, wenn er erforderlich ist. +Den schnellsten Vergleich ermöglicht der Typ TEXT. + +#on("b")#Hinweis#off("b")# Beachten Sie, daß mit der Vergabe von Feldtypen +keine +Überprüfung der Eingabe verbunden ist. Insbesondere beim Datum +wird nicht geprüft, ob die Form 'tt.mm.jj' eingehalten wurde. Wollen +Sie solche Überprüfungen vornehmen, lesen Sie bitte Abschnitt 11.3. + + +11.2 Kopieren + +In diesem Abschnitt sollen Sie erfahren, wie Sie eine EUDAS-Datei +#on("i")#kopieren#off("i")# können. Diese Funktion kann nicht nur ein inhaltsgleiches +Duplikat einer EUDAS-Datei herstellen (dies könnten Sie einfacher +durch eine logische Kopie bewerkstelligen, s. 16.1), sondern auch +komplizierte Umstrukturierungen vornehmen. + +#on("b")#Kopiermuster#off("b")# Der Schlüssel zu dieser Leistungsfähigkeit +ist das +#on("i")#Kopiermuster#off("i")#. Wie beim Druckmuster legen Sie dadurch die genauen +Auswirkungen der Funktion fest. + Für jedes Feld in der Zieldatei, in die kopiert werden soll, +enthält das Kopiermuster die Angabe, woraus der Inhalt dieses +Feldes entstehen soll. Durch Auswahl und Reihenfolge dieser Anga­ +ben bestimmen Sie die Struktur der Zieldatei. + Im einfachsten Fall sieht die Kopieranweisung für ein Feld wie +folgt aus: + + + "Feldname" K f ("Feldname"); + + +Das 'K' dient zur Festlegung der Kopierfunktion. Auf der linken +Seite steht in Anführungsstrichen der Name des Zielfeldes. Der +Ausdruck auf der rechten Seite gibt den zukünftigen Inhalt des +Feldes an. Der Ausdruck im obigen Beispiel steht einfach für den +Inhalt des Feldes 'Feldname' in der aktuellen Datei. Das Semikolon +am Ende dient zur Abgrenzung, da der ganze Ausdruck auch mehrere +Zeilen lang sein darf. + In der oben genannten Form würde das Feld 'Feldname' iden­ +tisch in die Zieldatei kopiert. Weitere Möglichkeiten besprechen wir +später. + +#on("b")#Feldreihenfolge#off("b")# Zunächst wollen wir uns damit befassen, +wie Sie +die Feldreihenfolge in der Zieldatei beeinflussen können. Dies ge­ +schieht einfach dadurch, daß Sie die Kopieranweisungen in der ge­ +wünschten Reihenfolge aufschreiben. Damit können wir bereits ein +erstes komplettes Beispiel betrachten: + + + "Name" K f ("Name"); + "Vorname" K f ("Vorname"); + "PLZ" K f ("PLZ"); + "Ort" K f ("Ort"); + "Strasse" K f ("Strasse"); + "m/w" K f ("m/w"); + + +Dieses Kopiermuster würde die bereits beschriebene Adressendatei +identisch kopieren, da alle Felder in der gleichen Reihenfolge vor­ +kommen. + Wenn Sie jedoch die Feldreihenfolge ändern wollen (um zum +Beispiel ein anderes Feld als erstes zu optimieren), brauchen Sie +bloß die Reihenfolge im Kopiermuster zu verändern: + + + "Ort" K f ("Ort"); + "Name" K f ("Name"); + "Vorname" K f ("Vorname"); + "PLZ" K f ("PLZ"); + "Strasse" K f ("Strasse"); + "m/w" K f ("m/w"); + + +Im Gegensatz zur Auswahl der Feldreihenfolge für die Anzeige än­ +dern Sie so die Feldreihenfolge für die Zieldatei permanent. + +#on("b")#Felder anfügen#off("b")# Die beiden angegebenen Kopiermuster haben +jedoch +nur dann die beschriebene Wirkung, wenn die Zieldatei noch nicht +existert. Bei einer existierenden Datei kann die Feldreihenfolge +nicht mehr geändert werden; daher hat die Reihenfolge der Kopier­ +anweisungen dann keine Wirkung. + Sie können jedoch zu einer existierenden Zieldatei noch Felder +hinzufügen. EUDAS verwendet nämlich folgende einfache Vorschrift: + +#limit (12.0)# + Wenn als Zielfeld in einer Kopieranweisung ein Feld + genannt wird, das in der Zieldatei noch nicht vorkommt, + wird es als weiteres Feld der Zieldatei hinzugefügt. +#limit (13.5)# + +Diese Strategie hat im Fall der nicht existierenden Datei zur Folge, +daß alle Felder neu sind und in der Reihenfolge ihres Auftretens +eingerichtet werden. Existiert die Datei schon, werden zusätzliche +Felder am Ende angefügt. + Beachten Sie, daß zusätzliche Felder für eine existierende +Datei nur in den neu hinzukopierten Sätzen gefüllt sind. In den +alten Sätzen bleiben alle neuen Felder einfach leer. + +#on("b")#Satzauswahl#off("b")# An dieser Stelle sollte erwähnt werden, daß +wie bei +allen Funktionen, die die gesamte Datei betreffen, nur die durch die +Suchbedingung ausgewählten Sätze kopiert werden. Ist mindestens +ein Satz markiert, werden nur die markierten Sätze kopiert und die +Suchbedingung ignoriert. + +#on("b")#Teildatei#off("b")# Jetzt können Sie auch die zweite wichtige +Aufgabe des +Kopierens verstehen. Sie können aus einer Datei einen Teil der +Sätze und einen Teil der Felder #on("i")#herausziehen#off("i")#. Danach haben Sie +unter Umständen eine wesentlich kleinere Datei, die sich auch +schneller bearbeiten läßt. Gerade wenn Sie nicht den allerneuesten +64-Bit-Supercomputer haben, können Sie so viel Zeit sparen, wenn +Sie wiederholt nur mit einem Teil der Datei arbeiten müssen. + Die Auswahl der Sätze für einen solchen Zweck erfolgt über ein +Suchmuster; im Kopiermuster geben Sie dann nur die gewünschten +Felder an. + +#on("b")#Aufruf#off("b")# An dieser Stelle wollen wir jetzt endlich +behandeln, wie +Sie die Kopierfunktion aufrufen. Dazu gibt es die Auswahl +#free (0.2)# + + Satzauswahl + K Kopieren + +#free (0.2)# +im Menü "Gesamtdatei". Als erstes werden Sie nach dem Namen der +Zieldatei gefragt. Existiert die Zieldatei schon und war sie vorher +sortiert, werden Sie gefragt, ob Sie die Datei zum Schluß wieder +sortieren wollen. Wie immer beim Sortieren werden auch hier gege­ +benenfalls nur die neu hinzugekommenen Sätze einsortiert. + Als nächstes müssen Sie den Namen des Kopiermusters angeben. +Da das Kopiermuster eine normale Textdatei ist, können Sie sich +einen beliebigen Namen ausdenken, unter dem das Muster dann +gespeichert wird. + Wollen Sie das Kopiermuster nicht aufbewahren, sondern nur +einmal verwenden, brauchen Sie keinen Namen anzugeben. Drücken +Sie einfach RETURN und für die Dauer des Kopierens wird das +Kopiermuster als unbenannte Datei eingerichtet. + Nachdem Sie den Namen des Kopiermusters eingegeben haben, +gelangen Sie in den Editor, wo Sie das Muster ändern können. Damit +Sie beim ersten Mal nicht so viel tippen müssen, bietet EUDAS Ihnen +bei einer neuen Musterdatei ein #on("i")#Standard-Kopiermuster#off("i")# zum Ändern +an. Das Aussehen des Standard-Kopiermusters richtet sich danach, +ob die Zieldatei schon existiert oder nicht. + Existiert die Zieldatei noch nicht, so werden im Standard- +Kopiermuster alle Felder der Ausgangsdatei in ihrer originalen Rei­ +henfolge angegeben. Wenn Sie dieses Muster nicht noch ändern, wird +die aktuelle Datei identisch kopiert. + Sie können jedoch die Feldreihenfolge verändern oder Felder +weglassen, indem Sie einfach die entsprechenden Zeilen vertauschen +oder löschen. Für Umbenennungen überschreiben Sie einfach den +Namen auf der linken Seite der Kopieranweisung. So können Sie das +Kopiermuster mit geringstem Aufwand erstellen. + Existiert die Zieldatei jedoch schon, werden Ihnen im Kopier­ +muster alle Felder der Zieldatei angeboten. Bei Feldern, die in der +aktuellen Datei nicht vorkommen, erscheint folgende Anweisung: + + + "Anrede" K ""; + + +Obwohl die Anweisung in diesem Fall keine Wirkung hat (wenn man +sie wegließe, würde das Feld ebenfalls leer bleiben), ist sie dennoch +aufgeführt, damit Sie auf der rechten Seite einen entsprechenden +Ausdruck einsetzen können. + Bei den angebotenen Anweisungen hat eine Änderung der Rei­ +henfolge oder eines Feldnamens keinen Sinn, da diese Felder ja alle +bereits existieren. Jedoch können Sie die Ausdrücke auf der rechten +Seite variieren und neue Anweisungen (Felder) hinzufügen. + +#on("b")#Ablauf#off("b")# Wenn Sie die Eingabe des Kopiermusters mit ESC 'q' +verlas­ +sen, wird das Kopiermuster übersetzt. Dabei können Fehlermeldun­ +gen auftreten. Sie können dann die Fehler korrigieren, wobei Sie die +Fehlermeldungen gleichzeitig auf dem Bildschirm sehen können. War +das Kopiermuster korrekt, werden alle ausgewählten (bzw. markier­ +ten) Sätze der aktuellen Datei in die Zieldatei kopiert und diese +anschließend gegebenenfalls noch sortiert. + Die kopierten Sätze werden jeweils am Ende der Zieldatei ange­ +fügt. War die Zieldatei vorher schon sortiert, können Sie angeben, +daß die neuen Sätze zum Schluß noch einsortiert werden. Anderen­ +falls können Sie die Datei anschließend mit der Funktion 'Sortieren' +sortieren. + +#on("b")#ELAN-Ausdrücke#off("b")# Wenn Sie schon einmal programmiert haben, +wird +Ihnen vielleicht aufgefallen sein, daß ein Kopiermuster einem +ELAN-Programm verdächtig ähnlich sieht. Diese Vermutung trügt Sie +nicht. Dies läßt den Schluß zu, daß Sie noch mehr ELAN hier an­ +bringen können. + Haben Sie noch nie programmiert, sollten Sie jetzt nicht in +Panik geraten, denn das Wichtigste dieses Abschnitts haben Sie +bereits gelernt. Vielleicht sind Ihnen die folgenden Beispiele bereits +ganz nützlich. Um alle Möglichkeiten auszunutzen, sollten Sie sich +aber irgendwann (später!) mit den Kapiteln 14 und 15 befassen, in +denen Sie Genaueres erfahren. + Zunächst sei festgestellt, daß der rechte Teil einer Kopieran­ +weisung ein beliebiger ELAN-Ausdruck sein kann, der einen TEXT +liefert. Den wichtigsten Ausdruck kennen Sie bereits: + + + f ("Feldname") + + +liefert den Inhalt des Feldes 'Feldname' des aktuellen Satzes der +aktuellen Datei. Gibt es das Feld nicht, erscheint eine Fehlermel­ +dung bei der Ausführung. + Sie können jedoch auch einen konstanten Text angeben, der +dann für alle Sätze gleich ist. Dazu schließen Sie den Text einfach +in Anführungsstriche ein. Die folgende Kopieranweisung dient dazu, +ein neues Feld einzurichten, das aber vorläufig noch leer bleiben +soll: + + + "Feldname" K ""; + + +Ebenso können Sie mehrere Felder zu einem neuen verbinden, zum +Beispiel: + + + "Wohnort" K f ("PLZ") + " " + f ("Ort"); + + +Das Pluszeichen kennzeichnet die Aneinanderreihung von zwei Tex­ +ten. Denken Sie auch immer an das Semikolon am Ende. In gleicher +Weise können Sie viele andere Textfunktionen verwenden, die in +Kapitel 14 beschrieben sind. + Prinzipiell können Sie auch Bedingungen mit IF abfragen, wie +zum Beispiel in der folgenden Übersetzung: + + + IF f ("m/w") = "w" THEN + "Anrede" K "Frau" + ELSE + "Anrede" K "Herr" + END IF; + + +Auf diese Weise können Sie Kodierungen verschiedenster Art auto­ +matisch umsetzen. Sie müssen hierbei jedoch unbedingt darauf ach­ +ten, daß innerhalb der IF-Konstruktion immer eine Kopieranweisung +ausgeführt wird. Falls nämlich kein Fall zutrifft und für ein Feld +keine Kopieranweisung ausgeführt wird, wird das Feld bei einer +neuen Datei auch nicht richtig eingerichtet. + + +11.3 Tragen + +In Kapitel 6 hatten Sie gesehen, wie man einzelne Sätze aus der +aktuellen Datei in eine andere trägt, und auch, wie man sie wieder +zurückholen kann. Diese Funktion diente im wesentlichen dazu, +nicht mehr benötigte Sätze zu entfernen. + Sie haben aber auch die Möglichkeit, eine ganze Reihe von +Sätzen in einem Arbeitsgang zu tragen, nämlich alle durch das +Suchmuster ausgewählten beziehungsweise alle markierten Sätze. +Diese Funktion dient ebenfalls dazu, Sätze zu entfernen, beispiels­ +weise alle Sätze, die vor einem gewissen Stichtag liegen. Als wei­ +tere Anwendung können Sie beim Tragen aber auch Bedingungen +überprüfen. + Diese #on("i")#Prüfbedingungen#off("i")# sollen sicherstellen, daß die Daten in +einer Datei ganz bestimmten Richtlinien entsprechen. Zum Beispiel +kann geprüft werden, ob ein eingegebenen Datum stimmen kann, ob +ein Satz doppelt aufgenommen wurde oder ob eine Artikelnummer die +richtige Anzahl von Stellen hat. + Die Prüfbedingungen werden einer Datei fest zugeordnet. Sie +können mit der Funktion +#free (0.2)# + + P Prüfbed. + +#free (0.2)# +im Menü 'Öffnen' eingegeben oder geändert werden. Die Prüfbedin­ +gungen werden als Text im Editor geschrieben. + +#on("b")#Ablauf#off("b")# Das ganze Verfahren läuft nun so ab: Sie fügen neue +Sätze +immer erst in eine Zwischendatei ein, die die gleiche Struktur wie +die eigentliche Datei hat. Wenn Sie alle Sätze fertig eingegeben +haben, tragen Sie diese Datei komplett in die gewünschte Datei. +Dabei werden die Prüfbedingungen getestet. + Erfüllt ein Satz die Bedingungen, wird er anstandslos getragen. +Trifft eine Bedingung aber nicht zu, bleibt der Satz in der Zwi­ +schendatei und eine entsprechende Meldung wird ausgegeben. Die +Meldungen werden gespeichert, um Sie später nochmal abrufen zu +können. + Sie müssen jetzt in der Zwischendatei die notwendigen Ände­ +rungen durchführen, damit die Prüfbedingungen erfüllt werden. Beim +Aufruf der Funktion +#free (0.2)# + + A Ändern + +#free (0.2)# +können Sie mit Hilfe der Tastenkombination ESC 'P' (großes P) die +Datei mit den Fehlermeldungen in einem kleinen Teilfenster editie­ +ren. Anhand dieser Hinweise können Sie dann den Satz korrigieren. +Die Meldungen bleiben bis zum nächsten Öffnen oder Tragen erhal­ +ten. + Nach der Korrektur können Sie den gleichen Vorgang erneut +aufrufen - es sind ja nur noch die zuerst fehlerhaften Sätze in der +Zwischendatei. Bei Bedarf können Sie diesen Vorgang wiederholen, +bis alle Sätze korrekt übernommen worden sind. + +#on("b")#Aufruf#off("b")# Das Tragen wird aufgerufen durch die Funktion +#free (0.2)# + + Satzauswahl + T Tragen + +#free (0.2)# +Nach Eingabe des Zieldateinamens müssen Sie noch angeben, ob Sie +die Prüfbedingungen testen wollen. + +#on("b")#Prüfbedingungen#off("b")# Zu diskutieren bleibt noch die Form der +Prüfbe­ +dingungen. Diese stellen ein kleines ELAN-Programm dar, in dem +einige spezielle Prozeduren zum Prüfen enthalten sind. Wenn Sie +nicht ELAN programmieren können, sollte Sie diese Bemerkung nicht +erschrecken: die Prüfbedingungen sind einfach genug. + Sie schreiben also die Prüfbedingungen jeweils untereinander. +Eine mögliche Bedingung ist + + + wertemenge ("Feldname", "Wert1,Wert2,Wert3,Wert4"); + + +Diese Bedingung gibt an, daß das Feld einen der angegebenen Werte +haben muß. Die Werte werden untereinander durch Komma getrennt. +Es gibt jedoch keine Möglichkeit, Werte mit Komma darzustellen, da +das Komma immer als Trennung wirkt. Leerzeichen dürfen in den +Werten vorkommen, sie müssen dann aber auch genau so im Feld +stehen. + Wir könnten zum Beispiel eine Bedingung für unser Feld 'm/w' +wie folgt formulieren + + + wertemenge ("m/w", "m,w"); + + +EUDAS würde sich dann beschweren, wenn das Feld leer wäre (ir­ +gendein Geschlecht muß die Person ja wohl haben). Wenn das Feld +auch leer sein darf, geben Sie einfach zwei Kommata hintereinander +oder ein Komma am Anfang an: + + + wertemenge ("m/w", ",m,w"); + + +Eine andere Möglichkeit der Prüfbedingung besteht darin, eine +Maske für ein Feld zu definieren. Diese Maske gibt an, daß an be­ +stimmten Stellen des Feldes nur bestimmte Zeichen stehen dürfen. +So könnte man zum Beispiel folgende Maske für ein Datumsfeld +angeben: + + + feldmaske ("Datum", "99.99.99"); + + +Die Neunen haben hier eine spezielle Bedeutung und und stehen für +eine beliebige Ziffer. Es gibt noch einige weitere Zeichen, die eine +reservierte Bedeutung haben, nämlich: + + + '9' für jede Ziffer (wie schon erwähnt) + 'X' für jedes Zeichen + 'A' für jeden Großbuchstaben + 'a' für jeden Kleinbuchstaben + '*' für eine Folge beliebiger Zeichen + + +Alle anderen Zeichen im Muster stehen für sich selbst. Eine Sonder­ +stellung besitzt der Stern; er sollte sparsam verwendet werden, da +seine Benutzung etwas aufwendiger ist. Der Stern kann auch für +eine leere Zeichenfolge stehen. Als weiteres Beispiel könnte man +definieren + + + feldmaske ("Name", "A*"); + + +damit immer ein Name angegeben ist, der noch dazu mit einem Groß­ +buchstaben beginnt. + Für Bedingungen, die sich nicht mit diesen beiden Prozeduren +formulieren lassen, gibt es noch + + + pruefe ("Feldname", Bedingung); + + +Diese Prozedur erhält einen logischen (booleschen) Wert als Parame­ +ter, der einen Vergleich darstellt. Ist dieser Parameter falsch +(FALSE), wird eine entsprechende Fehlermeldung protokolliert. So +könnte man folgende Bedingung angeben: + + + pruefe ("Alter", wert ("Alter") > 18.0); + + +Diese Bedingung würde sicherstellen, daß alle Personen in der Datei +volljährig sind ('wert' ist eine von EUDAS definierte Funktion, die +den Inhalt eines Feldes als REAL-Zahl liefert - denken Sie auch +daran, daß der ELAN-Compiler Zahlen mit Dezimalpunkt geschrieben +haben möchte). + Da die Prüfbedingungen ein ELAN-Programm sind, können Sie +natürlich sämtliche ELAN-Anweisungen verwenden. + Weiterhin haben Sie die Möglichkeit, Doppeleinträge zu verhin­ +dern. Dazu geben Sie mit Hilfe der Prozedur + + + eindeutige felder (n); + + +wieviele Felder vom ersten an eindeutig sein sollen. Ein zu tragen­ +der Satz, der mit irgendeinem anderen Satz in diesen Feldern über­ +einstimmt, wird als fehlerhaft zurückgewiesen. In unserer Adressen­ +datei könnte man + + + eindeutige felder (2); + + +angeben. Damit würde ein neuer Satz mit bereits vorhandenem Na­ +men und Vornamen abgelehnt. + +#on("b")#Limit#off("b")# Aus technischen Gründen können die Prüfbedingungen +einer +Datei nur 2000 Zeichen umfassen. Wollen Sie aufwendigere Bedin­ +gungen konstruieren, sollten Sie sich diese als Prozedur definieren +und insertieren. In den Prüfbedingungen müssen Sie dann nur diese +Prozedur aufrufen. + + +11.4 Automatische Änderungen + +Mit EUDAS können Sie die geöffnete Datei nicht nur satzweise von +Hand ändern, sondern auch automatisch die ganze Datei. Dazu müs­ +sen Sie dem Rechner eine Vorschrift geben, nach der er handeln +kann. Ein solches #on("i")#Änderungsmuster#off("i")# stellt im Prinzip schon ein klei­ +nes Programm dar. Der Änderungsvorgang wird durch die Auswahl +#free (0.2)# + + V Verändern + +#free (0.2)# +aufgerufen. Dabei wird der Name des Änderungsmusters erfragt. Dies +ist eine normale Textdatei. Existiert das Muster noch nicht, können +Sie den Inhalt an dieser Stelle im Editor angeben. Anschließend +werden alle ausgewählten Sätze nach der Vorschrift bearbeitet. +Dabei wird jeweils die aktuelle Satznummer ausgegeben. + +#on("b")#Änderungsmuster#off("b")# Da auch ein Kopiermuster ein Programm ist, +ist +es nicht erstaunlich, daß Änderungsmuster ganz ähnlich aussehen. +Eine typische Zeile sieht etwa so aus: + + + "Feldname" V "neuer Inhalt"; + + +Diese Zeile bedeutet: Ersetze den Inhalt des Feldes 'Feldname' +durch den Text 'neuer Inhalt'. Anstelle des neuen Textes kann +wieder ein beliebiger ELAN-Ausdruck stehen. Ein Beispiel, in dem +ein Feld einen Stern angehängt bekommt, sieht dann so aus: + + + "Feldname" V f ("Feldname") + "*"; + + +Beachten Sie, daß Sie den Ausdruck auf der rechten Seite eventuell +in Klammern setzen müssen (obwohl der Operator 'V' die niedrigste +Priorität hat). Wenn Sie sich nicht sicher sind, können Sie den Aus­ +druck immer in Klammern einschließen. + Ebenso wie im Kopiermuster können Sie hier beliebige ELAN- +Ausdrücke verwenden. Auch IF-Abfragen und ähnliche Konstruktio­ +nen sind möglich, im Gegensatz zum Kopiermuster sogar ohne Be­ +schränkungen. + Im Vergleich zu einem separat geschriebenen ELAN-Programm +hat das Änderungsmuster den Vorteil, daß Sie nur die eigentlichen +Veränderungsanweisungen kodieren müssen. Die wiederholte Anwen­ +dung auf die ausgewählten Sätze erledigt EUDAS automatisch. Wol­ +len Sie eine solche Änderungsanweisung fest insertieren, so brau­ +chen Sie das Muster nur in eine Prozedur zu verpacken und EUDAS +zu übergeben (Näheres s. Referenzhandbuch). + diff --git a/doc/eudas/eudas.hdb.12 b/doc/eudas/eudas.hdb.12 new file mode 100644 index 0000000..fba5ca5 --- /dev/null +++ b/doc/eudas/eudas.hdb.12 @@ -0,0 +1,446 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (123)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +12 Weitere Möglichkeiten zum Drucken + + + +12.1 Anschluß an die Textverarbeitung + +Auf zweierlei Art und Weise kann der EUDAS-Druckgenerator mit +den Programmen der EUMEL-Textverarbeitung zusammenarbeiten. +Zum ersten können Ausgabedateien des Druckprozesses anschließend +mit den Textkosmetik-Werkzeugen bearbeitet werden. Zum anderen +kann EUDAS im Editor direkt Daten aus einer EUDAS-Datei in die +editierte Datei importieren. + +#on("b")#Druckrichtung#off("b")# Wie Sie schon in Kapitel 7 gesehen haben, +kann +man die Ausgabe des Druckgenerators statt auf den Drucker in eine +Datei umleiten. Die Datei erhält dann einen automatisch generierten +Namen. Sie können jedoch auch festlegen, daß die Ausgabe in eine +ganz bestimmte Datei geschrieben werden soll. Dazu wählen Sie die +Funktion + + + Ausgabe + R Richtung + + +im Druckmenü. Es erscheint die Frage + +___________________________________________________________________________________________ + + Ausgabe automatisch zum Drucker (j/n) ? +___________________________________________________________________________________________ + + +Verneinen Sie die Frage und es erscheint + +___________________________________________________________________________________________ + + Ausgabe in bestimmte Datei (j/n) ? +___________________________________________________________________________________________ + + +Wenn Sie diese Frage auch verneinen, erhält die Ausgabedatei einen +automatisch generierten Namen. Wenn Sie die Frage aber bejahen, +können Sie anschließend den Namen der Ausgabedatei angeben. + Existiert die angegebene Datei schon, wird der Ausdruck am +Ende der Datei angefügt. Anderenfalls wird die Datei neu eingerich­ +tet. + Die Angabe der Ausgabedatei gilt jedoch nur für den folgenden +Druckvorgang. Wenn Sie mehrmals in die gleiche Datei drucken wol­ +len, müssen Sie den Namen immer wieder neu angeben. Falls Sie dies +vergessen, wird die folgenden Male wieder ein Name automatisch +generiert. + +#on("b")#Begrenzung der Dateigröße#off("b")# Für kleinere Systeme ist es +vorteilhaft, +wenn die Druckausgabe nicht in einer großen Datei gesammelt wird, +sondern sich auf mehrere kleine Dateien verteilt. Da die Ausgabe­ +datei nach dem Drucken gelöscht wird, kann man auf diese Weise +einen Hintergrundengpaß vermeiden. Es besteht die Möglichkeit, die +maximale Größe der Ausgabedatei mit dem ELAN-Kommando + + + maxdruckzeilen (1000) + + +auf eine bestimmte Zeilenzahl (maximal 4000) zu beschränken. Wenn +der Druckgenerator nach der Bearbeitung eines Satzes feststellt, +daß diese Maximalzahl überschritten wurde, wird die Ausgabedatei +direkt gedruckt (falls durch 'Richtung' eingestellt) und eine neue +Ausgabedatei eröffnet. + +#on("b")#Initialisierungsteil#off("b")# Dabei ist jedoch zu beachten, daß +Drucker­ +steuerungsanweisungen, die im Vorspann eingestellt wurden, jetzt in +der neuen Datei nicht mehr vorhanden sind. In einem solchen Fall +würden die folgenden Teile der Ausgabe mit einer anderen Einstel­ +lung gedruckt. + Um dies zu vermeiden, können Sie solche Anweisungen in den +#on("i")#Initialisierungsteil#off("i")# schreiben. Der Initialisierungsteil umfaßt alle +Zeilen des Druckmusters bis zum ersten Abschnitt, also bis zur +ersten Anweisung. Zeilen im Initialisierungsteil werden beim Eröff­ +nen einer neuen Ausgabedatei an den Anfang dieser Datei ge­ +schrieben. + Druckersteuerungsanweisungen, die ein bestimmtes Schriftbild +der Ausgabe erzeugen ('type', 'limit', 'linefeed', 'start' usw.), sollten +also in den Initialisierungsteil vor Beginn aller Abschnitte ge­ +schrieben werden. + +#on("b")#Nachbearbeitung#off("b")# Wenn Sie in der Druckausgabe verschiedene +Schriften oder Proportionalschrift verwenden wollen, sollten Sie die +folgenden Hinweise beachten. Da EUDAS keine Informationen über +die Schriftbreiten und -größen hat, werden alle Schrifttypen gleich +behandelt. Dies gilt insbesondere für die Zeilenbreite, die ja durch +das Dateilimit des Druckmusters festgelegt ist. + So kann es passieren, daß Zeilen mit kleinen Schrifttypen zu +früh abgeschnitten werden, während Zeilen mit großen Schriften +nicht mehr auf das Blatt passen. Für diesen Fall sollten Sie das +größte benötigte Limit einstellen (zum Beispiel 135 bei Schmal­ +schrift auf DIN A 4) und die Ausgabedatei anschließend mit 'line­ +form' bearbeiten. + 'lineform' verteilt zu langen Text auf mehrere Zeilen. Außerdem +werden gegebenenfalls Trennungen durchgeführt. + 'lineform' benötigt zur Information Absatzmarken. Fehlt an +einer Zeile die Absatzmarke, wird die nächste Zeile so weit wie +möglich direkt angehängt. Die Absatzmarken in der Ausgabedatei +werden direkt aus dem Druckmuster übernommen (es ist nicht mög­ +lich, Absatzzeilen durch eingesetzte Leerzeichen zu erzeugen). Im +Normalfall sollten alle Zeilen im Druckmuster eine Absatzmarke +haben. + Wenn Sie seitenorientierte Überschriften haben möchten, kön­ +nen Sie auch 'pageform' einsetzen. Die gewünschten Überschrift­ +anweisungen können Sie im Initialisierungsteil angeben. + Die beiden Funktionen wählen Sie über den Menüpunkt + + + N Nachbearb. + + +im Druckmenü. Dort können Sie den Namen der Ausgabedatei ange­ +ben, die Sie bearbeiten möchten. Es wird jeweils gefragt, ob Sie +'lineform' und 'pageform' anwenden wollen. Das Ergebnis der Bear­ +beitung können Sie danach ausdrucken. + +#on("b")#EUDAS im Editor#off("b")# Wenn Sie sich im Editor zum Zweck der +Textver­ +arbeitung befinden, können Sie Daten aus einer EUDAS-Datei direkt +in die editierte Datei übernehmen. Dazu wählen Sie zunächst die +gewünschten Sätze aus - danach geben Sie den Namen eines Druck­ +musters an. EUDAS druckt die gewählten Sätze unter Beachtung des +Druckmusters direkt in die editierte Datei. + Wenn Sie das Kommando + + + eudas + + +im Editor geben (nach ESC ESC), gelangen Sie in ein spezielles +Kurzprogramm, das alle notwendigen Information von Ihnen erfragt. + Zunächst müssen Sie den Namen der gewünschten EUDAS-Datei +angeben. Diese Datei wird dann automatisch geöffnet. Vorher geöff­ +nete Dateien werden nach Anfrage gesichert. Beachten Sie, daß +keine Datei mehr geöffnet ist, wenn Sie später EUDAS wieder normal +aufrufen. + Danach wird Ihnen eine Übersicht aller Sätze gezeigt - in einer +Form, die Sie aus der Funktion 'Übersicht' bereits kennen. Wie dort +wird Ihnen zunächst eine Auswahl der Felder angeboten, um die +Anzeige übersichtlich zu halten. Anschließend können Sie noch ein +Suchmuster angeben. + In der Übersicht können Sie sich dann zu einem bestimmten +Satz bewegen oder mehrere Sätze markieren. Nach dem Verlassen der +Übersicht können Sie den aktuellen Satz oder alle ausgewählten +(bzw. markierten) Sätze drucken. Natürlich können Sie auch beide +Fragen verneinen. + Zum Drucken wird der Name des Druckmusters erfragt. Dieses +muß bereits existieren. Die Ausgabe wird an der Stelle eingefügt, an +der der Cursor in der editierten Datei steht - die Zeile wird bei +Bedarf aufgesplittet. + Nach dem Drucken können Sie den Vorgang wiederholen, wenn +Sie zum Beispiel einen weiteren Satz drucken wollen. Dazu können +Sie auch ein neues Suchmuster angeben. Markierungen von Sätzen +werden nach dem Drucken gelöscht. + + +12.2 Spaltendruck + +Für manche Anwendungen reicht es nicht aus, wenn die bearbeite­ +ten Sätze jeweils untereinander in der Ausgabe erscheinen. Häufig­ +stes Beispiel dafür ist der Etikettendruck. Hierfür werden vielfach +mehrbahnige Formulare eingesetzt. + In diesem Fall müssen die Sätze bis zur gewünschten Anzahl +von Spalten nebeneinander gesetzt werden - erst danach wird die +nächste Reihe angefangen. + EUDAS unterstützt diese Anwendung. Dazu wird hinter der +'%WIEDERHOLUNG'-Anweisung die Anzahl der Spalten als Parameter +geschrieben (durch Leerzeichen getrennt). Der Wiederholungsteil +wird dann mit der angegebenen Anzahl von Spalten gedruckt. Zu +beachten ist, daß Vorspann und Nachspann diese Spaltenanordnung +durchbrechen, also immer hinter dem bisher Gedruckten beginnen. + Die Spaltenbreite wird vom Dateilimit des Druckmusters be­ +stimmt. Die Zeilen eines Wiederholungsteils werden bis zum Limit +mit Leerzeichen aufgefüllt, wenn der nächste Wiederholungsteil +danebengesetzt wird. + Alternativ kann die Spaltenbreite in Zeichen auch als zweiter +Parameter angegeben werden. Der Wert gilt jedoch nur für den Wie­ +derholungsteil - Vor- und Nachspann richten sich immer nur nach +dem Dateilimit. + Es spielt keine Rolle, ob die nebeneinandergesetzten Wieder­ +holungsteile unterschiedliche Längen haben. Die kürzeren Teile +werden einfach bei Bedarf durch Leerzeilen ergänzt. Es ist jedoch zu +beachten, daß sich auf diese Weise unterschiedliche Längen für die +einzelnen Reihen ergeben können. + Beispiel: Das Ergebnis für Satz 1, 3, 4 und 5 sei vier Zeilen +lang, für Satz 2 aber fünf Zeilen. Bei zweispaltigem Druck wird die +erste Reihe eine Zeile länger als die folgenden (s. dazu Abb. 12-1). + + + Satz 1 Satz 2 + braucht braucht + vier Zeilen. ausnahmsweise + ---------------- fünf Zeilen. + ---------------- + Satz 3 Satz 4 + braucht braucht + vier Zeilen. vier Zeilen. + ---------------- ---------------- + Satz 5 + braucht + vier Zeilen. + ---------------- + +#center#Abb. 12-1 Seitenaufteilung beim Spaltendruck + + +#on("b")#Beispiel#off("b")# Zum Abschluß noch als Beispiel ein Druckmuster +für ein +dreibahniges Etikettenformular. Die Spaltenbreite und die Länge des +Wiederholungsteils richten sich natürlich nach dem verwendeten +Formular und müssen im Einzelfall ausprobiert werden. + + + % VORSPANN + \#start (1.0, 0.8)\# + % WIEDERHOLUNG 3 40 + + &Vorname %Name + &Strasse + + &PLZ %Ort + \#free (1.693)\# + + + +12.3 Modi + +Gesetzt der Fall, Sie wollen eine Tabelle drucken, deren Einträge +auf jeden Fall in voller Länge erscheinen sollen, auch wenn sie die +Spaltenbreite überschreiten. Dies würde bedeuten, daß Tabellenein­ +träge nach rechts geschoben werden, wenn vorhergehende Einträge +länger sind. Für diesen Fall können also nur Feldmuster variabler +Position (mit '%') eingesetzt werden. Diese werden jedoch auch nach +links geschoben, wenn vorher kürzere Inhalte auftreten. + +#on("b")#Tabellenmodus#off("b")# Um dieses Linksschieben zu unterdrücken, +können +Sie mit folgender Anweisung im Musterteil in den #on("i")#Tabellenmodus#off("i")# +umschalten: + + + % MODUS 2 + + +Der so eingestellte Modus gilt bis zum Ende des jeweiligen Ab­ +schnitts. Zu Beginn eines Abschnitts ist der Modus 1 (Normalmodus) +eingestellt. + +#on("b")#Beispiel#off("b")# Um diese Anweisung auszuprobieren, sollten Sie +folgendes Druckmuster auf unsere Beispieldatei anwenden: + + + % WIEDERHOLUNG + % MODUS 2 + &Vorname %Name + + +In der Ausgabe können Sie sehen, daß der Nachname nicht nach +links geschoben wird, so daß eine Tabelle entsteht. Ist der Vorname +jedoch zu lang, wird die Tabelleneinteilung durchbrochen und der +Nachname nach rechts geschoben, um den Vornamen nicht abschnei­ +den zu müssen: + + + Herbert Wegner + Helga Sandmann + Albert Katani + Peter Ulmen + Karin Regmann + Hubert Arken + Anna-Maria Simmern + Angelika Kaufmann-Drescher + Harald Fuhrmann + Friedrich Seefeld + + +#on("b")#Zeilenfortsetzung#off("b")# Eine weitere Möglichkeit, überlange +Feldinhalte +einzusetzen, besteht darin, daß der Rest des Inhaltes, der nicht +mehr in den reservierten Raum paßt, in der nächsten Zeile fortge­ +setzt wird. Dies wird im Modus 3 erreicht. Falls ein Feldinhalt ab­ +geschnitten werden müßte, wird in diesem Modus die gleiche Mu­ +sterzeile nochmal mit den restlichen Inhalten gedruckt. Dies wird +fortgesetzt, bis alle Inhalte abgearbeitet sind. + Damit die Fortsetzung sinnvoll ist, wird das letzte Wort ganz in +die nächste Zeile übernommen, falls es zerschnitten würde (ähnlich +wie im Editor). Der dadurch freiwerdende Raum in der vorigen Zeile +wird mit Leerzeichen gefüllt. Ist rechtsbündiges Einsetzen verlangt, +werden die einzelnen Teile jeweils rechtsbündig in ihrem reservier­ +ten Platz justiert. + Dieser Modus ist besonders interessant, wenn Sie längere Kom­ +mentare in eine EUDAS-Datei eintragen, die Sie dann natürlich auch +wieder drucken wollen. Den Text tragen Sie bereits in mehreren +Zeilen in die EUDAS-Datei ein. Beachten Sie, daß der Umbruch des +Textes im Druck nicht mit dem Umbruch des Textes am Bildschirm +übereinstimmt. Wollen Sie dies verhindern, müssen Sie jeden Absatz +des Textes in ein eigenes Feld schreiben. + Wie zu Anfang des Kapitels bereits angedeutet, kann der Um­ +bruch bei Proportionalschrift nicht korrekt sein, da EUDAS die Zei­ +chenbreiten nicht kennt. Um die nachfolgende Bearbeitung mit +'lineform' zu ermöglichen, werden bei fortgesetzten Feldern grund­ +sätzlich keine Absatzmarken an die Zeilen geschrieben. Lediglich die +letzte Fortsetzungszeile erhält eine Absatzmarke. + In den Fortsetzungszeilen, werden die Feldmuster, deren Inhalte +bereits abgearbeitet sind, leer eingesetzt. Die Mustertexte zwischen +den Feldmustern werden in den Fortsetzungszeilen durch Leerzei­ +chen ersetzt. + Die Anzahl der Fortsetzungszeilen kann durch die Anweisung + + + % MEHR n + + +auf eine bestimmte Zahl 'n' festgelegt werden. Wenn alle Inhalte +abgearbeitet wurden, aber die Anzahl der Zeilen noch nicht erreicht +ist, werden entsprechend viele Zeilen mit leeren Inhalten erzeugt. + Die Zeilenwiederholung kann auch mit dem Tabellenmodus kom­ +biniert werden. Dies wird im Modus 4 erreicht. Felder variabler +Position werden auch in diesem Modus nicht nach links geschoben. +Außerdem werden aber in Fortsetzungszeilen die Mustertexte zwi­ +schen den Feldmustern wiederholt, um z.B. Tabellenbegrenzungen zu +erzeugen. + +#on("b")#Beispiele#off("b")# Zur Verdeutlichung hier noch einige Beispiele. +Das folgende Druckmuster: + + + % WIEDERHOLUNG + % MODUS 3 + Kommentar: &Kommentar + ---------- + + +könnte folgende Ausgabe bewirken: + + + Kommentar: Dies ist ein längerer Kommentar aus + einer EUDAS-Datei, der zum Drucken + auf eine Breite von 48 Zeichen + umbrochen worden ist. Nur die letzte + Zeile hat eine Absatzmarke. + ---------- + + +Soll die Anzahl der Zeilen immer gleich bleiben, könnte man folgen­ +des Druckmuster verwenden: + + + % WIEDERHOLUNG + % MODUS 3 + % MEHR 5 + Kommentar: &Kommentar + ---------- + + +Mit einem kürzeren Text ergäbe sich folgendes Bild: + + + Kommentar: Nur ein kurzer Text. + + + + + ---------- + + +Für eine Tabelle würde man den Modus 4 benutzen: + + + % VORSPANN + -------------------------------------------------------- + ! Abk. ! Kommentar ! + !---------+--------------------------------------------! + % WIEDERHOLUNG + % MODUS 4 + ! &abk ! &Kommentar&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ! + ----------+--------------------------------------------- + + +Als Ausgabe könnte folgender Text erscheinen: + + + -------------------------------------------------------- + ! Abk. ! Kommentar ! + !---------+--------------------------------------------! + ! MA11 ! Dieser Kurs hat eine Menge an besonderen ! + ! ! Eigenschaften, die ihn für jüngere ! + ! ! Teilnehmer geeignet erscheinen lassen. ! + !---------+--------------------------------------------! + ! TD04 ! Stellt keine besonderen Anforderungen. ! + !---------+--------------------------------------------! + ! PM01 ! Seit dem 01.01. eingerichtet und noch ! + ! ! nicht voll besetzt. ! + ----------+--------------------------------------------- + + +Beachten Sie hier, daß Tabelleneinträge hier nicht wie im Modus 2 +geschoben, sondern auf weitere Zeilen verteilt werden, wenn sie zu +lang sind. Außerdem werden die Tabellenbegrenzungen mit wieder­ +holt. Das Feldmuster für Kommentar muß jedoch mit fester Länge +angegeben werden, da sonst die rechte Tabellenbegrenzung bis zum +Dateilimit geschoben würde. + +#on("b")#Zusammenfassung#off("b")# Zum Abschluß dieses Abschnitts eine +Zusammenfassung aller möglichen Modi: + + Modus Effekt + + 1 Normalmodus. + '%'-Feldmuster werden auch nach links geschoben. + Keine Zeilenwiederholung. + + 2 Tabellenmodus. + '%'-Feldmuster werden nicht nach links geschoben. + Keine Zeilenwiederholung. + + 3 Normalmodus mit Zeilenwiederholung. + '%'-Feldmuster werden auch nach links geschoben. + Zeilenwiederholung ohne Zwischentexte. + + 4 Tabellenmodus mit Zeilenwiederholung. + '%'-Feldmuster werden nicht nach links geschoben. + Zeilenwiederholung mit Zwischentexten. + + diff --git a/doc/eudas/eudas.hdb.13 b/doc/eudas/eudas.hdb.13 new file mode 100644 index 0000000..435fbfc --- /dev/null +++ b/doc/eudas/eudas.hdb.13 @@ -0,0 +1,757 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (133)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +13 Programmierung von Druckmustern + + + +13.1 Abkürzungen + +In den vorigen Kapiteln haben Sie erfahren, daß man Feldmuster +von ganz bestimmter Länge definieren kann, deren Inhalt in genau +dieser Länge eingesetzt und bei Bedarf abgeschnitten wird. Bei der +Angabe dieser Länge spielt jedoch die Länge des Feldnamens eine +ganz entscheidende Rolle. Das kürzeste Feldmuster fester Länge, das +Sie definieren können, ist nämlich zwei Zeichen länger als der Feld­ +name (ein Musterzeichen vorher und eins nachher). + Hätte das Feld 'PLZ' den Namen 'Postleitzahl' bekommen, so +müßte ein solches Feldmuster mindestens eine Länge von 14 Zeichen +haben. Damit Sie mit diesem Feldnamen auch ein Feldmuster der +Länge 4 bekommen können (Postleitzahlen haben in den seltensten +Fällen mehr als 4 Stellen), haben Sie die Möglichkeit, den Namen +'Postleitzahl' für die Verwendung im Druckmuster geeignet abzu­ +kürzen. + Abkürzungen haben jedoch noch eine viel weitreichendere +Bedeutung. Mit ihnen ist es möglich, nicht nur die Feldinhalte einer +EUDAS-Datei einzusetzen, sondern auch jeden anderen Text, den Sie +mit einem ELAN-Programm erzeugen können. + Die einfachsten zusätzlichen Daten, die Sie verwenden können, +sind z.B. Datum und Uhrzeit. Für weitergehende Zwecke können Sie +die Inhalte der EUDAS-Datei auch für Berechnungen verwenden und +damit so umfangreiche Probleme wie das Schreiben von Rechnungen +oder statistische Auswertungen unter Verwendung eines Druck­ +musters lösen. + +#on("b")#Abkürzungsteil#off("b")# Abkürzungen werden in einem speziellen +Abkür­ +zungsteil am Ende eines Abschnittes angegeben. Der Abkürzungsteil +wird durch die Anweisung + + + % ABKUERZUNGEN + + +eingeleitet. Eine Abkürzungsdefinition hat eine ähnliche Form wie +ein Refinement (Falls Sie nicht wissen, was das ist, vergessen Sie +es). Zu Beginn steht der Name der Abkürzung in Form eines Feld­ +musters, beginnend in der ersten Spalte. Danach folgt, durch Leer­ +zeichen getrennt, ein Doppelpunkt in der gleichen Zeile. Daran +schließt sich ein beliebiger ELAN-Ausdruck an, der sich in freiem +Format über beliebig viele Zeilen erstrecken kann und mit einem +Punkt abgeschlossen werden muß. Dieser ELAN-Ausdruck muß ein +TEXT-Objekt liefern. + +#on("b")#Feldinhalt#off("b")# Für die Abfrage von Inhalten aus einer +EUDAS-Datei ist der Ausdruck + + + f ("Feldname") + + +vordefiniert. Die Abkürzung des Feldes 'Postleitzahl' würde also als +Ausschnitt folgendermaßen aussehen: + + + % ABKUERZUNGEN + &p : f ("Postleitzahl") . + + +Mit dieser Definition kann man im Muster so verfahren, als ob das +Feld 'Postleitzahl' auch 'p' hieße. Diese einfachste Form der Ab­ +kürzung können Sie natürlich variieren, indem Sie für 'p' und +'Postleitzahl' Ihre eigenen Namen einsetzen. + +#on("b")#Übersetzung#off("b")# Beachten Sie, daß das Druckmuster in ein +ELAN-Pro­ +gramm umgeformt werden muß, da ELAN-Ausdrücke in ihm vorkom­ +men. Das automatisch erzeugte ELAN-Programm wird dann vom +ELAN-Compiler übersetzt und ausgeführt. Fehler in den ELAN-Aus­ +drücken im Abkürzungsteil können erst vom ELAN-Compiler ent­ +deckt werden. Dieser kennt jedoch das Druckmuster nicht und mel­ +det die Fehler anhand des generierten Programms. Sie müssen in +einem solchen Fall aufpassen, daß Sie die Fehlerquelle an der rich­ +tigen Stelle im Druckmuster lokalisieren (Hilfestellungen dazu sind +im Kapitel über die Übersetzung von Druckmustern zu finden). + +#on("b")#Beispiel#off("b")# Um die Verwendung von Abkürzungen zu +demonstrieren, wollen wir folgendes Druckmuster betrachten: + + + % VORSPANN + Adressenliste als Beispiel für Abkürzungen + Stand: &Datum + ------------------------------------------ + % ABKUERZUNGEN + &Datum : date . + + % WIEDERHOLUNG + &&l : &Vorname %Name + &Strasse + &&p& &Ort + ------------------------------------------ + % ABKUERZUNGEN + &l : lfd nr . + &p : f ("PLZ") . + + % NACHSPANN + &l Adressen gedruckt. + + +Dieses Beispiel enthält eine ganze Reihe interessanter Details. Als +erstes sollten Sie registrieren, daß auch im Vorspann oder Nach­ +spann Feldmuster verwendet werden können. Soll in diesem Fall ein +Feldinhalt aus der EUDAS-Datei eingesetzt werden, so werden beim +Vorspann die Inhalte des ersten und beim Nachspann die Inhalte des +letzten durch Suchmuster ausgewählten Satzes verwendet. Daher +kann auch jeder Abschnitt einen Abkürzungsteil haben. Abkürzun­ +gen gelten jedoch für alle Abschnitte (s. '&l'); die Aufteilung in +mehrere Abkürzungsteile fördert im wesentlichen die Übersichtlich­ +keit. + Versuchen Sie, an diesem Beispiel die wichtigsten Unterschiede +zwischen dem #on("i")#Musterteil#off("i")# und dem #on("i")#Abkürzungsteil#off("i")# eines Abschnittes +zu verstehen. Das Format des Musterteiles soll in die Ausgabe +übernommen werden; daher ist dort die Stellung jedes Wortes wich­ +tig. Im Abkürzungsteil definieren Sie Abkürzungen ohne bestimm­ +tes Format - mit der einzigen Ausnahme, daß eine Abkürzungs­ +definition mit einem '&' in der ersten Spalte anfangen und ein +Leerzeichen vor dem Doppelpunkt haben muß. Wie Sie sehen, dürfen +dort Leerzeilen zur besseren Lesbarkeit eingefügt werden. +Sie sollten bei unserem Beispiel folgende Ausgabe erhalten: + + + Adressenliste als Beispiel für Abkürzungen + Stand: 28.12.84 + ------------------------------------------ + 1 : Herbert Wegner + Krämergasse 12 + 5000 Köln + ------------------------------------------ + 2 : Helga Sandmann + Willicher Weg 109 + 5300 Bonn 1 + ------------------------------------------ + 3 : Albert Katani + Lindenstr. 3 + 5210 Troisdorf + ------------------------------------------ + 4 : Peter Ulmen + Mozartstraße 17 + 5 Köln 60 + ------------------------------------------ + 5 : Karin Regmann + Grengelweg 44 + 5000 Köln 90 + ------------------------------------------ + 6 : Hubert Arken + Talweg 12 + 5200 Siegburg + ------------------------------------------ + 7 : Anna-Maria Simmern + Platanenweg 67 + 5 Köln 3 + ------------------------------------------ + 8 : Angelika Kaufmann-Drescher + Hauptstr. 123 + 53 Bonn 2 + ------------------------------------------ + 9 : Harald Fuhrmann + Glockengasse 44 + 5000 Köln 1 + ------------------------------------------ + 10 : Friedrich Seefeld + Kabelgasse + 5000 Köln-Ehrenfeld + ------------------------------------------ + 10 Adressen gedruckt. + + +Nun zu den Abkürzungen im einzelnen. Das Feld 'PLZ' muß abge­ +kürzt werden, damit es rechtsbündig vor den Ort gedruckt werden +kann. Die Abkürzung 'p' benutzt die im vorigen Kapitel beschriebe­ +ne Form zur Abfrage des Feldinhaltes. + 'Datum' wird als Abkürzung für das aktuelle Datum definiert, +ein häufig benötigter Fall. 'date' ist der ELAN-Ausdruck, der das +Datum liefert. (Bemerkung für ELAN-Programmierer: der Name der +Abkürzung gehorcht nicht der ELAN-Syntax für Bezeichner). + Eine für Tabellen sinnvolle Funktion wird bei der Definition +von 'l' verwendet. Der von EUDAS definierte Ausdruck 'lfd nr' lie­ +fert die laufende Nummer des gerade gedruckten Satzes als Text. +Dabei ist zu beachten, daß die laufende Nummer nicht mit der Satz­ +nummer übereinstimmt, sondern nur während des Druckvorganges +von 1 an bei jedem gedruckten Satz hochgezählt wird. Diese Funk­ +tion dient dazu, die Sätze in der Liste durchzunumerieren. + Die laufende Nummer soll in der Liste rechtsbündig mit Doppel­ +punkt vor dem Namen stehen. Dazu wird das Feldmuster '&&l' be­ +nutzt, eine Form, die eigentlich keinen Sinn hat (die Kombination +'variable Länge' und 'rechtsbündig' gibt es nicht). Um ein möglichst +kurzes Feldmuster schreiben zu können, wird in diesem Fall jedoch +feste Länge unterstellt (auch ohne folgendes '&'). Damit hat das +kürzeste Feldmuster fester Länge drei Zeichen sowohl im linksbün­ +digen ('&l&') wie auch im rechtsbündigen Fall ('&&l'). + +#on("b")#Auswertungen#off("b")# Die Verwendung der Abkürzung 'l' im Nachspann +kann als erstes Beispiel für eine Auswertungsfunktion gelten. Da +für den Nachspann die Daten des letzten Satzes verwendet werden, +erscheint hier die laufende Nummer des letzten Satzes und somit die +Anzahl der Sätze, die gedruckt wurden. Das kann dazu benutzt +werden, die Sätze zu zählen, die eine bestimmte Suchbedingung +erfüllen. Folgendes Druckmuster zählt die Anzahl der Frauen oder +Männer in der Datei: + + + % NACHSPANN + &l Personen mit dem Geschlecht '%' vorhanden. + % ABKUERZUNGEN + &l : lfd nr . + + +Wenn Sie vor dem Drucken jetzt die Suchbedingung 'm' für das Feld +'m/w' einstellen, werden alle Männer ausgewählt. Das Drucken be­ +steht in diesem Fall nur aus dem Hochzählen der laufenden Nummer +für jeden Mann. Im Nachspann kann das Ergebnis dann ausgegeben +werden; zugleich soll der aktuelle Wert des Feldes 'm/w' gedruckt +werden, damit das Druckmuster auch für das Zählen der Frauen +verwendet werden kann. + Die beiden möglichen Ausgaben würden dann so aussehen: + + + 6 Personen mit dem Geschlecht 'm' vorhanden. + + 4 Personen mit dem Geschlecht 'w' vorhanden. + + +#on("b")#Zusammenfassung#off("b")# Wir können die Erkenntnisse dieses +Abschnittes wie folgt zusammenfassen: + +* Feldmuster können auch im Vorspann und Nachspann verwendet + werden. Im Vorspann werden die Daten des ersten, im Nachspann + die Daten des letzten ausgewählten Satzes verwendet. + +* Der Musterteil eines Abschnittes definiert ein Format; der Ab­ + kürzungsteil ist formatfrei. + +* 'lfd nr' dient zum Durchnumerieren aller gedruckten Sätze. + +* Ein rechtsbündiges Feldmuster hat immer auch feste Länge. + +#on("b")#Komplexe Abkürzungen#off("b")# Mit Hilfe von Abkürzungen können wir +jetzt auch bessere Musterbriefe schreiben. Ein Problem, das bereits +angesprochen wurde, besteht darin, daß in der Anrede je nach Ge­ +schlecht 'Herr' oder 'Frau' stehen soll. Um dieses Problem zu lösen, +wird der Inhalt des Feldes 'm/w' benötigt. + Da in einer Abkürzung jede ELAN-Anweisung erlaubt ist, die +einen Text liefert, können natürlich auch #on("i")#IF-Anweisungen#off("i")# verwen­ +det werden. Mit diesen Informationen können wir jetzt die Abkür­ +zung 'Anrede' definieren: + + + % ABKUERZUNGEN + &Anrede : + IF f ("m/w") = "w" THEN + "Frau" + ELSE + "Herr" + END IF . + + +Für Nicht-Programmierer: Die IF-Anweisung besteht aus einer Ab­ +frage und zwei Alternativen. Die Abfrage steht zwischen dem IF und +dem THEN und besteht in der Regel aus einer Abfrage, ob zwei +Dinge gleich oder ungleich (<>), größer oder kleiner sind. Außerdem +können mehrere Abfragen mit AND (und) und OR (oder) kombiniert +werden. Näheres dazu im Kapitel 14. + Die Alternative hinter dem THEN wird ausgewählt, wenn die +Abfrage zutrifft. An dieser Stelle sind wieder beliebige Ausdrücke +erlaubt, die einen Text liefern, einschließlich erneuter IF-Anwei­ +sungen (Schachtelung). Die Alternative zwischen ELSE und END IF +wird ausgewählt, wenn die Abfrage nicht zutrifft. + +#on("b")#Textkonstanten#off("b")# Bisher wurden nur ELAN-Funktionen als +Textlie­ +feranten betrachtet ('date', 'lfd nr', 'f'). In unserem Fall werden +aber #on("i")#Textkonstanten#off("i")# in den Alternativen der IF-Anweisung benö­ +tigt. Textkonstanten werden in ELAN in Anführungsstriche einge­ +schlossen, die aber nicht zum Text gehören. Innerhalb einer Text­ +konstanten werden Leerzeichen wie alle anderen Zeichen angesehen +(erscheinen also auch nachher in der Ausgabe). + Bei solchen Abkürzungen, die längere Anweisungen umfassen, +sollten Sie das freie Format ausnutzen und eine möglichst über­ +sichtliche Darstellung wählen. Wie Sie sehen, muß nur der Doppel­ +punkt noch in der ersten Zeile stehen, der Rest kann sich beliebig +auf die folgenden Zeilen erstrecken. + +#on("b")#Beispiel#off("b")# Ein typischer Einsatz einer IF-Anweisung für die +Anrede sieht so aus: + + + % WIEDERHOLUNG + + Sehr geehrte&Anrede %! + + ... + % ABKUERZUNGEN + &Anrede : + IF f ("m/w") = "m" THEN + "r Herr" + ELSE + " Frau" + END IF . + + +Sie sollten jetzt diese Konstruktion in einen Musterbrief einfügen +können. Probieren Sie ihn dann als Beispiel aus ! + +#on("b")#Weitere Möglichkeiten#off("b")# Durch Verwendung von Abkürzungen ist +es +auch möglich, rechtsbündige Felder mit einer Länge von weniger als +3 Zeichen zu simulieren. Dies geschieht mit Hilfe der Textoperatio­ +nen von ELAN. Ohne ELAN-Vorkenntnisse können Sie dieses Bei­ +spiel überlesen. In unserer Liste im obigen Beispiel sind die laufen­ +den Nummern höchstens zweistellig und sollten deshalb auch nur +zwei Stellen belegen. Dies würde folgende Abkürzung ermöglichen: + + + % ABKUERZUNGEN + &l : text (lfd nr als zahl, 2) . + lfd nr als zahl : int (lfd nr) . + + +Die Prozedur 'text' wird dazu benutzt, eine Zahl rechtsbündig auf +zwei Stellen zu formatieren (s. EUMEL-Benutzerhandbuch). Da die +Abkürzung immer eine Länge von zwei Zeichen hat, kann sie auch in +einem Feldmuster variabler Länge eingesetzt werden. Die Attribute +'feste Länge' und 'rechtsbündig' werden in diesem Fall also nicht +durch das Feldmuster, sondern durch die Abkürzung selbst erzeugt. + Um die Prozedur 'text' anwenden zu können, muß die laufende +Nummer als Zahl (sprich: INT-Objekt) vorliegen. Diese Umwandlung +wird mit der Prozedur 'int' vorgenommen, die einen Text in eine +Zahl umwandelt. Obwohl man 'int (lfd nr)' direkt in den Aufruf von +'text' hätte schreiben können, wird hier als Demonstration dafür ein +Refinement verwendet. + Refinements können in einem Abkürzungsteil neben Abkürzun­ +gen stehen und von allen Abkürzungen benutzt werden. Sie werden +ähnlich geschrieben wie Abkürzungen, nur ihr Name muß in Klein­ +buchstaben geschrieben werden, dafür muß er nicht in der ersten +Spalte anfangen und kann Leerzeichen enthalten. Bei komplizierte­ +ren Ausdrücken sollten Refinements zur besseren Lesbarkeit einge­ +setzt werden. + Sie können die IF-Anweisung auch mit beliebig vielen ELIF- +Teilen versehen. Achten Sie jedoch darauf, daß die IF-Anweisung +#on("i")#immer#off("i")# irgendeinen Wert liefern muß. Sie dürfen also den ELSE-Teil +nicht weglassen. Statt einer IF-Anweisung können Sie natürlich +auch eine SELECT-Anweisung verwenden. Es stehen Ihnen im Prin­ +zip alle werteliefernden Anweisungen von ELAN zur Verfügung. + Die Programmiersprache ELAN bietet Ihnen noch weit mehr +Möglichkeiten, als hier beschrieben werden können. So können Sie +sich eigene Prozeduren definieren und diese dann in Abkürzungen +verwenden. In Kapitel 14 und 15 finden Sie eine Einführung in die +wichtigsten Konstrukte, die für EUDAS gebraucht werden. + + +13.2 Bedingte Musterteile + +Wenn größere Teile des Druckmusters in Abhängigkeit von bestimm­ +ten Daten unterschiedlich ausfallen sollen, werden die dazu benö­ +tigten Abkürzungen sehr umfangreich. Für solche Fälle kann man +IF-Anweisungen auch im Musterteil eines Abschnitts verwenden. In +diesem Fall werden die Alternativen der IF-Anweisung durch +Musterzeilen dargestellt. + Im Musterteil müssen jedoch die Zeilen, die Teil der IF-An­ +weisung sind, von den Musterzeilen unterschieden werden. Deshalb +werden die Anweisungszeilen durch ein '%'-Zeichen in der ersten +#on("i")#und#off("i")# zweiten Spalte gekennzeichnet. Das zweite '%'-Zeichen dient +zur Unterscheidung von Anweisungen an den Druckgenerator, die +nicht an den ELAN-Compiler übergeben werden sollen. + Mit einer IF-Anweisung im Musterteil kann man das Anredepro­ +blem auch folgendermaßen lösen: + + + % WIEDERHOLUNG + %% IF f ("m/w") = "w" THEN + Sehr geehrte Frau &! + %% ELSE + Sehr geehrter Herr &! + %% END IF; + + +Beachten Sie den Unterschied, daß die IF-Anweisung hier mit einem +Semikolon abgeschlossen werden muß - in Abkürzungen mußte ja ein +Punkt danach folgen. Außerdem darf hier der ELSE-Teil (die zweite +Alternative) fehlen, während in einer Abkürzung in jeder Alternati­ +ve etwas stehen muß (zumindest der leere Text ""). + Falls sich der IF-THEN-Teil über mehr als eine Zeile erstrek­ +ken soll, muß jede dieser Zeilen mit '%%' beginnen, da die Folgezei­ +len sonst als Musterzeilen gedruckt würden. Benutzen Sie in einem +solchen Fall jedoch besser ein Refinement, das Sie im Abkürzungs­ +teil definieren müssen. + Sie können im Musterteil auch andere ELAN-Anweisungen +verwenden. Der Unterschied zu Abkürzungen liegt darin, daß die +Musterzeilen nicht als Werte angesehen werden, die die Anweisung +liefern muß, sondern als Anweisungen, die dort aufgeführten Mu­ +sterzeilen einzusetzen und zu drucken. Daher kann im Musterteil +auch eine FOR-Schleife sinnvoll sein, wenn in Abhängigkeit eines +Wertes eine bestimmte Anzahl von Zeilen gedruckt werden soll. + + +13.3 Übersetzung + +Wenn Sie bis jetzt auch als ELAN-Programmierer immer noch nicht +ganz durchblicken, wie Sie welche ELAN-Anweisungen verwenden +können, dann ist das noch kein Anlaß zur Sorge. Es ist kaum mög­ +lich, die genauen Auswirkungen beliebiger Anweisungen zu be­ +schreiben, ohne den Übersetzungsprozeß zu schildern, der diese +Anweisungen zu einem ELAN-Programm zusammenbindet. Daher soll +diese Übersetzung jetzt genauer erklärt werden. + +#on("b")#Übersetzungsmechanismus#off("b")# Alle Zeilen eines Abkürzungsteils +wer­ +den direkt in das Programm übernommen, wobei der Name einer Ab­ +kürzung durch einen beliebig gewählten Refinementnamen ersetzt +wird ('abk' + eine laufende Nummer). Alle Abkürzungen und Re­ +finements werden als globale Refinements definiert, also außerhalb +von Prozeduren. Dadurch wird erreicht, daß sie an jeder Stelle +verwendet werden können. + Damit eine Abkürzung richtig als Refinement übersetzt wird, +muß sie ein TEXT-Objekt als Wert liefern. Die anderen Refinements +sind beliebig, da Sie nur in selbstdefinierten Anweisungen verwen­ +det werden. Die Refinements der Abkürzungen werden in einer Zu­ +weisung an eine TEXT-Variable verwendet, damit der Druckgenera­ +tor auf den entsprechenden Wert zugreifen kann. + Jeder Abschnitt wird dagegen als eine Prozedur übersetzt. Jede +Folge von Musterzeilen wird in eine Anweisung übersetzt, diese +Musterzeilen einzusetzen und zu drucken. Jede '%%'-Anweisung +wird einfach unverändert dazwischen geschrieben. Die Vorspann- +Prozedur wird einmal zu Anfang aufgerufen, die Prozedur für den +Wiederholungsteil einmal für jeden ausgewählten Satz und die Nach­ +spann-Prozedur einmal am Schluß. + Bei Fehlern im ELAN-Teil zeigt der Compiler das erzeugte Pro­ +gramm zusammen mit seinen Fehlermeldungen im Paralleleditor. Sie +müssen nun die Fehlermeldung lokalisieren und anhand der eben +gegebenen Hinweise in das ursprüngliche Druckmuster zurücküber­ +setzen, damit Sie dort den Fehler korrigieren können. + +#on("b")#Beispiel#off("b")# Nun müßten Sie genug Informationen haben, um +beliebige +ELAN-Anweisungen in das Druckmuster einfügen zu können. Als +Beispiel wollen wir versuchen, alle Männer und Frauen in der +Adressendatei zu zählen, ohne ein Suchmuster einstellen zu müssen +und ohne den Druckvorgang zweimal ablaufen zu lassen (wie dies +bei dem obigen Beispiel der Fall war). Ein erster Versuch könnte so +aussehen: + + + % VORSPANN + %% INT VAR maenner, frauen; + %% maenner := 0; + %% frauen := 0; + % WIEDERHOLUNG + %% IF f ("m/w") = "m" THEN + %% maenner INCR 1 + %% ELSE + %% frauen INCR 1 + %% END IF + % NACHSPANN + &maenner Männer und %frauen Frauen vorhanden. + + +Aber Vorsicht! In diesem Beispiel sind mehrere Fehler eingebaut. +Finden Sie sie! + +#on("b")#Fehler im Beispiel#off("b")# Der erste Fehler befindet sich im +Nachspann. +Hier wird versucht, die Namen der beiden Variablen 'maenner' und +'frauen' direkt in einem Feldmuster zu verwenden. Diese beiden +Namen sind dem Druckgenerator nicht bekannt, sondern nur dem +ELAN-Compiler. Um die Werte der beiden Variablen einsetzen zu +können, müssen Sie also zwei geeignete Abkürzungen definieren. + Der zweite Fehler ist schwieriger zu finden. Wie oben gesagt, +wird jeder Abschnitt in eine Prozedur übersetzt. Die in einem Ab­ +schnitt definierten Variablen können also nur in diesem Abschnitt +verwendet werden (sie sind lokal) und auch nicht im Abkürzungs­ +teil, da dieser wieder global vereinbart wird. Die beiden im Vor­ +spann definierten Variablen stehen also im Wiederholungsteil und im +Nachspann nicht zur Verfügung. + +#on("b")#Anweisungen im Initialisierungsteil#off("b")# Für diesen Fall gibt +es die +Möglichkeit, ELAN-Anweisungen vor allen Abschnitten im Initiali­ +sierungsteil zu definieren. Diese Anweisungen sind dann ebenfalls +global. Das richtige Druckmuster finden Sie auf der nächsten Seite. + Natürlich könnten Sie die Initialisierung der beiden Variablen +auch noch aus dem Vorspann herausnehmen. Denken Sie daran, daß +Sie aus INT-Variablen erst einen Text machen müssen, ehe Sie sie +in eine Musterzeile einsetzen können. Beachten Sie Schreibweise der +Variablen: in ELAN können die Umlaute nicht in Bezeichnern ver­ +wendet werden, daher muß die Variable mit 'ae' geschrieben wer­ +den. Im Mustertext und in Abkürzungs- und Feldnamen können die +Umlaute jedoch frei verwendet werden. + + + %% INT VAR maenner, frauen; + % VORSPANN + %% maenner := 0; + %% frauen := 0; + % WIEDERHOLUNG + %% IF f ("m/w") = "m" THEN + %% maenner INCR 1 + %% ELSE + %% frauen INCR 1 + %% END IF + % NACHSPANN + &m Männer und %f Frauen vorhanden . + % ABKUERZUNGEN + &m : text (maenner) . + &f : text (frauen) . + + + +13.4 Gruppen + +Der Druckgenerator bietet die Möglichkeit, Vorspann und Nachspann +nicht nur am Anfang und am Ende, sondern auch an bestimmten +Stellen zwischen Sätzen zu drucken. Diese Stellen sind dadurch +bestimmt, daß ein bestimmtes Merkmal (z.B. ein Feldinhalt) seinen +Wert ändert. Ein solches Merkmal wird im Druckmuster #on("i")#Gruppe#off("i")# ge­ +nannt. + Ein Beispiel für die Verwendung von Gruppen ist eine Schüler­ +datei, die nach Klassen geordnet ist. Definiert man das Feld 'Klas­ +se' als Gruppe, so wird jeweils am Ende einer Klasse ein Nachspann +und am Beginn einer Klasse ein Vorspann gedruckt. + Dieses Verfahren ist eine Erweiterung der bisher beschriebenen +Methode, indem eine Datei quasi in mehrere Dateien untergliedert +wird, die jedoch in einem Arbeitsgang gedruckt werden können. +Voraussetzung dafür ist jedoch, daß die Datei nach dem Gruppen­ +merkmal geordnet ist - der Druckgenerator sammelt nicht erst alle +Schüler einer Klasse aus der Datei, sondern erwartet sie hinter­ +einander. + +#on("b")#Gruppendefinition#off("b")# Eine Gruppe wird im Initialisierungsteil +des +Druckmusters (also vor allen Abschnitten) definiert. Notwendige +Daten sind eine Nummer zur Identifizierung und das Merkmal. Die +Nummer sollte am sinnvollsten von 1 an vergeben werden; die mög­ +lichen Werte sind nach oben hin beschränkt. Das Merkmal ist ein +beliebiger ELAN-Ausdruck, der einen Text liefert. Sinnvollerweise +wird er den Inhalt eines Feldes enthalten. + Gruppendefinitionen müssen nach allen ELAN-Anweisungen im +Initialisierungsteil folgen, und zwar, weil die Gruppendefinitionen +alle in einer Prozedur zusammengefaßt werden, die bei jedem neuen +Satz auf Gruppenwechsel testet. + Unter der Annahme, daß die oben erwähnte Schülerdatei ein +Feld 'Klasse' besitzt, würde die Gruppe wie folgt definiert: + + + % GRUPPE 1 f ("Klasse") + + +Nach der Anweisung 'GRUPPE' folgt die Gruppennummer und dann +ein ELAN-Ausdruck. Die ganze Definition muß in einer Zeile stehen; +reicht der Platz nicht aus, müssen Sie in einem Abkürzungsteil ein +Refinement definieren. + +#on("b")#Klassenliste#off("b")# Das komplette Druckmuster für die +Klassenliste könn­ +te folgendes Aussehen haben, wenn außer 'Klasse' auch noch die +Felder 'Name' und 'Vorname' vorhanden sind: + + + % GRUPPE 1 f ("Klasse") + % VORSPANN + Klassenliste für Klasse &Klasse + ---------------------------- + % WIEDERHOLUNG + &Vorname %Name + % NACHSPANN + \#page\# + + +Wenn eine Gruppe definiert ist, werden im Nachspann immer die +Feldinhalte des letzten Satzes vor dem Gruppenwechsel gedruckt, im +Vorspann die Inhalte des ersten Satzes nach dem Wechsel. Daher +kann hier im Vorspann die Klasse gedruckt werden, da sie sich erst +ändert, wenn schon wieder der nächste Vorspann gedruckt wird. + +#on("b")#Mehrere Gruppen#off("b")# Wie die Identifikation über eine +Gruppennummer +vermuten läßt, können Sie mehrere Gruppen definieren. Nachspann +und Vorspann werden jeweils gedruckt, wenn sich das Merkmal ir­ +gendeiner Gruppe ändert. Ob eine bestimmte Gruppe gewechselt hat, +kann mit der Abfrage + + + BOOL PROC gruppenwechsel (INT CONST gruppennummer) + + +in einer IF-Anweisung ermittelt werden. Vor dem ersten und nach +dem letzten Satz wechseln automatisch alle Gruppen. + Die ganze Datei bildet eine Quasi-Gruppe mit der Nummer 0. +Sie ist immer definiert und wechselt nur vor dem ersten und nach +dem letzten Satz. Sie ist es, die bewirkt, daß Vorspann und Nach­ +spann in ihrer normalen Weise gedruckt werden. + +#on("b")#Anwendungsbeispiel#off("b")# Um einige der Möglichkeiten zu +illustrieren, +die durch Gruppen geschaffen werden, wollen wir als Beispiel eine +Anwendung betrachten, die neue Wege für die Benutzung von EUDAS +aufzeigt. + Aus einer Datei, in der für jede Bestellung der Kunde, der Ar­ +tikel, die bestellte Menge und der Einzelpreis des Artikels einge­ +tragen werden, sollen anschließend Rechnungen gedruckt werden. +Die Datei soll folgende Felder haben: + + + 'Kundennummer' + 'Artikelnummer' + 'Einzelpreis' + 'Menge' + + +Als Voraussetzung müssen die Bestellungen in der Datei jeweils +nach Kunden geordnet vorliegen. Die Kundennummer wird als Gruppe +definiert, so daß die Bestellungen eines Kunden zu einer Rechnung +zusammengefaßt werden können. Das Druckmuster rechnet dann die +einzelnen Preise zusammen und gibt eine Endsumme aus. + Damit in der Rechnung Name und Adresse des Kunden auftau­ +chen können, wird zu der Bestellungsdatei die Kundendatei gekop­ +pelt, die folgende Felder haben soll: + + + 'Kundennummer' + 'Name' + 'Vorname' + 'Strasse' + 'PLZ' + 'Ort' + + +Stellen Sie sich zum Ausprobieren des folgenden Druckmusters ge­ +gebenenfalls eigene Daten zusammen. Hier nun das Druckmuster: + + + %% REAL VAR gesamtpreis, summe; + % GRUPPE 1 f ("Kundennummer") + % VORSPANN + %% summe := 0.0; + Fa. Kraus & Sohn + Schotterstr. 10 + + 5000 Köln 1 + &Vorname %Name + &Strasse + + &PLZ &Ort &Datum + + R E C H N U N G + =============== + + Menge Artikelnr. Einzelpreis Gesamtpreis + ------------------------------------------------ + % ABKUERZUNGEN + &Datum : date . + + % WIEDERHOLUNG + %% gesamtpreis := round + %% (wert ("Einzelpreis") * wert ("Menge"), 2); + %% summe INCR gesamtpreis; + &Menge &Artikelnummer &&&&epr&& &&&&gpr&& + % ABKUERZUNGEN + &epr : f ("Einzelpreis") . + &gpr : zahltext (gesamtpreis, 2) . + + % NACHSPANN + ------------------------------------------------ + Summe: &&&&sum&& + + 14% MWSt. &&&Mwst&& + ========= + Endbetrag &&&&end&& + \#page\# + % ABKUERZUNGEN + &sum : zahltext (summe, 2) . + &Mwst : zahltext (mwst, 2) . + &end : zahltext (summe + mwst, 2) . + mwst : round (summe * 0.14, 2) . + + +Im Initialisierungsteil dieses Druckmusters wird die Kundennummer +als Gruppe definiert. Dies hat zur Folge, daß für jeden neuen Kun­ +den eine neue Rechnung begonnen wird, nachdem vorher im Nach­ +spann die Rechnungssumme des vorherigen Kunden berechnet und +ausgedruckt wurde. Vor dieser Gruppendefinition sind 'gesamtpreis' +und 'summe' definiert, die später als globale Variablen zur Verfü­ +gung stehen sollen. Diese Zeile darf nicht nach der Gruppendefini­ +tion stehen. + Im Vorspann wird der Kopf der Rechnung angegeben. Dieser +enthält neben den Daten des Kunden (aus der gekoppelten Kun­ +dendatei) noch das Datum. Die Kundennummer wird nur zum Kop­ +peln und als Gruppenmerkmal benötigt, erscheint also nicht auf der +Rechnung. + Es fällt auf, daß im Firmennamen ein '&'-Zeichen auftaucht, +das doch für die Markierung von Feldmustern reserviert ist. Die +beiden Musterzeichen können jedoch im normalen Text auftauchen, +wenn ihnen direkt ein Leerzeichen folgt. In diesem Fall werden Sie +nicht als Beginn eines Feldmusters interpretiert, sondern unverän­ +dert gedruckt. Der gleiche Fall taucht noch mit '%' im Nachspann +auf. + Im Wiederholungsteil wird zunächst aus dem Einzelpreis und der +Menge des jeweiligen Artikels der Gesamtpreis für diesen Artikel +berechnet. Für die Abfrage der Feldinhalte wird die Funktion 'wert' +verwendet, die wie 'f' funktioniert, jedoch gleich einen REAL-Wert +liefert. + Zu beachten ist, daß 'wert' wie beim Sortieren von Zahl alle +Sonderzeichen ignoriert. Weiterhin müssen die Zahlen mit dem ein­ +gestellten Dezimalkomma geschrieben werden (also normalerweise +mit Komma), damit ihr Wert richtig erkannt wird. Anderenfalls soll­ +ten Sie den Dezimalpunkt einstellen (s. 11.1). + Damit kaufmännisch richtig gerechnet wird, wird der Gesamt­ +preis auf 2 Nachkommastellen gerundet und erst dann aufsummiert. +Würde der Gesamtpreis nur zum Einsetzen gerundet, könnten bei der +anschließenden Addition der nicht gerundeten Werte eine falsche +Gesamtsumme entstehen. + Erst nach diesen Berechnungen kann die Musterzeile folgen, in +die die Werte dann eingesetzt werden. Um eine Ausgabe mit zwei +Nachkommastellen zu erzeugen, wird die von EUDAS definierte +Funktion 'zahltext' benutzt. Diese erzeugt aus einem REAL-Wert +einen Text mit der angegebenen Anzahl von Kommastellen und setzt +das korrekte Dezimalkomma ein. Das Ergebnis dieser Funktion wird +dann rechtsbündig eingesetzt. + Im Nachspann wird dann der summierte Wert mit aufgeschlage­ +ner Mehrwertsteuer gedruckt. Die Mehrwertsteuer muß ebenfalls auf +zwei Nachkommastellen gerundet werden. + +#on("b")#Erweiterung#off("b")# Zur Erweiterung könnten Sie die Bestelldatei +noch mit +einer Artikeldatei koppeln, die etwa folgende Struktur haben würde: + + + 'Artikelnummer' + 'Bezeichnung' + 'Einzelpreis' + + +In diesem Fall könnten Sie noch jeweils die Artikelbezeichnung in +eine Rechnungszeile drucken. Außerdem würde der Preis zentral +gespeichert. Eine entsprechende Änderung des Druckmusters sollte +Ihnen keine Schwierigkeiten bereiten. + + + diff --git a/doc/eudas/eudas.hdb.14 b/doc/eudas/eudas.hdb.14 new file mode 100644 index 0000000..1aa3c87 --- /dev/null +++ b/doc/eudas/eudas.hdb.14 @@ -0,0 +1,724 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (151)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +14 Ausdrücke in ELAN + + + +14.1 Was sind Ausdrücke ? + +In diesem Kapitel wollen wir uns mit ELAN-Ausdrücken beschäfti­ +gen, wie sie für EUDAS gebraucht werden. Natürlich kann dies keine +ernsthafte Einführung für ELAN-Programmierer sein - mit solchen +Ambitionen halten Sie sich am besten an die entsprechende ELAN- +Literatur. + Dieser Text richtet sich eher an den Benutzer, der kaum Erfah­ +rung mit ELAN hat, aber die Möglichkeiten von EUDAS optimal nut­ +zen will. Viele fortgeschrittene Fähigkeiten von EUDAS laufen ja +über ELAN-Programme. + +#on("b")#Vorkommen#off("b")# Sie haben ELAN-Ausdrücke bereits an +verschiedenen +Stellen eingesetzt, wenn Sie sich mit den vorhergehenden Kapiteln +befaßt haben. ELAN-Ausdrücke werden in nahezu allen Verarbei­ +tungsfunktionen benötigt. + Im Druckmuster dienen sie dazu, den Inhalt eines Feldmusters +festzulegen. Die Definition einer Abkürzung besteht immer aus dem +Namen der Abkürzung und einem Ausdruck. Ebenso wird in einer +Gruppendefinition ein Ausdruck angegeben. + Beim Kopiermuster und beim Änderungsmuster besteht jeweils +die rechte Seite einer Anweisung aus einem Ausdruck. Weiterhin +werden Ausdrücke auch in anderen ELAN-Konstruktionen benötigt, +wie zum Beispiel direkt am Anfang einer IF-Anweisung. + +#on("b")#Bedeutung#off("b")# Ein Ausdruck steht allgemein für einen Wert. Im +ein­ +fachsten Fall kann dies eine Konstante sein, der Wert des Aus­ +drucks ändert sich also nicht. Anderenfalls spricht man von einem +zusammengesetzten Ausdruck. Dessen Wert ergibt sich dann durch +die Ausführung der im Ausdruck angegebenen Operationen. Dieser +Wert kann je nach dem aktuellen Zustand des Systems verschieden +sein, da er jedes Mal neu berechnet wird, wenn er gebraucht wird. + Ein Beispiel für einen zusammengesetzten Ausdruck ist 2+2 +Dieser Ausdruck steht für den Wert 4. + Der Wert eines Ausdrucks ist das, was uns eigentlich interes­ +siert. Beim Druckvorgang wird dieser Wert dann gedruckt, beim +Kopieren und Verändern in ein Feld eingetragen. + +#on("b")#Zusammensetzung#off("b")# Ausdrücke lassen sich aus verschiedenen +Ele­ +menten zusammensetzen. Grundlage bilden die Konstanten. Konstan­ +ten können durch #on("i")#Operatoren#off("i")# miteinander verknüpft werden. So ist +in dem Ausdruck 2+3 das '+' ein Operator, der die Konstanten 2 +und 3 verknüpft. Das Ergebnis der Verknüpfung hängt natürlich vom +jeweiligen Operator ab. + Wie Sie schon in der Schule gelernt haben ("Punktrechnung vor +Strichrechnung"), muß man die Reihenfolge der Operatoren festlegen, +wenn mehrere Operatoren im Spiel sind. Ähnliche Regeln gibt es für +alle Operatoren in ELAN. + Wenn eine andere Reihenfolge der Operatoren erwünscht ist, +können Sie diese durch Einsatz von Klammern verändern. Auch dies +dürfte Ihnen aus der Schule noch in Erinnerung sein. Der Unter­ +schied in ELAN ist lediglich, daß es dort einige zusätzliche Opera­ +toren gibt, die Ihnen nicht aus der Mathematik vertraut sind. + Ein weiteres Konstruktionselement von Ausdrücken sind #on("i")#Funk­ +tionen#off("i")#. Auch diese kennen Sie aus der Schule. Lediglich die +Schreibweise muß für den "dummen" Computer etwas ausführlicher +gehalten werden (Beispiel: sin (3.14 * x)). + Die Argumente der Funktion hinter dem Funktionsnamen müssen +auf jeden Fall in Klammern stehen. In der Terminologie der Pro­ +grammiersprachen spricht man von #on("i")#Parametern#off("i")#. Parameter können +wieder komplexe Ausdrücke sein. Bei Funktionen mit mehreren +Parametern werden diese durch Komma getrennt: + + + min (2.5 * x, x + 1.25) + + + +14.2 Datentypen + +Bevor wir beginnen, konkrete Ausdrücke zu behandeln, müssen wir +erst das Konzept der #on("i")#Datentypen#off("i")# einführen. Grundidee dabei ist, +daß es verschiedene Klassen von Werten gibt, die nicht einfach +untereinander gemischt werden können. + So gibt es in ELAN einen grundlegenden Unterschied zwischen +#on("i")#Zahlen#off("i")# und #on("i")#Texten#off("i")#. Texte bestehen aus einer beliebigen Aneinan­ +derreihung von Zeichen, die im Normalfall nur für den betrachten­ +den Menschen eine Bedeutung haben. Mit Zahlen kann man dagegen +Berechnungen anstellen. + Der tiefere Grund für die Trennung in verschiedene Typen ist +also, daß für jeden Typ gewisse Operationen definiert snd, die nur +für diesen Typ sinnvoll sind. So ist zum Beispiel die Addition der +beiden Texte "abc" und "-/-" völlig sinnlos. + Aber nicht nur die Operationen sind verschieden, sondern auch +die interne Darstellung im Rechner. So werden der Text "1234" und +die Zahl 1234 völlig anders gespeichert, obwohl man ihnen die glei­ +che Bedeutung beimessen könnte. + +#on("b")#Grundtypen#off("b")# In ELAN gibt es vier verschiedene Grundtypen, +die für +uns wichtig sind. Sie können sich in ELAN auch eigene Typen +schaffen, dies geht jedoch weit über unsere Bedürfnisse hinaus. + Der in EUDAS am meisten verwendete Typ heißt #on("i")#TEXT#off("i")#. TEXT- +Objekte bestehen aus einer Folge von 0 bis 32000 Zeichen. Die Zei­ +chen entstammen einem Satz von 256 verschiedenen Symbolen, die +jeweils eine andere Darstellung haben. Einige der Zeichen lassen +sich überhaupt nicht darstellen, sondern führen bestimmte Funktio­ +nen aus (zum Beispiel Bildschirm löschen). + Sämtliche Feldinhalte einer EUDAS-Datei sind TEXTe, ebenso +die Zeilen von Textdateien. Auch Datei- und Feldnamen sind +TEXTe. Von daher besteht eigentlich kein Grund, warum Sie sich +außer zur Programmierung noch mit anderen Datentypen beschäfti­ +gen sollten. + Neben den Texten gibt es noch die Zahlen. Diese sind in ihrer +internen Darstellung so beschaffen, daß ein effizientes Rechnen mit +ihnen möglich ist. Andererseits können sie nicht mehr beliebige +Informationen darstellen, sondern haben eine sehr eingeschränkte +Bedeutung. + Um unterschiedichen Bedürfnissen gerecht zu werden, gibt es in +ELAN zwei verschiedene Zahltypen. Der Typ #on("i")#INT#off("i")# umfaßt nur ganze +Zahlen ohne Kommastellen. Damit die Zahl möglichst wenig Spei­ +cherplatz belegt, ist der Wertebereich bei den meisten Rechnern auf +-32768..32767 beschränkt (die krummen Zahlen ergeben sich wegen +der Binärarithmetik des Rechners). Dieser Typ eignet sich am besten +zum Abzählen und zum Auswählen aus einer festen Anzahl von +Objekten (zum Beispiel Feld 1 bis Feld 255). + Zum eigentlichen Rechnen gibt es den Typ #on("i")#REAL#off("i")#. Dieser umfaßt +auch Kommazahlen. Genauigkeit, Wertebereich und Darstellung sind +nahezu identisch mit den Möglichkeiten eines Taschenrechners. der +Typ REAL wird immer dann verwendet, wenn mit realen Größen +(Geldbeträge, physikalische Werte) gerechnet werden muß. + Zuletzt gibt es noch den Typ #on("i")#BOOL#off("i")#. Er hat nur zwei mögliche +Werte, nämlich TRUE (wahr) und FALSE (falsch). Er wird dazu benö­ +tigt, Ausdrücke zu schreiben, die den Zweig einer IF-Anweisung +bestimmen. + +#on("b")#Denotation#off("b")# ELAN verfügt über einen strengen Typenschutz; +das +heißt, Objekte verschiedenen Typs dürfen nicht gemischt werden. +Daher muß schon bei der Schreibweise der Konstanten festgelegt +sein, welchen Typ die Konstante hat. + Bei Texten geschieht dies durch den Einschluß in Anführungs­ +striche. Die Anführungsstriche sorgen gleichzeitig auch für eine +Abgrenzung der Zeichen des Textes und des umgebenden Programms. +Sie kennen diese Schreibweise bereits von vielen Stellen in EUDAS. + Ebenfalls keine Probleme bereitet der Typ BOOL, da die +Schreibweise der beiden möglichen Werte TRUE und FALSE eindeutig +ist. + Problematisch wird es bei den Zahlen. Da die ganzen Zahlen in +den rationalen Zahlen enthalten sind, muß für die ganzen Zahlen +durch die Schreibweise festgelegt werden, zu welchem der beiden +Typen sie gehören. Man hat festgelegt, daß REAL-Zahlen immer mit +Komma geschrieben werden müssen, während Zahlen ohne Komma den +Typ INT haben (das Komma wird in ELAN bei den REAL-Zahlen in +internationaler Schreibweise als Punkt notiert). + So ist 4 eine INT-Zahl, während 4.0 den Typ REAL besitzt. +Denken Sie in Zukunft immer daran, welcher Zahltyp jeweils ver­ +langt wird und richten Sie die Schreibweise danach. + +#on("b")#Unterschied zu Feldtypen#off("b")# Verwechseln Sie die hier +vorgestellten +Datentypen nicht mit den Feldtypen einer EUDAS-Datei. Die Feld­ +typen beziehen sich immer auf den gleichen Datentyp, nämlich +TEXT. Die Feldtypen bestimmen lediglich die spezielle Behandlung +des Feldes beim Suchen und Sortieren, während Datentypen tat­ +sächlich Unterschiede in der Speicherung und den anwendbaren +Operationen bedeuten. + Daher können Sie Feldtypen auch nach Bedarf ändern, während +der Datentyp eines Objekts ein für alle Mal feststeht. Merken Sie +sich, daß Feldinhalte in EUDAS immer den Typ TEXT haben. + +#on("b")#Umwandlungen#off("b")# Obwohl verschiedene Datentypen nicht +miteinander +gemischt werden dürfen, können sie mit speziellen Funktionen in­ +einander umgewandelt werden. So ist zum Beispiel die Addition von +1 und 1.5 verboten, aber der folgende Ausdruck + + + real (1) + 1.5 + + +liefert den Wert 2.5 mit dem Typ REAL. Umgekehrt geht die Um­ +wandlung mit der Funktion 'int', dabei werden jedoch die Nachkom­ +mastellen abgeschnitten. Weitere Hinweise dazu erhalten Sie im +Abschnitt 14.4. + Wichtiger jedoch ist die Umwandlung von Zahlen in TEXT-Ob­ +jekte. Was Sie auf Ihrem Bildschirm oder Ausdruck sehen, sind ja +immer nur Zeichenfolgen und damit Texte. Zahlen (INT oder REAL) +in ihrer internen Darstellung können Sie prinzipiell nicht sehen. Sie +müssen zur Darstellung immer in Texte umgewandelt werden. + Auch beim Rechnen mit Werten aus EUDAS-Dateien müssen +mehrere Umwandlungen stattfinden. Der Feldinhalt, der ja ein TEXT +ist, muß zunächst in eine Zahl umgewandelt werden. Dann wird mit +dieser Zahl gerechnet. Wenn das Ergebnis wieder in ein Feld einge­ +tragen oder gedruckt werden soll, muß eine Rückumwandlung in +einen Text vorgenommen werden. + Die zum Umwandeln benötigten Funktionen werden ebenfalls im +Abschnitt 14.4 besprochen. + +#on("b")#Funktionsbeschreibung#off("b")# In den zwei folgenden Abschnitten +sollen +die wichtigsten Funktionen und Operatoren anhand von Beispielen +beschrieben werden. Da jede Funktion nur auf bestimmte Datentypen +angewendet werden kann, gibt es eine Notation, die genau die Form +eines Funktionsaufrufs festlegt. + + + INT PROC min (INT CONST a, b) + + +Die obige Schreibweise hat folgende Bedeutung: Spezifiziert wird die +Funktion 'min', die als Ergebnis einen INT-Wert liefert (das INT +ganz links). Die Bezeichnung PROC gibt an, daß es sich um eine +Funktion handelt. In Klammern ist dann angegeben, welche Parame­ +ter verwendet werden müssen. Die Funktion hat zwei Parameter, +beide vom Typ INT. Die Bezeichnung CONST gibt an, daß auch Kon­ +stanten verwendet werden dürfen (Normalfall). + Zu beachten ist, daß bei jedem Aufruf beide Parameter vorhan­ +den und vom Typ INT sein müssen. Anderenfalls gibt es eine Feh­ +lermeldung. + Die gleiche Schreibweise wird auch zur Spezifikation von Ope­ +ratoren verwendet: + + + INT OP + (INT CONST a, b) + + +Jedoch dürfen Operatoren nicht mit Parametern in Klammern ge­ +schrieben werden, sondern der Operator wird zwischen die Parameter +geschrieben. + Eine Besonderheit von ELAN ist es, daß es verschiedene Opera­ +toren und Funktionen mit gleichem Namen geben kann. Die Funktio­ +nen werden nur unterschieden nach dem Typ ihrer Parameter. So +gibt es nicht nur den oben genannten Operator '+', sondern auch +den folgenden: + + + REAL OP + (REAL CONST a, b) + + +Obwohl im Aussehen gleich, handelt es sich doch um verschiedene +Operatoren mit möglicherweise völlig verschiedener Wirkung. Dies +sieht man an diesem Beispiel: + + + TEXT OP + (TEXT CONST a, b) + + +Dieser Operator führt nun keine Addition aus, sondern eine #on("i")#Verket­ +tung#off("i")# zweier Texte. Je nach Typ der Parameter wird der entspre­ +chende Operator ausgesucht. + + +14.3 TEXT-Funktionen + +In diesem Abschnitt wollen wir die wichtigsten Funktionen und +Operatoren zur Behandlung von Texten beschreiben. Wie Sie noch +sehen werden, spielt dabei aber auch der Typ INT eine gewisse +Rolle. + +#on("b")#EUDAS-Abfragen#off("b")# Die wichtigste Funktion zur Abfrage von +Inhal­ +ten der aktuellen Datei sollten Sie bereits kennen: + + + TEXT PROC f (TEXT CONST feldname) + + +Neu ist eigentlich nur die Schreibweise der Spezifikation. Sie sollten +aber in der Lage sein, daraus einen konkreten Ausdruck zu kon­ +struieren. Bisher haben wir immer die Schreibweise + + + f ("Feldname") + + +verwendet. Dies ist jedoch nur ein Beispiel. Die korrekte Angabe +finden Sie oben. + Die Funktion 'f' darf natürlich nicht angewendet werden, wenn +keine Datei geöffnet ist. In die Verlegenheit kommen Sie aber nur +beim Ausprobieren, denn alle gefährlichen EUDAS-Funktionen sind +sonst gesperrt. + Falls das angegebene Feld nicht existiert, wird mit einer Feh­ +lermeldung abgebrochen. Beachten Sie, daß dies immer erst bei der +Ausführung festgestellt werden kann. Bei der Eingabe, zum Beispiel +eines Druckmusters, kann dies noch nicht überprüft werden. + Eine weitere Abfrage, die EUDAS während des Druckens ermög­ +licht, ist die Funktion + + + TEXT PROC lfd nr + + +Diese hat keine Parameter und liefert die laufende Nummer des +gedruckten Satzes. + Diese beiden Funktionen können als Ausgangsbasis dienen zur +Manipulation mit weiteren Funktionen. + +#on("b")#Verkettung#off("b")# Zur Verkettung von Teiltexten gibt es den oben +schon +beschriebenen Operator '+'. Wenn Sie mehr als zwei Texte verketten +wollen, können Sie den Operator beliebig hintereinander verwenden: + + + f ("PLZ") + " " + f ("Ort") + + +Wie in diesem Beispiel können Sie sowohl Konstanten als auch Tex­ +te, die von anderen Funktionen geliefert werden, verketten. Beach­ +ten Sie, daß die Texte immer ohne Zwischenraum aneinandergehängt +werden; daher wird im obigen Beispiel ein Leerzeichen extra ange­ +geben. + Wenn Sie eine bestimmte Anzahl von gleichen Zeichen haben +möchten (zum Beispiel für horizontale Linien oder große Zwischen­ +räume), können Sie dafür folgenden Operator verwenden: + + + TEXT OP * (INT CONST anzahl, TEXT CONST einzeltext) + + +Hier sehen Sie als Beispiel einen Operator, der mit verschiedenen +Datentypen arbeitet. Sie müssen die Parameter jedoch immer in der +angegebenen Reihenfolge benutzen. Das folgende Beispiel ist kor­ +rekt: + + + 20 * "-" + + +während dies nicht erlaubt ist: + + + "-" * 20 + + +Wieder können Sie diesen Operator mit anderen Funktionen verknü­ +pfen: + + + "!" + 10 * " " + "!" + 5 * "-" + "!" + + +Da der Multiplikationsoperator Vorrang vor der Addition hat, kom­ +men Sie hier sogar ohne Klammern aus (überlegen Sie sich, wo ein +Fehler auftreten würde, wenn dies nicht so wäre). Als Ergebnis +dieses komplexen Ausdrucks ergäbe sich der folgende Text: + + + "! !-----!" + + +#on("b")#Teiltexte#off("b")# Um auch Teile von Texten bearbeiten zu können, +werden +die Zeichen eines Textes von 1 an (mit INT-Zahlen) durchnumeriert. +Anhand dieser Positionen können Sie Teiltexte extrahieren. + Damit Sie die Position des letztes Zeichens (und damit die An­ +zahl der Zeichen) erfragen können, gibt es die Funktion + + + INT PROC length (TEXT CONST text) + + +Wieviel Zeichen in einem Feld stehen, können Sie also mit + + + length (f ("Feldname")) + + +erfahren. + Einen Teiltext bekommen Sie mit der Funktion 'subtext'. Diese +gibt es in zwei Ausführungen. + + + TEXT PROC subtext (TEXT CONST text, INT CONST anfang) + + +liefert den Teiltext von einer bestimmten Position an (einschließ­ +lich) bis zum Textende. Mit + + + TEXT PROC subtext (TEXT CONST t, INT CONST anf, ende) + + +können Sie auch die Position des letzten Zeichens (einschließlich) +angeben. Daher würden die beiden folgenden Aufrufe + + + subtext (f ("Feldname"), 1) + subtext (f ("Feldname"), 1, length (f ("Feldname"))) + + +den Feldinhalt unverändert liefern. Ein weiteres Beispiel: + + + subtext ("Ein Text als Beispiel", 5, 8) + + +liefert als Ergebnis "Text". + Es gibt noch den Operator 'SUB', der jeweils nur ein Zeichen +aus dem Text liefert: + + + TEXT OP SUB (TEXT CONST text, INT CONST stelle) + + +Der Aufruf ist gleichwertig zu einem Aufruf von 'subtext', in dem +beide Stellen gleich sind. + Bei beiden Funktionen wird nicht vorhandener Text einfach +ignoriert. So liefert + + + subtext ("Hallo", 4, 8) + + +das Ergebnis "lo" und + + + "Hallo" SUB 10 + + +den leeren Text "". + +#on("b")#Verschachtelte Ausdrücke#off("b")# Wie Sie bereits gesehen haben, +kann +man Ausdrücke ineinander verschachteln. Dies ist in unserem Fall +sehr nützlich, wenn Teiltexte bestimmt werden sollen, deren Posi­ +tion nicht konstant ist. Ein Beispiel, in dem 'length' bei der Fest­ +legung der Endposition verwendet wird, haben Sie weiter oben +bereits gesehen. + Als weitere Möglichkeit können Sie mit Positionen, die ja INT- +Zahlen sind, ganz normal rechnen. Folgender Ausdruck liefert zum +Beispiel die letzten drei Zeichen eines Feldes: + + + subtext (f ("Feldname"), length (f ("Feldname")) - 2) + + +Wichtig ist, daß ein Ausdruck, der wieder als Parameter für einen +anderen Ausdruck verwendet werden soll, den richtigen Typ hat, +der von dem anderen Ausdruck verlangt wird. + In dem obigen Beispiel muß als Position ein INT verwendet +werden. Diese Position wird vom Operator '-' berechnet. Es gibt +aber nur einen Subtraktionsoperator, der einen INT liefert, nämlich +den, der wiederum zwei INTs subtrahiert. Glücklicherweise sind +sowohl 'length' als auch die 2 vom Typ INT, anderenfalls wäre der +Ausdruck fehlerhaft. 'length' wiederum benötigt einen TEXT als +Parameter, der von der Funktion 'f' stammt, die als Parameter eben­ +falls einen TEXT verlangt. + Wie Sie sehen, kann es durchaus verwickelt zugehen, wenn ein +Ausdruck aus den verschiedensten Teilausdrücken unterschiedlichen +Typs zusammengesetzt ist. Die gleiche Überprüfung wie eben ge­ +schildert sollten Sie bei jedem Ausdruck vornehmen, damit keine +Fehlermeldung erscheint. + +#on("b")#Variable Positionen#off("b")# Zur Berechnung von Positionen gibt es +noch eine weitere nützliche Prozedur, nämlich + + + INT PROC pos (TEXT CONST text, teiltext) + + +Sie liefert die Position, an der der angegebene Teiltext zum ersten +Mal in dem Text vorkommt, oder 0, wenn der Teiltext nicht darin +vorkommt. So ist + + + pos ("Hallo", "l") = 3 + + +und + + + pos ("Hallo", "lo") = 4 + + +und + + + pos ("Hallo", "xx") = 0 + + +Diese Funktion kann zum Beispiel dazu verwendet werden, ein Feld +in mehrere Teile aufzuspalten. Sind zum Beispiel Name und Vorname +in einem Feld durch Leerzeichen getrennt hintereinandergeschrie­ +ben, liefert + + + subtext (f ("Name"), 1, pos (f ("Name"), " ") - 1) + + +den Vornamen und entsprechend + + + subtext (f ("Name"), pos (f ("Name"), " ") + 1) + + +den Nachnamen. Soll die Position erst ab einer gewissen Stelle ge­ +sucht werden, gibt es noch die folgende Variation der Funktion: + + + INT PROC pos (TEXT CONST text, teiltext, INT CONST ab) + + +Bei dieser Funktion wird erst ab der angegebenen Stelle einschließ­ +lich gesucht. + + +14.4 Rechenfunktionen + +#on("b")#Umwandlungen#off("b")# Bevor mit dem Inhalt eines Feldes gerechnet +wer­ +den kann (auch wenn das Feld den Feldtyp ZAHL hat), muß der Wert +des Feldinhaltes als REAL-Zahl berechnet werden. Dazu gibt es die +Funktion + + + REAL PROC wert (TEXT CONST feldname) + + +Die Funktion 'wert' ignoriert alle Sonderzeichen in dem Feld außer +dem Minuszeichen (als Vorzeichen) und dem eingestellten Dezimal­ +komma. Wenn das Feld 'Summe' beispielsweise "-***20,09 DM" ent­ +hält, ergibt sich + + + wert ("Summe") = 20.09 + + +Zum kaufmännischen Rechnen ist es manchmal erforderlich, den Wert +auf eine bestimmte Anzahl von Nachkommastellen zu runden. Diese +Anzahl kann man bei einer Variante von 'wert' als Parameter ange­ +ben: + + + REAL PROC wert (TEXT CONST feldname, + INT CONST kommastellen) + + +Mit den so erhaltenen Werten können Sie dann die weiter unten +beschriebenen Berechnungen durchführen. Bevor Sie das Ergebnis +jedoch drucken oder in ein Feld eintragen können, müssen Sie den +REAL-Wert wieder in einen TEXT verwandeln. Dazu dient die Funk­ +tion + + + TEXT PROC zahltext (REAL CONST wert, + INT CONST kommastellen) + + +Der übergebene Wert wird mit der gewünschten Anzahl von Komma­ +stellen als Text formatiert. Dazu wird der Wert gerundet. Außerdem +wird statt eines Punktes das eingestellte Dezimalkomma eingesetzt. +Die Länge des Textes richtet sich nach der Anzahl von benötigten +Stellen, es werden also keine führenden Nullen oder Leerzeichen +eingesetzt (dafür kann man den Text beim Drucken ja rechtsbündig +einsetzen). + Wird 0 als Kommastellen angegeben, wird auch kein Dezimal­ +komma erzeugt (Darstellung wie ein INT). Als Abkürzung können Sie +auch + + + TEXT PROC zahltext (TEXT CONST feldname, + INT CONST kommastellen) + + +als Ersatz für + + + zahltext (wert ("Feldname"), kommastellen) + + +verwenden. So kann ein Feld einheitlich zum Drucken formatiert +werden. + +#on("b")#Arithmetik#off("b")# Sowohl mit INT- als auch mit REAL-Zahlen +(jedoch +nicht gemischt) können Sie die üblichen Rechenoperatoren '+', '-' +und '*' verwenden. Auch Minimum ('min') und Maximum ('max') sind +für zwei Parameter dieser Typen definiert. + Lediglich die Division wird bei beiden Typen unterschiedlich +gehandhabt. Für REAL-Zahlen gibt es den Operator '/' für die +übliche Division. Da die ganzzahlige Division eine andere Bedeutung +hat, wird dafür der Operator 'DIV' verwendet. Den Rest der ganz­ +zahligen Division liefert 'MOD'. + 'abs' liefert den Wert eines REAL oder INT ohne das Vorzeichen. +Die Umwandlungsfunktionen 'int' und 'real' hatten wir ja bereits +weiter oben erwähnt. + Für REAL-Zahlen gibt es noch weitere mathematische Funktio­ +nen (Exponentialfunktion, Trigonometrie), die Sie am besten im +EUMEL-Benutzerhandbuch nachschlagen, wenn Bedarf dafür besteht. + + +14.5 Abfragen + +#on("b")#IF-Abfragen#off("b")# Wie Sie schon im vorigen Kapitel gesehen +haben, +kann man in Druckmustern auch IF-Abfragen als Ausdrücke ver­ +wenden. Die IF-Abfragen können zwar auch ineinander verschach­ +telt werden, sie dürfen jedoch nicht mehr innerhalb eines normalen +Ausdrucks angewendet werden. + Eine IF-Abfrage enthält 3 Teilausdrücke in folgender Form: + + + IF 'BOOL-Ausdruck' THEN + 'Ausdruck1' + ELSE + 'Ausdruck2' + END IF + + +Der erste Ausdruck muß einen Wert vom Typ BOOL liefern, der ent­ +scheidet, welcher der beiden Teilausdrücke ausgewertet wird. Wir +werden gleich noch sehen, was für Möglichkeiten es da gibt. + Die beiden Teilausdrücke dürfen auch wieder IF-Abfragen sein, +sind sie es jedoch nicht, dürfen in ihnen dann keine IF-Abfragen +mehr vorkommen. Die IF-Abfragen liegen also immer auf der äußer­ +sten Ebene. + Die beiden Teilausdrücke dürfen einen beliebigen Typ haben, er +muß jedoch für beide gleich sein. + Als Ergebnis der IF-Abfrage wird 'Ausdruck1' geliefert, wenn +der BOOL-Ausdruck wahr ist, sonst 'Ausdruck2'. + +#on("b")#Vergleiche#off("b")# Die wesentlichen Operationen, die boolesche +Ausdrücke +zur Verwendung in IF-Abfragen bilden, sind die Vergleichsoperato­ +ren: + + + = <> <= >= < > + + +Sie vergleichen jeweils zwei Elemente vom Typ TEXT, INT oder REAL +und liefern TRUE (wahr) oder FALSE (falsch). Selbstverständlich +können auch sie zwei zusammengesetzte Teilausdrücke vergleichen. + Eine Anwendung ist zum Beispiel der Test, ob ein Text in einem +anderen enthalten ist: + + + IF pos (f ("Betrag"), "DM") > 0 THEN + "deutsches Geld" + ELSE + "ausländisches Geld" + END IF + + +Die Funktion 'pos' wird hier dazu benutzt, festzustellen, ob es sich +um deutsches oder ausländisches Geld handelt. + Oft müssen jedoch mehrere Vergleiche miteinander kombiniert +werden. Zu diesem Zweck gibt es die beiden Operatoren AND (und) +und OR (oder). Damit AND das Ergebnis TRUE liefert, müssen beide +Vergleiche wahr sein, bei OR muß mindestens einer der beiden wahl +sein. + Die Reihenfolge aller dieser Operatoren ist so gewählt, daß +normalerweise keine Klammern benötigt werden. Funktionen haben +immer Vorrang vor Operatoren, bei den Operatoren kommt die Multi­ +plikation vor der Addition, dann kommen die Vergleiche, danach das +AND und danach das OR. Alle anderen Operatoren (#on("i")#insbesondere +SUB#off("i")#) teilen sich den letzten Rang. + Wenn Sie also in einem Ausdruck mehrere Vergleiche mit AND +und OR verknüpfen, und das OR soll stärker binden als das AND, +müssen Sie dies durch Klammern ausdrücken. + Den oben besprochenen Operator SUB sollten Sie immer in +Klammern setzen, wenn Sie ihn in einem Vergleich benutzen. Da er +die niedrigste Priorität hat, gäbe es sonst mit Sicherheit Fehler: + + + IF (f ("Name") SUB 1) = "M" THEN + "vielleicht Müller" + ELSE + "bestimmt nicht" + END IF + + +#on("b")#Refinements#off("b")# Bisher hatten wir gesagt, daß IF-Abfragen +nicht +innerhalb von anderen Ausdrücken verwendet werden dürfen. Diese +Einschränkung kann man umgehen, indem man #on("i")#Refinements#off("i")# verwen­ +det. + Ein Refinement hat im Druckmuster eine ähnliche Wirkung wie +eine Abkürzung, lediglich der Name darf nur mit Kleinbuchstaben +und Ziffern geschrieben sein und kann nicht als Feldmuster ver­ +wendet werden. + + + &abk : + subtext (f ("Name"), namensanfang) . + namensanfang : + IF pos (f ("Name"), " ") > 0 THEN + pos (f ("Name"), " ") + 1 + ELSE + length (f ("Name")) + END IF . + + +Innerhalb von Refinements dürfen auch wieder andere Refinements +verwendet werden. + Auch in Kopier- und Änderungsmustern können Sie Refinements +verwenden. Hier müssen Sie jedoch darauf achten, daß alle Refine­ +ments am Ende gesammelt werden und vor dem ersten Refinement +ein Punkt stehen muß. Ebenso müssen die Refinements wie im +Druckmuster durch Punkte voneinander getrennt sein: + + + "Anrede" K anrede; + . + anrede : + IF f ("m/w") = "w" THEN + "Frau" + ELSE + "Herr" + END IF . + + + diff --git a/doc/eudas/eudas.hdb.15 b/doc/eudas/eudas.hdb.15 new file mode 100644 index 0000000..c0a22cf --- /dev/null +++ b/doc/eudas/eudas.hdb.15 @@ -0,0 +1,286 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (165)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +15 Anweisungen in ELAN + + + +15.1 Variablen und Zuweisungen + +Im vorigen Kapitel haben wir Ausdrücke in ELAN kennengelernt. Der +Wert eines Ausdrucks wird bei jeder Verwendung erneut berechnet. +Wenn wir den Wert eines Ausdrucks aufbewahren wollen, müssen wir +ihn schon in eine EUDAS-Datei schreiben. + Oft tritt jedoch die Notwendigkeit auf, Werte zu merken, ohne +sie in einer Datei zu speichern. Beispiel dafür ist ein Zählvorgang im +Druckmuster. In jedem Wiederholungsteil muß der dazukommende +Wert zum bisherigen, aufsummierten und aufbewahrten Wert addiert +werden. Das Zwischenergebnis der Zählung muß also irgendwo ge­ +speichert werden. + +#on("b")#Variablen#off("b")# Zu diesem Zweck gibt es Variablen. Sie sind +ähnlich wie +Felder in einer Datei. Ihre Existenz ist jedoch unabhängig von einer +Datei. Außerdem sind sie zu Anfang nicht einfach leer, sondern +haben einen undefinierten Wert. + Variablen müssen im Programm definiert werden. Sie existieren +dann während der Ausführung dieses Programms und gehen an­ +schließend verloren. Zu Beginn des Programms sind sie, wie schon +gesagt, undefiniert. + Eine Variable muß immer einen Typ haben. Dieser Typ ist für +die Lebensdauer der Variable unveränderlich. Die Variable kann +natürlich nur Werte dieses Typs annehmen. + Eine Variablendefinition (oder auch -deklaration) besteht aus +der Angabe eines Typs, dem Schlüsselwort VAR und einem freige­ +wählten Namen. Wie schon bei den Refinements darf ein solcher +Name nur aus Kleinbuchstaben (keine Umlaute) und eventuell Zif­ +fern bestehen. Dagegen darf der Name Leerzeichen enthalten. +Beispiel: + + + INT VAR zaehler; + TEXT VAR feldname; + REAL VAR mein ergebnis 1; + + +Das Semikolon am Ende beschließt die Definition. + Die Lebensdauer einer Variablen hängt davon ab, an welcher +Stelle sie definiert ist. Eine Variable, die im Druckmuster im Initia­ +lisierungsteil definiert ist, behält ihren Wert für die gesamte Dauer +des Druckvorgangs. Eine Variable in einem Abschnitt lebt dagegen +nur für eine Abarbeitung dieses Abschnitts. Bei der nächsten Abar­ +beitung ist sie wieder undefiniert. + Das gleiche gilt für Kopier- und Änderungsmuster. Auch hier +sind Variablen nur für die Dauer der Bearbeitung eines Satzes +gültig. + +#on("b")#Zuweisung#off("b")# Um einer Variablen einen Wert zu geben, führt +man eine +#on ("i")#Zuweisung#off("i")# aus. Die Zuweisung wird durch Doppelpunkt und Gleich­ +heitszeichen aneinandergeschrieben gekennzeichnet. Auf der linken +Seite steht die Variable, auf der rechten Seite eine Ausdruck: + + + zaehler := 1; + + +Wie oben schließt das Semikolon die Anweisung ab. Nach der Aus­ +führung hat die Variable den Wert 1. Der Wert vorher ist für die +Zuweisung egal, er kann definiert oder undefiniert sein. + Eine Variable kann in einem Ausdruck verwendet werden, indem +man einfach den Namen hinschreibt. Der Ausdruck + + + zaehler + 1 + + +hat nach der obigen Zuweisung den Wert 2. Eine Variable muß bei +der Verwendung definiert sein, sonst können beliebige Fehler ent­ +stehen. Es muß also vor der ersten Verwendung ausdrücklich eine +Zuweisung erfolgt sein. + Da Variablen in Ausdrücken verwendet werden können und +Ausdrücke auf der rechten Seite einer Zuweisung stehen, ist folgen­ +de Konstruktion möglich: + + + zaehler := zaehler + 1; + + +Diese Zeile bewirkt, daß der Wert der Variable um 1 erhöht wird. +Zuerst wird bei der Zuweisung der Wert des Ausdrucks auf der rech­ +ten Seite bestimmt. Zu diesem Zeitpunkt habe die Variable bei­ +spielsweise den Wert 1. Der Ausdruck hat dann den Wert 2 (1+1). +Dieser Wert wird der neue Wert der Variablen. + Bei der nächsten Ausführung würde sich der gleiche Vorgang +wiederholen, so daß die Variable anschließend den Wert 3 hat. + Auch bei der Zuweisung gilt natürlich, daß die Variable auf der +linken Seite den gleichen Datentyp haben muß wie der Ausdruck auf +der rechten Seite. + +#on("b")#Initialisierung#off("b")# Sie können Variablendeklaration und +Zuweisung +auch miteinander verknüpfen, so daß die Variable gleich zu Anfang +einen Wert erhält: + + + INT VAR zaehler := 0; + + +Dieses Verfahren ist eine gute Vorsichtsmaßregel, damit Sie keine +undefinierten Variablen verwenden. + +#on("b")#Inkrement#off("b")# Da der Fall so häufig auftritt, daß der Wert +einer Vari­ +ablen um einen bestimmten Wert erhöht wird (bei allen Zählvorgän­ +gen), gibt es auch dafür eine Abkürzung, und zwar die beiden Ope­ +ratoren INCR und DECR. + + + zaehler INCR 1; + mein ergebnis 1 DECR 24.4; + + +Die Operatoren sind für REALs und INTs definiert. INCR erhöht um +einen Betrag, DECR erniedrigt. Auf der rechten Seite darf wieder ein +beliebiger Ausdruck stehen. + Für TEXTe gibt es eine ähnliche Abkürzung, allerdings nur für +die Addition (Verkettung). Hier heißt der Operator CAT. Die beiden +folgenden Zeilen haben die gleiche Bedeutung: + + + feldname := feldname + "."; + feldname CAT "."; + + + +15.2 Weitere Konstruktionen + +#on("b")#IF#off("b")# Die Ihnen bereits bekannte IF-Konstruktion dient nicht +nur +dazu, Werte zu liefern, sondern steuert auch die Abarbeitung von +beliebigen Anweisungen. Diese Anweisungen können Kopier- und +Änderungsanweisungen sein (s. Kapitel 11), oder die oben beschrie­ +benen Zuweisungen. + In einem Teil der IF-Konstruktion können auch mehrere Anwei­ +sungen stehen. Diese müssen dann jedoch unbedingt durch Semiko­ +lon getrennt sein. Mehrere Anweisungen hintereinander haben ein­ +fach die Bedeutung der Ausführung in der notierten Reihenfolge. + Als drittes kann auch der ELSE-Teil weggelassen, da nicht in +jedem Fall ein Ergebnis erwartet wird. Falls die Bedingung nicht +zutrifft, muß nicht unbedingt etwas ausgeführt werden. + + + IF zaehler > 0 THEN + zaehler DECR 1; + mein ergebnis 1 INCR wert ("zaehlfeld") + END IF; + + +Auch diese IF-Konstruktion kann wieder geschachtelt werden. Für +viele Fälle gibt es jedoch einen ELIF-Teil, der die Verschachtelung +erspart: + + + IF f ("m/w") = "m" THEN + maenner INCR 1 + ELIF f ("m/w") = "w" THEN + frauen INCR 1 + ELSE + zweifelhaft INCR 1 + END IF; + + +Der ELIF-Teil beinhaltet noch einmal einen Test. Dieser Test wird +jedoch nur dann durchgeführt, wenn die erste Bedingung falsch war. +Gibt es noch mehr Wahlmöglichkeiten, können Sie beliebig viele +ELIF-Teile benutzen. + Beachten Sie, daß die letzte Anweisung in einem Teil der IF- +Konstruktion nicht unbedingt ein folgendes Semikolon haben muß +(das Semikolon soll nur trennen). Ein Semikolon an dieser Stelle +kann aber auch nicht schaden. + +#on("b")#Werteliefernde Programme#off("b")# Nicht nur Ausdrücke können Werte +lie­ +fern, sondern auch ganze Anweisungsfolgen. Dies ist eine Erweite­ +rung der werteliefernden IF-Konstruktion. Sie können dies für Ab­ +kürzungen oder Refinements ausnutzen. + + + endergebnis : + gesammelte zeichen CAT "."; + gesammelte zeichen . + + +In diesem Beispiel werden in einer Textvariable bestimmte Zeichen +gesammelt. Zum Schluß soll ein Punkt angefügt werden und dieser +Text dann als Ergebnis des Refinements geliefert werden. + Damit eine Anweisungsfolge einen Wert liefert, muß am Ende +der Anweisungsfolge ein Ausdruck stehen. Der Wert des Ausdrucks +nach Abarbeitung der Anweisungen ist dann der Wert der Anwei­ +sungsfolge. + Allerdings kann man den gleichen Wert oft verschieden aus­ +drücken. Folgendes Refinement hat die gleiche Wirkung wie oben: + + + endergebnis : + gesammelte zeichen + "." . + + +In manchen Fällen ist eine Formulierung als werteliefernde Anwei­ +sungsfolge jedoch übersichtlicher. + +#on("b")#Beispiel#off("b")# Zum Abschluß dieses Kapitels wollen wir als +Beispiel eine +statistische Auswertung einer Zahlenreihe als Druckmuster formu­ +lieren. + Gegeben sei eine Datei mit folgenden Feldern: + + + "Meßwert 1" + "Meßwert 2" + + +Wir wollen als Ergebnis Mittelwert und Standardabweichung der +beiden Meßwerte ausdrucken. Dazu dient das Druckmuster auf der +folgenden Seite. + Im Initialisierungsteil des Druckmusters werden die notwendi­ +gen Variablen definiert und initialisiert. Beachten Sie hier, daß in +einer Definition mehrere Variablen durch Komma getrennt aufgeführt +werden können, wenn sie den gleichen Typ haben. + Im Wiederholungsteil müssen dann jeweils die Zwischensummen +aktualisiert werden. Da mit der Funktion 'wert' eine relativ auf­ +wendige Umwandlung verbunden ist, wird der Wert des jeweiligen +Feldes erst einmal in einer Variable zwischengespeichert, da er +mehrmals benötigt wird. Diese Zwischenspeicherungsvariable muß +nicht initialisiert werden + Im Nachspann werden dann die Ergebnisse gedruckt. Die Formeln +sind jeweils als Abkürzungen definiert. Die Funktion 'zahltext' sorgt +dafür, daß die Werte mit drei Nachkommastellen (gerundet) aufge­ +führt werden. + Da die Formeln relativ komplex sind, werden sie auf mehrere +Zeilen verteilt (in ELAN hat das Zeilenende keine Bedeutung). + + + %% REAL VAR + %% messwert, + %% summe 1 := 0.0, quadratsumme 1 := 0.0, + %% summe 2 := 0.0, quadratsumme 2 := 0.0; + %% INT VAR anzahl := 0; + % WIEDERHOLUNG + %% anzahl INCR 1; + %% messwert := wert ("Meßwert 1"); + %% summe 1 INCR messwert; + %% quadratsumme 1 INCR messwert * messwert; + %% messwert := wert ("Meßwert 2"); + %% summe 2 INCR messwert; + %% quadratsumme 2 INCR messwert * messwert; + % NACHSPANN + &anz Meßwerte. + Meßwert 1 Meßwert 2 + Mittelwert &&mw1&&&& &&mw2&&&& + Standardabweichung &&st1&&&& &&st2&&&& + % ABKUERZUNGEN + &mw1 : zahltext (summe 1 / real (anzahl), 3) . + &mw2 : zahltext (summe 2 / real (anzahl), 3) . + &st1 : zahltext + (sqrt ((quadratsumme 1 - summe 1 * summe 1 / + real (anzahl)) / real (anzahl - 1)), 3) . + &st2 : zahltext + (sqrt ((quadratsumme 2 - summe 2 * summe 2 / + real (anzahl)) / real (anzahl - 1)), 3) . + + +Mit entsprechenden Formeln können Sie dieses Beispiel für Ihre +eigenen Statistiken erweitern. Die Beispiele der letzten beiden Ka­ +pitel sollten Ihnen genügend Anregungen dafür gegeben haben. + diff --git a/doc/eudas/eudas.hdb.16 b/doc/eudas/eudas.hdb.16 new file mode 100644 index 0000000..5f5d575 --- /dev/null +++ b/doc/eudas/eudas.hdb.16 @@ -0,0 +1,350 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (171)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +16 Dateiverwaltung mit EUDAS + + + +16.1 Dateien im System + +Zum Bearbeiten von Dateien innerhalb des Systems gibt es das Menü +'Dateien', das Sie bereits in Kapitel 4 kurz kennengelernt haben. +An dieser Stelle sollen die übrigen Funktionen dieses Menüs be­ +sprochen werden. + + + -------------- + Dateien System + U Übersicht + -------------- + Datei + L Löschen + N Umbenennen + K Kopieren + P Platzbedarf + A Aufräumen + -------------- + +#center#Abb. 16-1 Menü 'Dateien' + + +Beachten Sie, daß alle Funktionen in diesem Menü mit Dateien +beliebiger Struktur arbeiten können, also sowohl mit Textdateien +als auch EUDAS-Dateien (und anderen). Dies liegt daran, daß +Dateien an dieser Stelle einfach als "schwarze Kästen" mit beliebi­ +gem Inhalt betrachtet werden. + +#on("b")#Übersicht#off("b")# Die Funktion 'Übersicht' haben Sie bereits +ausprobiert. +Sie zeigt in einem Editorfenster an der rechten Seite alle Dateien, +die sich in Ihrer Task befinden. Falls nicht alle Dateien auf den +Bildschirm passen, können Sie das Fenster mit HOP OBEN und HOP +UNTEN rollen. Sie verlassen die Übersicht wie üblich mit ESC 'q'. + +#on("b")#Löschen#off("b")# Auch die Funktion 'Löschen' sollten Sie schon +kennen. +Mit dieser Funktion verschwindet eine Datei auf Nimmerwieder­ +sehen. Daher werden Sie sicherheitshalber immer gefragt, ob Sie die +Datei wirklich löschen wollen. Sie können in einer Auswahl auch +alle zu löschenden Dateien ankreuzen (dann wird trotzdem nochmal +gefragt). + Eine EUDAS-Datei, die gerade geöffnet ist, können Sie nicht +löschen (sonst würde EUDAS zumindest durcheinanderkommen). Sie +müssen die Datei zuerst sichern - oder nicht sichern, aber die +Arbeitskopien löschen. + +#on("b")#Umbenennen#off("b")# Mit der Funktion 'Umbenennen' können Sie einer +Datei +einen neuen Namen geben. Sie werden zuerst aufgefordert, den alten +Namen der Datei einzugeben. Alternativ können Sie hier wieder die +umzubenennenden Dateien auswählen. Danach wird Ihnen (für jede +ausgewählte Datei) der alte Dateiname zum Überschreiben angebo­ +ten. + Sie können diesen Namen mit den üblichen Editierfunktionen +verändern oder mit HOP RUBOUT löschen und ganz neu eingeben. +Auf diese Weise sparen Sie sich erheblichen Tippaufwand, wenn Sie +einen langen Dateinamen an nur einer Stelle verändern wollen. + +#on("b")#Kopieren#off("b")# Wie in Abschnitt 11.2 bereits angedeutet, gibt es +eine +Funktion zum logischen Kopieren von Dateien. Dies ist eine Funk­ +tion, die sich auf spezielle Eigenschaften des EUMEL-Systems +stützt. Wenn Sie eine Datei #on("i")#logisch#off("i")# kopieren, wird lediglich ein +Verweis kopiert. Die Daten werden zunächst nur einmal für beide +Dateien gespeichert. + Natürlich hätte das Ganze wenig Sinn, wenn danach bei Ände­ +rungen immer beide Dateien geändert würden. Bei Änderungen an +einer Datei werden jedoch nur die geänderten Daten getrennt ange­ +legt, der Rest wird weiterhin gemeinsam benutzt. Die beiden Dateien +sind also nach außen hin komplett unabhängig, intern werden je­ +doch gemeinsame Daten so weit wie möglich geteilt. Auf diese Weise +wird sowohl Zeit als auch Speicherplatz gespart. + Dieses Verfahren ist besonders dann sinnvoll, wenn Sie sich +einen bestimmten Stand einer Datei aufbewahren wollen. In diesem +Fall stellen Sie sich eine logische Kopie her und arbeiten mit dem +Original weiter. Es werden dann nur die Daten zusätzlich angelegt, +die Sie seit der Kopie verändert haben. + EUDAS benutzt die gleiche Funktion auch für die Arbeitskopie. +Die Arbeitskopie teilt ebenfalls ihre Daten mit dem Original. Ande­ +renfalls wäre es ja auch zeitlich gar nicht möglich, beim Öffnen eine +Arbeitskopie anzufertigen. + Beim Aufruf der Funktion 'Kopieren' werden Sie zunächst nach +dem Namen der Datei gefragt (wie üblich mit Auswahlmöglichkeit). +Dann können Sie einen neuen Namen für die Kopie angeben. Dieser +neue Name darf jedoch nicht für eine andere Datei vergeben sein. +Wollen Sie eine andere Datei überkopieren, müssen Sie diese zu­ +nächst löschen. + Denken Sie daran, daß die hier beschriebene Funktion sich +wesentlich vom Kopieren im Menü 'Gesamtdatei' unterscheidet. Dort +wird nämlich eine tatsächliche Kopie durchgeführt, dafür können Sie +sich dann auch selektiv bestimmte Daten herausgreifen. Außerdem +gilt die dortige Funktion nur für EUDAS-Dateien. + +#on("b")#Platzbedarf#off("b")# Zu Ihrer Information können Sie sich auch den +Platz­ +bedarf anzeigen lassen, den eine Datei auf dem Speichermedium hat. +Wenn Sie den Namen der Datei angegeben haben, wird Ihnen die +Größe in "Kilobyte" (KB) angegeben. Ein KB entspricht etwa 1000 +Zeichen, also einer halben vollgeschriebenen Bildschirmseite. + Bei logisch kopierten Dateien wird für jede Datei der benötigte +Platz separat angegeben. Sie können die Zahlen also nicht einfach +addieren, um den Gesamtspeicherbedarf zu ermitteln, da Sie dann +die gemeinsam benutzten Bereiche doppelt zählen würden. + +#on("b")#Aufräumen#off("b")# Wenn eine Datei viel geändert wurde, führen zwei +Effekte zu einer langsameren Verarbeitung dieser Datei. Zum einen +wird durch Textleichen der Platzbedarf größer. Dies tritt vor allem +dann auf, wenn zu einzelnen Sätzen immer etwas hinzugefügt wurde +(eine Folge der Flexibilität, mit variablen Textlängen operieren zu +dürfen). + Da der Platzbedarf der Datei also wächst, sind mehr Speicher­ +zugriffe notwendig, als es dem Inhalt entspricht. Doch nicht nur der +Platz, sondern auch die Verteilung der Sätze machen sich unange­ +nehm bemerkbar. Da vergrößerte Sätze intern am Ende der Datei +gespeichert werden, werden logisch aufeinanderfolgende Sätze phy­ +sikalisch weit verstreut. + Der gleiche Effekt ensteht auch durch Umsortieren oder Ein­ +fügen von Sätzen. Um die Datei sequentiell zu bearbeiten, sind also +ständig wechselnde Speicherzugriffe erforderlich. + Die beiden beschriebenen Effekte führen zur Geschwindigkeits­ +verringerung. Dies kann verhindert werden, indem die Datei in eine +frische Datei umkopiert wird. Diesen Vorgang nennt man #on("i")#Reorgani­ +sieren#off("i")#. Dafür gibt es die Funktion 'Aufräumen'. + Während des Umkopierens werden die Satznummern ausgegeben. +Achten Sie darauf, daß zum Reorganisieren genügend Platz auf dem +System vorhanden ist, um eine komplette Kopie der zu reorganisie­ +renden Datei aufzunehmen. + Zum Reorganisieren muß nämlich tatsächlich eine physikalische +Kopie angefertigt werden. Eine logische Kopie oder das Schreiben +auf das Archiv reorganisieren eine Datei dagegen nicht, wohl aber +die Funktion 'Kopieren' im Menü 'Gesamtdatei'. + Da der Inhalt gelesen werden muß, funktioniert die Funktion +'Aufräumen' im Gegensatz zu den oben gemachten Versprechungen +nur für Textdateien oder EUDAS-Dateien, nicht aber für andere +Dateitypen. Die Unterscheidung der Dateitypen wird automatisch +vorgenommen. + + +16.2 Dateien auf dem Archiv + +Mit den Funktionen im Menü 'Archiv' können Sie nicht nur Dateien +auf dem Archiv behandeln, sondern auch in anderen Tasks oder per +EUMEL-Netz sogar auf anderen Rechnern. + + + -------------- + Dateien Archiv + U Übersicht + D Üb. Drucken + -------------- + Datei + K Kopieren + vom Archiv + S Schreiben + auf Archiv + L Löschen + auf Archiv + -------------- + Archivdiskette + I Init + -------------- + Z Zielarchiv + P Paßwort + R Reservieren + -------------- + +#center#Abb. 16-2 Menue 'Archiv' + + +#on("b")#Zielarchiv#off("b")# Dazu können Sie die Task einstellen, mit der +Sie arbei­ +ten möchten. Normaleinstellung ist die Task 'ARCHIVE', die Ihre +Archivdiskette bedient. Dies wird auch in der untersten Bildschirm­ +zeile angezeigt. + Die Task stellen Sie mit der Funktion 'Zielarchiv' ein. Sie +werden dann nach dem Namen der Task gefragt. Diese Task muß +eine Managertask sein (also unabhängig vom Bildschirm arbeiten) +und sie muß bereits existieren. + Wenn Sie auf Ihrem Rechner das EUMEL-Netz installiert haben, +werden Sie auch nach der Nummer der Zielstation gefragt, also der +Nummer des Rechners, auf dem die gewünschte Task arbeitet. Durch +Drücken von RETURN wird automatisch Ihre eigene Stationsnummer +verwendet. + Nun gibt es zwei Arten von Managertasks, mit denen EUDAS +zusammenarbeiten kann, #on("i")#Archivmanager#off("i")# und normale Dateimanager. +Der Unterschied besteht darin, daß ein Archivmanager für einen +Benutzer reserviert werden muß, damit man nicht auf Disketten +eines anderen Benutzers zugreifen kann. Normale Dateimanager +können und sollen dagegen von mehreren Benutzern in beliebiger +Reihenfolge angesprochen werden. + Manche Rechner haben mehrere Archivmanager für mehrere +Diskettenlaufwerke. Durch das Einstellen des Zielarchivs können Sie +auf verschiedenen Laufwerken archivieren. Ein Archivmanager kann +sich natürlich auch auf einem anderen Rechner befinden. Sie benut­ +zen dann dessen Diskettenlaufwerk. + Beim Einstellen des Zielarchivs wird als letztes gefragt, ob die +Zieltask ein Archivmanager ist oder nicht. Im Normalfall sollten Sie +die Frage bejahen, wenn Sie 'ARCHIVE' einstellen, und ansonsten +verneinen (s. die obigen Ausnahmefälle). + Das eingestellte Zielarchiv wird jeweils in der untersten Bild­ +schirmzeile angezeigt. + Die Reservierung eines Archivmanagers findet beim ersten Zu­ +griff statt. Beim Umschalten des Zielarchivs oder Verlassen des +Menüs wird die Reservierung automatisch wieder aufgehoben. + +#on("b")#Übersicht#off("b")# Mit der Funktion 'Übersicht' können Sie eine +Auflistung +aller Dateien abrufen, die sich auf der Archivdiskette (bzw. in dem +eingestellten Manager) befinden. Wie die Dateiübersicht im System +können Sie die Darstellung wie im Editor rollen und mit ESC 'q' +verlassen. + Wollen Sie die Übersicht gedruckt haben, rufen Sie die Funktion +'Übersicht drucken' auf. Die Übersicht wird dann nochmals zusam­ +mengestellt und gleich gedruckt. + +#on("b")#Schreiben und Lesen#off("b")# Mit den Funktionen 'Kopieren vom +Archiv' +und 'Schreiben auf Archiv' können Sie Dateien zwischen dem Archiv +und Ihrer Task hin und her transportieren. Es wird jeweils eine +Kopie angefertigt, das heißt das Original auf der Diskette oder in +Ihrer Task wird nicht verändert. + Wenn die transportierte Datei an ihrem Ziel schon existiert, +wird gefragt, ob die vorher existierende Datei gelöscht (überschrie­ +ben) werden soll. Überschreiben aus Versehen ist nicht möglich, +wenn Sie die Frage sorgfältig beantworten. + Beim Aufruf der Funktionen können Sie den gewünschten Da­ +teinamen angeben oder in der Auswahl ankreuzen. Die Auswahl ist +hier besonders sinnvoll, wenn Sie mehrere Dateien (eventuell sogar +in einer bestimmten Reihenfolge) sichern müssen. Außerdem können +Sie ja keine Datei transportieren, die nicht existiert; alle Möglich­ +keiten werden Ihnen also durch Ankreuzen angeboten. + Beachten Sie, daß beim Überschreiben einer Datei auf einer +Archivdiskette der Speicherplatz der alten (überschriebenen) Ver­ +sion im allgemeinen nicht wiederverwendet werden kann. In diesem +Fall kann das Archiv voll werden, obwohl eigentlich genügend Platz +da wäre. + +#on("b")#Löschen#off("b")# Das gleiche Problem tritt auf beim Löschen einer +Datei +auf dem Archiv. Mit der Funktion 'Löschen auf Archiv' können Sie +zwar die Datei auf der Diskette ungültig machen, der Platz wird +jedoch nur dann wiederverwendet, wenn es die letzte Datei auf der +Diskette war. Anderenfalls bleiben "Leichen" übrig, die Sie in der +Archivübersicht als Striche erkennen können. + Diese Probleme treten jedoch mit anderen Managern nicht auf, +da diese Ihren Speicherplatz intelligenter verwalten können. + +#on("b")#Initialisieren#off("b")# Als Abhilfe bei einem übergelaufenen Archiv +müssen +Sie das ganze Archiv initialisieren und neu beschreiben. Dazu gibt +es die Funktion 'Init'. + Diese Funktion müssen Sie auch dann verwenden, wenn Sie eine +Archivdiskette zum ersten Mal verwenden. Auf dem Archiv muß +nämlich als erstes der Archivname eingetragen werden, ehe es be­ +nutzt werden kann. Diesen Namen müssen Sie hier angeben. + Alle alten Daten des Archivs werden komplett gelöscht. Daher +müssen Sie vorher die noch gültigen Daten vom Archiv ins System +kopiert haben. Wenn das Archiv vorher schon beschrieben war, +werden Sie anhand des Namens gefragt, ob Sie die richtige Diskette +zum Überschreiben eingelegt haben. + Wenn Sie eine fabrikneue Diskette aus der Verpackung nehmen, +müssen Sie diese vor der Initialisierung #on("i")#formatieren#off("i")#. Dabei wird die +Diskette auf ein bestimmtes physikalisches Format eingestellt. Ohne +diese Operation ist weder Schreiben noch Lesen überhaupt möglich. + In der Regel muß eine Diskette nur einmal formatiert werden. +Sie können sie jedoch jederzeit wieder formatieren (wenn Sie zum +Beispiel nicht wissen, was Ihnen da für eine alte Diskette in die +Finger geraten ist). + Am Anfang des Initialisierens werden Sie gefragt, ob Sie die +Diskette formatieren wollen. Manche Rechner unterstützen diese +Operation innerhalb des EUMEL-Systems nicht. In diesem Fall (und +natürlich auch sonst normalerweise) müssen Sie die Frage vernei­ +nen. Das Formatieren muß dann vorher irgendwie außerhalb des +Systems geschehen sein. + Das Initialisieren funktioniert natürlich nur bei Archivmana­ +gern. Bei einer anderen Zieltask ist diese Funktion gesperrt. + +#on("b")#Paßwort#off("b")# Dateien in einem allgemeinen Dateimanager (nicht +jedoch +auf dem Archiv) können Sie mit einem Paßwort gegen unbefugten +Zugriff sichern. Sinnvolle Voraussetzung dafür ist, daß der Datei­ +manager selbst mit einem anderen Paßwort gegen Betreten gesichert +ist. + Das von Ihnen verwendete Paßwort geben Sie mit der Funktion +'Paßwort' ein. Damit Ihnen niemand über die Schulter schauen +kann, werden alle Zeichen auf dem Bildschirm als Punkte darge­ +stellt. Anschließend müssen Sie das Paßwort noch einmal eingeben, +damit sich kein unbemerkter Schreibfehler eingeschlichen hat. + Das Paßwort wird dann bei allen Transport- und Löschopera­ +tionen abgefragt. Eine Datei im Manager erhält Ihr Paßwort zuge­ +wiesen, wenn Sie sie das erste Mal im Manager ablegen. Bei allen +folgenden Zugriffen muß das gleiche Paßwort eingestellt sein, sonst +wird der Zugriff verweigert. + Natürlich können Sie für verschiedene Dateien verschiedene +Paßwörter einstellen. Trotz Einstellung eines Paßworts können auch +andere Benutzer ihre Dateien im gleichen Manager ablegen. + Sie können auch für Schreiben (und Löschen) sowie Lesen +unterschiedliche Paßwörter einstellen. Dazu benutzen Sie einfach +einen Trennstrich in der Form + + + Schreibpaßwort/Lesepaßwort + + +Soll eine Datei überhaupt nicht überschrieben oder gelöscht werden +können, können Sie '-' als Schreibpaßwort verwenden: + + + -/Lesepaßwort + + +Die Datei kann dann nur beim direkten Betreten der Managertask +verändert werden. + Wollen Sie die Paßworteinstellung wieder aufheben, drücken Sie +bei der Paßworteingabe nur RETURN, da der leere Text als "kein +Paßwort" interpretiert wird. + +#on("b")#Reservieren#off("b")# Wollen Sie eine Task als Zieltask verwenden, +die zwar +kein Archivmanager ist, aber reserviert werden muß (zum Beispiel +'DOS' zum Ansprechen fremder Diskettenformate) müssen Sie die +Reservierung mit der Funktion 'Reservieren' selbst vornehmen. Die +Zieltask darf nicht als Archivmanager gekennzeichnet sein (dann ist +die Funktion 'Reservieren' nämlich gesperrt). + Bei der Reservierung müssen Sie den Reservierungsparameter +(abhängig von der Art der Zieltask - bei 'DOS' beispielsweise den +Modus) als Text eingeben. Nach der Reservierung können Sie die +anderen Funktionen des Archivmenüs verwenden. + Die Freigabe der Zieltask erfolgt automatisch beim Verlassen +des Menüs oder beim Einstellen einer neuen Zieltask. + diff --git a/doc/eudas/eudas.hdb.2 b/doc/eudas/eudas.hdb.2 new file mode 100644 index 0000000..f3f14e1 --- /dev/null +++ b/doc/eudas/eudas.hdb.2 @@ -0,0 +1,178 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (11)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +2 Installation des Programms + + + +Bevor Sie EUDAS auf Ihrem System benutzen können, müssen Sie das +Programm zuvor installieren. Wenn EUDAS schon auf Ihrem System +zur Verfügung steht, können Sie dieses Kapitel getrost überlesen. + + +2.1 Lieferumfang + +EUDAS wird auf einer Diskette geliefert, die alle notwendigen Pro­ +gramme enthält. Um den Inhalt der Diskette feststellen zu können, +starten Sie Ihr System und bringen es dazu, daß 'gib kommando:' +erscheint. Dann legen Sie die Diskette ein und geben das Kommando + + + archive ("EUDAS"); list (archive); release (archive) + + +Anschließend erscheint eine Übersicht der auf dem Archiv vorhan­ +denen Programmteile. Folgende Namen sollten sich in dieser Über­ +sicht wiederfinden: + + + "eudas.1" + "eudas.2" + "eudas.3" + "eudas.4" + "eudas.init" + "eudas.generator" + "Adressen" + + +Eventuell können noch weitere Namen in der Übersicht auftauchen. +Sollte einer der angegebenen Namen nicht vorhanden sein, rekla­ +mieren Sie die Diskette. Falls Sie statt der Übersicht eine Fehler­ +meldung erhalten, sollten Sie überprüfen, ob die Diskette das rich­ +tige Format besitzt oder Ihr Diskettenlaufwerk Probleme bereitet. + Wenn Sie so den Inhalt der Diskette kontrolliert haben, können +Sie EUDAS installieren. Je nachdem, ob Sie ein Single-User oder ein +Multi-User System benutzen, sind die Anweisungen unterschiedlich. +Sie brauchen nur den Sie betreffenden der beiden folgenden Ab­ +schnitte zu lesen. Falls Sie nicht wissen, welches System Sie benut­ +zen: ein Multi-User System wird auf der Systemdiskette und am +Bildschirm durch die Kennzeichnung 'EUMEL x.y.z/M' identifiziert, +bei einem Single-User System steht als letztes Zeichen ein 'S'. + + +2.2 Single-User + +Dieser Abschnitt betrifft Sie nur, wenn Sie EUDAS auf einem +Single-User System installieren wollen. + Sie können EUDAS immer nur auf einer bestimmten Hinter­ +grunddiskette installieren. Auf dieser Diskette sollten noch min­ +destens 250 KB frei sein (stellen Sie dies durch das Kommando +'storage info' sicher). EUDAS kann anschließend auch nur auf dieser +Diskette verwendet werden. + Starten Sie nun die gewünschte Diskette. Dann legen Sie die +Diskette, auf der EUDAS sich befindet, in das Archivlaufwerk. Geben +Sie dann das Kommando + + + archive ("EUDAS"); fetch ("eudas.generator", archive); run + + +Sie haben damit das Generatorprogramm gestartet, das die Installa­ +tion automatisch durchführt. Lassen Sie während dieses Vorganges +das EUDAS-Archiv eingelegt. Sie werden benachrichtigt, wenn die +Generierung abgeschlossen ist. + Wenn Sie EUDAS auf allen Ihren Hintergrunddisketten haben +möchten, können Sie das so erzeugte System als Muttersystem +sichern. Mit dem Kommando 'save system' können Sie den Hinter­ +grund komprimiert auf eine leere Archivdiskette schreiben. Mit +dieser Sicherung können Sie dann jederzeit neue Systemdisketten +wie von Ihrem Originalsystem herstellen. + +#on("b")#Einschränkungen#off("b")# Aus Platzgründen hat die +Single-User-Version von EUDAS folgende Einschränkungen: +#free (0.2)# + Sie können die Funktionen Ketten und Koppeln nicht verwenden. +#free (0.2)# + Sie können im Druckmuster keine ELAN-Anweisungen und -Aus­ + drücke verwenden. +#free (0.2)# + Es stehen nur einige allgemeine Hilfstexte zur Verfügung. +#free (0.2)# + Funktionen, die mehrere Tasks vorausssetzen, sind ebenfalls + gesperrt. +#free (0.2)# +Die betreffenden Funktionen sind zwar gegebenenfalls im Menü +enthalten, lassen sich aber nicht aufrufen. + + +2.3 Multi-User + +Dieser Abschnitt betrifft Sie nur, wenn Sie EUDAS auf einem Mul­ +ti-User System installieren wollen. + EUDAS muß in einer bestimmten Task installiert werden. Alle +neuen Söhne und Enkel dieser Task können dann EUDAS aufrufen. +Im Normalfall wird diese Task 'PUBLIC' sein. + Zum Installieren müssen Sie in diese Task gehen (in diesem +Beispiel 'PUBLIC'). Dazu rufen Sie durch Tippen der SV-Taste den +Supervisor und geben das Kommando + + + continue ("PUBLIC") + + +Stelle Sie mit Hilfe des 'storage info'-Kommandos fest, ob auf Ihrem +Hintergrund noch mindestens 300 KB frei sind (dieser Platz wird zur +Generierung benötigt). Dann legen Sie die EUDAS-Archivdiskette ein +und geben folgendes Kommando + + + archive ("EUDAS"); fetch ("eudas.generator", archive); run + + +Falls die Task 'PUBLIC' Söhne besitzt, werden Sie gefragt, ob Sie +diese löschen wollen. EUDAS steht nämlich nur in den Söhnen zur +Verfügung, die #on("i")#nach#off("i")# der Installation eingerichtet wurden. Antworten +Sie auf die Frage durch einfaches Tippen von 'j' oder 'n'. wenn Sie +die Frage verneinen, können Sie die Generierung zu diesem Zeit­ +punkt auch noch abbrechen und zunächst die Söhne aufräumen. + Es erscheint die Frage + + + Ausführliche Hilfstexte installieren ? (j/n) + + +Verneinen Sie die Frage, wenn in Ihrem System der Speicherplatz +kritisch ist (zum Beispiel wenn Sie keine Festplatte haben). Es +werden dann nur die wichtigsten allgemeinen Hilfstexte installiert +(Ersparnis etwa 40 KByte). + Anschließend wird die automatische Generierung gestartet. +Lassen Sie die EUDAS-Archivdiskette eingelegt. Die Generierung ist +beendet, wenn das EUMEL-Bild erscheint. Die Task, in der die +Generierung stattfindet, wird automatisch zu einer Managertask, das +heißt, daß man von ihr Söhne einrichten kann. + Sie können das so erweiterte System auch mit 'save system' auf +einer oder mehreren Archivdiskette sichern. Lesen Sie dazu die +Hinweise zur Systemsicherung im EUMEL-Systemhandbuch. + +#on("b")#Korrekturversionen#off("b")# Falls Sie später einmal eine +Korrekturversion +von EUDAS bekommen, sollten Sie vor der neuen Generierung die +Task, in der EUDAS vorher generiert war, löschen (Vorsicht: alle +Söhne werden mitgelöscht) und wieder neu einrichten. Anderenfalls +bleibt die alte Version als unzugängliche "Leiche" auf Ihrem System +liegen. + In diesem Fall und auch, wenn Sie mehrere Programme in der +gleichen Task installieren, kann es zum Überlauf der internen Über­ +setzertabellen kommen. Für größere Installationen oder wenn Sie +viele verschiedene Programme benutzen, empfiehlt es sich, zur +Generierung eine eigene Task 'EUDAS' als Sohn von 'PUBLIC' zu +verwenden. Sie dürfen dann aber in 'PUBLIC' nicht zu viel insertie­ +ren, da 'EUDAS' ja alle Programme von 'PUBLIC' erbt. Denken Sie +daran, daß Sie EUDAS nur in Tasks benutzen können, die unter der +Task 'EUDAS' eingerichtet wurden. + + + + + + diff --git a/doc/eudas/eudas.hdb.3 b/doc/eudas/eudas.hdb.3 new file mode 100644 index 0000000..e89ff4f --- /dev/null +++ b/doc/eudas/eudas.hdb.3 @@ -0,0 +1,515 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (15)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +3 Ein Beispiel zum Ausprobieren + + + +Bevor Sie in die tieferen Geheimnisse von EUDAS einsteigen, sollen +Sie in diesem Kapitel erst einige Erfahrungen mit der Bedienung +sammeln. Dadurch erhalten Sie Sicherheit im Umgang mit dem Pro­ +gramm und haben bereits einen Eindruck dessen, was Sie anschlie­ +ßend erwartet. + Das Durchlesen dieses Kapitels ist nur dann sinnvoll, wenn Sie +die Anweisungen selbst am Rechner ausprobieren. Anderenfalls +beginnen Sie besser mit dem nächsten Kapitel. + Im folgenden sind die Eingaben, die Sie machen sollen, kursiv +gedruckt, während Ausgaben des Rechners normal erscheinen. +Außerdem erscheinen spezielle Tasten in spitzen Klammern: + + + + + +Bitte tippen Sie nicht die eckigen Klammern oder Großbuchstaben, +sondern die entsprechende Taste. Oft haben die Sondertasten auch +etwas andere Bezeichnungen (die obige zum Beispiel 'CR', 'Carriage +Return', 'RETURN', 'ENTER'). Bitte fragen Sie bei Unklarheiten Ihren +Systemlieferanten oder -betreuer. + + +3.1 Start + +Die Anweisungen zum Starten von EUDAS sind unterschiedlich, je +nachdem wie Ihr System eingerichtet ist. Bitte beachten Sie daher +die verschiedenen Fälle. + +1. Falls Sie EUDAS nicht selbst installiert haben, fragen Sie am + besten Ihren Systembetreuer. Ansonsten verhalten Sie sich wie + unter 2. + +2. Falls Sie EUDAS nach den Anweisungen von Kapitel 2 in einem + Multi-User-System eingerichtet haben, müssen Sie zunächst eine + Arbeitstask (Arbeitsbereich) einrichten. Dazu tippen Sie die + SV-Taste (diese trägt häufig die unterschiedlichsten Bezeich­ + nungen). Es erscheint + + + EUMEL x.y.z/M + + gib supervisor kommando : + + + Sie tippen nun folgendes Kommando: + + + #on("i")#begin ("arbeit")#off("i")# + + + Vergessen Sie nicht die RETURN-Taste am Schluß. Machen Sie + jetzt weiter bei Punkt 4. + +3. Falls Sie ein Single-User-System besitzen, starten Sie die + Systemdiskette und geben das Datum ein. Dann machen Sie wei­ + ter mit Punkt 4. + +4. Danach erscheint: + + + gib kommando : + + + und Sie tippen: + + + #on("i")#eudas#off("i")# + + + Als Ergebnis wird das EUDAS-Eingangsmenü angezeigt (s. Abb. + 3-1 auf der nächsten Seite). + + +3.2 Daten eintragen + +Als Beispiel sollen Sie eine kleine Adressenkartei einrichten. Der +Fachausdruck für eine elektronische Kartei ist #on("i")#Datei#off("i")#. + +___________________________________________________________________________________________ + + EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv + --------------: + EUDAS-Datei : + O Öffnen : + - Ketten : + - Koppeln : EEEEE U U DDDD A SSSS + --------------: E U U D D A A S + Arbeitskopie : EEE U U D D AAAAA SSS + - Sichern : E U U D D A A S + --------------: EEEEE UUU DDDD A A SSSS + Aktuelle Datei: + - Notizen : Version 4.3 + - Feldstrukt. : Stand: 14.07.87 + - Prüfbeding. : + --------------: (C) Copyright + Mehrbenutzer : Thomas Berlage + M Manager : Software-Systeme + --------------: + : + : + : + : + : + Akt.Datei: Manager: Datum: 22.07.87 +___________________________________________________________________________________________ + + +#center#Abb. 3-1 EUDAS-Eingangsmenü + + + Zunächst müssen Sie eine neue Datei einrichten. Dazu tippen +Sie die Leertaste. Dadurch wird die invers dargestellte Funktion +'Öffnen' ausgeführt. Folgen Sie bitte dem nachstehenden Dialog auf +der rechten Bildschirmseite: + + + Name der Datei: #on ("i")#Mitglieder#off("i")# + "Mitglieder" neu einrichten ? (j/n) #on("i")#j#off("i")# + + +Unter der Überschrift 'Neue Feldnamen' tippen Sie jetzt folgendes +(bitte keine Leerstellen vor den Namen tippen): + + + #on("i")#Name#off("i")# + #on("i")#Vorname#off("i")# + #on("i")#PLZ#off("i")# + #on("i")#Ort#off("i")# + #on("i")#Strasse#off("i")# + #on("i")#m/w#off("i")##on("i")#q#off("i")# + + +Zum Schluß beantworten Sie noch eine Frage: + + + Feldnamen oder Feldtypen aendern ? (j/n) #on("i")#n#off("i")# + + +Damit ist die neue Datei eingerichtet. + Nun tippen Sie die Pfeiltaste . Es erscheint ein neues +Menübild (s. Abb. 3-2). + +___________________________________________________________________________________________ + + EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv + --------------: Satz 1 .........ENDE... Mitglieder .......... Feld 1 + Positionieren : Name + W Weiter : Vorname + Z Zurück : PLZ + N Satz.Nr : Ort + --------------: Strasse + Suchbedingung : m/w + S Setzen : ........................................................... + L Löschen : + M Markierung : + --------------: + Datensatz : + E Einfügen : + A Ändern : + T Tragen : + H Holen : + --------------: + F Feldauswahl : + --------------: + : + : + : + +___________________________________________________________________________________________ + + +#center#Abb. 3-2 Menü 'Einzelsatz' + + +Nun tippen Sie so lange die Pfeiltaste , bis die Funktion +'Einfügen' invers markiert ist. Dann tippen Sie die Leertaste zum Aus­ +führen dieser Funktion. Die Schreibmarke springt nach rechts ins +Datenfeld zum Eingeben. Geben Sie jetzt den ersten Datensatz wie +folgt ein: + + + #on("i")#Wegner#off("i")# + #on("i")#Herbert#off("i")# + #on("i")#5000#off("i")# + #on("i")#Köln#off("i")# + #on("i")#Krämergasse 12#off("i")# + #on("i")#m#off("i")##on("i")#w#off("i")# + + +Anschließend wird das Datenfeld wieder freigemacht, so daß Sie +gleich den zweiten Datensatz eingeben können. Dies tun Sie auf die +gleiche Weise, nur mit anderen Daten: + + + #on("i")#Sandmann#off("i")# + #on("i")#Helga#off("i")# + #on("i")#5300#off("i")# + #on("i")#Bonn 1#off("i")# + #on("i")#Willicher Weg 109#off("i")# + #on("i")#w#off("i")##on("i")#w#off("i")# + + +Ebenso verfahren Sie dann weiter mit den folgenden Daten. Falls Sie +sich vertippt haben, können Sie mit den vier Pfeiltasten an die +entsprechende Stelle gehen und die falschen Buchstaben über­ +schreiben. + + + #on("i")#Katani#off("i")# + #on("i")#Albert#off("i")# + #on("i")#5210#off("i")# + #on("i")#Troisdorf#off("i")# + #on("i")#Lindenstr. 3#off("i")# + #on("i")#m#off("i")##on("i")#w#off("i")# + + #on("i")#Ulmen#off("i")# + #on("i")#Peter#off("i")# + #on("i")#5#off("i")# + #on("i")#Köln 60#off("i")# + #on("i")#Mozartstraße 17#off("i")# + #on("i")#m#off("i")##on("i")#w#off("i")# + + #on("i")#Regmann#off("i")# + #on("i")#Karin#off("i")# + #on("i")#5000#off("i")# + #on("i")#Köln 90#off("i")# + #on("i")#Grengelweg 44#off("i")# + #on("i")#w#off("i")##on("i")#w#off("i")# + + #on("i")#Arken#off("i")# + #on("i")#Hubert#off("i")# + #on("i")#5200#off("i")# + #on("i")#Siegburg#off("i")# + #on("i")#Talweg 12#off("i")# + #on("i")#m#off("i")##on("i")#w#off("i")# + + #on("i")#Simmern#off("i")# + #on("i")#Anna-Maria#off("i")# + #on("i")#5#off("i")# + #on("i")#Köln 3#off("i")# + #on("i")#Platanenweg 67#off("i")# + #on("i")#w#off("i")##on("i")#w#off("i")# + + #on("i")#Kaufmann-Drescher#off("i")# + #on("i")#Angelika#off("i")# + #on("i")#53#off("i")# + #on("i")#Bonn#off("i")# + #on("i")#Hauptstr. 123#off("i")# + #on("i")#w#off("i")##on("i")#w#off("i")# + + #on("i")#Fuhrmann#off("i")# + #on("i")#Harald#off("i")# + #on("i")#5000#off("i")# + #on("i")#Köln 1#off("i")# + #on("i")#Glockengasse 44#off("i")# + #on("i")#m#off("i")##on("i")#w#off("i")# + + +Bei der letzten Adresse ist die letzte Taste unterschiedlich, da Sie +keine weiteren Daten mehr eintragen wollen. Bitte beachten Sie dies. + + + #on("i")#Seefeld#off("i")# + #on("i")#Friedrich#off("i")# + #on("i")#5000#off("i")# + #on("i")#Köln-Ehrenfeld#off("i")# + #on("i")#Kabelgasse#off("i")# + #on("i")#m#off("i")##on("i")#q#off("i")# + + +Damit die neu eingetragenen Daten permanent gespeichert sind, +müssen Sie sie #on("i")#sichern#off("i")#. Dazu kehren Sie durch Tippen von +in das erste Menü zurück. Dort tippen Sie wieder so lange , +bis die Funktion 'Sichern' markiert ist. Tippen Sie dann die Leer­ +taste zum Ausführen und folgen dem nachstehenden Dialog: + + + Arbeitskopie "Mitglieder" veraendert! Sichern ? (j/n) #on("i")#j#off("i")# + Alte Version ueberschreiben ? (j/n) #on("i")#j#off("i")# + Interne Arbeitskopien loeschen ? (j/n) #on("i")#j#off("i")# + + +Damit steht Ihnen nun eine Mitgliederdatei mit 10 Einträgen zur +weiteren Verfügung. + + +3.3 Daten abfragen + +Um Daten abzufragen, müssen Sie die Datei zunächst wieder öffnen. +Dazu bewegen Sie die inverse Markierung durch mehrmaliges Tippen +von nach oben bis zur Funktion 'Öffnen' und tippen Sie die +Leertaste. Danach ergibt sich folgender Dialog: + + + Name der Datei: #on("i")#Mitglieder#off("i")# + Wollen Sie etwas aendern (eine Arbeitskopie einrichten) + ? (j/n) #on("i")#n#off("i")# + + +Danach gehen Sie durch Tippen von in das zweite Menü. +Dort erscheint jetzt die zehnte Adresse. + Zunächst sollen Sie an den Anfang gehen. Dazu schieben Sie +die Markierung auf die Funktion 'Satz.Nr' mit Hilfe der Pfeiltasten +und tippen dann die Leertaste. Nach folgender Angabe + + + Neue Satznummer: #on("i")#1#off("i")# + + +erscheint die erste Adresse. Nun sollen Sie nach der Adresse von +Harald Fuhrmann suchen. Dazu bringen Sie die Markierung auf die +Funktion 'Suchbedingung Setzen' und tippen die Leertaste. Die +Schreibmarke springt wieder in das Datenfeld. Dort geben Sie ein: + + + #on("i")#Fuhrmann#off("i")##on("i")#q#off("i")# + + +In der markierten Überschrift erscheint 'SUCH-' zum Zeichen, daß +eine Suchbedingung eingestellt ist. Dann schieben Sie die Markie­ +rung auf die Funktion 'Weiter' und tippen die Leertaste. Kurz da­ +nach erscheint die Adresse von Herrn Fuhrmann mit dem Hinweis +'SUCH+' (gefunden). + Führen Sie dann die Funktion 'Zurück' aus (Verschieben der +Markierung und Tippen der Leertaste). Es erscheint wieder die erste +Adresse mit dem Hinweis 'SUCH-' (kein weiterer Fuhrmann gefun­ +den). Führen Sie dann die Funktion `Suchbedingung Löschen' aus. +Der 'SUCH'-Hinweis verschwindet wieder. + Als nächstes sollen Sie die Daten nach allen weiblichen Mit­ +gliedern durchsuchen. Dazu führen Sie wieder die Funktion 'Such­ +bedingung Setzen' aus. Diesmal tippen Sie im Datenfeld fünfmal die +Pfeiltaste , bis die Schreibmarke neben der Bezeichnung +'m/w' steht. Dort tippen Sie + + + #on("i")#w#off("i")##on("i")#q#off("i")# + + +Wenn Sie jetzt die Funktion 'Weiter' ausführen, erscheint das erste +weibliche Mitglied, Frau Sandmann. Da aber noch weitere Frauen in +der Datei vorkommen, führen Sie erneut 'Weiter' aus und es erschei­ +nen die nächsten weiblichen Mitglieder. + Wenn kein gesuchtes Mitglied mehr gefunden wurde, erscheint +ein leeres Datenfeld mit den Bezeichnungen 'ENDE' und 'SUCH-' in +der Überschrift. Durch mehrmaliges Ausführen von 'Zurück' können +Sie die weiblichen Mitglieder wieder in der umgekehrten Reihenfolge +ansehen, bis Sie an den Anfang der Datei kommen. + Bitte lassen Sie die Suchbedingung eingestellt, denn im näch­ +sten Abschnitt wollen wir alle weiblichen Mitglieder ausdrucken. + + +3.4 Drucken + +Zuerst begeben Sie sich durch zweimaliges Tippen von in +das Druckmenü, das in Abb. 3-3 gezeigt wird. + +___________________________________________________________________________________________ + + EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv + --------------: + Satzauswahl : + D Drucken : + --------------: + Druckausgabe : + R Richtung : + --------------: + Textdatei : + E Editieren : + A Ausdrucken : + N Nachbearb. : + --------------: + : + : + : + : + : + : + : + : + : + : + Akt.Datei: "Mitglieder" Datum: 22.07.87 +___________________________________________________________________________________________ + + +#center#Abb. 3-3 Menü 'Drucken' + + +Zunächst müssen Sie ein Druckmuster erstellen, das angibt, wie der +Druck aussehen soll. Dazu führen Sie die Funktion 'Textdatei Edi­ +tieren' aus. Es erscheint die Aufforderung: + + + Name der Datei: #on("i")#liste#off("i")# + + +Dann wird der Bildschirm gelöscht und Sie können folgendes einge­ +ben: + + + #on("i")#% VORSPANN#off ("i")# + #on("i")#Liste der weiblichen Mitglieder#off ("i")# + #on("i")#-------------------------------#off ("i")# + #on("i")#% WIEDERHOLUNG#off ("i")# + #on("i")#&Vorname %Name#off ("i")##on("i")#q#off("i")# + + +Ebenso wie beim Eingeben von Daten können Sie hier mit den Pfeil­ +tasten auf fehlerhafte Stellen zurückgehen und dort korrigieren. + Nun sollten Sie sich vergewissern, ob Ihr Drucker eingeschaltet +und bereit (Ready) ist. Falls Sie keinen Drucker haben, folgen Sie +bitte den Anweisungen unter 2. Anderenfalls gehen Sie wie folgt +vor. + +1. Rufen Sie die Funktion 'Richtung' auf und beantworten Sie + folgende Frage: + + + Ausgabe automatisch zum Drucker ? (j/n) #on("i")#j#off("i")# + + + Dann rufen Sie die Funktion 'Drucken' auf und geben den Namen + des Druckmusters an: + + + Name des Druckmusters: #on("i")#liste#off ("i")# + + + Als Ergebnis sollte folgende Liste auf Ihrem Drucker erscheinen: + + + Liste der weiblichen Mitglieder + ------------------------------- + Helga Sandmann + Karin Regmann + Anna-Maria Simmern + Angelika Kaufmann-Drescher + + +2. Rufen Sie die Funktion 'Richtung' auf und beantworten Sie + folgende Fragen: + + + Ausgabe automatisch zum Drucker ? (j/n) #on("i")#n#off("i")# + Ausgabe in bestimmte Datei ? (j/n) #on("i")#n#off("i")# + + + Dann rufen Sie die Funktion 'Drucken' auf und geben den Namen + des Druckmusters an: + + + Name des Druckmusters: #on("i")#liste#off ("i")# + + + Nach dem Ende des Druckprozesses (wenn das Sternchen vor + 'Drucken' wieder durch ein 'D' ersetzt worden ist), rufen Sie + wieder die Funktion 'Textdatei Editieren' auf und geben folgen­ + den Namen an: + + + Name der Datei: #on("i")#liste.a$1#off("i")# + + + Es erscheint die gleiche Ausgabe wie unter 1 beschrieben auf + dem Bildschirm. Wenn Sie die Ausgabe genug gesehen haben, + kehren Sie durch + + + #on("i")#q#off("i")# + + + wieder in das Menü zurück. + + +3.5 Ergebnis + +Da Sie sich wieder im Menü befinden, könne Sie EUDAS durch + + #on("i")#q#off("i")# + +wieder verlassen. Danach können Sie Ihre Sitzung beenden, etwas +Anderes tun oder EUDAS erneut aufrufen. + + Sie haben nun selbst ausprobiert, wie Sie unter EUDAS Daten +eingeben können, wie Sie diese Daten abrufen und in ihnen suchen +können. Sie haben die Daten auch schon ausgedruckt. + Damit Sie besser verstehen, was Sie soeben gemacht haben, +werden Sie in den folgenden vier Kapiteln die Grundfunktionen von +EUDAS mit den dazugehörigen Erläuterungen kennenlernen. + Danach können Sie dann selber Ihre eigene Anwendung entwer­ +fen und EUDAS zu Ihrer Arbeitserleichterung einsetzen. + + + + + + diff --git a/doc/eudas/eudas.hdb.5 b/doc/eudas/eudas.hdb.5 new file mode 100644 index 0000000..b5927ea --- /dev/null +++ b/doc/eudas/eudas.hdb.5 @@ -0,0 +1,386 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (43)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +5 Gespeicherte Daten abfragen + + + +5.1 Öffnen + +Als letzte Vorbereitung, bevor Sie mit der Adreßdatei spielen kön­ +nen, müssen Sie die Datei wie einen Karteikasten #on("i")#öffnen#off("i")#. Nach dem +Öffnen beziehen sich alle weiteren Funktionen auf die gerade ge­ +öffnete Datei. Aus diesem Grund darf auch immer nur eine einzige +Datei geöffnet sein - als hätte auf Ihrem Schreibtisch nur ein Kar­ +teikasten Platz. + Dazu wählen Sie jetzt wieder das erste Menü an. Dort finden +Sie die Funktion +#free (0.2)# + + O Öffnen + +#free (0.2)# +Wählen Sie diese Funktion aus. Dann drücken Sie die Leertaste, um +die Funktion auszuführen. Als erstes erscheint im unteren Teil des +Bildschirms eine Frage: + +___________________________________________________________________________________________ + + Wollen Sie etwas aendern (eine Arbeitskopie anlegen) (j/n) ? +___________________________________________________________________________________________ + + +Der Cursor bleibt hinter der Frage stehen. Sie kennen diesen Frage­ +zustand ja schon. + In diesem Fall wollen Sie an der Spieldatei nichts verändern, +Sie beantworten die Frage also mit einem 'n'. Als nächstes werden +Sie nach dem Namen gefragt (Beachten Sie auch hier wieder die +Statuszeile). + Tippen Sie nun 'Adressen' und beenden Sie die Eingabe mit +RETURN. EUDAS öffnet die Datei und kehrt zum Menü zurück. Alter­ +nativ können Sie die Datei auch in einer Auswahl ankreuzen, wenn +Sie ESC 'z' tippen. + +#on("b")#Fußzeile#off("b")# Nach der Ausführung dieser Funktion sollten Sie +Ihre +Aufmerksamkeit auf die letzte Zeile des Bildschirms richten. Hier +finden Sie jetzt folgendes vor: + +___________________________________________________________________________________________ + + Akt.Datei: "Adressen" Manager: Datum: 22.07.87 +___________________________________________________________________________________________ + + +Neben dem Datum und dem eingestellten Manager (dies kommt viel +später) sehen Sie hier, welche Datei Sie geöffnet haben und nun +bearbeiten können. Diese Fußzeile finden Sie auch in den ande­ +ren Menüs. Lediglich die mittlere Angabe ändert sich bei den ande­ +ren Menüs (eine Erläuterung dazu finden Sie in späteren Kapiteln). + +#on("b")#Anzeige#off("b")# Zum Anzeigen der Daten in der Adreßdatei müssen Sie +das +zweite Menü 'Einzelsatz' anwählen (durch Drücken der Pfeiltaste +RECHTS). Am linken Rand erscheint das neue Menü mit den Anzei­ +gefunktionen. Der Rest des Bildschirms enthält das Formular für die +Adreßdatei mit den Daten des ersten Satzes. Abbildung 5-1 zeigt +das Bild, das sich dann ergibt. + +___________________________________________________________________________________________ + + EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv + --------------: Satz 1 ................... Adressen ....... Zeile 1 + Positionieren : Name Wegner + W Weiter : Vorname Herbert + Z Zurück : PLZ 5000 + N Satz.Nr : Ort Köln + --------------: Strasse Krämergasse 12 + Suchbedingung : m/w m + S Setzen : ........................................................... + L Löschen : + M Markierung : + --------------: + Datensatz : + - Einfügen : + - Ändern : + - Tragen : + - Holen : + --------------: + F Feldauswahl : + --------------: + : + : + : + +___________________________________________________________________________________________ + + +#center#Abb. 5-1 Menü 'Einzelsatz' + + +Das automatisch generierte Formular zeigt immer genau einen Satz. +Das Formular besteht aus drei Teilen: der Überschrift, dem Feldteil +und der Abschlußzeile. In der #on("i")#Überschrift#off("i")# steht der Name der Datei +("Adressen"), die Satznummer (1) und die Nummer der ersten ange­ +zeigten Zeile (immer 1, außer wenn die Datei mehr Felder hat, als +auf den Bildschirm passen). In manchen Fällen können auch noch +weitere Informationen dort auftauchen, wie wir später sehen wer­ +den. + Im #on("i")#Feldteil#off("i")# befindet sich der eigentliche Inhalt, und zwar sind +links markiert die Feldnamen zu sehen, während rechts die zugehö­ +rigen Inhalte des betreffenden Satzes stehen. Dieses Bild ähnelt +einer Karteikarte mit einem festen Format. + Die #on("i")#Abschlußzeile#off("i")# am Ende gibt an, daß für diesen Satz keine +weiteren Informationen mehr vorhanden sind. Wir werden aber spä­ +ter noch sehen, wie man anderenfalls die restlichen Informatio­ +nen sichtbar machen kann. + + +5.2 Bewegen + +Nun wollen Sie nicht immer nur einen Satz betrachten (das wäre ja +furchtbar langweilig). Daher müssen Sie die Möglichkeit haben, sich +in der Datei zu "bewegen". Dies geschieht mit Hilfe der beiden +Funktionen +#free (0.2)# + + W Weiter + +#free (0.2)# +und +#free (0.2)# + + Z Zurück + +#free (0.2)# +Sie haben die Wirkung, daß der Satz mit der nächsthöheren bzw. +nächstniedrigeren Satznummer angezeigt wird. Natürlich funktioniert +dies nur, wenn noch ein Satz vorhanden ist: am Anfang (Satz 1) +können Sie nicht zurückgehen. In diesem Fall ignoriert EUDAS Ihren +Befehl einfach. + Wenn Sie bis zum Ende der Datei gehen (keine Angst - diese +Datei enthält nur 10 Sätze), werden Sie feststellen, daß zum Schluß +ein ganz leerer Satz erscheint. Dieser Satz ist eine Art Endemarkie­ +rung; er informiert Sie, daß keine weiteren Sätze vorhanden sind. +Dieser Satz ist aber kein richtiger Satz, daher wird in der Über­ +schrift 'ENDE' angezeigt. (Wenn Ihnen diese Art Endemarkierung +merkwürdig erscheint: sie hat schon einen triftigen Grund, s.6.2). + Um einen Satz mit bekannter Satznummer gezielt anzuwählen, +können Sie die Funktion +#free (0.2)# + + N Satz.Nr + +#free (0.2)# +verwenden. Sie müssen anschließend die Satznummer eingeben (Bitte +mit RETURN beenden). Ist der Satz vorhanden, erscheint dieser, +ansonsten stehen Sie am Ende der Datei. + +#on("b")#Aufruf über Buchstaben#off("b")# Vielleicht ist Ihnen inzwischen +schon +aufgefallen, daß vor jeder Funktion in einem Menü ein Buchstabe +steht. Damit hat es folgendes auf sich: da das Positionieren des +Cursors zum Auswählen einer Funktion mehrere Tastendrücke erfor­ +dern kann, haben Sie die Möglichkeit, jede Funktion auch über +einen Buchstaben auszuführen. + Dies ist besonders dann sinnvoll, wenn Sie mit den eben be­ +sprochenen Funktionen schnell in der Datei "blättern" wollen. An­ +dererseits müssen Sie sich aber für eine schnelle Reaktion auch +einige der Tasten merken. Für die Praxis empfiehlt sich folgender +Kompromiß: die meistgebrauchten Funktionen über Buchstaben und +der Rest durch Positionieren im Menü. + + +5.3 Suchen + +Stellen Sie sich vor, die Datei wäre größer und Sie müßten eine +bestimmte Adresse heraussuchen. Dazu würden Sie durch die ganze +Datei durchgehen, bis die gewünschte Adresse erscheint. Das wäre +natürlich bei vielen Adressen eine ungeheuer mühselige Arbeit, die +mit einem Karteikasten wahrscheinlich schneller zu erledigen wäre. + EUDAS bietet Ihnen jedoch die Möglichkeit, nach bestimmten +Sätzen zu suchen. Dazu müssen Sie angeben, wonach gesucht werden +soll. Als Beispiel wollen wir die Adresse von Frau Simmern su­ +chen. Bewegen Sie sich zunächst zurück bis auf den ersten Satz. +Dann wählen Sie die Funktion +#free (0.2)# + + Suchbedingung + S Setzen + +#free (0.2)# +Auf dem Bildschirm verschwinden die Feldinhalte und der Cursor +steht hinter dem ersten Feldnamen. Dies bedeutet, daß Sie neben +die Feldnamen etwas schreiben können. Auch in der Statuszeile +erscheint statt der Anzeige der Menünamen ein Hinweis auf die +Eingabemöglichkeit (s. Abb. 5-2). Sie befinden sich jetzt in einem +Zustand, in dem Sie hinter die Feldnamen etwas schreiben können +(dem sogenannten #on("i")#Satzeditor#off("i")#). + Als Angabe, was gesucht werden soll, schreiben Sie jetzt in der +ersten Zeile neben 'Name' die Bedingung 'Simmern'. Sie haben jetzt +ein einfaches #on("i")#Suchmuster#off("i")# angegeben. Ein Suchmuster besteht aus +Bedingungen, die neben die Feldnamen geschrieben werden. Unser +einfaches Suchmuster lautet übersetzt: + + Wähle alle Sätze aus, bei denen 'Simmern' im Feld 'Name' + steht. + +Beenden Sie die Eingabe des Suchmusters mit ESC 'q'. Es erscheint +wieder das vorherige Bild, mit dem Unterschied, daß jetzt in der +Überschrift ein 'SUCH-' auftaucht. EUDAS steht immer noch auf dem +ersten Satz. + Die Anzeige 'SUCH' gibt an, daß ein Suchmuster eingestellt +wurde. Das Minuszeichen bedeutet, daß der aktuelle Satz die Such­ +bedingung jedoch #on("i")#nicht#off("i")# erfüllt. + +___________________________________________________________________________________________ + + SUCHMUSTER EINGEBEN: Abbruch: ESC h Beenden: ESC q Hilfe: ESC ? + --------------: Satz 1 .................... ............... Zeile 1 + Positionieren : Name Simmern + W Weiter : Vorname + Z Zurück : PLZ + N Satz.Nr : Ort + --------------: Strasse + Suchbedingung : m/w + * Setzen : ........................................................... + L Löschen : + M Markierung : + --------------: + Datensatz : + - Einfügen : + - Ändern : + - Tragen : + - Holen : + --------------: + F Feldauswahl : + --------------: + : + : +___________________________________________________________________________________________ + + +#center#Abb. 5-2 Eingabe eines Suchmusters + + +#on("b")#Positionierung#off("b")# Das Suchen beginnt erst, wenn Sie sich in +der Datei +bewegen. In diesem Fall erhalten die Funktionen 'Satz weiter' und +'Satz zurück' eine etwas geänderte Bedeutung. Sie gehen nämlich +nicht einfach zum nächsten bzw. vorigen Satz, sondern zum näch­ +sten bzw. vorigen Satz. + Als Indikator, daß Sie sich auf dem gesuchten Satz befinden, +dient die Anzeige 'SUCH+'. Probieren Sie dies jetzt aus, indem Sie +weitergehen. Als nächster Satz erscheint der gewünschte Satz 7. Die +nicht ausgewählten Sätze wurden also übersprungen. Das gleiche +passiert, wenn Sie noch weiter gehen. Da kein passender Satz mehr +vorhanden ist, erscheint der leere Endesatz. + +#limit (12.0)# + Denken Sie daran, daß das Einstellen der Suchbedingung + noch keine Suche bewirkt. Diese müssen Sie selbst + durch Positionieren mit 'Weiter' oder 'Zurück' auslösen. +#limit (13.5)# + +Sollten Sie sich nicht am Anfang der Datei befinden, wenn Sie eine +Suchbedingung einstellen, kann es sein, daß sich der gesuchte Satz +vor oder hinter der aktuellen Position befindet. In diesem Fall +müssen Sie entscheiden, ob Sie vorwärts oder rückwärts gehen. +Wenn Sie rückwärts gehen und der Satz ist nicht in diesem Ab­ +schnitt, erscheint der erste Satz mit der Anzeige 'SUCH-'. Gehen Sie +dann wieder vorwärts, finden Sie den Satz auf jeden Fall. + Die Funktion 'Satz.Nr' richtet sich natürlich nicht nach der +eingestellten Bedingung, da Sie ja eine bestimmte Satznummer wün­ +schen. Aus der 'SUCH'-Anzeige können Sie jedoch entnehmen, ob +die Suchbedingung auf diesen Satz zutrifft. + +#on("b")#Suchbedingung löschen#off("b")# Wollen Sie wieder alle Sätze sehen, +müssen Sie die Funktion +#free (0.2)# + + Suchbedingung + L Löschen + +#free (0.2)# +auswählen. Die Anzeige 'SUCH' verschwindet wieder, um anzudeu­ +ten, daß keine Suchbedingung mehr eingestellt ist. + +#on("b")#Beispiel#off("b")# Um den Charakter einer Selektion nochmal deutlich +zu +machen, sollen Sie jetzt eine Bedingung einstellen, die auf mehrere +Sätze zutrifft. Dies hätte uns auch eben passieren können, wenn es +mehrere Simmern gegeben hätte. Wir können zum Beispiel alle weib­ +lichen Personen auswählen. + Als erstes löschen Sie die alte Suchbedingung. Tun Sie dies +nicht, wird Ihnen beim nächsten Eingeben das alte Suchmuster zum +Ändern angeboten. Dies ist praktisch, wenn ein Suchmuster nicht +den erhofften Erfolg brachte und Sie es modifizieren wollen. + Danach wählen Sie erneut die Funktion 'Suchbedingung setzen'. +Nun bewegen Sie den Cursor mit der Pfeiltaste UNTEN neben den +Feldnamen 'm/w'. Dort tragen Sie die Bedingung 'w' ein. Verlassen +Sie die Eingabe mit ESC 'q'. + Wenn Sie sich jetzt in der Datei bewegen, sehen Sie, daß immer +nur weibliche Personen angezeigt werden - die männlichen werden +unterdrückt (in Umkehrung der Realität). + + + ! 1 ! ! 3 ! 4 ! ! 6 ! + +-----+-----+-----+-----+-----+-----+-----+ + !Name ! .. ! ! .. ! .. ! ! .. ! + ! ! ! ! ! ! ! ! + : : : : : + ! ! ! ! ! ! ! ! + !m/w ! w ! ! w ! w ! ! w ! + +-----+-----+ +-----+-----+ +-----+ + +#center#Abb. 5-3 Wirkung einer Selektion + + + +5.4 Suchbedingungen + +Im letzten Abschnitt haben Sie gesehen, wie das Einstellen einer +Suchbedingung funktioniert. In diesem Abschnitt sollen Sie weitere +Möglichkeiten zur Formulierung von Suchmustern kennenlernen. + Die erste Möglichkeit kennen Sie schon. Wenn neben einen +Feldnamen ein Text geschrieben wird, bedeutet dies, daß ausge­ +wählte Sätze im Inhalt dieses Feldes mit dem Text übereinstimmen +müssen. + +#on("b")#Kombination#off("b")# Nun kann es sein, daß mehrere Bedingungen +gelten +müssen. Im ersten Beispiel des vorigen Abschnitts hätten wir zum +Beispiel auch noch den Vornamen 'Anna-Maria' angeben können, um +bei mehreren Simmern die richtige auszuwählen. Wird also in mehre­ +re Felder eine Bedingung geschrieben, müssen alle diese Bedingun­ +gen gleichzeitig zutreffen. + Würden Sie in unserem Beispiel noch als dritte Bedingung 'm' +für das Feld 'm/w' angeben, würde gar kein Satz mehr ausgewählt, +da Anna-Maria Simmern natürlich nicht männlich ist. Auch das +kann also passieren. + + + Name Simmern + Vorname Anna-Maria + .. + .. + m/w m + +#center#Abb. 5-4 Kombination von Bedingungen + + +#on("b")#Stern#off("b")# Die Bedingungen, die wir bis jetzt kennengelernt +haben, +müssen alle ganz exakt zutreffen. Häufig tritt aber der Fall auf, +daß der gesuchte Name nicht genau bekannt ist. In diesem Fall +kann der Name im Suchmuster auch teilweise eingegeben werden. +Der unbekannte Teil am Anfang oder am Ende wird einfach durch +einen Stern markiert. + Wenn Sie also als Bedingung 'Sim*' für den Namen angeben, so +würde dies auf den Namen Simmern zutreffen, aber zum Beispiel +auch auf Simmerath oder Simon. Die Bedingung '*mern' würde nicht +nur auf Simmern zutreffen, sondern auch auf Pommern. + Der Stern kann aber auch für einen leeren Text stehen. So +trifft 'Simmern*' auf Simmern zu, aber auch auf Doppelnamen. die +mit Simmern beginnen. Wissen Sie jetzt nicht, ob Simmern in dem +Doppelnamen vorne oder hinten erscheint, können Sie auch an bei­ +den Seiten einen Stern machen. Die Bedingung '*Simmern*' trifft +nicht nur auf Simmern, sondern sowohl auf Deckerath-Simmern als +auch auf Simmern-Jakob zu. + Es gibt noch eine Reihe von weiteren Möglichkeiten, Bedingun­ +gen im Suchmuster zu formulieren. Auch komplexe Kombinationen +von Bedingungen sind möglich. Mit dem bisher Besprochenen sollten +Sie aber in vielen Fällen auskommen. Die übrigen Möglichkeiten +werden in Abschnitt 10.2 erklärt. Schauen Sie bei Bedarf dort nach. + + diff --git a/doc/eudas/eudas.hdb.6 b/doc/eudas/eudas.hdb.6 new file mode 100644 index 0000000..e617881 --- /dev/null +++ b/doc/eudas/eudas.hdb.6 @@ -0,0 +1,394 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (51)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +6 Daten eingeben und ändern + + + +6.1 Neue Datei einrichten + +Nachdem Sie sich bis jetzt an einer existierenden Datei erprobt +haben, können Sie nun dazu übergehen, eine eigene neue Datei +einzurichten. Als Beispiel sollen Sie ein kleines Telefonregister +erstellen. + Dazu gehen Sie wieder in das Menü 'Öffnen' zurück und wäh­ +len erneut die Funktion +#free (0.2)# + + O Öffnen + +#free (0.2)# +indem Sie mehrmals OBEN tippen, bis die Funktion markiert. Dann +tippen Sie die Lerrtaste zum Ausführen. Als Dateinamen geben Sie +'Telefonnummern' an. + Da die Datei 'Telefonnummern' noch nicht existiert, werden Sie +gefragt: + + + "Telefonnummern" neu einrichten ? (j/n) #on("i")#j#off("i")# + + +Es kann ja sein, daß Sie sich vertippt haben und eine andere, +existierende Datei meinten. In unserem Fall wird die Datei aber +wirklich neu eingerichtet, daher bejahen Sie die Frage. + +#on("b")#Feldnamen eingeben#off("b")# Wenn Sie beim Öffnen eine Datei neu +einrich­ +ten, müssen Sie zuerst die Feldnamen festlegen, zum Beispiel diese: + + + 'Name' + 'Vorname' + 'Strasse' + 'PLZ' + 'Ort' + 'Telefon' + 'Bemerkungen' + + +Ihnen wird jetzt Gelegenheit gegeben, die Feldnamen untereinander +einzugeben. Zur Korrektur können Sie die gleichen Tasten verwen­ +den wie im Editor (beachten Sie dazu die Statuszeile am oberen +Bildschirmrand. + Geben Sie die Namen in dieser Reihenfolge ein. Tippen Sie nach +jedem Namen die RETURN-Taste, damit der nächste Name in eine +neue Zeile kommt. Beenden Sie die Eingabe mit ESC 'q'. + Die folgende Frage ermöglicht es Ihnen, noch weitere Eigen­ +schaften der Felder festzulegen. Dies ist jedoch im Normalfall nicht +nötig. Beantworten Sie also die Frage mit 'n'. Ihre Datei ist nun +eingerichtet. + Wie Sie sehen, besteht das Einrichten einer Datei eigentlich +nur aus der Eingabe der Feldnamen. Wenn Sie später noch Felder +anfügen wollen, ist dies ohne weiteres möglich. + + +6.2 Sätze Einfügen + +Nachdem die Datei nun eingerichtet worden ist, sollen Sie zunächst +einige Sätze eingeben. Wenn Sie wieder das Menü 'Einzelsatz' an­ +wählen, sehen Sie nur den leeren Satz mit der Anzeige 'ENDE', der +das Dateiende markiert. Um neue Sätze aufzunehmen, gibt es die +Funktion +#free (0.2)# + + E Einfügen + +#free (0.2)# +Wenn Sie diese Funktion aufrufen, geschieht etwas Ähnliches wie +beim Eingeben des Suchmusters. Der Cursor wandert wieder hinter +den ersten Feldnamen und in der Statuszeile erscheint die Auffor­ +derung + +___________________________________________________________________________________________ + + SATZ EINFUEGEN: Abbruch: ESC h Beenden: ESC q Hilfe: ESC ? +___________________________________________________________________________________________ + + +Sie können nun die Feldinhalte der einzelnen Felder neben die +entsprechenden Feldnamen schreiben. Mit der RETURN-Taste schlie­ +ßen Sie eine Zeile ab und gelangen in die nächste. + Um eventuelle falsche Eingaben zu korrigieren, können Sie +ähnlich wie im Editor mit den Pfeiltasten herumfahren und falsche +Eingaben überschreiben. Die Taste RUBOUT löscht falsche Zeichen. +Sie beenden die Eingabe mit ESC 'q'. Anschließend ist der neue Satz +vorhanden. + + +#free (4.5)# + +#center#Abb. 6-1 Einfügen + + +#on("b")#Wirkung#off("b")# Die Wirkungsweise der Funktion 'Einfügen' +verdeutlicht +die Abb. 6-1. Dargestellt ist ein Ausschnitt aus einer Datei mit den +Sätzen 4 bis 7 und durch Buchstaben dargestellten, beliebigen In­ +halten. Satz 6 sei der aktuelle Satz. + Beim Einfügen wird nun vor dem aktuellen Satz eine Lücke für +den neuen Satz geschaffen, die zunächst noch leer ist und dann von +Ihnen ausgefüllt werden muß. Die Satznummern aller folgenden Sätze +erhöhen sich um 1. + Die Leerstelle bleibt nur dann erhalten, wenn Sie Daten für den +neuen Satz eingeben. Anderenfalls wird nach ESC 'q' wieder der alte +Zustand hergestellt. + Dieses Verfahren erklärt auch, warum das Ende der Datei ein +leerer Pseudosatz ist. Um nämlich am Ende der Datei einen neuen +Satz anzufügen, muß man vor dem Endesatz einen Satz einfügen. + Nachdem Sie also jetzt den ersten Satz eingegeben haben, +müssen Sie sich wieder zum Ende bewegen, damit der nächste Satz +hinter dem ersten steht. Für diesen häufig benötigten Vorgang gibt +es eine Abkürzung: Wenn Sie die Eingabe mit ESC 'w' (Weiter) statt +ESC 'q' beenden, geht EUDAS nach dem Einfügen des Satzes weiter +zum nächsten und fügt dort wieder einen Satz ein. + Auf diese Weise können Sie also schnell eine ganze Reihe von +Sätzen nacheinander eingeben. Nachdem Sie einen Satz eingegeben +haben, tippen Sie ESC 'w' und können gleich anschließend schon mit +der Eingabe des nächsten Satzes beginnen. Alle so eingegebenen +Sätze erscheinen nachher in der Reihenfolge der Eingabe. + +#on("b")#Satzeditor#off("b")# Bei der Eingabe eines neuen Satzes haben Sie +nahezu +alle Möglichkeiten, die auch der EUMEL-Editor bietet. Der be­ +schreibbare Bereich ist jedoch kleiner. Er umfaßt das ganze Gebiet, +in dem sonst die Feldinhalte erscheinen. + Wie beim Editor können Sie den Cursor mit den Cursortasten +(Pfeiltasten) bewegen. Mit der Taste RUBOUT können Sie ein Zeichen +löschen. Die restlichen Zeichen der Zeile rücken dann nach. Mit +RUBIN dagegen schalten Sie in einen Einfügemodus um. Alle einge­ +gebenen Zeichen werden dann eingefügt - der Rest der Zeile rückt +entsprechend nach rechts. Nochmaliges Tippen von RUBIN schaltet +wieder in den alten Modus. Welcher Modus eingeschaltet ist, steht +in der Überschriftzeile. + Mit der Kombination ESC RUBOUT können Sie den Rest einer +Zeile ab der Cursorposition löschen. Steht der Cursor in der ersten +Spalte, wird dementsprechend die ganze Zeile gelöscht. Im Unter­ +schied zum EUMEL-Editor rücken die folgenden Zeilen jedoch nicht +herauf. + Entsprechend fügen Sie mit der Funktion ESC RUBIN eine neue +Zeile ein. Dies ist immer dann erforderlich, wenn ein Feldinhalt +nicht auf eine Zeile paßt. Der Teil der Zeile, der hinter dem Cursor +steht, wird bei ESC RUBIN in die neue Zeile mitgenommen. + Normalerweise tippen Sie ESC RUBIN, wenn Sie an das Ende +einer Zeile kommen. Wenn Sie aber weiterschreiben, wird die Zeile +einfach gerollt. Dies ist nicht weiter schlimm, aber Sie können den +ganzen Feldinhalt nicht auf einmal sehen. + In der normalen Anzeige wird ein überlanger Inhalt auf jeden +Fall auf mehrere Zeilen verteilt. + +#on("b")#Warnung#off("b")# Ein Hinweis für alle, die sich mit der +Editorbedienung +schon auskennen: EUDAS benutzt den Editor als Unterprogramm. +Jedoch haben einige Editorfunktionen unliebsame Auswirkungen. +Besonders gefährlich sind hier HOP RUBOUT und HOP RUBIN. Diese +Funktion zerstören die Korrespondenz zwischen Feldnamen und +Feldinhalten, das heißt der Feldinhalt steht nicht mehr neben dem +Feldnamen. + Weiterhin können Sie das Editorbild rollen, ohne daß die Feld­ +namen mitrollen (zum Beispiel wenn Sie in der untersten Zeile +RETURN drücken). In diesem Fall ist die Korrespondenz auch nicht +erhalten, das heißt die Inhalte stehen falsch, sind aber eigentlich +richtig. + In solchen Fällen erscheint am oberen oder unteren Rand der +Hinweis "Bitte ESC '1' druecken". Wenn das Editorbild nur gerollt +wurde, verschwindet durch ESC '1' der Hinweis wieder und das Bild +ist in Ordnung. Wenn jedoch Zeilen gelöscht oder eingefügt wurden, +müssen Sie diese Änderungen von Hand wieder rückgängig machen, +bis der Hinweis verschwindet. Sie sollten also HOP RUBOUT und HOP +RUBIN im Satzeditor nicht verwenden. + Im Zweifelsfall, wenn Sie meinen, den Satz durcheinanderge­ +bracht zu haben, können Sie immer mit ESC 'h' abbrechen. Es steht +dann der vorherige Zustand für einen neuen Versuch zur Verfügung. + + +6.3 Daten ändern + +Wenn Sie nachträglich noch eingegebene Daten ändern wollen, kön­ +nen Sie die Funktion +#free (0.2)# + + A Ändern + +#free (0.2)# +verwenden. Sie haben anschließend wie beim Einfügen Gelegenheit, +neue Daten einzugeben. Allerdings werden Ihnen die bisherigen +Daten gleich mit angeboten, so daß Sie nur die Änderungen ein­ +geben müssen. Alles andere kann unverändert bleiben. Auch diese +Funktion wird mit ESC 'q' verlassen. ESC 'w' funktioniert beim +Ändern ebenfalls (der nächste Satz wird zum Ändern angeboten). + Stellen Sie beim Ändern oder Einfügen fest, daß Sie irgendeinen +krassen Fehler gemacht haben, können Sie die Operation mit ESC 'h' +abbrechen. Beim Ändern bleibt dann der alte Zustand unverändert, +beim Einfügen wird kein Satz eingefügt. + +#on("b")#Löschen#off("b")# Für den Fall, daß Sie einen Satz wieder ganz aus +der +Datei löschen wollen, hat EUDAS eine besondere Vorsichtsmaßnahme +vorgesehen. Damit der Satz nicht gleich unwiederbringlich verloren­ +geht, müssen Sie ihn zunächst in eine andere Datei #on("i")#tragen#off("i")#. Falls +das Löschen ein Irrtum war, können Sie den Satz von dort noch +wiederholen. In vielen Fällen besteht ohnehin die Anforderung, daß +auch die nicht mehr aktuellen Daten noch eine gewisse Zeit aufge­ +hoben werden müssen. + Zum Tragen gibt es die Funktion + + + Datensatz + T Tragen + + +Sie werden nach einem Dateinamen gefragt. Geben Sie hier zum +Beispiel 'müll' an. Da diese Datei noch nicht existiert, werden Sie +gefragt, ob Sie sie neu einrichten wollen (falls Sie sich vielleicht +verschrieben haben). Danach wird der aktuelle Satz in die Datei +'müll' transportiert. Am Bildschirm erscheint der nächste Satz. Der +getragene Satz kommt an das Ende der Zieldatei. + Eine Bedingung beim Tragen ist, daß die Zieldatei immer die +gleichen Felder haben muß wie die aktuelle Datei. Sie können also +nicht aus verschieden strukturierten Dateien in die gleiche Datei +tragen. + Zum Zurückholen eines Satzes benutzen Sie die Funktion + + + Datensatz + H Holen + + +Der letzte Satz der Datei, die Sie angeben, wird vor dem aktuellen +Satz eingefügt. Dadurch wird der Effekt des letzten Tragens wieder +aufgehoben. + Um die getragenen Sätze endgültig zu vernichten, müssen Sie +die Zieldatei als Ganzes löschen. Die dazu notwendige Funktion aus +dem Menü 'Dateien' haben Sie bereits in Abschnitt 4.4 kennenge­ +lernt. + + +6.4 Arbeitskopie sichern + +Wenn Sie eine Datei zum Ändern öffnen oder sie gerade neu einge­ +richtet haben, wird von dieser Datei intern eine Arbeitskopie ange­ +legt, die dann geändert wird. Sie müssen diese Arbeitskopie nach +den Änderungen sichern, damit die Änderungen wirksam werden. + In unserem Beispiel ist die Datei "Telefonnummern" immer noch +leer. Die Änderungen sind momentan nur in der internen Kopie +vorhanden. Wenn Sie die Datei zum Beispiel auf eine Archivdiskette +schreiben wollten, würden Sie eine leere Datei auf der Diskette +haben. + Zum Sichern rufen Sie die Funktion +#free (0.2)# + + S Sichern + +#free (0.2)# +im ersten Menü auf. Es erscheint dann folgende Frage: + +___________________________________________________________________________________________ + + Arbeitskopie "Telefonnummern" veraendert! Sichern (j/n) ? +___________________________________________________________________________________________ + + +Beantworten Sie diese Frage mit 'j'. Als nächstes wird gefragt: + +___________________________________________________________________________________________ + + Alte Version überschreiben (j/n) ? +___________________________________________________________________________________________ + + +Beantworten Sie auch diese Frage mit 'j'. Die Arbeitskopie über­ +schreibt dann die (leere) Version vor dem Ändern. + Wenn Sie die Frage verneint hätten, könnten Sie anschließend +einen neuen Namen für die Arbeitskopie angeben. Dies wäre dann +sinnvoll, wenn Sie den Stand vor den Änderungen noch aufbewahren +wollen. In diesem Fall ist es jedoch nutzlos, die alte leere Datei +noch behalten zu wollen. + Abschließend wird gefragt, ob Sie die Arbeitskopien löschen +wollen. Wenn Sie noch weiter mit der Datei arbeiten wollen, vernei­ +nen Sie diese Frage. Die Datei bleibt dann geöffnet. Anderenfalls +müßten Sie die Datei neu öffnen, wenn Sie sie wieder ansehen wol­ +len. + +#on("b")#Arbeitskopien#off("b")# Es ist sehr wichtig, daß Sie sich die +Funktionsweise +mit der Arbeitskopie immer vor Augen halten, damit Sie später bei +der Arbeit mit EUDAS nicht überrascht werden. + Eine Arbeitskopie wird immer dann angelegt, wenn Sie beim +Öffnen einer EUDAS-Datei angeben, daß Sie diese Datei ändern +wollen. In dem Beispiel haben Sie eine neue Datei eingerichtet. +EUDAS nimmt dann automatisch an, daß Sie ändern wollen. Öffnen +Sie eine existierende Datei, werden Sie gefragt + +___________________________________________________________________________________________ + + Wollen Sie etwas ändern (Arbeitskopie anlegen) (j/n) ? +___________________________________________________________________________________________ + + +Wenn Sie diese Frage verneinen, wird keine Arbeitskopie angelegt; +alle Änderungsfunktionen werden jedoch gesperrt. Daran können Sie +auch erkennen, daß keine Arbeitskopie vorliegt. + Die Arbeitskopie, die EUDAS sich anlegt, ist anonym. Wenn Sie +sich also im Menü 'Dateien' eine Übersicht zeigen lassen, erscheint +nur das Original. Bevor Sie mit diesem Original etwas anstellen +(zum Beispiel auf Archiv schreiben), sollten Sie sich vergewissern, +daß Sie die Arbeitskopie gesichert haben, da das Original sonst +nicht auf dem neuesten Stand ist. + Um Sie in diesem Fall zu warnen, erscheint vor einer geöffneten +Datei in einer Dateiauswahl das Symbol , zum Beispiel: + + + o "Telefonnummern" + o "Mitglieder" + + +Wenn Sie dieses Symbol sehen, sollten Sie die Datei lieber erst +sichern, bevor Sie etwas mit ihr anstellen. + +#on("b")#Beispiel#off("b")# Um die Arbeitsweise von EUDAS noch besser zu +verstehen, +betrachten Sie das Beispiel in Abb. 6-2. Nehmen Sie an, Sie haben +drei EUDAS-Dateien 'Kalender', 'Namen' und 'Adressen' mit ihren +Anfangsinhalten K0, N0 und A0 (symbolisch). In dem Diagramm sind +die Vorgänge zu den Zeitpunkten 0 bis 10 mit ihren Auswirkungen +auf die Inhalte der Dateien und der Arbeitskopie dargestellt. + + +#free (5.5)# +#center#Abb. 6-2 Beispiel zur Arbeitskopie + + +Zu den einzelnen Zeitpunkten passiere folgendes: + +0: Anfangszustand. Es wurde noch keine Datei geöffnet, also ist + keine Arbeitskopie vorhanden. Es könnte aber auch eine + beliebige Datei ohne Änderungserlaubnis geöffnet sein. +#free (0.2)# +1: Die Datei 'Adressen' wird geöffnet zum Ändern. Der momen­ + tane Zustand der Datei wird als Arbeitskopie übernommen. +#free (0.2)# +2: Es wird eine Änderung vorgenommen (zum Beispiel) ein Satz + eingefügt). Diese Änderung betrifft aber nur die Kopie - die + Datei 'Adressen' als Original bleibt unverändert. +#free (0.2)# +3: Eine weitere Änderung führt zum Inhalt A2 der Arbeitsko­ + pie. +#free (0.2)# +4: Aufruf von 'Sichern'. Die alte Version von 'Adressen' wird + überschrieben und durch den Inhalt A2 ersetzt. Die Frage + nach dem Löschen der Arbeitskopie wird verneint; daher bleibt + die Kopie auch erhalten. +#free (0.2)# +5: Die Kopie wird erneut verändert. +#free (0.2)# +6: Aufruf von 'Sichern'. Die Frage, ob die Kopie gesichert wer­ + den soll, wird verneint. Die Arbeitskopie soll jedoch gelöscht + werden. Als Ergebnis geht die Änderung A3 verloren (viel­ + leicht war diese Änderung ein Irrtum). Die Datei 'Adressen' + wird nicht verändert. Es ist keine Arbeitskopie mehr vor­ + handen. +#free (0.2)# +7: Die Datei 'Namen' wird zum Ändern geöffnet. +#free (0.2)# +8: Die Datei 'Kalender' wird zum Ändern geöffnet. Da an der + vorigen Arbeitskopie keine Änderungen vorgenommen wurden, + kann die Kopie einfach überschrieben werden. Anderenfalls + wäre an dieser Stelle die Möglichkeit zum Sichern angeboten + worden. +#free (0.2)# +9: Es wird eine Änderung durchgeführt. +#free (0.2)# +10: Die geänderte Arbeitskopie wird gesichert, das Original über­ + schrieben und die Arbeitskopie gelöscht (Normalfall). + + diff --git a/doc/eudas/eudas.hdb.7 b/doc/eudas/eudas.hdb.7 new file mode 100644 index 0000000..d6f1bf3 --- /dev/null +++ b/doc/eudas/eudas.hdb.7 @@ -0,0 +1,687 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (61)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +7 Ausdrucken der Daten + + + +7.1 Druckmuster + +Nachdem Sie sich die Inhalte der EUDAS-Datei ausgiebig am Bild­ +schirm angesehen haben, möchten Sie die gespeicherten Daten sicher +auch in gedruckter Form auf Papier sehen. Sie können eine +EUDAS-Datei jedoch nicht ohne weiteres ausdrucken, da sie eine +andere Struktur als normale Textdateien hat. + Vor dem Drucken müssen also die Inhalte der EUDAS-Datei +zunächst in lesbarer Form in eine Textdatei geschrieben werden. +EUDAS kann diese Aufgabe jedoch ohne Ihre Hilfe nicht alleine be­ +wältigen. + Es taucht nämlich das Problem auf, daß die Dateiinhalte in +vielen verschiedenen Formen dargestellt werden können (Sie erin­ +nern sich sicher noch an das erste Kapitel). Vielleicht wollen Sie +bestimmte Überschriften haben oder die Daten müssen auf ein be­ +stimmtes Formular passen. + Um die Ausgabe nach Ihren Wünschen zu gestalten, müssen Sie +also dem Rechner genau angeben, an welcher Stelle welche Felder +gedruckt werden sollen usw. Dies geht am einfachsten, indem Sie +dem Rechner ein Muster vorsetzen, nach dem er dann die richtigen +Ausdrucke erstellen kann. Dieses Muster schreiben Sie in eine eige­ +ne Textdatei, die #on("i")#Druckmuster#off("i")# genannt wird. Aus den Daten der +EUDAS-Datei und der Form, die im Druckmuster angegeben ist, wird +dann eine weitere Textdatei erzeugt, die die Daten in der ge­ +wünschten Form enthält und die anschließend automatisch gedruckt +werden kann. + Durch ein Druckmuster erhalten Sie fast völlige Freiheit in der +Gestaltung Ihrer Ausdrucke. Zum Beispiel können aus einer einzigen +Adressendatei einfache Listen, Einladungskarten oder Rundbriefe +erzeugt werden. Für eine einfache Adressenliste entspricht das +Druckmuster einer Zeile der Liste, wobei angegeben wird, in welche +Spalten die Inhalte gedruckt werden. Zum Drucken von Einladungs­ +karten wird als Druckmuster eine Einladungskarte verwendet, in der +die Stellen markiert sind, an denen die Adresse erscheinen soll. Das +gleiche kann man mit einem Brief machen, der dann mit jeder +Adresse einmal ausgedruckt wird. + +#on("b")#Druckverfahren#off("b")# Man kann sich diesen Druckprozeß wie folgt +vorstellen: + + +#free (6.5)# + +#center#Abb. 7-1 Druckverfahren + + +Vereinfacht gesagt (das genaue Verfahren wird später beschrieben) +wird für jeden Satz der EUDAS-Datei das Druckmuster einmal in die +Druckdatei übernommen. Dabei werden die Inhalte aus der EUDAS- +Datei in einer noch anzugebenden Weise an den gewünschten Stellen +eingefügt. + Im weiteren sollen Sie erfahren, wie ein Druckmuster genau +aussieht und wie daraus ein Ausdruck entsteht. + +#on("b")#Beispiel#off("b")# Im folgenden sollen Sie zur Demonstration die +bereits in +Kapitel 3 und 4 beschriebene Beispieldatei verwenden. Nach Mög­ +lichkeit sollten Sie die angegebenen Beispiele mit dieser Datei +selbst am Rechner ausprobieren. + +Folgende Sätze befinden sich in der Datei: + + + Vorname Name, Strasse, PLZ Ort, m/w + ------------------------------------------------------- + Herbert Wegner, Krämergasse 12, 5000 Köln, m + Helga Sandmann, Willicher Weg 109, 5300 Bonn 1, w + Albert Katani, Lindenstr. 3, 5210 Troisdorf, m + Peter Ulmen, Mozartstraße 17, 5 Köln 60, m + Karin Regmann, Grengelweg 44, 5000 Köln 90, w + Hubert Arken, Talweg 12, 5200 Siegburg, m + Anna-Maria Simmern, Platanenweg 67, 5 Köln 3, w + Angelika Kaufmann-Drescher, Hauptstr. 123, 53 Bonn 2, w + Harald Fuhrmann, Glockengasse 44, 5000 Köln 1, m + Friedrich Seefeld, Kabelgasse, 5000 Köln-Ehrenfeld, m + + +Wie Sie sehen, wurde die Reihenfolge der Felder gegenüber der Datei +teilweise verändert und Name und Vorname ohne Komma hinterein­ +andergeschrieben, während die anderen Feldinhalte durch Komma +getrennt sind. Diese Liste wurde unter Verwendung eines Druck­ +musters erzeugt. + Da dieses Druckmuster jedoch vorerst noch zu kompliziert ist, +sollen Sie erst einmal ein einfacheres Druckmuster erstellen und +versuchen, nur die Namen aus der Datei in Tabellenform auszuge­ +ben. + Das dafür nötige Druckmuster hat folgendes Aussehen: + + + % WIEDERHOLUNG + ! &Name ! &Vorname ! + + +Das Druckmuster besteht nur aus zwei Zeilen, von der die zwei­ +te das eigentliche Muster darstellt. Die erste Zeile ist eine #on("i")# Anwei­ +sung#off("i")# an den Druckgenerator. 'WIEDERHOLUNG' gibt an, daß die +folgenden Zeilen für jeden Satz wiederholt werden sollen (warum +diese Angabe notwendig ist, werden Sie später einsehen). Das Pro­ +zentzeichen kennzeichnet eine Anweisung und muß unbedingt in der +ersten Spalte des Druckmusters stehen, also ganz am linken Rand. + In der zweiten Zeile ist zu sehen, daß das Zeichen '&' dazu +benutzt wird, die Stellen zu markieren, an denen nachher Feldin­ +halte eingesetzt werden sollen. Hinter dem '&'-Zeichen folgt der +Name des Feldes, das an dieser Stelle eingesetzt werden soll. Eine +solche Konstruktion wird #on("i")#Feldmuster#off("i")# genannt. Beachten Sie, daß +Feldnamen hier immer ohne Anführungsstriche geschrieben werden +müssen. Die Ausrufungszeichen bilden den eigentlichen Mustertext +und werden unverändert als Tabellenbegrenzung in die Ausgabe +übernommen. + Als Ergebnis des Druckprozesses sollte folgende Ausgabe auf +dem Drucker erscheinen: + + + ! Wegner ! Herbert ! + ! Sandmann ! Helga ! + ! Katani ! Albert ! + ! Ulmen ! Peter ! + ! Regmann ! Karin ! + ! Arken ! Hubert ! + ! Simmern ! Anna-Maria ! + ! Kaufmann-Drescher ! Angelika ! + ! Fuhrmann ! Harald ! + ! Seefeld ! Friedrich ! + + +Sie können erkennen, daß die Feldmuster in der Ausgabe jeweils +durch den Inhalt des zugehörigen Feldes ersetzt worden sind. Der +übrige Text in der Musterzeile ist unverändert geblieben. Beachten +Sie, daß das '&' ein reserviertes Zeichen ist, das ein Feldmuster im +umgebenden Text kennzeichnet und daher (vorerst) nicht gedruckt +werden kann. + + +7.2 Aufruf + +In diesem Abschnitt sollen Sie erfahren, wie Sie diese Ausgabe +selbst erzeugen können. Damit der Druckgenerator arbeiten kann, +müssen Sie die Datei 'Adressen' erst einmal öffnen. Anschließend +wählen Sie das Menü 'Drucken' an. + +#on("b")#Druckmuster erstellen#off("b")# Als nächstes müssen Sie das +Druckmuster erstellen. Hierfür gibt es die Funktion +#free (0.2)# + + Textdatei + E Editieren + +#free (0.2)# +da das Druckmuster eine normale Textdatei ist. + Wählen Sie diese Funktion. Sie werden dann nach einem Namen +für das Druckmuster gefragt. Wir wollen das Druckmuster 'Namens­ +liste' nennen - Sie können aber auch einen beliebigen anderen +Namen wählen. Denken Sie daran, die Anführungsstriche nicht mit +einzugeben. + Es erscheint anschließend das gewohnte Editorbild mit einer +entsprechenden Statuszeile. Geben Sie die zwei Zeilen des Druck­ +musters ein und beenden Sie den Editor mit ESC 'q'. Damit ist das +Druckmuster fertig. + + Die hier beschriebene Funktion können Sie nicht nur zum Er­ +stellen, sondern auch zum Ändern und einfachen Ansehen eines +Druckmusters bzw. einer Textdatei allgemein verwenden. Es wird +Ihnen immer der jeweilige Inhalt präsentiert, den Sie dann nach +Belieben abändern können oder nicht. + +___________________________________________________________________________________________ + + EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv + --------------: + Satzauswahl : + D Drucken : + --------------: + Druckausgabe : + R Richtung : + --------------: + Textdatei : + E Editieren : + A Ausdrucken : + N Nachbearb. : + --------------: + +___________________________________________________________________________________________ + +#center#Abb. 7-2 Menü "Drucken" + + +#on("b")#Ausgaberichtung#off("b")# Bevor Sie jetzt weitermachen, sollten Sie +über­ +prüfen, ob an Ihrem System ein Drucker angeschlossen ist. Der +Drucker sollte bei den folgenden Versuchen betriebsbereit sein. + Ist kein Drucker angeschlossen oder wollen Sie kein Papier +verschwenden, haben Sie die Möglichkeit, den Ausdruck als Text­ +datei zu erhalten. Dazu wählen Sie die Funktion +#free (0.2)# + + Ausgabe + R Richtung + +#free (0.2)# +an. Beantworten Sie beide Fragen, die Ihnen gestellt werden, mit +'n'. Die Ausgaben stehen dann nachher in Dateien mit einem Namen +der Form +#free (0.2)# + + Namensliste.a$n + +#free (0.2)# +die Sie sich mit der oben beschriebenen Funktion dann genau wie +ein Druckmuster anschauen können. Der Name besteht also aus dem +Namen des Druckmusters, dem ein '.a$' angehängt wird. Die Nummer +'n' dient zur Unterscheidung bei mehreren aufeinanderfolgenden +Ausgaben. Um Verwirrung zu vermeiden, sollten Sie die Datei nach +dem Anschauen löschen (im Menü 'Dateien'). + +#on("b")#Druckaufruf#off("b")# Wenn Sie diese Hinweise beachtet haben, können +Sie den Druckvorgang mit der Auswahl +#free (0.2)# + + Satzauswahl + D Drucken + +#free (0.2)# +starten. Sie werden hier nach dem Namen des Druckmusters gefragt, +das Sie verwenden wollen (Sie können ja durchaus eine ganze Reihe +von verschiedenen Druckmustern haben). + Sie können den Ablauf des Druckvorganges daran verfolgen, +daß jeweils die Nummer des Satzes ausgegeben wird, der gerade +bearbeitet wird. Probieren Sie eventuell auch kleine Abwandlungen +des Druckmusters aus, indem Sie die Tabellenspalten schmaler oder +breiter machen oder die Ausrufungszeichen durch ein anderes Zei­ +chen ersetzen (je nach Geschmack). + +#on("b")#Ausgabedatei#off("b")# Wollen Sie die erzeugte Ausgabe (die in der +Datei +'Namensliste.a$1' steht) irgendwann tatsächlich ausdrucken, ver­ +wenden Sie die Funktion +#free (0.2)# + + A Ausdrucken + +#free (0.2)# +Sie werden dann nach dem Namen der Textdatei gefragt. Beachten +Sie, daß Sie diese Funktion #on("i")#nicht#off("i")# zum Drucken von EUDAS-Dateien +verwenden können, da aus einer EUDAS-Datei erst eine Druckdatei +erzeugt werden muß. + Auch wenn Sie angegeben haben, daß die Ausgabe des Druck­ +prozesses direkt ausgedruckt werden soll, startet Ihr Drucker erst, +wenn EUDAS die ganze Datei durchgegangen ist und der Vorgang für +Sie beendet ist. Dies liegt am EUMEL-System, das nur vollständige +Druckaufträge entgegennimmt, damit sich mehrere Benutzer nicht in +die Quere kommen können. In einem Multi-User-System können Sie +weiterarbeiten, während der Drucker beschäftig ist. + +#on("b")#Fehler#off("b")# Bevor der eigentliche Druckprozeß gestartet wird, +wird das +Druckmuster auf unsinnige oder unverständliche Konstruktionen +überprüft. Ist dem Druckgenerator etwas suspekt, gibt er eine Feh­ +lermeldung aus, in der die fragliche Situation von seiner Seite aus +beschrieben wird. Er kann natürlich nicht Ihren Fehler "verstehen". +Daher müssen Sie unter Umständen eine Fehlermeldung erst inter­ +pretieren, ehe Sie die wahre Ursache erkennen können. + Damit Sie einen aufgetretenen Fehler gleich korrigieren können, +werden Ihnen das Druckmuster und die Fehlermeldungen parallel auf +dem Bildschirm zum Ändern und Anschauen angeboten. Sie können +mit dem Editor das Druckmuster ändern und in den Fehlermeldungen +blättern. Diese Konfiguration wird Paralleleditor genannt. Mit ESC +'w' wechseln Sie zwischen den beiden Bildschirmhälften. + +#on("b")#Suchbedingung#off("b")# Wollen Sie nicht alle Namen ausdrucken, so +können +Sie vorher ein Suchmuster einstellen, das nur auf die gewünschten +Namen zutrifft (wie im Kapitel 5 beschrieben). Der Druckgenerator +richtet sich immer nach dem aktuell eingestellten Suchmuster und +druckt nur die ausgewählten Sätze. Wenn Sie zum Beispiel die Na­ +men aller Frauen ausdrucken wollen, stellen Sie im Tastenmodus ein +Suchmuster ein (das sollten Sie können), das für das Feld 'm/w' die +Bedingung 'w' enthält. Danach können Sie den Druckgenerator auf­ +rufen. Vergessen Sie nicht, das Suchmuster anschließend wieder zu +löschen. + +#on("b")#Feldnamen abfragen#off("b")# Wenn Sie selber ein Druckmuster +erstellen, +wird es häufiger vorkommen, daß Sie die genaue Schreibweise der +Feldnamen nicht im Kopf haben. Für diesen Zweck definiert EUDAS +im Editor eine spezielle Tastenkombination. + Wenn Sie dort ESC 'F' tippen (großes 'F'), erhalten Sie eine +Auswahl aller Felder der gerade geöffneten Datei. Sie können sich +die Namen einfach ansehen, aber auch direkt in den Text des +Druckmusters übernehmen. + Wenn Sie nämlich vor dem Verlassen der Auswahl mit ESC 'q' +ein Feld ankreuzen, wird anschließend der Name in Anführungs­ +strichen an die Position geschrieben, an der vor dem Aufruf der +Cursor stand. Auf diese Weise können Sie sich auch das Tippen +langer Feldnamen vereinfachen. + Beachten Sie, daß Sie im Normalfall im Druckmuster die Anfüh­ +rungsstriche wieder entfernen müssen. Die Anführungsstriche dienen +zur Abgrenzung, wie weit der Feldname geht. Falls der Name Leer­ +zeichen enthält, beachten Sie bitte den Absatz 'Abgrenzung der +Feldnamen' in Abschnitt 7.4. + + +7.3 Abschnitte + +Die Tabellen, die Sie bis jetzt erzeugen können, sehen optisch noch +nicht sehr gut aus. Es fehlt auf jeden Fall eine vernünftige Über­ +schrift. Um eine Überschrift zu erzeugen, können Sie im Druckmuster +einen #on("i")#Vorspann#off("i")# definieren, der ganz zu Anfang einmal gedruckt +wird. + Dieser Vorspann wird durch die Anweisung + + + % VORSPANN + + +eingeleitet (bitte nicht vergessen, daß das '%'-Zeichen für eine +Anweisung in der ersten Spalte stehen muß). Die folgenden Zeilen +bis zur 'WIEDERHOLUNG'-Anweisung gehören zum Vorspann. Ein +Druckmuster für unsere Namensliste mit Überschrift könnte dann so +aussehen: + + + % VORSPANN + Alle Namen aus der EUDAS-Datei 'adressen' + ----------------------------------------- + % WIEDERHOLUNG + ! &Name ! &Vorname ! + + +Der Druckgenerator erzeugt mit diesem Druckmuster die gewünschte +Liste mit Überschrift. Sie können als Vorspann natürlich auch einen +beliebigen anderen Text verwenden. + In einer analogen Weise können Sie die Liste noch durch eine +waagerechte Linie abschließen, indem Sie einen #on("i")#Nachspann#off("i")# definie­ +ren. Die dafür notwendige Anweisung heißt + + + % NACHSPANN + + +Die Zeilen nach dieser Anweisung werden gedruckt, nachdem alle +Sätze bearbeitet worden sind. Das folgende Druckmuster erzeugt +schon eine sehr schöne Liste: + + + % VORSPANN + Alle Namen aus der EUDAS-Datei 'adressen' + ----------------------------------------- + % WIEDERHOLUNG + ! &Name ! &Vorname ! + % NACHSPANN + ----------------------------------------- + + +nämlich: + + + Alle Namen aus der EUDAS-Datei 'adressen' + ----------------------------------------- + ! Wegner ! Herbert ! + ! Sandmann ! Helga ! + ! Katani ! Albert ! + ! Ulmen ! Peter ! + ! Regmann ! Karin ! + ! Arken ! Hubert ! + ! Simmern ! Anna-Maria ! + ! Kaufmann-Drescher ! Angelika ! + ! Fuhrmann ! Harald ! + ! Seefeld ! Friedrich ! + ----------------------------------------- + + +Die drei Teile, aus denen ein Druckmuster bestehen kann (Vorspann, +Nachspann und Wiederholungsteil), werden #on("i")#Abschnitte#off("i")# genannt. Wie +Sie später noch sehen werden, haben Abschnitte eine Reihe von +gemeinsamen Eigenschaften. Ein Abschnitt wird durch eine eigene +Anweisung eingeleitet und endet, wenn ein anderer Abschnitt be­ +ginnt oder das Druckmuster zu Ende ist. Alle Abschnitte können +auch weggelassen werden, irgendein Abschnitt muß aber immer +vorhanden sein. So ist es zum Beispiel möglich, ein Druckmuster zu +bauen, das nur aus einem Nachspann besteht (Sie werden allerdings +jetzt noch nicht verstehen können, warum so etwas sinnvoll sein +kann). + Zum Abschluß dieses Kapitels hier noch einmal eine Übersicht +der bisher vorgestellten Anweisungen: + + + Anweisung ! Bedeutung + ---------------+---------------------------------- + % VORSPANN ! leitet Vorspann ein + % WIEDERHOLUNG ! leitet Wiederholungsteil ein + % NACHSPANN ! leitet Nachspann ein + + + +7.4 Feldmuster + +Mit den bis jetzt beschriebenen Möglichkeiten des Druckgenerators +können Sie schon sehr viel anfangen. Es fehlt aber noch die Mög­ +lichkeit, mehrere Feldinhalte direkt hintereinander zu schreiben, +egal wie lang diese Inhalte sind. Diese Fähigkeit wird zum Beispiel +für die anfangs vorgestellte Liste benötigt. + +#on("b")#Variable Position#off("b")# Die Feldmuster, die Sie bis jetzt +kennen, begin­ +nen mit einem '&'-Zeichen und werden immer genau an der Stelle +gedruckt, an der sie stehen (feste Position). Sie können ein Feld­ +muster aber auch mit '%' beginnen lassen. In diesem Fall kann der +Inhalt verschoben werden (variable Position), je nachdem, ob vorhe­ +rige Inhalte kürzer oder länger sind. + '%' ist wie '&' ein reserviertes Zeichen, kann also nicht direkt +gedruckt werden. Da '&' und '%' Feldmuster einleiten, heißen sie +#on("i")#Musterzeichen#off("i")#. + Um Feldmuster variabler Position einmal auszuprobieren, soll­ +ten Sie unser bisheriges Druckmuster in der folgenden Weise um­ +schreiben: + + + % WIEDERHOLUNG + &Vorname %Name + + +(Vorspann und Nachspann der Einfachheit halber mal weggelassen). +Als Ergebnis erhalten wir: + + + Herbert Wegner + Helga Sandmann + Albert Katani + Peter Ulmen + Karin Regmann + Hubert Arken + Anna-Maria Simmern + Angelika Kaufmann-Drescher + Harald Fuhrmann + Friedrich Seefeld + + +Das Feldmuster '%Name' ist also entsprechend der Länge des Vor­ +namens nach links oder nach rechts gerutscht. Zu beachten ist, daß +ein Feldmuster mit '%' nicht in der ersten Spalte stehen darf, denn +dann würde die Zeile als Anweisung angesehen. Ein Feldmuster +variabler Position wäre ja auch in der ersten Spalte wenig sinnvoll. + +#on("b")#Feste Länge#off("b")# Außer den beiden bisher besprochenen einfachen +Arten (mit '&' oder '%') gibt es noch weitere Ausprägungen von +Feldmustern für besondere Fälle. Wird ein Feldmuster noch von +weiteren Musterzeichen gefolgt, dann wird dieses Feldmuster immer +in der reservierten Länge eingesetzt. Die reservierte Länge reicht +vom ersten bis zum letzten Musterzeichen. Durch die zusätzlichen +Musterzeichen wird also ein bestimmter Platz freigehalten. + Ersetzt man im obigen Druckmuster '&Vorname' durch +'&Vorname&&', wird der Effekt des folgenden '%'-Feldes wieder +aufgehoben, da jetzt für alle Vornamen die gleiche Länge verwendet +wird (Probieren Sie dies aus). + Bei einem solchen Feldmuster mit fester Länge wird der Inhalt +abgeschnitten, falls er diese Länge überschreitet; ist der Inhalt +kürzer, wird rechts mit Leerstellen aufgefüllt. Aber auch bei Feld­ +mustern mit variabler Länge (also ohne folgende Musterzeichen) +kann abgeschnitten werden, nämlich genau dann, wenn der Inhalt so +lang ist, daß ein folgendes Feld mit fester Position (mit '&' anfan­ +gend) überschrieben würde. Hätten wir also in unserem ersten +Druckmuster nicht genügend Platz für die Spalten vorgesehen, +wären einige Namen abgeschnitten worden (probieren Sie es nochmal +aus, falls es Ihnen nicht schon passiert ist). + In einem weiteren Fall werden Feldmuster variabler Länge +abgeschnitten, nämlich wenn die generierte Zeile die maximale +Zeilenlänge überschreitet. Die maximale Zeilenlänge richtet sich +nach dem Dateilimit, das für das Druckmuster eingestellt ist. Nor­ +malerweise ist dies 77, so daß Sie in Normalschrift die Zeilenbreite +auf einem DIN A4-Blatt nicht überschreiten. + Benutzen Sie jedoch breites Papier oder eine schmale Schrift, +sollten Sie während der Eingabe des Druckmusters ESC ESC tippen +und das Kommando + + + limit (135) + + +eingeben. EUDAS nutzt dann die volle Zeilenbreite aus. + +#on("b")#Rechtsbündig#off("b")# Sie sind jetzt aber noch nicht zu Ende mit +den +Feldmustervariationen. Eine letzte Möglichkeit besteht darin, den +Inhalt rechtsbündig in ein Feldmuster einzusetzen. Dies hat natür­ +lich nur Sinn bei fester Länge. Man erreicht dies dadurch, daß man +das Feldmuster mit mehreren Musterzeichen beginnen läßt. So ist + + + %%Vorname% + + +die rechtsbündige Version von + + + %Vorname%% + + +Beide Feldmuster sind gleich lang, beim ersten wird jedoch am lin­ +ken Rand aufgefüllt oder abgeschnitten, beim zweiten dagegen am +rechten Rand. + +#on("b")#Zusammenfassung#off("b")# Hier noch einmal eine Zusammenstellung +aller möglichen Feldmustertypen: + + + Typ ! Beispiel ! Position ! Länge ! bündig + ----+-----------+------------------------------ + 1 ! &Name ! fest ! variabel ! links + 2 ! %Name ! variabel ! variabel ! links + 3 ! &Name&&& ! fest ! fest ! links + 4 ! %Name%%% ! variabel ! fest ! links + 5 ! &&&Name& ! fest ! fest ! rechts + 6 ! %%%Name% ! variabel ! fest ! rechts + + +Wir können zusammenfassen: +#free (0.2)# +* Feldmuster dienen im Druckmuster dazu, Stellen zu markieren, an + denen Inhalte eingesetzt werden sollen. +#free (0.2)# +* Feldmuster beginnen mit einem Musterzeichen ('&' oder '%'); + darauf folgt der Feldname. +#free (0.2)# +* Durch '&' wird feste und durch '%' variable Position festgelegt. +#free (0.2)# +* Durch zusätzliche Musterzeichen kann eine feste Länge angege­ + ben werden; mehrere Musterzeichen am Anfang führen zu rechts­ + bündigem Einsetzen. + +#on("b")#Abgrenzung der Feldnamen#off("b")# Als nächstes sollen Sie den Fall +be­ +trachten, daß Sie einen Namen in der oft auftretenden Form + + + Name, Vorname + + +schreiben wollen. Die Schwierigkeit liegt in dem Komma, das direkt +hinter dem Namen folgen soll. Sie könnten versuchen, diese Situa­ +tion im Druckmuster folgendermaßen darzustellen: + + + % WIEDERHOLUNG + &Name, %Vorname + + +In diesem Fall erhalten Sie aber die Fehlermeldung + + + FEHLER in Zeile 2 bei >>Name,<< + diese Abkuerzung ist nicht definiert + + +Wenn Sie sich nicht genau vorstellen können, wie der Druckgenera­ +tor ein Feldmuster liest, wird Ihnen dieser Fehler mysteriös er­ +scheinen, denn 'Name' ist doch als Feld definiert (was eine Abkür­ +zung ist, werden Sie in Kapitel 13 lernen). Den entscheidenden +Hinweis liefert jedoch das Komma. Offensichtlich hat der Druck­ +generator das Komma als Teil des Feldnamens angesehen. + Dies liegt daran, daß ja irgendwann der Feldname in einem +Feldmuster beendet sein muß. Normalerweise interpretiert der +Druckgenerator ein Leerzeichen oder Musterzeichen als Ende des +Namens, alle vorherigen Zeichen gehören mit zum Feldnamen. Wenn +nun aber nach dem Feldmuster kein Leerzeichen folgen soll (wie in +unserem Beispiel) oder der Feldname selbst Leerzeichen enthält +(dies ist ja erlaubt, könnte aber im Druckmuster nie erkannt wer­ +den), muß noch eine zusätzliche Angabe erfolgen. + In solchen Fällen kann der Feldname in spitze Klammern einge­ +schlossen werden. Der Druckgenerator sieht den Feldnamen dann bei +der ersten schließenden Klammer als beendet an, wobei die Klam­ +mern natürlich nicht zum Feldnamen gehören, aber auch nicht ge­ +druckt werden. + Das obige Beispiel müßte also richtig so formuliert werden: + + + % WIEDERHOLUNG + &, %Vorname + + +Wenn Sie dieses Druckmuster ausprobieren, werden Sie sehen, daß +die Namen tatsächlich in der gewünschten Form erscheinen. + +#on("b")#Leerautomatik#off("b")# Es gibt noch eine trickreiche Automatik in +EUDAS, +die in manchen Fällen ganz nützlich ist - und zwar in Fällen, in +denen Sie mehrere Felder als Aufzählung durch Leerzeichen ge­ +trennt drucken wollen. Nehmen wir an, unsere Adreßdatei hätte +noch ein Feld 'Titel', in das Sie bei Bedarf 'Dr.' oder 'Prof. Dr.' +eintragen. In der Adresse würden Sie dann angeben: + + + &Titel %Vorname %Name + + +Wenn der Titel jedoch leer ist, würde ein störendes Leerzeichen vor +dem Namen bleiben. In einem solchen Fall entfernt EUDAS das Leer­ +zeichen automatisch. Vorbedingung für diese Automatik ist, daß es +sich um ein Feld variabler Länge handelt und vor dem Feld noch ein +Leerzeichen steht (außer in Spalte 1). + +#on("b")#Aufgabe#off("b")# Sie sollten jetzt die Möglichkeiten des +Druckgenerators +soweit kennengelernt haben, daß Sie ein Druckmuster für die zu +Anfang des Kapitels erwähnte Liste aller Dateiinhalte erstellen +können. Versuchen Sie dies zunächst allein, ehe Sie die Lösung +nachschauen. + + +Hier nun die Lösung: + + + % VORSPANN + Vorname Name, Strasse, PLZ Ort, m/w + ------------------------------------------------------- + % WIEDERHOLUNG + &Vorname %, %, %PLZ %, %m/w + + +Beachten Sie die spitzen Klammern, die nötig sind, um das Kom­ +ma ohne Zwischenraum anzuschließen. + +#on("b")#Beispiel#off("b")# Als letztes Beispiel sollen Sie einen Fall +betrachten, bei +dem pro Satz mehr als eine einzelne Listenzeile gedruckt werden +soll, und zwar sollen Sie einen Brief schreiben, in den der Druck­ +generator die Adressen verschiedener Leute einfügen soll. Die Er­ +stellung von Formbriefen ist eine sehr häufige Anwendung von +EUDAS. Mit den bisher beschriebenen Konstrukten kann man etwa +folgendes Druckmuster schreiben: + + + % WIEDERHOLUNG + &Vorname %Name + &Strasse + &PLZ %Ort + + Lieber &Vorname ! + + Ich lade Dich mit diesem Brief zu + meiner nächsten Party ein. + Bring gute Laune und was zu Essen mit. + + Viele Grüße + \#page\# + + +Die letzte Zeile zeigt eine Möglichkeit, von der Sie wahrscheinlich +öfter Gebrauch machen werden, nämlich Druckersteuerungsanwei­ +sungen in das Druckmuster einzufügen. Die Anweisung '\#page\#' +wird an den Drucker weitergereicht und bewirkt, daß nach jedem +Brief eine neue Seite angefangen wird (Sie wollen sicher nicht +mehrere Briefe auf ein Blatt drucken). Sie können auch andere An­ +weisungen verwenden, z.B. neue Schrifttypen einstellen. Informieren +Sie sich gegebenenfalls, welche Anweisungen die Textkosmetik zur +Verfügung stellt. + +#on("b")#Ausblick#off("b")# Sie kennen jetzt bereits einen großen Teil der +Möglich­ +keiten des Druckgenerators. Einige wünschenswerte Fähigkeiten +fehlen jedoch noch. So wäre es vorteilhaft, wenn abhängig vom +Inhalt des Feldes 'm/w' die Anrede 'Sehr geehrter Herr' oder 'Sehr +geehrte Frau' erzeugt werden könnte. Außerdem könnte das im +Rechner vorhandene Datum automatisch in den Brief übernommen +werden. Diese Möglichkeiten werden den Kapiteln 12 und 13 be­ +schrieben. + Sie sollten diese jedoch erst dann durchlesen, wenn Sie eine +gewisse Sicherheit im Umgang mit Druckmustern erlangt haben. +Zuvor sollten Sie die Inhalte dieses Kapitels beherrschen, damit Sie +EUDAS gut nutzen können. + diff --git a/doc/eudas/eudas.hdb.8 b/doc/eudas/eudas.hdb.8 new file mode 100644 index 0000000..83246e9 --- /dev/null +++ b/doc/eudas/eudas.hdb.8 @@ -0,0 +1,211 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (75)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +8 Was war und was noch kommt + + + +8.1 Rückblick + +So! Wenn Sie bis hierhin gut mitgearbeitet haben, haben Sie die +erste und wichtigste Etappe beim Erlernen von EUDAS schon ge­ +schafft. Bevor Sie kennenlernen, was für Möglichkeiten Ihnen EUDAS +sonst noch bietet, wollen wir die wichtigsten Dinge rekapitulieren, +die Sie gelernt haben sollten. + +#on("b")#EUDAS-Dateien#off("b")# Sie sollten wissen, wie EUDAS-Dateien +aussehen, +und daß sie sich von normalen Textdateien unterscheiden. Diese +Unterscheidung sollten Sie immer beachten, denn es gibt Funktio­ +nen, die nur EUDAS-Dateien annehmen (zum Beispiel 'Öffnen'), +andere, die nur Textdateien annehmen (zum Beispiel 'Textdatei +erstellen') und solche, die mit beliebigen Arten von Dateien "ohne +Ansehen der Person" funktionieren (zum Beispiel 'Kopieren vom +Archiv'). + +#on("b")#Bedienung#off("b")# Sie sollten wissen, wie man eine Funktion im +Menü +aufruft; wie Sie EUDAS die notwendigen Informationen (zum Beispiel +Dateinamen) mitgeben und wie Sie in besonderen Situationen (Feh­ +ler, Abbruch) reagieren können. Zur problemlosen Bedienung sollten +Sie auch die jeweilige Statuszeile interpretieren können. + +#on("b")#Dateiverwaltung#off("b")# Sie sollten wissen, wie Sie Dateien von +Archiv­ +disketten holen und dort auch wieder abspeichern können. Dazu ist +die Dateiauswahl durch Ankreuzen sehr hilfreich. Sie sollten von +Anfang an darauf achten, daß Sie Ihre Dateien regelmäßig auf dem +Archiv sichern, damit Sie bei etwaigen Problemen mit Ihrem Rechner +die Daten nicht verlieren. + +#on("b")#Öffnen#off("b")# Sie sollten wissen, daß Sie eine EUDAS-Datei vor +dem +Bearbeiten erst öffnen müssen. Weiterhin sollten Sie mit der Ar­ +beitskopie umgehen können, die EUDAS bei Änderungen anlegt. +Denken Sie daran, Ihre Datei nach Änderungen zu sichern. Sie soll­ +ten auch neue EUDAS-Dateien mit eigener Struktur anlegen können. + +#on("b")#Ansehen und Ändern#off("b")# Sie sollten wissen, wie Sie die Daten +Ihrer +EUDAS-Dateien am Bildschirm abrufen können - entweder manuell +oder mit Hilfe eines Suchmusters. Sie sollten Änderungen und Ein­ +fügungen durchführen können. + +#on("b")#Drucken#off("b")# Sie sollten wissen, wie Sie die Daten einer +EUDAS-Datei +mit Hilfe eines Druckmusters ausdrucken können. Denken Sie daran, +daß dies ein zweistufiger Vorgang ist (Generierung der Druckdatei - +Ausgeben an Drucker), den Sie an verschiedenen Stellen beeinflus­ +sen können. + +Lesen Sie das entsprechende Kapitel erneut durch, wenn Sie sich bei +einem Punkt dieser Aufzählung nicht sicher sind. Wichtig ist auch, +daß Sie die bschriebenen Funktionen selbst am Rechner ausprobiert +haben. + Wenn Sie dies alles geduldig absolviert haben, sind Sie in der +Lage, EUDAS sinnvoll für Ihre eigenen Probleme einzusetzen. Sie +sollten jetzt ruhig versuchen, eigene Lösungen zu realisieren. Sicher +werden Sie dabei erkennen, daß Ihnen noch einige Möglichkeiten +fehlen. Die Chancen sind aber gut, daß EUDAS Ihnen diese Möglich­ +keiten bietet. + Im nächsten Abschnitt erhalten Sie einen Überblick darüber, +was EUDAS noch zur Verfügung stellt. Dort können Sie sich orien­ +tieren, welche Kapitel Sie lesen sollten, wenn Sie bestimmte Fragen +haben. + + +8.2 Ausblick + +Im zweiten Teil dieses Handbuchs erwarten Sie eine ganze Reihe +interessanter Themen. Dort werden Erweiterungen und Verallgemei­ +nerungen von Funktionen beschreiben, die Sie bereits kennen. Viele +Funktionen sind jedoch ganz neu und manchmal auch nicht ganz +einfach zu beherrschen. + +#on("b")#Kapitel 9#off("b")# Das neunte Kapitel befaßt sich mit der +grundsätzlichen +Struktur der geöffneten Datei. Sie erfahren, daß Sie mehr als eine +Datei gleichzeitig öffnen und bearbeiten können. Zum einen können +Sie gleichartige Dateien verketten oder Dateien über Beziehungen +koppeln. Insbesondere das Koppeln ist eine wichtige Grundlage für +viele fortgeschrittene Anwendungen von EUDAS. + In diesem Kapitel wird auch beschrieben, wie Sie auf einem +Mehrplatzsystem von mehreren Plätzen aus auf die gleichen EUDAS- +Dateien zugreifen können. Die Fähigkeiten von EUDAS auf diesem +Gebiet erreichen nicht das Niveau von großen Datenbanksystemen, +sind jedoch einfach anzuwenden und in vielen Fällen nützlich. + +#on("b")#Kapitel 10#off("b")# Im zehnten Kapitel erfahren Sie, wie Sie den +Bildschirm +übersichtlicher gestalten können, wenn Sie Dateien mit zahlreichen +Feldern benötigen. Sie können bestimmte Felder auswählen, aber +auch die Sätze einfach ausschnittweise ansehen. + Das Suchmuster besitzt noch viele Fähigkeiten, die im ersten +Teil nicht zur Sprache gekommen sind. Sie können mehrere Bedin­ +gungen auf verschiedene Weisen miteinander kombinieren. Auch +einige neue Vergleiche treten auf. Außerdem können Sie mehrere +Felder eines Satzes miteinander vergleichen. + Zum schnellen Überblick steht Ihnen eine Funktion bereit, die +jeweils einen Satz pro Bildschirmzeile anzeigt. In dieser Übersicht +können Sie blättern und auch Sätze markieren (ankreuzen), um Sie +später zu bearbeiten. + +#on("b")#Kapitel 11#off("b")# Das elfte Kapitel ist den Funktionen zur +Bearbeitung +gewidmet. Dort erfahren Sie, wie Sie eine Datei sortieren können. +Außerdem können Sie eine Datei ausschnittweise kopieren, wobei Sie +noch eine Vielzahl von Manipulationsmöglichkeiten haben. + Auch das Tragen von mehreren Sätzen in einem Arbeitsgang ist +möglich. Dabei können Konsistenzbedingungen einer Datei überprüft +werden. + Als letztes erfahren Sie, wie man eine EUDAS-Datei automa­ +tisch nach einer beliebigen Vorschrift ändern kann. Hier, wie bei +den vorherigen Funktionen, werden Sie zum ersten Mal erkennen, +wieviel man mit der Programmiersprache ELAN innerhalb von EUDAS +ohne viel Aufwand machen kann. + +#on("b")#Kapitel 12#off("b")# Das nächste Kapitel zeigt Ihnen weitere +Möglichkeiten +zum Drucken. Sie können die Druckausgabe vor dem Drucken noch +mit den Programmen der EUMEL-Textverarbeitung aufbereiten. Auch +innerhalb der EUMEL-Textverarbeitung können Sie EUDAS aufrufen, +um Daten aus einer EUDAS-Datei in den Text einzufügen. + EUDAS kann auch in mehreren Spalten drucken (zum Beispiel +für Etiketten). Schließlich wird noch beschrieben, wie Sie lange +Felder auf mehrere Zeilen aufteilen können und welche speziellen +Möglichkeiten Sie zur Erzeugung von Tabellen haben. + +#on("b")#Kapitel 13#off("b")# Ab hier beginnt die Beschreibung dessen, was +die +Ausgabe des Druckgenerators so ungeheuer anpassungsfähig macht: +die Verwendung der Programmiersprache ELAN. + Mit einfachsten ELAN-Elementen können Sie komplizierte For­ +matierungswünsche erfüllen. Dazu können Sie den Inhalt von Feld­ +mustern durch vorherige Bearbeitung und durch die Abfrage von +Bedingungen manipulieren. Ganze Musterteile können in Abhängig­ +keit von Bedingungen variabel gestaltet werden. + Auch der Ablauf von Druckvorgängen kann von Bedingungen +abhängig gemacht werden. So lassen sich gesteuert Vorspann und +Nachspann innerhalb des Ausdrucks einfügen und Zwischenüber­ +schriften oder -summen bilden (Gruppenverarbeitung). + +#on("b")#Kapitel 14 und 15#off("b")# Für denjenigen, der noch nie mit ELAN zu +tun +hatte, werden diese Möglichkeiten sicher nicht ganz einfach zu +verstehen sein. Obwohl die vorherigen Kapitel viele benutzbare +Beispiele enthalten, ist zur vollen Ausnutzung ein gewisses Ver­ +ständnis von ELAN notwendig. + Dies soll in den Kapitel 14 und 15 vermittelt werden, und zwar +in dem Umfang, in dem es in EUDAS nötig ist (Sie sollen hier nicht +zum ELAN-Programmierer ausgebildet werden). Für den ELAN- +Kenner bieten diese Kapitel sicher nichts Neues, aber sie enthalten +viele Beispiele und Beschreibungen der Funktionen, die für EUDAS +wichtig sind. + Dabei geht Kapitel 15 weiter auf die Sprachmittel für Zählvor­ +gänge, Auswertungen und statistische Anwendungen ein, während in +Kapitel 14 die grundlegenden Ausdrücke zur Formulierung von +Manipulationen besprochen werden. + +#on("b")#Kapitel 16#off("b")# Im letzten Kapitel geht es dann wieder +harmloser zu. +Hier werden die Funktionen beschrieben, die unter EUDAS zur +allgemeinen Dateiverwaltung zur Verfügung stehen. Im Grunde sind +dies alles Funktionen, die vom EUMEL-System zur Verfügung ge­ +stellt werden. EUDAS integriert sie lediglich in ein Menüsystem, +damit Sie als Benutzer die Funktionen möglichst einfach aufrufen +können. + Aber auch dem erfahrenen EUMEL-Benutzer bieten die Funktio­ +nen einen zusätzlichen Komfort, da auch hier die praktische Aus­ +wahl durch Ankreuzen in allen Funktionen vertreten ist. Außerdem +wird die Anzahl von Tastendrücken zum Erreichen eines Ziels ver­ +ringert. Daher besteht auch für den "Profi" keine Notwendigkeit, +grundsätzlich mit einer Kommandoschnittstelle weiterzuarbeiten. + +#on("b")#Referenzhandbuch#off("b")# Im Referenzhandbuch sind alle hier +besproche­ +nen Funktionen noch einmal in einer sehr kurzen, zusammenfassen­ +den und abstrakten Form aufgeführt. Dort sollen Sie nachschlagen, +wenn Sie eine ganz bestimmte Information suchen und sich mit +EUDAS bereits auskennen. + Sie können jedoch auch ohne das Referenzhandbuch auskommen, +denn alles, was Sie wissen müssen, steht auch hier im Benutzer­ +handbuch. + Das Referenzhandbuch enthält auch einen Teil, der sich spe­ +ziell an den ELAN-Programmierer wendet, der besondere Anwendun­ +gen mit EUDAS realisieren will. Allerdings sollten alle dort be­ +schriebenen Möglichkeiten mit Vorsicht betrachtet werden, da sie im +Normalfall nicht so abgesichert sind, wie die hier beschriebenen +Fähigkeiten. Auch sollten Sie mit den Einsatzmöglichkeiten von +ELAN, wie sie in den Kapitel 11 und 13 beschrieben sind, wirklich +alle praktischen Probleme erledigen können. + diff --git a/doc/eudas/eudas.hdb.9 b/doc/eudas/eudas.hdb.9 new file mode 100644 index 0000000..341feca --- /dev/null +++ b/doc/eudas/eudas.hdb.9 @@ -0,0 +1,556 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (83)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +9 Das virtuelle Dateikonzept + + + +9.1 Konzept + +Bisher haben Sie zu einem Zeitpunkt immer nur eine EUDAS-Datei +bearbeiten können. Wenn Sie zu einer anderen Datei wechseln woll­ +ten, mußten Sie die eine Datei sichern und die andere Datei wieder +öffnen. Es gibt jedoch Fälle, in denen Beziehungen zwischen mehre­ +ren Dateien bestehen. Daher kann EUDAS auch mit mehreren Dateien +gleichzeitig umgehen. + Es hat jedoch Vorteile, wenn man nur mit einer Datei arbeitet. +Sie müssen dann nicht immer den Namen der gewünschten Datei +angeben, wenn Sie eine Funktion ausführen. Dies brauchen Sie nur +einmal beim Öffnen zu tun - danach ist eindeutig festgelegt, wel­ +che Datei gemeint ist. + EUDAS versucht diese Vorteile auch bei mehreren Dateien zu +erhalten. Die verschiedenen Dateien werden so kombiniert, daß eine +neue Datei entsteht. Sie arbeiten dann nur mit dieser Datei, die alle +Daten der Einzeldateien enthält. + Damit Sie aber nicht so lange warten müssen, geschieht dieser +Kombinationsvorgang erst beim Ansehen. Die kombinierte Datei ist +also nicht wirklich vorhanden, sondern ihre Einzelsätze werden nur +bei Bedarf erzeugt. Daher heißt diese Gesamtdatei auch #on("i")#virtuelle#off("i")# +(scheinbare) Datei. + Eine Kombination von Dateien ist auf zwei Arten möglich. Sie +können gleichartige Dateien hintereinander#on("i")#ketten#off("i")#, oder Sie können +Dateien über gemeinsame Felder #on("i")#koppeln#off("i")#. Beide Methoden können +auch kombiniert werden. + +#on("b")#Änderungen#off("b")# Die virtuelle Datei kann auch verändert werden. +Die +Veränderungen werden dann in den entsprechenden Ursprungsda­ +teien vorgenommen. Es ist jedoch nicht immer eindeutig, wie diese +Änderungen aussehen sollen. Achten Sie daher auf die speziellen +Regeln, die bei solchen Änderungen gelten, damit Sie die Auswir­ +kungen einer Änderung abschätzen können. + Wenn Sie Veränderungen vorgenommen haben, müssen Sie die +Arbeitskopien anschließend wieder sichern. Denken Sie daran, daß +EUDAS immer auf unbenannten Kopien arbeitet, wenn Sie ändern +wollen. Beim Sichern von mehreren Dateien wird Ihnen zu jeder +Datei einzeln angezeigt, ob sie tatsächlich verändert wurde. Sie +können dann ebenfalls einzeln entscheiden, ob Sie die Datei sichern +wollen oder nicht. + + +9.2 Ketten + +Wenn Sie einmal EUDAS-Dateien mit mehreren tausend Sätzen er­ +stellen, werden Sie feststellen, daß deren Handhabung recht um­ +ständlich sein kann. Da die Datei sehr groß ist, dauern zum Beispiel +Kopiervorgänge aufs Archiv viel länger als bei kleinen Dateien. + Wenn Sie nun auch noch für jede kleine Änderung die Datei +vom Archiv holen und anschließend wieder zurückschreiben müssen, +werden Sie einen Weg suchen, diese Arbeit zu erleichtern. Die ein­ +fachste Möglichkeit wäre, einen schnelleren Rechner zu kaufen. Dies +ist gleichzeitig aber auch die teuerste. + + +#free (4.5)# + +#center#Abb. 9-1 Verkettung von A und B + + +EUDAS ermöglicht es Ihnen nun, die große Datei in mehrere kleine +aufzuspalten. In der Regel gibt es bei solch großen Dateien ein +Kriterium, nach dem die Sätze in verschiedene Dateien verteilt +werden können. Jede einzelne Datei kann nun bequem geändert +werden. + Ein Problem entsteht jedoch, wenn alle Dateien zusammen ver­ +arbeitet werden müssen (zum Beispiel beim Drucken). Für einen +solchen Vorgang können Sie die kleineren Dateien logisch aneinan­ +derketten. + Dies bedeutet für Sie, daß alle kleinen Dateien wie eine große +Datei wirken. Wenn Sie beim Bewegen in der Datei das Ende einer +einzelnen Datei erreichen, kommen Sie automatisch an den Anfang +der nächsten Datei. + +#on("b")#Aufruf#off("b")# Damit dies funktioniert, müssen die Dateien +natürlich +gleiche Feldstruktur haben. Außerdem ist die Zahl der verkettbaren +Dateien aus technischen Gründen auf 10 beschränkt. + Sie können die Dateien verketten, indem Sie die Funktion +#free (0.2)# + + K Ketten + +#free (0.2)# +im Menü 'Öffnen' aufrufen. + +#on("b")#Änderungen#off("b")# In der virtuellen Datei ist sowohl Einfügen als +auch +Ändern erlaubt. Beim Einfügen ist jedoch zu beachten, daß am Ende +einer Datei nicht angefügt werden kann. Dies liegt daran, daß Sie +entweder vor dem letzten Satz der einen Datei oder vor dem ersten +Satz der anderen Datei einfügen. Der Endesatz der einen Datei, der +normalerweise sichtbar wäre, wird übersprungen. + Am Ende der letzten Datei können Sie natürlich anfügen, da +deren Endemarkierung als Ende der ganzen Datei ja wieder sichtbar +ist. + + +9.3 Koppeln + +Nachdem das Verketten von Dateien noch ganz einfach zu verstehen +war, kommt jetzt eine Funktion auf Sie zu, die kompliziertere Mög­ +lichkeiten in sich birgt: nämlich das Koppeln. + Es kommt häufiger vor, daß sich ein Feld einer Datei auf einen +bestimmten Satz in einer anderen Datei bezieht. So könnten zum +Beispiel die Ausleihen einer Bücherei in folgender Datei gespeichert +sein: + + + 'Name' + 'Vorname' + 'Datum' + 'Buch-Nr.' + + +Wenn jetzt ein Ausleiher sein Rückgabedatum überschritten hat, +möchte die Bücherei dem Kunden ein Mahnschreiben schicken. Auf +diesem Schreiben soll aber nicht die Buch-Nr. erscheinen, sondern +Autor und Titel des Buches. + Diese Sekundärinformationen sind in einer anderen Datei ge­ +speichert, der Bestandskartei: + + + 'Buch-Nr.' + 'Autor' + 'Titel' + 'Verlag' + + +Alle Dateistrukturen hier sind natürlich zwecks größerer Übersicht­ +lichkeit vereinfacht. Um jetzt dem Kunden das Mahnschreiben zu +schicken, müssen die Informationen in den beiden Dateien korreliert +werden. + +#on("b")#Aufruf#off("b")# Zuerst wird die Ausleihdatei normal geöffnet. Dazu +wird dann die Bestandsdatei mit Hilfe der Funktion +#free (0.2)# + + K Koppeln + +#free (0.2)# +gekoppelt. Dies hat folgenden Effekt: + Die Sätze erscheinen normal so, wie sie in der Ausleihdatei +auftauchen, also für jede Ausleihe genau ein Satz. Dazu erscheint +aber jeweils die Beschreibung des ausgeliehenen Buches aus der +Bestandsdatei: die beiden Dateien wurden über das Feld "Buch-Nr." +gekoppelt. + Als Struktur ergibt sich für die kombinierte Datei: + + + 'Name' + 'Vorname' + 'Datum' + 'Buch-Nr.' + 'Titel' + 'Autor' + 'Verlag' + + +Die Felder der Koppeldatei wurden also noch hinzugefügt. + +#on("b")#Koppelfelder#off("b")# Zwei Dinge sind in diesem Zusammenhang +wichtig: +Damit der Koppelvorgang ohne allzuviele Vorgaben auskommen kann, +müssen Felder, über die gekoppelt wird, den gleichen Namen haben +- und zwar exakt Zeichen für Zeichen. Zum zweiten muß ein solches +#on("i")#Koppelfeld#off("i")# am Anfang der gekoppelten Datei (in unserem Fall der +Bestandsdatei) stehen. Dies ist aus technischen Gründen notwendig, +damit der Koppelvorgang in vernünftiger Geschwindigkeit ablaufen +kann. + + +#free (7.0)# + +#center#Abb. 9-2 Schema des Koppelvorgangs + + +#on("b")#Mehrere Dateien#off("b")# Genau wie beim Ketten ist die Kombination +der +Dateien nicht physikalisch, sondern nur scheinbar vollzogen worden. +Bis zum Limit der maximal geöffneten Dateien (10) können Sie auch +weitere Dateien dazukoppeln. Die Koppelfelder dieser Dateien kön­ +nen sich jedoch immer nur auf die erste Datei beziehen, also nicht +auf eine andere Koppeldatei. + Dies könnte man in unserem Beispiel ausnutzen. Die Bücherei +hat sicher auch eine Datei ihrer Mitglieder. Diese könnte etwa so +aussehen: + + + 'Name' + 'Vorname' + 'm/w' + 'Strasse' + 'PLZ' + 'Ort' + + +Diese Datei können wir ebenfalls zur Ausleihdatei dazukoppeln. +Damit haben wir auch gleich die Quelle gewonnen, aus der wir die +Anschrift für das Mahnschreiben gewinnen können. + Die Kopplung geschieht in diesem Fall über zwei Felder, näm­ +lich 'Name' und 'Vorname'. Damit ein Mitglied eindeutig identifi­ +ziert wird, werden beide Namen gebraucht. Dies berücksichtigt auch +das Koppelverfahren. Wiederum müssen die Namen exakt mit Namen +der ersten Datei übereinstimmen. + Wenn mehrere Koppelfelder für eine Koppeldatei notwendig sind, +müssen Sie alle hintereinander stehen. Wäre die Struktur der Mit­ +gliederdatei etwa + + + 'Name' + 'Titel' + 'Vorname' + 'm/w' + 'Strasse' + 'PLZ' + 'Ort' + + +würde nur über 'Name' gekoppelt, da 'Titel' in der ersten Datei +nicht vorkommt. Alle weiteren Felder können dann keine Koppelfel­ +der mehr werden. Durch Umstellen der Feldreihenfolge der Koppel­ +datei (durch Umkopieren) oder durch entsprechende Benennung von +Feldern können Sie immer den gewünschten Effekt erzielen. + + +#free (8.0)# + +#center#Abb. 9-3 Aufbau der virtuellen Datei + + +#on("b")#Zusammenfassung#off("b")# An dieser Stelle wollen wir die Ergebnisse +dieses Abschnitts als Regel zusammenfassen: + +#limit (12.0)# + Die ersten Felder der Koppeldatei, die wörtlich an be­ + liebiger Stelle auch in der ersten Datei auftauchen, + werden Koppelfelder genannt. Zu einem Satz der ersten + Datei wird ein Satz der Koppeldatei gezeigt, der im In­ + halt der Koppelfelder übereinstimmt. +#limit (13.5)# + +Übersetzt in unser Beispiel heißt dies: 'Buch-Nr.' bzw. 'Name' und +'Vorname' sind Koppelfelder. Zu einer bestimmten Ausleihe erschei­ +nen die Daten des Buches mit der angegebenen Buch-Nr. bzw. die +Adresse des Mitgliedes mit den angegebenen Namen. + + +9.4 Auswirkungen des Koppelns + +Nachdem Sie nun das Grundprinzip des Koppelns kennen, sollen Sie +einige Auswirkungen dieses Verfahrens kennenlernen. + Ein Beispiel dazu finden Sie in Abb. 9-4. Dargestellt sind je­ +weils die Satznummern und einige Inhalte. Die zweite Zeile in der +Hauptdatei und die erste in der Koppeldatei stellen das Koppelfeld +dar. + + +#free (6.5)# + +#center#Abb. 9-4 Kombinationen + + +#on("b")#Kombinationen#off("b")# Zuerst muß geklärt werden, was passiert, +wenn es +keinen passenden Satz in der Koppeldatei gibt. Zum Beispiel könnte +eine Buchnummer eingegeben worden sein, die in der Bestandsdatei +nicht existiert. In diesem Fall zeigt EUDAS für die Felder der Kop­ +peldatei einfach einen leeren Inhalt an (siehe Satz 23 der Haupt­ +datei, es gibt keinen Satz mit 'L' in der Koppeldatei). + Wenn umgekehrt zu einem bestimmten Buch keine Ausleihe +existiert, macht das natürlich nichts - das Buch erscheint nur +dann, wenn Sie die Bestandsdatei alleine öffnen. + Weiterhin kann es passieren, daß es zwei passende Sätze in der +Koppeldatei gibt. Dies kommt dann vor, wenn zwei Mitglieder glei­ +chen Namen und gleichen Vornamen haben (was gar nicht so selten +ist). In diesem Fall zeigt EUDAS beide Kombinationen an (siehe +Satz 23 der Hauptdatei). Die Ausleihe erscheint also zweimal, je­ +weils mit einem anderen Mitglied. + Damit man diesen Fall ohne weiteres erkennen kann, führt +EUDAS bei Kopplungen zwei Nummern: zum einen die normale Satz­ +nummer und zum anderen eine Kombinationsnummer. In dem eben +besprochenen Fall würde die Satznummer gleichbleiben, die Kombi­ +nationsnummer aber hochgezählt werden. Am Bildschirm wird die +Kombinationsnummer durch Bindestrich getrennt hinter die Satz­ +nummer geschrieben, wenn Sie Dateien koppeln. + Das Durchgehen aller Kombinationen zu einem Satz der Haupt­ +datei passiert aber nur dann, wenn Sie sich mit der Funktion 'Satz +weiter' in der Datei bewegen. Wenn Sie rückwärts gehen oder auf +einen bestimmten Satz positionieren, wird immer nur die erste Kom­ +bination angezeigt (Dies hat zum Teil technische Gründe). Beim +Zurückgehen von Satz 23-1 in dem Beispiel würde also auf Satz +22-1 positioniert und die Kombination 22-2 übersprungen. + +#on("b")#Änderungen#off("b")# Auch wenn Sie Dateien gekoppelt haben, können +Sie +immer noch Sätze ändern und einfügen (wenn Sie dies beim Öffnen +erlaubt haben). Die Auswirkungen der Veränderungen sind jedoch +nicht mehr ganz so einfach wie bei geketteten Dateien, wo sich die +Änderungen ja einfach auf den aktuellen Satz bezogen. + Als Grundregel gilt, daß Änderungen möglichst wenig Auswir­ +kungen auf die Koppeldateien haben sollen. Das führt dazu, daß +beim Einfügen eines neuen Satzes oder beim Entfernen eines Satzes +durch Tragen keine Aktion in der Koppeldatei durchgeführt wird. +Dies ist auch nicht nötig, denn wenn zum Beispiel ein neuer (zu­ +nächst leerer) Satz eingefügt wird, existiert sowieso noch kein +passender Satz in der Koppeldatei und die entsprechenden Felder +bleiben leer. Hingegen darf beim Entfernen eines Satzes der Satz in +der Koppeldatei nicht entfernt werden, da er ja noch zu einem an­ +deren Satz gehören könnte. + Änderungen an den Koppelfeldern können nun zu drei verschie­ +denen Reaktionen führen: + +1. Es wird kein Satz der Koppeldatei geändert, sondern nur ein + neuer passender Satz gesucht. Dies geschieht immer dann, wenn + außer den Koppelfeldern nur leere Inhalte für die Felder der + Koppeldatei angegeben sind. Nach dem Ändern oder Einfügen + werden dann die Inhalte des neuen Koppelsatzes angezeigt. + + Beispiel: Bei einer Ausleihe geben Sie Name und Vorname des + Ausleihers an, nicht aber seine Adresse. Wenn Sie den Satzedi­ + tor beim Einfügen mit ESC 'q' verlassen, wird die zugehörige + Adresse angezeigt (falls der entsprechende Name in der Kop­ + peldatei vorhanden ist). + +2. Es wird ein neuer Satz in der Koppeldatei angefügt. Dies ge­ + schieht immer dann, wenn die Koppelfelder verändert wurden + und die anderen Felder der Koppeldatei nicht leer sind. Da­ + durch soll verhindert werden, daß die Koppelfelder in einem + Satz verändert werden, der vielleicht noch zu einem anderen + Satz paßt. + + Beispiel: Sie geben bei einer Ausleihe auch die Adresse mit + an. Wenn eine Person mit gleichem Namen und Vornamen bereits + existiert, wird die dort gespeicherte Adresse nicht überschrie­ + ben. Stattdessen wird die zweite Adresse auch in die Koppel­ + datei eingetragen. Beim nächsten Ansehen bekommen Sie dann + zwei Adressen angezeigt. So wird verhindert, daß Sie ungewollt + die erste Adresse vernichten. + +3. Der Satz in der Koppeldatei wird verändert. Dies geschieht nur + dann, wenn die Koppelfelder unverändert geblieben sind, der + Rest sich aber geändert hat. + + Beispiel: Sie ändern eine Ausleihe mit der zugehörigen + Adresse. Sie geben nur eine neue Straße an und lassen Name + und Vorname unverändert. Der Satz in der Koppeldatei enthält + anschließend die neue Straße. + +Da Koppeldateien keine Sortierung besitzen müssen, werden neue +Sätze der Koppeldatei immer am Ende angefügt. Dies ist zu beach­ +ten, wenn die Koppeldatei auch allein verwendet werden soll. Ge­ +gebenenfalls müssen Sie die Koppeldatei dann erst sortieren. + + +9.5 Umschalten auf Koppeldatei + +Häufig kommt es vor, daß Sie beim Einfügen eines neuen Satzes mit +gekoppelten Dateien die Verbindung mit einem existierenden Satz +der Koppeldatei erreichen wollen, aber den notwendigen Inhalt der +Koppelfelder nicht auswendig wissen. + So wollen Sie beim Eingeben einer Ausleihe Name und Vorname +des Entleihers nicht immer wieder abtippen. Dabei ist auch die +Gefahr von Eingabefehlern sehr groß. Stattdessen wollen Sie lieber +erst den Entleiher in der Mitgliederdatei suchen und dessen Namen +dann automatisch in den Entleihsatz übernehmen. + Hierfür bietet Ihnen EUDAS eine Unterstützung an. + +#on("b")#Ausführung#off("b")# Während Sie sich in der virtuellen Datei +befinden, +können Sie auf eine bestimmte Koppeldatei umschalten, die Sie dann +wie eine Einzeldatei bearbeiten können. Beim Zurückschalten haben +Sie dann die Möglichkeit, die Koppelfelder des gefundenen Satzes zu +übernehmen. + Das Umschalten bewirken Sie durch die Tastenkombination ESC +'K' (großes K) nur im Menü 'Einzelsatz' sowie im Satzeditor beim +Einfügen und Ändern. An anderen Stellen hat dieser Befehl keine +Wirkung. Bei mehreren Koppeldateien werden Ihnen die Dateien der +Reihenfolge nach angeboten. Durch Verneinung aller Fragen können +Sie die Funktion ohne Wirkung beenden. + Haben Sie nun umgeschaltet, wird Ihnen die Koppeldatei dar­ +geboten, als hätten Sie sie allein geöffnet. Sie können die Datei +auch beliebig ändern (wenn Sie dies beim Öffnen angegeben haben). +Nur die Anzeige in der Bildüberschrift zeigt an, daß Sie +sich in einer Koppeldatei befinden. Sie können auch Funktionen in +anderen Menüs aufrufen. + Das Zurückschalten geschieht im Menü 'Einzelsatz' mit der +gleichen Tastenkombination. Alle Einstellungen der virtuellen Datei +von vorher bis auf die Feldauswahl bleiben erhalten. + Wenn Sie nicht im Menü, sondern im Satzeditor (also beim +Ändern oder Einfügen) umschalten, werden Sie zunächst wieder aus +dem Satzeditor rausgeworfen. Sie können dann in der Koppeldatei +den gewünschten Satz aufsuchen (oder neu eintragen). Beim Zurück­ +schalten werden Sie gefragt, ob Sie die Koppelfelder übernehmen +wollen oder nicht. Danach kehren Sie automatisch wieder in den +Satzeditor zurück, wobei jetzt die Koppelfelder gegebenenfalls aus­ +gefüllt oder überschrieben sind. + Durch erneutes Umschalten können Sie den Vorgang auch für +weitere Koppeldateien wiederholen. + Die Position, die Sie beim Umschalten in der Koppeldatei einge­ +nommen haben, wird bis zum nächsten Umschalten gespeichert. Sie +kommen dann zunächst wieder auf den gleichen Satz. So können Sie +die gleichen Koppelfelder wie beim letzten Mal übernehmen, indem +Sie einfach zweimal ESC 'K' tippen. + +#on("b")#Beispiel#off("b")# Der typische Vorgang beim Entleihen würde dann +wie folgt +aussehen. Zunächst öffnen Sie die Entleihdatei mit Änderungser­ +laubnis; dann koppeln Sie die Mitgliederdatei und die Bestandsdatei +dazu. + Für eine neue Ausleihe rufen Sie zunächst die Funktion 'Ein­ +fügen' auf. Dann tippen Sie ESC 'K' und schalten auf die Mitglie­ +derdatei um. Dort suchen Sie das Mitglied und schalten wieder zu­ +rück. Existierte das Mitglied noch nicht, können Sie es gleich ein­ +tragen. Beim Zurückschalten übernehmen Sie den Namen des Mit­ +glieds. + Dann tragen Sie die Nummer des Buches ein (die müssen Sie nur +dann suchen, wenn Sie nicht auf dem Buch steht). Das Entleihdatum +erhalten Sie mit Hilfe der Tastenkombination ESC 'D' (wird im näch­ +sten Kapitel beschrieben). + Wollen Sie mehrere Ausleihen für ein Mitglied eintragen, so +tippen Sie beim nächsten Einfügen einfach zweimal ESC 'K', ohne +dazwischen eine Positionierung vorzunehmen. + + +9.6 Mehrfachbenutzung + +EUDAS ermöglicht es mehreren Benutzern an einem Rechner, mit den +gleichen Dateien zu arbeiten. Dies ist eigentlich nichts Besonderes, +denn das EUMEL-System ist ja bereits von Haus aus dazu geeignet. +Es müssen jedoch einige Schutzvorkehrungen getroffen werden, +damit dadurch keine Probleme entstehen. + Als Grundvoraussetzung für die Mehrfachbenutzung müssen +EUDAS-Dateien in einer unabhängigen #on("i")#Managertask#off("i")# gespeichert +sein. Eine Managertask kann man sich durch das Kommando 'global +manager' einrichten. In dieser Task sollte dann nicht mehr gearbei­ +tet werden. + Stattdessen kann sich der Benutzer Dateien aus dieser Mana­ +gertask kopieren und auch wieder dorthin zurückschreiben. Wie Sie +dies im EUDAS-Menü bewerkstelligen können, wird im Kapitel 16 +beschrieben. Es sei nochmal betont, daß dies eine Methode ist, die +Sie für beliebige Dateien verwenden können. + Im Kapitel 16 ist weiterhin auch beschrieben, wie Sie solche +Dateien mit #on("i")#Passworten#off("i")# schützen können, so daß sie nicht jeder +benutzen kann. Schauen Sie bei Bedarf dort nach. + + +#free (7.7)# + +#center#Abb. 9-5 Mehrfachbenutzung + + +#on("b")#Konflikte#off("b")# Wir wollen uns jedoch jetzt um ein Problem +kümmern, das +bei dieser Art von Mehrfachbenutzung auftritt. Nehmen wir an, +unsere Bücherei habe zwei Plätze, an denen Entleihen durchgeführt +werden können. Beide Plätze sollen mit der gleichen Entleihdatei +arbeiten (wie Sie gleich noch sehen werden und aus anderen Grün­ +den würde man EUDAS für eine solche Bücherei nicht einsetzen - +wir wollen hier nur das Prinzip illustrieren). + Der Ablauf wäre dann folgendermaßen. Jeder Platz kopiert sich +für eine Entleihe die gemeinsame Datei aus der Managertask, öffnet +sie, trägt die Entleihe ein und sichert die Datei wieder. Dann wird +die Datei in die Managertask zurückgeschrieben, wo sie die alte +Entleihdatei ersetzt. + Abgesehen von dem viel zu hohen manuellen Aufwand kann der +Fall eintreten, daß beide gleichzeitig eine Entleihe bearbeiten. +Nehmen wir an, beide benutzen die Entleihdatei mit dem symboli­ +schen Inhalt A. Auf Platz 1 kommt noch die Entleihe B, auf Platz 2 +die Entleihe C dazu. Platz 1 will anschließend den Inhalt AB zu­ +rückschreiben, Platz 2 den Inhalt AC. + Je nach der zeitlichen Reihenfolge wird nur eine der beiden +Versionen übrigbleiben, da derjenige, der später zurücksichert, die +vorherige Version überschreibt. Richtig sollte die endgültige Version +ABC herauskommen. Unser Beispiel führt jedoch auf jeden Fall zu +einer fehlerhaften Datei. + Grund dafür ist, daß beim Zurückschreiben der ganzen Datei ein +Platz gesperrt werden muß, während der andere Platz eine Datei +zum Ändern angefordert hat. Man könnte auch dazu übergehen, nur +einzelne Sätze zu übertragen; diese Methode wird jedoch von EUDAS +wegen des hohen Aufwandes nicht unterstützt (daher würde man +EUDAS eben auch nicht für eine Mehrplatz-Bücherei nehmen). + In vielen Fällen reicht das Sperren ganzer Dateien jedoch aus, +besonders, wenn nicht ganz so häufig an einzelnen Sätzen geändert +wird. EUDAS bietet dafür neben der notwendigen Sperre auch noch +eine automatische Versendung der Dateien an. + +#on("b")#Manager#off("b")# Es bietet sich an, dieses Kopieren der Dateien +beim Öff­ +nen (auch Koppeln und Ketten) und Sichern automatisch durchzu­ +führen. Als Voraussetzung dafür müssen Sie EUDAS angeben, mit +welcher Managertask Sie arbeiten wollen. Dazu dient die Funktion +#free (0.2)# + + M Manager + +#free (0.2)# +im Menü 'Öffnen'. Sie werden dann nach dem Namen der Task ge­ +fragt. Geben Sie keinen Namen an, wird der Managermodus wieder +ausgeschaltet. Welche Task als Manager eingestellt ist, sehen Sie in +der untersten Bildschirmzeile. + In der Task, die Sie angeben, muß EUDAS insertiert sein (oder +in einem Vater), da sonst die Sperre nicht funktioniert. + Wenn Sie nun einen solchen Manager angegeben haben, können +Sie beim Öffnen Dateinamen aus dieser Task angeben. Auch bei ESC +'z' werden Ihnen alle Namen aus dem Manager mit angeboten. Wenn +Sie einen solchen Namen angeben, der nicht aus Ihrer eigenen Task +stammt, wird die Datei vor dem Öffnen automatisch kopiert. Wenn +Sie angegeben haben, daß Sie die Datei verändern wollen, wird in +der Managertask eine entsprechende Sperre gesetzt. + Wenn Sie die Datei nach Änderungen dann sichern, wird die +geänderte Kopie zurückgeschrieben. Die Sperre wird jedoch erst +dann aufgehoben, wenn Sie die Arbeitskopien endgültig löschen. + Möchte nun ein anderer Benutzer diese Datei öffnen, während +Sie sie ändern, kann er dies nur, wenn er sie nicht ändern will. +Natürlich wird die Datei dann auch nicht wieder zurückgeschickt. +Will er sie ändern, erhält er eine Fehlermeldung und kann den +Versuch später wiederholen. + +#on("b")#Vorsichtsmaßregeln#off("b")# Bedenken Sie, daß der Schutz nur +wirksam sein +kann, wenn Sie diesen Vorgang nicht unter Umgehung der Menü­ +steuerung ausführen. Würden Sie sich zum Beispiel eine Datei vom +Manager holen (s. Kapitel 16), ohne daß Sie ein Änderungsvorhaben +anmelden können, können Sie diese Datei ja trotzdem ändern und +wieder zurückschicken. In diesem Fall hat EUDAS keine Kontrolle +mehr über die Datei. + Aus dem gleichen Grund sollten Sie sich die Managertask auch +nicht an Ihren Bildschirm holen, denn auch dann könnten Sie ohne +Kontrolle Änderungen durchführen (zudem kann der Manager wäh­ +rend dieser Zeit nicht auf andere Benutzer reagieren). + Nur wenn Sie eine neue Datei im Manager anlegen, müssen Sie +dies von Hand tun. Dazu erstellen Sie die Datei ganz normal und +schreiben Sie mit der in Kapitel 16 beschriebenen Funktion zum +Manager. Sie sollten jedoch darauf achten, daß dort nicht schon +eine Datei gleichen Namens liegt (EUDAS fragt ja dann, ob über­ +schrieben werden soll). + diff --git a/doc/eudas/eudas.hdb.inhalt b/doc/eudas/eudas.hdb.inhalt new file mode 100644 index 0000000..62134f8 --- /dev/null +++ b/doc/eudas/eudas.hdb.inhalt @@ -0,0 +1,133 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +Inhalt + + + + Vorwort . . . . . . . . . . . . . . . . . . . i + Inhalt . . . . . . . . . . . . . . . . . . . . iii + + +I. Die ersten Schritte + +#on("b")#1 Was kann EUDAS ?#off("b")# +#free (0.2)# +1.1 Textverarbeitung und Datenverwaltung . . . . . 3 +1.2 EUDAS als Karteikasten . . . . . . . . . . . . 5 +1.3 Drucken . . . . . . . . . . . . . . . . . . . 7 +1.4 Grenzen . . . . . . . . . . . . . . . . . . . 9 + +#on("b")#2 Installation#off("b")# +#free (0.2)# +2.1 Lieferumfang . . . . . . . . . . . . . . . . . 11 +2.2 Single-User . . . . . . . . . . . . . . . . . 12 +2.3 Multi-User . . . . . . . . . . . . . . . . . . 13 + +#on("b")#3 Ein Beispiel zum Ausprobieren#off("b")# +#free (0.2)# +3.1 Start . . . . . . . . . . . . . . . . . . . . 15 +3.2 Daten eintragen . . . . . . . . . . . . . . . 16 +3.3 Daten abfragen . . . . . . . . . . . . . . . . 21 +3.4 Drucken . . . . . . . . . . . . . . . . . . . 22 +3.5 Ergebnis . . . . . . . . . . . . . . . . . . . 24 + + +II. Einführung in die Benutzung + +#on("b")#4 Umgang mit Dateien und Menüs#off("b")# +#free (0.2)# +4.1 EUDAS-Dateien . . . . . . . . . . . . . . . . 27 +4.2 EUDAS-Menüs . . . . . . . . . . . . . . . . . 29 +4.3 Archivmenü . . . . . . . . . . . . . . . . . . 32 +4.4 Dateiverwaltung . . . . . . . . . . . . . . . 37 +4.5 Bedienungsregeln . . . . . . . . . . . . . . . 39 + +#on("b")#5 Gespeicherte Daten abfragen#off("b")# +#free (0.2)# +5.1 Öffnen . . . . . . . . . . . . . . . . . . . . 43 +5.2 Bewegen . . . . . . . . . . . . . . . . . . . 45 +5.3 Suchen . . . . . . . . . . . . . . . . . . . . 46 +5.4 Suchbedingungen . . . . . . . . . . . . . . . 49 + +#on("b")#6 Daten eingeben und ändern#off("b")# +#free (0.2)# +6.1 Neue Datei einrichten . . . . . . . . . . . . 51 +6.2 Sätze einfügen . . . . . . . . . . . . . . . . 52 +6.3 Daten ändern . . . . . . . . . . . . . . . . . 55 +6.4 Arbeitskopie sichern . . . . . . . . . . . . . 56 + +#on("b")#7 Ausdrucken der Daten#off("b")# +#free (0.2)# +7.1 Druckmuster . . . . . . . . . . . . . . . . . 61 +7.2 Aufruf . . . . . . . . . . . . . . . . . . . . 64 +7.3 Abschnitte . . . . . . . . . . . . . . . . . . 67 +7.4 Feldmuster . . . . . . . . . . . . . . . . . . 69 + +#on("b")#8 Was war und was noch kommt#off("b")# +#free (0.2)# +8.1 Rückblick . . . . . . . . . . . . . . . . . . 75 +8.2 Ausblick . . . . . . . . . . . . . . . . . . . 76 + + +III. Weitere Möglichkeiten + +#on("b")#9 Das virtuelle Dateikonzept#off("b")# +#free (0.2)# +9.1 Konzept . . . . . . . . . . . . . . . . . . . 83 +9.2 Ketten . . . . . . . . . . . . . . . . . . . . 84 +9.3 Koppeln . . . . . . . . . . . . . . . . . . . 85 +9.4 Auswirkungen des Koppelns . . . . . . . . . . 89 +9.5 Umschalten auf Koppeldatei . . . . . . . . . . 92 +9.6 Mehrfachbenutzung . . . . . . . . . . . . . . 93 + +#on("b")#10 Datenabfrage am Bildschirm#off("b")# +#free (0.2)# +10.1 Feldauswahl . . . . . . . . . . . . . . . . . 97 +10.2 Satzeditor . . . . . . . . . . . . . . . . . . 98 +10.3 Suchmuster . . . . . . . . . . . . . . . . . . 99 +10.4 Markieren . . . . . . . . . . . . . . . . . . 104 +10.5 Übersicht . . . . . . . . . . . . . . . . . . 105 + +#on("b")#11 Funktionen zur Bearbeitung#off("b")# +#free (0.2)# +11.1 Sortieren . . . . . . . . . . . . . . . . . . 109 +11.2 Kopieren . . . . . . . . . . . . . . . . . . . 112 +11.3 Tragen . . . . . . . . . . . . . . . . . . . . 118 +11.4 Automatische Änderungen . . . . . . . . . . . 121 + +#on("b")#12 Weitere Möglichkeiten zum Drucken#off("b")# +#free (0.2)# +12.1 Anschluß an die Textverarbeitung . . . . . . . 123 +12.2 Spaltendruck . . . . . . . . . . . . . . . . . 126 +12.3 Modi . . . . . . . . . . . . . . . . . . . . . 128 + +#on("b")#13 Programmierung von Druckmustern#off("b")# +#free (0.2)# +13.1 Abkürzungen . . . . . . . . . . . . . . . . . 133 +13.2 Bedingte Musterteile . . . . . . . . . . . . . 141 +13.3 Übersetzung . . . . . . . . . . . . . . . . . 142 +13.4 Gruppen . . . . . . . . . . . . . . . . . . . 144 + +#on("b")#14 Ausdrücke in ELAN#off("b")# +#free (0.2)# +14.1 Was sind Ausdrücke ? . . . . . . . . . . . . . 151 +14.2 Datentypen . . . . . . . . . . . . . . . . . . 152 +14.3 TEXT-Funktionen . . . . . . . . . . . . . . . 156 +14.4 Rechenfunktionen . . . . . . . . . . . . . . . 160 +14.5 Abfragen . . . . . . . . . . . . . . . . . . . 161 + +#on("b")#15 Anweisungen in ELAN#off("b")# +#free (0.2)# +15.1 Variablen und Zuweisungen . . . . . . . . . . 165 +15.2 Weitere Konstruktionen . . . . . . . . . . . . 168 + +#on("b")#16 Dateiverwaltung mit EUDAS#off("b")# +#free (0.2)# +16.1 Dateien im System . . . . . . . . . . . . . . 171 +16.2 Dateien auf dem Archiv . . . . . . . . . . . . 174 + + +IV. Anhang + + Register . . . . . . . . . . . . . . . . . . . 181 + diff --git a/doc/eudas/eudas.hdb.macros b/doc/eudas/eudas.hdb.macros new file mode 100644 index 0000000..d06e6d1 --- /dev/null +++ b/doc/eudas/eudas.hdb.macros @@ -0,0 +1,80 @@ +#*format# +#limit (13.5)##start (3.5,2.5)##pagelength (21.0)##block# +#:firsthead (false)# +#linefeed (1.07)# +#*macro end# +#*text# +#type ("prop10")# +#linefeed (1.07)# +#*macro end# +#*beispiel# +#type ("12")# +#linefeed (0.97)# +#*macro end# +#*bildschirm# +#type ("17")# +#linefeed(0.83)# +#*macro end# +#*proc# +#type ("12")# +#*macro end# +#*endproc# +#free (0.1)# +#type ("prop10")# +#linefeed (1.0)# +#*macro end# +#*abschnitt ($1,$2,$3)# +#headodd# +#on("b")#$1#right#$3 %#off("b")# +#free (1.0)# +#end# +#on("b")##ib(9)#$1#ie(9,"   $3")# $2#off("b")# +#*macro end# +#*char($1)# +$1 +#*macro end# +#*kapitel ($1,$2,$3,$4)# +#free (1.3)# +#"nlq"# +#type("roman.24")# +#on("b")##center#$1#off("b")# +#free (0.2)# +#type ("roman.18")# +#on("b")##center#$2 #off("b")# +#on("b")##center# $3#off("b")# +#on("b")##center#$4#off("b")# +#type ("prop10")# +#free (0.6)# +#headeven# +#on("b")#% $2 $3 $4#off("b")# +#free (1.0)# +#end# +#headodd# +#right##on("b")#%#off("b")# +#free (1.0)# +#end# +#*macro end# +#*f2# +#free (0.2)# +#*macro end# +#*a ($1)# +#on("b")#$1.#off("b")#  +#*macro end# +#*bsp ($1)# +#type("12")#$1#type("prop")# +#*macro end# + + + + + + + + + + + + + + + diff --git a/doc/eudas/eudas.hdb.titel b/doc/eudas/eudas.hdb.titel new file mode 100644 index 0000000..b8cc805 --- /dev/null +++ b/doc/eudas/eudas.hdb.titel @@ -0,0 +1,99 @@ +#limit (14.0)# +____________________________________________________________________________ + + +#on("b")##on ("u")# +#center#Betriebssystem E U M E L +#off ("u")# + + +#center#E U D A S + + + + +#off("b")# +#center#Lizenzfreie Software der +#on ("b")# + +#center#Gesellschaft für Mathematik und Datenverarbeitung mbH, +#center#5205 Sankt Augustin + + +#off("b")# +#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für +#center#nichtkommerzielle Zwecke gestattet. + +#center#Gewährleistung und Haftung werden ausgeschlossen + + +____________________________________________________________________________ +#page# + +#free (6.0)# +#on("b")#EUDAS#off("b")# +#free (1.0)# +#on("b")#Anwender-#off("b")# +#on("b")#Datenverwaltungssystem#off("b")# +#free (2.0)# +#on ("b")#VERSION 4#off("b")# +#free(1.0)# +#on("u")#                                                    #off("u")# +#free (0.5)# +#on("b")#BENUTZERHANDBUCH#off("b")# +#block# +#page# +#free (12.0)# +Ausgabe Juli 1987 + +Dieses Handbuch und das zugehörige Programm sind urheberrechtlich +geschützt. Die dadurch begründeten Rechte, insbesondere der Ver­ +vielfältigung in irgendeiner Form, bleiben dem Autor vorbehalten. + +Es kann keine Garantie dafür übernommen werden, daß das Pro­ +gramm für eine bestimmte Anwendung geeignet ist. Die Verantwor­ +tung dafür liegt beim Kunden. + +Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrekt­ +heit und Vollständigkeit der Angaben wird aber keine Gewähr über­ +nommen. Das Handbuch kann jederzeit ohne Ankündigung geändert +werden. + +(c) Copyright 1987 Thomas Berlage + Software-Systeme + Im alten Keller 3 +#free (0.1)# + D-5205 Sankt Augustin 1 +#page# +#free (7.0)# +#center##on("b")#I.#off("b")# +#free (1.0)# +#center##on("b")#DIE#off("b")# +#center##on("b")#ERSTEN#off ("b")# +#center##on("b")#SCHRITTE#off("b")# +#page# +#free (7.0)# +#center##on("b")#II.#off("b")# +#free (1.0)# +#center##on("b")#EINFÜHRUNG#off("b")# +#center##on("b")#IN DIE#off ("b")# +#center##on("b")#BENUTZUNG#off("b")# +#page# +#free (7.0)# +#center##on("b")#III.#off("b")# +#free (1.0)# +#center##on("b")#WEITERE#off("b")# +#center##on("b")#MÖGLICHKEITEN#off("b")# +#page# +#free (7.0)# +#center##on("b")#IV.#off("b")# +#free (1.0)# +#center##on("b")#ANHANG#off("b")# + + + + + + + + diff --git a/doc/eudas/eudas.hdb.vorwort b/doc/eudas/eudas.hdb.vorwort new file mode 100644 index 0000000..6f7f17c --- /dev/null +++ b/doc/eudas/eudas.hdb.vorwort @@ -0,0 +1,89 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +____________________________________________________________________________ + + +#on("b")##on ("u")# +#center#Betriebssystem E U M E L +#off ("u")# + + +#center#EUDAS + + + + +#off("b")# +#center#Lizenzfreie Software der +#on ("b")# + +#center#Gesellschaft für Mathematik und Datenverarbeitung mbH, +#center#5205 Sankt Augustin + + +#off("b")# +#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für +#center#nichtkommerzielle Zwecke gestattet. + +#center#Gewährleistung und Haftung werden ausgeschlossen + + +____________________________________________________________________________ +#page# +Vorwort + + + +Lieber EUDAS-Benutzer ! + +Dieses Handbuch soll Sie bei Ihrer Arbeit mit EUDAS begleiten. Ob­ +wohl EUDAS nicht schwierig zu bedienen ist, gibt es doch eine Reihe +von Dingen zu lernen, ehe Sie ein EUDAS-Spezialist geworden sind. + Um Ihnen diesen Weg möglichst einfach zu machen, ist die +EUDAS-Dokumentation in zwei Handbücher aufgeteilt. Dies ist das +#on("b")#Benutzerhandbuch#off("b")#, das Ihnen eine gut lesbare Einführung in alle +Fähigkeiten von EUDAS bieten soll. Außerdem gibt es noch das +#on("b")#Referenzhandbuch#off("b")#, das Ihnen zum Nachschlagen und als Hilfe beim +Programmieren dienen soll. + + Bis Sie EUDAS gut beherrschen, sollten Sie sich also mit dem +Benutzerhandbuch beschäftigen. Das Benutzerhandbuch ist nochmal +in drei Teile aufgeteilt, um Ihnen das Lernen zu erleichtern. In +jedem Teil werden die vorher behandelten Dinge zyklisch wieder +aufgenommen und auf höherem Niveau erweitert. + Der allererste Teil des Handbuchs umfaßt nur drei Kapitel und +soll Ihnen über den ersten Tag mit EUDAS hinweghelfen. Dort finden +Sie eine Übersicht, was Sie mit EUDAS anfangen können, wie Sie das +Programm auf Ihrem Rechner installieren und ein kurzes Beispiel +zum Ausprobieren. + Im zweiten Teil lernen Sie dann die Grundkonzepte von EUDAS +anhand von zahlreichen Beispielen kennen. Sie sollten die Beispiele +am Rechner ausprobieren und ihre Bedeutung verstehen. Nach dem +Durcharbeiten dieses Teils (was höchstens wenige Tage in Anspruch +nimmt) sind Sie dann in der Lage, EUDAS für eigene Zwecke anzu­ +wenden. + Wenn Ihre Ansprüche dann wachsen, sollten Sie sich mit dem +dritten Teil befassen. Hier erhalten Sie Einblick in weitergehende +Möglichkeiten von EUDAS. Die einzelnen Kapitel sind relativ unab­ +hängig voneinander, so daß Sie nur die für Sie interessanten +genauer durchlesen müssen. + In Kapitel 8 finden Sie als Orientierung nicht nur eine Wieder­ +holung dessen, was Sie im zweiten Teil gelernt haben sollten, son­ +dern auch eine Übersicht, welche weiteren Möglichkeiten im dritten +Teil noch beschrieben werden. + + Im Referenzhandbuch finden Sie später, wenn Sie einige Erfah­ +rung gesammelt haben, eine genaue Beschreibung der Wirkungsweise +aller Funktionen. Um diese zu verstehen, sollten Sie jedoch bereits +eine grobe Ahnung der Wirkungsweise haben. + Als zweites finden Sie im Referenzhandbuch Informationen für +Programmierer, die EUDAS-Funktionen in eigenen Programmen ver­ +wenden wollen. Dies sollte jedoch in den meisten Fällen nicht not­ +wendig sein, so daß dieser Teil für Spezialisten reserviert bleibt. + + Trotz größter Bemühungen kann das Handbuch natürlich nicht +frei von Unklarheiten und Fehlern sein. Anregungen und Kritik sind +daher dringend erwünscht, um diese Dokumentation zu verbessern. + +Und nun viel Spaß bei Ihrer Arbeit mit EUDAS ! + diff --git a/doc/eudas/eudas.ref.1 b/doc/eudas/eudas.ref.1 new file mode 100644 index 0000000..7c66368 --- /dev/null +++ b/doc/eudas/eudas.ref.1 @@ -0,0 +1,326 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (3)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +Zustände und Bedienung + + + +1.1 Zustände + +EUDAS befindet sich zu jeder Zeit in einem von 11 verschiedenen +Zuständen. Für jeden Zustand ist festgelegt, welche Eingabetasten +benutzt werden können und welche Wirkung sie haben. Bestimmte +Tastenfunktionen führen in einen anderen Zustand. Obwohl für +jeden Zustand andere Tastenkombinationen gültig sind, wird für die +gleiche Funktion in jedem Zustand auch die gleiche Taste oder +Tastenkombination verwendet. + Die wichtigsten Tastenfunktionen eines Zustandes werden in +der #on("i")#Statuszeile#off("i")# am oberen Bildschirmrand angezeigt. + Im folgenden sind alle möglichen Zustände als Übersicht be­ +schrieben. Eine Übersicht der Zustandsübergänge enthält Abb. 1-1. + Zu jedem Zustand wird die entsprechende Statuszeile darge­ +stellt sowie alle möglichen Tastenfunktionen und ihre Bedeutung. + +EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv + +_____________________________________________________ + +OBEN Anwahl der nächsthöheren Funktion +UNTEN Anwahl der nächsttieferen Funktion +RECHTS Anwahl des nächsten Menüs zur Rechten +LINKS Anwahl des nächsten Menüs zur Linken +HOP OBEN Anwahl der ersten Funktion +HOP UNTEN Anwahl der letzten Funktion +'1' .. '6' Anwahl des entsprechenden Menüs +LEER Ausführen der gewählten Funktion +'Buchstabe' Ausführen der Funktion mit 'Buchstabe' davor +ESC '?' Hilfestellung zur gewählten Funktion +ESC ESC Eingabe von ELAN-Kommandos + + +HILFE: Beenden: ESC q Seite weiter: ESC w Seite zurueck: ESC z + +_____________________________________________________ + +ESC 'w' Blättern zur nächsten Seite +ESC 'z' Blättern zur vorigen Seite +ESC 'q' Verlassen (Rückkehr in alten Zustand) + + +AUSWAHL: Ankreuzen: 'x' Durchstreichen: 'o' Beenden: ESC q Hilfe: ESC ? + +_____________________________________________________ + +'x' Auswahl ankreuzen +'o' Ankreuzen rückgängig machen +LEER Ankreuzen und Auswahl sofort verlassen +OBEN Zur nächsten Auswahl nach oben +UNTEN Zur nächsten Auswahl nach unten +HOP OBEN Zur obersten Auswahl bzw. eine Seite zurück +HOP UNTEN Zur untersten Auswahl bzw. eine Seite weiter +HOP RETURN Aktuelle Auswahl wird erste auf der Seite +ESC '1' zur ersten Auswahl +ESC '9' zur letzten Auswahl +ESC 'q' Auswahl verlassen und weitermachen +ESC '?' Hilfe zur Auswahl +HOP 'x' alle freien Wahlen ankreuzen +HOP 'o' alle Kreuze entfernen +ESC 'h' Auswahl und Funktion abbrechen + + +EINGABE: Bestätigen: RETURN Zeigen: ESC z Abbrechen: ESC h Hilfe: ESC ? + +_____________________________________________________ + +RECHTS zum nächsten Zeichen +LINKS zum vorigen Zeichen +HOP RECHTS zum letzten Zeichen +HOP LINKS zum ersten Zeichen +RUBOUT Zeichen löschen +RUBIN Einfügemodus umschalten +HOP RUBOUT Rest der Zeile löschen +'Zeichen' Zeichen überschreiben oder einfügen +RETURN Eingabe abschließen und weitermachen +ESC '?' Hilfe zur Eingabe +ESC 'h' Eingabe und Funktion abbrechen +ESC 'z' Auswahl zeigen (falls in Statuszeile aufgeführt) + + +FRAGE: Bejahen: j,J Verneinen: n,N Abbrechen: ESC h Hilfe: ESC ? + +_____________________________________________________ + +'j', 'J' Frage bejahen +'n', 'N' Frage verneinen +ESC '?' Hilfe zur Frage +ESC 'h' Frage und Funktion abbrechen + + +!!! FEHLER !!! Quittieren: ESC q Hilfe zur Meldung: ESC ? + +_____________________________________________________ + +ESC '?' Hilfe zum Fehler +ESC 'Taste' Fehler quittieren +'Taste' Fehler quittieren + + +SATZ ÄNDERN: Abbruch: ESC h Beenden: ESC q Hilfe: ESC ? +SATZ EINFÜGEN: Abbruch: ESC h Beenden: ESC q Hilfe: ESC ? +SUCHMUSTER EINGEBEN: Abbruch: ESC h Beenden: ESC q Hilfe: ESC ? + +_____________________________________________________ + +ESC OBEN eine Seite zurück blättern +ESC UNTEN eine Seite vor blättern +ESC '?' Hilfe zum Satzeditor +ESC 'p' ganzen Satz merken (nicht bei Suchmuster) +ESC 'g' Satz durch gemerkten ersetzen (nicht bei Such­ + muster) +ESC 'h' Abbruch der Funktion +ESC 'D' Tagesdatum schreiben +ESC 'F' Prüffehler nach Tragen editieren +ESC 'w' Verlassen und mit nächstem Satz erneut aufrufen + (nicht im Suchmuster) +ESC 'z' Verlassen und mit vorigem Satz erneut aufrufen + (nicht im Suchmuster) +ESC RUBIN Rest der Zeile in neue Zeile umbrechen +ESC RUBOUT Rest der Zeile löschen +HOP RUBIN nicht verwenden! +HOP RUBOUT nicht verwenden! + +Weitere Tasten siehe EUMEL-Benutzerhandbuch (Editor). + + +Bitte warten.. + +_____________________________________________________ + +keine Tasten erlaubt (außer SV) + + +ZEIGEN: Blättern: HOP OBEN, HOP UNTEN Ende: ESC q Hilfe: ESC ? + +_____________________________________________________ + +HOP OBEN auf erste Zeile bzw. eine Seite zurück +HOP UNTEN auf letzte Zeile bzw. eine Seite vor +ESC '?' Hilfe zur Übersicht +ESC 'h' Abbruch der Funktion +ESC 'q' Verlassen + + +EDITIEREN: Abbruch: ESC h Verlassen: ESC q Hilfe: ESC ? + +_____________________________________________________ + +ESC 'F' Feldnamen anzeigen und auswählen +ESC 'h' Abbruch der Funktion + +Weitere Tasten siehe EUMEL-Benutzerhandbuch (Editor). + + +Gib Kommando: + +_____________________________________________________ + +Tasten siehe EINGABE. + + +#free (18.5)# + +#center#Abb. 1-1 Zustandsübergänge + + + + +1.2 Menüs + +Menüs dienen zur Auswahl von Funktionen. Sie werden am linken +Rand des Bildschirms angezeigt. Welches Menü aktiv ist, wird durch +Markierung des Menünamens in der obersten Bildschirmzeile unter +allen zur Verfügung stehenden Menüs angezeigt. In jedem Menü ist +die zuletzt ausgeführte Funktion ebenfalls markiert. + +#on("b")#Ausführen von Funktionen#off("b")# Zum Ausführen einer bestimmten +Funk­ +tion wird mit Hilfe der Cursortasten ein bestimmtes Menü und die +gewünschte Funktion angewählt. Die Funktion wird dann durch +Drücken der Leertaste ausgeführt. Alternativ kann auch der vor der +Funktion stehende Buchstabe gedrückt werden. + Die einzelnen Menüs können auch durch Nummern (1 bis 6) +angewählt werden (absolute Positionierung). + Soll eine andere Taste als die Leertaste zum Ausführen ver­ +wendet werden, so kann dies durch die Prozedur 'ausfuehrtaste' +angegeben werden (s. Abschnitt 10.3). + Funktionen, deren Ausführung augenblicklich nicht möglich +oder nicht sinnvoll ist, werden durch ein vorangestelltes Minuszei­ +chen gekennzeichnet. Sie können zwar angewählt, nicht aber ausge­ +führt werden. + Durch ESC '?' wird ein erläuternder Hilfstext zur gerade ange­ +wählten Funktion angezeigt. Näheres dazu s. Abschnitt 1.4. + Durch ESC ESC kann ein beliebiges ELAN-Kommando eingegeben +und ausgeführt werden. Die Eingabe des Kommandos erfolgt in der +Statuszeile. + + +1.3 Auswahl + +Die Auswahlfunktion dient dazu, aus vorhandenen Datei- oder +Feldnamen in bestimmter Reihenfolge auszuwählen. Die einzelnen +Namen werden untereinander aufgelistet. + Vor jedem Namen ist ein 'o' zum Ankreuzen angegeben. Mit den +Cursortasten kann der Cursor vor einen bestimmten Namen positio­ +niert werden. Mit 'x' kann dieser Name dann angekreuzt werden. Das +Ankreuzen kann durch 'o' wieder rückgängig gemacht werden. + Die Reihenfolge des Ankreuzens wird durch vorangestellte +Nummern gekennzeichnet. Die Namen werden von der entsprechenden +Funktion später in genau dieser Reihenfolge verwendet. + Wenn nicht alle Namen auf den Bildschirm passen, kann die +Darstellung gerollt werden. Ein Teil der Überschrift bleibt dabei +stehen; am Anfang und am Ende wird jeweils eine Abschlußzeile zur +Kennzeichnung mitgerollt. + Mit ESC '?' kann eine Hilfestellung abgerufen werden. Mit ESC +'q' wird die Auswahl beendet. Mit ESC 'h' können die Auswahl und +die in Ausführung befindliche Operation abgebrochen werden. + + +1.4 Hilfe und Dialog + +In den meisten Situationen kann durch ESC '?' eine spezifische +Hilfestellung abgerufen werden. Die Anzeige der Hilfsinformation +geschieht im rechten Bildschirmteil. + Die Texte sind seitenweise aufgebaut. Es wird immer eine Seite +angezeigt. Mit ESC 'w' bzw. ESC 'z' kann auf die nächste bzw, vorige +Seite umgeblättert werden. Mit ESC 'q' wird die Hilfestellung wieder +verlassen und die Situation wiederhergestellt, in der die Hilfe auf­ +gerufen wurde. + +#on("b")#Fragen#off("b")# Die meisten Funktionen wickeln zur Eingabe von +zusätz­ +lichen Parametern oder zum Stellen von Fragen einen Dialog in der +unteren Schirmhälfte ab. Es gibt zwei Möglichkeiten des Dialogs: +eine Frage oder die Eingabe eines Textes. + Bei einer Frage kann man mit 'j' oder 'n' antworten. Sowohl +große als auch kleine Buchstaben werden akzeptiert. Mit ESC '?' +kann eine Hilfsinformation zu der Frage abgerufen werden. ESC 'h' +bricht die fragende Funktion ab. + +#on("b")#Eingabe#off("b")# Bei der Eingabe eines Textes können die üblichen +Opera­ +tionen zum Editieren in einer Zeile verwendet werden. Die Eingabe +wird durch RETURN beendet. Auch hier kann durch ESC '?' eine +Hilfsinformation abgerufen werden. ESC 'h' bricht ebenfalls die fra­ +gende Funktion ab. In einigen Fällen (ersichtlich aus der Statuszei­ +le) kann durch ESC 'z' eine Auswahl der verfügbaren Namen abgeru­ +fen werden. + + +1.5 Editor + +Der EUMEL-Editor wird in EUDAS auf zweierlei Weise aufgerufen. +Zum einen dient er im Satzformular zum Eingeben von Daten und +Suchmustern. Dort wird er als #on("i")#Satzeditor#off("i")# bezeichnet. Da hier die +Feldnamen mit berücksichtigt werden müssen, gibt es einige Unter­ +schiede zum normalen Editor. + An anderen Stellen wird der Editor ohne Änderungen eingesetzt +zum Eingeben von Feldnamen oder Mustern. In diesem Fall finden +Sie die Bedienungshinweise im EUMEL-Benutzerhandbuch. + +#on("b")#Satzeditor#off("b")# Beim Ändern, Einfügen und Eingeben des +Suchmusters +wird im EUDAS-Formular der Editor aufgerufen. Das Editorfenster +beschränkt sich auf den rechten Teil des Formulars, der einen Teil +der Überschrift und die Feldinhalte umfaßt. Im Satzeditor können +dann die entsprechenden Inhalte eingegeben bzw. verändert werden. + Rollen unter Beibehaltung der Korrespondenz ist durch ESC +OBEN und ESC UNTEN möglich. Diese Funktionen wirken wie bei der +Anzeige - das Editorfenster wird ebenfalls entsprechend mitgerollt. +Mit ESC '1' kann wie üblich auf die erste, mit ESC '9' auf die letzte +Zeile gesprungen werden. Auch diese Funktionen passen die Feld­ +namen entsprechend an. + Falls die für ein Feld vorgesehenen Zeilen nicht für den Inhalt +ausreichen, kann durch ESC RUBIN eine weitere Zeile für dieses Feld +bereitgestellt werden. ESC RUBIN wirkt wie zweimal HOP RUBIN, die +Korrespondenz mit den Feldnamen bleibt jedoch gewahrt. + Zum Löschen steht ESC RUBOUT zur Verfügung. Es löscht eine +ganze Zeile, aber nur, wenn für dieses Feld noch andere Zeilen zur +Verfügung stehen, wird die Zeile tatsächlich vom Bildschirm ent­ +fernt. Im Normalfall bleibt sonst eine Leerzeile für dieses Feld ste­ +hen. + Ist die Information für ein Feld auf mehrere Zeilen verteilt, so +werden diese Zeilen zur Verarbeitung aneinandergehängt. Gegebe­ +nenfalls wird zwischen zwei Zeilen noch ein Leerzeichen eingefügt. + Der Editor kann wie üblich mit ESC 'q' verlassen werden. ESC +'h' bricht die Funktion ab, ohne die erfolgten Änderungen und Ein­ +gaben zu berücksichtigen. Mit ESC 'w' und ESC 'z' kann das Bearbei­ +ten von mehreren Sätzen beschleunigt werden. Durch diese Tasten­ +kombinationen wird der Editor verlassen und die gleiche Operation +(Ändern/Einfügen) beim nächsten bzw. vorigen Satz wiederholt. + +#on("b")#Hinweis#off("b")# Aus technischen Gründen kann das Editorfenster +gegen­ +über den Feldnamen verschoben werden (durch Rollen mit HOP +UNTEN zum Beispiel). Dabei geht die sichtbare Korrespondenz zwi­ +schen Feldnamen und Feldinhalten verloren. Ein solcher Fall wird +durch einen markierten Balken mit entsprechender Meldung ange­ +zeigt. Durch ESC '1' wird das Fenster aber wieder zurechtgerückt. + Aus diesem Grund sollte im Satzeditor auf HOP OBEN und HOP +UNTEN sowie auf RETURN am Ende des Fensters verzichtet werden. +Auch HOP RUBIN und HOP RUBOUT sollten nicht verwendet werden, +weil auf diese Weise die Anzahl der Zeilen verändert wird. Eine +solche Störung kann nicht durch ESC '1' beseitigt werden. Von Hand +müssen die entsprechenden Zeilen wieder gelöscht oder eingefügt +werden. + + diff --git a/doc/eudas/eudas.ref.10 b/doc/eudas/eudas.ref.10 new file mode 100644 index 0000000..fbfcf7e --- /dev/null +++ b/doc/eudas/eudas.ref.10 @@ -0,0 +1,406 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (97)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +10 Programmierung der Menüs + + + +10.1 Menüformat + +EUDAS verwendet drei verschiedene Strukturen zur Benutzerunter­ +stützung: Menü, Auswahl und Hilfestellung. Ein Menü dient zur +Auswahl von Funktionen, eine Auswahl bietet Feld- oder Datei­ +namen an und eine Hilfestellung zeigt einen Informationstext. + Alle diese Strukturen werden aus einer Initialisierungsdatei +eingelesen. Die Initialisierungsdatei ist eine normale Textdatei. Ihr +Format soll in diesem Abschnitt beschrieben werden. + Die Strukturen können in beliebiger Reihenfolge in der Initiali­ +sierungsdatei stehen. Jede Struktur wird durch eine spezielle +Anweisung eingeleitet. Anweisungen beginnen ähnlich wie im +Druckmuster mit einem Prozentzeichen. Dementsprechend gibt es die +drei Anweisungen + + + % MENUE "Name" + % AUSWAHL "Name" + % HILFE "Gebiet/Name" + + +die jeweils eine Struktur einleiten. Beendet wird eine Definition +immer mit + + + % ENDE + + +#on("b")#Menü#off("b")# Für ein Menü wird noch der Text angegeben, der auf +dem +Bildschirm erscheinen soll. Er wird durch die Anweisung + + + % BILD + + +eingeleitet. Danach folgen Zeilen mit dem Bildschirminhalt in der +gewünschten Größe (die tatsächliche Anzeigegröße wird erst beim +Aufruf angegeben). Dabei werden die Auswahlpositionen, auf denen +der Cursor sich bewegen kann, durch ein geschütztes Leerzeichen in +Spalte 2 festgelegt. + Nach der Angabe des Bildes muß für jede mögliche Auswahl­ +position noch eine weitere Angabe gemacht werden. Die Auswahl­ +positionen (oder Felder) werden dabei von oben nach unten durch­ +gezählt. Begonnen wird mit der Nummer 1. + Eine Felddefinition hat das Format + + + % FELD nr "Hilfstext" "Tasten" + + +Die Nummer identifiziert das Feld. Der Hilfstext gibt den Namen der +Hilfestellung an, die gezeigt werden soll, wenn auf diesem Feld ESC +'?' gedrückt wird. Die Tasten sind alle Zeichen, die gedrückt werden +können, um dieses Feld direkt auszuführen. + Anschließend an die Felddefinition kann in weiteren Zeilen +noch ein ELAN-Programm folgen, das bei Auswahl des Feldes aus­ +geführt wird. + +#on("b")#Auswahl#off("b")# Für eine Auswahl muß zuerst ein Vorspann angegeben +werden, der immer in den ersten Bildschirmzeilen der Auswahl an­ +gezeigt wird. Dieser wird durch + + + % VORSPANN + + +eingeleitet. Danach folgt das Bild. Das Bild setzt sich aus drei Tei­ +len zusammen. Die erste Zeile, in der ein geschütztes Leerzeichen +vorkommt, bildet den Wiederholungsteil. Diese Zeile wird nachher so +oft wie nötig mit entsprechenden Inhalten wiederholt, wobei das +geschützte Leerzeichen als Bindestrich dargestellt wird, auf dem +sich der Cursor bewegen kann. Die Teile davor und danach werden +jeweils bei Bedarf mitgerollt. + Die Wiederholungszeile darf mehrere geschützte Leerzeichen +enthalten. Die Inhalte werden dann in mehreren Spalten angezeigt. +Zu beachten ist, daß vor einem Trennstrich noch mindestens fünf +Zeichen Platz für eine laufende Nummer bleiben müssen. + +#on("b")#Hilfe#off("b")# Der Name einer Hilfestellung setzt sich aus zwei +Teilen +zusammen, die durch einen Schrägstrich getrennt werden. Der erste +Name gibt die Kategorie der Hilfestellung an, der zweite Name den +Einzeltext. Dies dient dazu, die relativ große Zahl der Hilfstexte +überschaubar zu machen. Als Beispiel + + + % HILFE "JA/Allgemein" + + +Eine Hilfestellung besteht einfach aus mehreren Seiten Text. Jede +Seite wird durch die AnweisungQ + + +Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q + + +Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈ +Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈ +Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈ +Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈ +Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q + + +Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q + + +Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q +Q̈Q̈Q̈Q̈Q̈Q̈Q̈estellung, wobei die Seiten einfach von 1 an durch­ +gezählt werden. Anschließend darf für diese Seite natürlich kein +Text folgen. + + +10.2 Verwaltung der Menüs + +Alle Menüdaten werden intern in Datenräumen gehalten. Dabei sind +die einzelnen Strukturen getrennt. Mit 'menuedaten einlesen' kön­ +nen Menüdaten aus einer Struktur gelesen und abgespeichert wer­ +den. Existierende Strukturen werden dabei überschrieben, neue +hinzugefügt. + Mit 'menuenamen' können die vorhandenen Strukturen abgefragt +werden. Mit 'menue loeschen' werden einzelne Strukturen oder alle +Menüdaten gelöscht. Damit die Datenräume mit den Menüdaten auch +an Söhne übergeben werden, ist der 'global manager' entsprechend +geändert. Dies wird im einzelnen durch 'menue manager' bewirkt. +Der neue Global Manager akzeptiert auch Anfragen von Tasks, die +nicht Söhne oder Enkel sind. + + +PROC menuedaten einlesen (TEXT CONST dateiname) + + Die in der Datei enthaltenen Strukturen werden eingelesen und + abgespeichert. Treten bei diesem Prozeß Fehler auf, so wird + eine entsprechende Meldung ins EUMEL-Notizbuch geschrieben + und nachher im Paralleleditor angezeigt. + + +THESAURUS PROC menuenamen (INT CONST index) + + Liefert die Namen der Strukturen. Der Index hat folgende Be­ + deutung: + 1: Hilfskategorien + 2: Menüs + 3: Auswahlen + Ist der Index negativ, so werden die Hilfsnamen der entspre­ + chenden Hilfskategorie geliefert, die im Thesaurus den Index + mit umgekehrtem Vorzeichen hat. + + +PROC menue loeschen (TEXT CONST name, INT CONST index) + + Löscht den Namen in dem Thesaurus mit dem angegebenen In­ + dex, falls dort der Name vorhanden ist. + + +PROC menue loeschen (BOOL CONST hilfen reduzieren) + + Löscht alle Menüdaten. Ist 'hilfen reduzieren' verlangt, wird + beim späteren Einlesen der Hilfstexte jeweils nur der erste + Text einer Kategorie gespeichert, um Platz zu sparen. + + +PROC global manager + + Geänderter Manager, der die Menüdatenräume in Söhne trans­ + portiert und Sperren setzen kann. Ersetzt den normalen 'free + global manager'. Nur im Multi-User-System vorhanden. + + +PROC menue manager (DATASPACE VAR ds, + INT CONST order, phase, + TASK CONST order task) + + Eigentliche Manager-Routine. Kann dazu dienen, Managererwei­ + terungen vorzunehmen. Nur im Multi-User-System vorhanden. + Beispiel: der Manager soll nur Aufträge von Söhnen annehmen. + + + PROC new manager (DATASPACE VAR ds, + INT CONST order, phase, + TASK CONST order task): + + LET begin code = 4; + IF order task < myself OR order = begin code OR + order task = supervisor THEN + menue manager (ds, order, phase, order task) + ELSE + errorstop ("kein Sohn") + END IF + + END PROC new manager; + + global manager (PROC new manager) + (* startet den Manager *) + + + +10.3 Aufruf + +Menüs werden mit der Prozedur 'menue anbieten' aufgerufen. Dabei +muß neben den Namen ein Fenster übergeben werden, in dem die +Menüs dann angezeigt werden. Es ist darauf zu achten, daß das +Fenster groß genug ist, um wenigstens die Auswahlpositionen im +Bild zu haben. + Außerdem muß eine Prozedur übergeben werden, die die einzel­ +nen Funktionen ausführt. Diese Prozedur erhält als Parameter die +Nummer der ausgewählten Funktion. + Mit 'waehlbar' können Auswahlen gesperrt werden. Diese Anga­ +be kann jedoch nicht vor Aufruf von 'menue anbieten' erfolgen, da +dann alle Sperren erstmal gelöscht werden. Zum Setzen der Sperren +beim Betreten eines Menüs dient ein besonderer Code, mit dem die +übergebene Prozedur aufgerufen wird. + Eine Auswahl wird mit der Prozedur 'auswahl anbieten' aufge­ +rufen. Diese bekommt ebenfalls ein Fenster übergeben, außerdem +den Namen einer Hilfestellung, die bei Bedarf aufgerufen werden +kann. Weiterhin muß eine Prozedur übergeben werden, die die aus­ +zuwählenden Texte erzeugt. Die gewählten Texte können anschlie­ +ßend mit der Prozedur 'wahl' abgefragt werden. + Eine Hilfestellung wird durch die Prozedur 'hilfe anbieten' +ausgegeben. Dabei muß außer dem Namen auch noch ein Fenster +übergeben werden. + Mit 'status anzeigen' kann ein Text in der Statuszeile ausge­ +geben werden. Die Menüprogramme tun dies für ihren Bereich jedoch +selbst. + + +PROC menue anbieten (ROW 6 TEXT CONST menuenamen, + FENSTER VAR f, + BOOL CONST esc erlaubt, + PROC (INT CONST, INT CONST) interpreter) + + Die angegebenen Menüs werden in dem Fenster 'f' angezeigt. + Das Fenster wird nach Beendigung des Menüs als verändert + gekennzeichnet. Die Namen der 6 Menüs werden in die Titelzeile + aufgenommen. Die Menünamen sollten mit einer Menüidentifika­ + tion versehen sein, zum Beispiel "EUDAS.Öffnen". Der Text vor + dem Punkt wird an den Anfang der Titelzeile gestellt und bei + den einzelnen Menünamen unterdrückt. Nicht benötigte Menüs + müssen als "" angegeben werden. + + 'esc erlaubt' gibt an, ob mit ESC ESC ein Kommandodialog ge­ + führt werden kann. Die übergebene Prozedur muß die einzelnen + Funktionen ausführen, die als Zahl übergeben werden. Der + Interpreter wird im 'disable stop' aufgerufen, daher ist in der + Regel ein 'enable stop' erforderlich. + + Die Parameter für 'interpreter' haben folgende Bedeutung: + Par. 1: 0 Aufruf zur Initialisierung der Sperren + oder anderen Initialisierungen zu Beginn + 1..6 Angabe des aktuellen Menüs + Par. 2: 1..23 Aufruf der entsprechenden Funktion + 0 Eintritt in ein neues Menü (wird vor der + Ausgabe dieses Menüs aufgerufen) + -1 Verlassen des Menüs + -2 Bildschirmupdate (nach Eintritt in das + Menü, wenn das Menü ganz ausgegeben ist, + oder wenn der Bildschirm nach 'Gib + Kommando:' zerstört worden ist) + + FEHLER: + + #on("i")#"Name" existiert nicht.#off("i")# + Das angegebene Menü ist nicht vorhanden. + + +PROC waehlbar (INT CONST menuenr, funktionsnr + BOOL CONST moeglich) + + Setzt die Funktionssperre der angegebenen Funktion. Muß in­ + nerhalb von 'menue anbieten' aufgerufen werden. Zu Beginn von + 'menue anbieten' sind jeweils alle Funktionen erlaubt. + + +PROC ausfuehrtaste (TEXT CONST taste) + + Setzt die Taste, die Funktionen ausführt. Ist standardmäßig die + Leertaste. + + FEHLER: + + #on("i")#falsche Ausfuehrtaste#off("i")# + Es muß ein einzelnes Zeichen angegeben werden, das nicht + bereits anderweitig verwendet wird. + + +PROC auswahl anbieten (TEXT CONST name, FENSTER CONST f, + TEXT CONST hilfe, + PROC (TEXT VAR, INT CONST) inhalt) + + Ruft die Auswahl in dem angegebenen Fenster auf. 'hilfe' wird + als Hilfestellung verwendet. Die Prozedur 'inhalt' liefert den + Text, der an der n-ten Position stehen soll. Wenn keine wei­ + teren Texte vorhanden sind, muß für alle weiteren Positionen + "" geliefert werden. + + FEHLER: + + #on("i")#"Name" existiert nicht.#off("i")# + Die angegebene Auswahl ist nicht vorhanden. + + +INT PROC wahl (INT CONST stelle) + + Liefert die Nummer des Textes, der an der n-ten Stelle ausge­ + wählt wurde. Wurde kein weiterer Text mehr gewählt, so wird 0 + geliefert. + + +PROC hilfe anbieten (TEXT CONST name, FENSTER CONST f) + + Bietet den Hilfstext in dem angegebenen Fenster an. Existiert + die Hilfe innerhalb der angegebenen Kategorie nicht, wird die + erste Hilfe der Kategorie angezeigt. + + FEHLER: + + #on("i")#Hilfe existiert nicht#off("i")# + Die angegebene Hilfskategorie ist nicht vorhanden. + + +PROC status anzeigen (TEXT CONST zeile) + + Zeigt den angegebenen Text in der obersten Bildschirmzeile an. + + +10.4 Dialog + +EUDAS führt den Benutzerdialog in einem Fenster, dessen Größe +durch 'dialogfenster' eingestellt wird. Das Dialogfenster wird zei­ +lenweise belegt. 'dialog' reserviert eine neue Zeile für eine beliebi­ +ge Ausgabe. Wenn das Fenster voll ist oder überschrieben wurde, +wird in der ersten Zeile wieder angefangen. Den gleichen Effekt +kann man mit 'neuer dialog' erreichen. + Mit 'ja' kann man im Dialogfenster eine Frage stellen. Als Ant­ +wort kann auch eine Hilfestellung angefordert werden oder die +Funktion abgebrochen werden. Mit 'editget' kann man nach Auffor­ +derung einen Text eingeben lassen. Dabei stehen die gleichen +zusätzlichen Möglichkeiten zur Verfügung. + Mit 'fehler ausgeben' kann eine durch 'errorstop' erzeugte Feh­ +lermeldung im Dialogfenster angezeigt werden. Der Benutzer muß +erst eine Taste drücken, ehe er weitermachen kann. Auch hier kann +eine Hilfestellung zu der Fehlermeldung abgerufen werden. + + +PROC dialogfenster (INT CONST x, y, xl, yl) + + Gibt die Fenstergröße und -position des Dialogfensters an. Für + den ganzen Bildschirm müßte (1, 1, 79, 24) angegeben werden. + + +PROC dialog + + Positioniert den Cursor auf die nächste Dialogzeile im Dialog­ + fenster. Wurde das Fenster verändert, wird das Fenster ge­ + löscht und auf die erste Zeile positioniert. + + +PROC neuer dialog + + Sorgt dafür, daß der nächste Aufruf von 'dialog' wieder in + einem leeren Fenster beginnt. + + +BOOL PROC ja (TEXT CONST frage, hilfe) + + Stellt die angegebene Frage. Es kann die angegebene Hilfsin­ + formation abgerufen werden. Außerdem wird durch ESC 'h' ein + Abbruch (errorstop ("")) erzeugt. + + +PROC editget (TEXT CONST prompt, TEXT VAR eingabe, + TEXT CONST res, hilfe) + + Gibt den Text 'prompt' aus und editiert dahinter 'eingabe'. Es + kann die angegebene Hilfsinformation abgerufen werden. 'res' + gibt an, bei welchen ESC-Folgetasten das Editieren beendet + werden soll. In einem solchen Fall wird als Eingabe (ESC + die + gedrückte Taste) zurückgeliefert. + + +PROC fehler ausgeben + + Im Dialogfenster wird die letzte Fehlermeldung ausgegeben. + Gleichzeitig wird der Fehlerzustand gelöscht. Der Benutzer muß + eine Taste drücken, um weiterzumachen. Alternativ kann die + Hilfsinformation "FEHLER/" + text (errorcode) abgerufen wer­ + den. + + diff --git a/doc/eudas/eudas.ref.11 b/doc/eudas/eudas.ref.11 new file mode 100644 index 0000000..48d36c3 --- /dev/null +++ b/doc/eudas/eudas.ref.11 @@ -0,0 +1,347 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (105)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +11 Programmierung von Anwendungen + + + +Zur Realisierung eigener EUDAS-Anwendungen mit Hilfe von ELAN- +Programmen gibt es mehrere Möglichkeiten mit zunehmender Lei­ +stungsfähigkeit, aber auch steigender Komplexität und Fehleranfäl­ +ligkeit. In den folgenden Abschnitten werden die drei wesentlichen +Methoden vorgestellt. Sie sollten erst dann eine kompliziertere +Methode in Angriff nehmen, wenn Sie die einfachere beherrschen. + + +11.1 Musterprogramme + +Die bevorzugte Methode zur Erstellung eigener Anwendungen unter +EUDAS ist die Programmierung von Mustern. EUDAS läßt dies bei +Druckmustern, Kopiermustern und Änderungsmustern zu. + In diesem Fall steuert EUDAS den Ablauf des Programms im +groben automatisch. Die jeweils unterschiedlichen Anweisungen, was +im einzelnen zu tun ist, werden in ELAN programmiert. Aus dem +Muster mit diesen zusätzlichen Anweisungen generiert EUDAS dann +das Programm und führt es mit Hilfe des ELAN-Compilers aus. + +#on("b")#Vorteile#off("b")# Diese Methode hat den Vorteil, daß nur die +minimal not­ +wendigen Anweisungen tatsächlich selbst programmiert werden +müssen. Dafür reichen bereits geringe ELAN-Kenntnisse vollkommen +aus. Ein Muster kann relativ schnell erstellt und getestet werden. +Durch den einfachen Aufbau ist auch die Fehlerwahrscheinlichkeit +beim Entwickeln geringer als bei anderen Methoden. + Daneben lassen sich die Musterprogramme jeweils bequem im +Menü durch Angabe des Namens oder durch Ankreuzen ausführen, +also auch durch unbedarfte Benutzer. + +#on("b")#Nachteile#off("b")# Nachteil dieser Methode ist, daß jeweils beim +Aufruf das +Programm nochmal neu erzeugt und übersetzt werden muß, da die +Übersetzung auch von der gerade geöffneten Datei abhängt. Dies +stört besonders bei umfangreichen Druckmustern (auf langsamen +Rechnern). + Zum zweiten wird ein umfangreiches Druckmuster auch bald +unübersichtlich, da Strukturierungshilfen für größere Programme +fehlen. Der eigentliche Mustertext ist dann schwer von den zahlrei­ +chen Abkürzungen zu trennen. + Als Abhilfe für diese beiden Nachteile bietet es sich an, um­ +fangreichere Abkürzungen bzw. Ausdrücke eingebettet in ein +ELAN-Paket aus dem Muster herauszunehmen und vorher zu in­ +sertieren. + Dadurch fällt zum einen die ständige Neuübersetzung dieser +Ausdrücke weg, zum anderen ist das eigentliche Muster wieder +überschaubar. Voraussetzung zur Anwendung eines solchen Musters +ist dann jedoch, daß das zugehörige Paket in der jeweiligen Task +bereits vorher übersetzt wurde. + Die nachfolgenden Beispiele zeigen, wie dieses Verfahren in der +Realität aussehen kann. + +#on("b")#Beispiel 1#off("b")# In der Schulverwaltung soll ein Kopier- oder +Ände­ +rungsmuster erstellt werden, das die Versetzung am Schuljahresende +realisiert. Angenommen wird eine Datei, die alle Schüler enthält. +Schüler, die nicht versetzt werden, sind vorher im Feld 'Versetzung' +mit einem beliebigen Text gekennzeichnet worden (zum Beispiel +'Nachprüfung' o.ä.). + Die Versetzung kann auf zweierlei Weise erfolgen: zum einen +durch automatische Änderung, wenn die alte Version noch auf einer +Archivdiskette aufgehoben wird, oder durch Kopieren in eine neue +Datei. + Bei beiden Mustern ist die einzige Änderung die Angabe der +neuen Klasse. Daher bietet es sich an, eine Prozedur 'neue klasse' +zu definieren, die als Ergebnis die neue Klasse eines Schülers lie­ +fert. Diese Prozedur kann dann im Änderungsmuster wie folgt ver­ +wendet werden: + + + "Klasse" V neue klasse; + + +Entsprechend läuft die Verwendung im Kopiermuster: + + + "Name" K f ("Name"); + "Vorname" K f ("Vorname"); + "Klasse" K neue klasse; + ... + + +Die Prozedur 'neue klasse' muß dann in einem Paket definiert wer­ +den, das etwa folgendes Aussehen haben könnte (spezifische Ände­ +rungen natürlich möglich): + + + PACKET klassenwechsel DEFINES neue klasse: + + TEXT PROC neue klasse : + + IF f ("Versetzung") = "" THEN + klasse um 1 erhoeht + ELSE + alte klasse ohne zusatz + END IF . + + klasse um 1 erhoeht : + INT CONST alte klasse := int (f ("Klasse")); + IF alte klasse < 9 THEN + "0" + text (alte klasse + 1) + zusatz + ELSE + text (alte klasse + 1) + zusatz + END IF . + + zusatz : + f ("Klasse") SUB 3. + + alte klasse ohne zusatz : + subtext (f ("Klasse"), 1, 2) . + + END PROC neue klasse; + + END PACKET klassenwechsel; + + +Schüler, die versetzt werden, erhalten ihre neue Jahrgangsstufe mit +dem alten Klassenzusatz zugeteilt. Dabei ist darauf zu achten, daß +die Klassen 5 bis 9 eine '0' vorangestellt bekommen, damit die +Sortierung funktioniert. + Schüler, die nicht versetzt werden, behalten ihre alte Jahr­ +gangsstufe, allerdings ohne einen Klassenzusatz, der ihnen an­ +schließend manuell zugewiesen werden muß. + Zur Benutzung muß das oben angegebene Paket in eine Text­ +datei geschrieben und mit dem Kommando 'insert' fest insertiert +werden. + +#on("b")#Beispiel 2#off("b")# Aus einer Datei mit bibliographischen Einträgen +sollen +bestimmte Literaturhinweise gedruckt werden. Der Literaturhinweis +soll jeweils als Endlostext umbrochen werden. Dafür müssen in einer +Abkürzung alle Daten verkettet werden. Es sei das folgende ein­ +fache Druckmuster vorgegeben: + + + % WIEDERHOLUNG + % MODUS 3 + [&] &titel + + % ABKUERZUNGEN + &krz : f ("Kurzbez") . (* z.B. "Lew84" *) + &titel : titel lang . + + +Die Prozedur 'titel lang' wird in folgendem Paket definiert: + + + PACKET bibliographie DEFINES titel lang : + + TEXT VAR puffer; (* verringert Heap-Belastung *) + + TEXT PROC titel lang : + + puffer := f ("Name 1"); + puffer CAT ", "; + puffer CAT f ("Vorname 1"); + ggf weitere namen; + titel kursiv; + enthalten in; + erscheinungsort und jahr; + puffer . + + ggf weitere namen: + IF f ("Name 2") <> "" THEN + puffer CAT "; "; + puffer CAT f ("Name 2") + END IF . + + titel kursiv : + puffer CAT " \#on (""i"")\#"; + puffer CAT f ("Titel"); + puffer CAT "\#off (""i"")\#, " . + + enthalten in : + IF f ("in") <> "" THEN + puffer CAT " in: "; + puffer CAT f ("in"); + puffer CAT ", " + END IF . + + erscheinungsort und jahr : + puffer CAT f ("Ort"); + puffer CAT ", "; + puffer CAT f ("Jahr") . + + END PROC titel lang; + + END PACKET bibliographie; + + +Die Puffervariable wird verwendet, um die bei Verwendung des +Operators '+' entstehende Heapbelastung zu verringern. An diese +Variable werden nacheinander alle notwendigen Daten mit den ent­ +sprechenden Trennzeichen angehängt. + Im Druckmuster wird dieser lange Text dann im Modus 3 auf +mehrere Zeilen umbrochen, wobei die Einrückung erhalten bleibt. Die +Druckausgabe kann dann bei Bedarf noch mit 'lineform' bearbeitet +werden, um einen noch besseren Umbruch zu erzielen. + + +11.2 Dateianwendungen + +Die zweite Möglichkeit der Programmierung unter EUDAS besteht +darin, ELAN-Programme zu schreiben, die EUDAS-Dateien mit Hilfe +des in Kapitel 6 beschriebenen Datentyps EUDAT manipulieren. Die +Programmierung gestaltet sich ähnlich wie mit FILEs. + +#on("b")#Vorteile#off("b")# Durch dieses Verfahren haben Sie volle Freiheit +der Pro­ +grammierung. Da lediglich die Struktur der EUDAS-Dateien als +Datenspeicher verwendet wird, sind sehr viele Anwendungen denk­ +bar. + Außerdem können so beliebig viele Dateien gleichzeitig bear­ +beitet werden. Da die Programme nicht auf die virtuelle Datei zu­ +greifen, ist ein Konflikt mit dem aktuellen Zustand von EUDAS +nahezu ausgeschlossen. + +#on("b")#Nachteile#off("b")# Der Nachteil dieses Verfahrens ist, daß viele +Dinge +selbst programmiert werden müssen, so zum Beispiel das Durchgehen +einer Datei. Auch die Hilfsmittel der virtuellen Datei wie Such­ +muster, Koppeln und alle Anwendungen, die auf die virtuelle Datei +zugreifen, stehen nicht zur Verfügung. + +#on("b")#Beispiel 1#off("b")# Die in Abschnitt 6.6 vorgestellte Anwendung als +Asso­ +ziativspeicher kann als Beispiel für diese Methode dienen. + +#on("b")#Beispiel 2#off("b")# Eine EUDAS-Datei (zum Beispiel eine +Schülerdatei) soll +in mehrere Dateien aufgespalten werden (zum Beispiel klassen­ +weise). Dies kann durch das folgende Beispielprogramm bewirkt +werden: + + + LET + klassenfeld = 3, + quellname = "Schüler", + zielname = "Jahrgang "; + ROW 9 EUDAT VAR ziel; + EUDAT VAR quelle; + SATZ VAR feldnamen; + + quelle oeffnen; + zieldateien einrichten; + auf satz (quelle, 1); + WHILE NOT dateiende (quelle) REP + aktuellen satz kopieren; + weiter (quelle) + END REP . + + quelle oeffnen : + oeffne (quelle, quellname); + feldnamen lesen (quelle, feldnamen) . + + zieldateien einrichten : + INT VAR i; + FOR i FROM 1 UPTO 9 REP + oeffne (ziel (i), zielname + text (i + 4)); + feldnamen aendern (ziel (i), feldnamen) + END REP . + + aktuellen satz kopieren : + SATZ VAR satz; + satz lesen (quelle, satz); + satz einfuegen (ziel (stufe), satz); + weiter (ziel (stufe)) . + + stufe : + TEXT VAR klasse; + feld lesen (satz, klassenfeld, klasse); + int (klasse) - 4 . + + + +11.3 Integrierte Anwendungen + +Die schwierigste Möglichkeit, Anwendungen unter EUDAS zu reali­ +sieren, ist ihre Integration. Ein solches Programm greift selbst auf +die virtuelle Datei zu, nutzt die Funktionen von EUDAS so weit wie +möglich und definiert vielleicht sogar ein eigenes Menü. + +#on("b")#Vorteile#off("b")# Auf diese Weise können natürlich alle +Möglichkeiten +ausgeschöpft werden. Sie können Programme erstellen, die als eine +natürliche Erweiterung von EUDAS wirken oder EUDAS ganz erset­ +zen. + +#on("b")#Nachteile#off("b")# Eine solche Integration ist aber besonders +schwierig, +wenn EUDAS und die Erweiterung nebeneinander benutzt werden +sollen. In diesem Fall hat EUDAS keine komplette Kontrolle der +Interaktion, so daß leicht undefinierte Zustände möglich sind. + Weniger Probleme treten auf, wenn sichergestellt ist, daß nur +die Anwendung selbst verwendet wird. Auch in diesem Fall ist zu +beachten, daß EUDAS nicht als Programmierumgebung für Anwen­ +dungssysteme konzipiert wurde und daher nicht immer leicht zu +benutzen ist. + Am einfachsten ist es noch, nur eigene Menüs für eine andere +Anwendung zu verwenden, da die Menüprozeduren relativ unabhän­ +gig vom Rest sind. + +#on("b")#Richtlinien#off("b")# Bei Erweiterungen von EUDAS sind folgende +Richtlinien zu beachten: + +1. Ein Programm, das selber Dateien für die virtuelle Datei öffnen + will, sollte vorher prüfen, ob noch eine Datei geöffnet ist und in + diesem Fall abbrechen. Beim Multi-User-Betrieb ist nämlich + sonst nicht gewährleistet, daß alle Sperren wieder entfernt + werden. + +2. Ein solches Programm sollte seine eigenen Dateien vor dem + Wechsel zu EUDAS selbst wieder sichern und die Arbeitskopien + löschen, damit der Ausgangszustand zu Beginn des Programms + wiederhergestellt wird. + +3. Programme, die Menüs benutzen, sollten nicht unter EUDAS auf­ + gerufen werden, da sonst eine Beeinflussung der EUDAS-Menüs + möglich ist. + +An dieser Stelle soll noch einmal von der Erstellung integrierter +Anwendungen abgeraten werden, wenn es auch andere Möglichkeiten +gibt, das gegebene Problem mit EUDAS zu lösen. Der hohe Aufwand +dieser Methode rechtfertigt sich nur in wenigen Fällen. + Experimentierfreudige Anwender werden sich durch diese War­ +nung sowieso nicht abhalten lassen. Ihnen sollte aber bewußt sein, +daß ein solches Vorgehen auf eigene Gefahr stattfindet und kein +Anspruch auf Beratung oder Fehlerbeseitigung in einem solchen Fall +besteht. + diff --git a/doc/eudas/eudas.ref.2 b/doc/eudas/eudas.ref.2 new file mode 100644 index 0000000..2447897 --- /dev/null +++ b/doc/eudas/eudas.ref.2 @@ -0,0 +1,830 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (13)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +2 Zusammenstellung der Funktionen + + + +Im folgenden finden Sie eine Übersicht über alle Menüfunktionen. Zu +jeder Funktion ist aufgeführt, welche Parameter angegeben werden +müssen. Die Parameter werden als Text erfragt. Bei einigen Funk­ +tionen können alle möglichen Parameterwerte mit ESC 'z' (Zeigen) +als Auswahl abgerufen werden. Bei manchen können in der Auswahl +mehrere Werte angekreuzt werden, die dann nacheinander abgear­ +beitet werden. Welcher Fall zutrifft, ist jeweils aufgeführt. + + +2.1 Menü 'Öffnen' + + +#linefeed (0.5)# +#on ("b")#O EUDAS-Datei Öffnen#off("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: EUDAS-Dateiname, mit Zeigen, eine Wahl + +Zweck: Stellt eine EUDAS-Datei als aktuelle Arbeitsdatei ein. + Falls eine vorher geöffnete Datei verändert wurde, + wird sie nach Anfrage gesichert. Falls die zu öffnende + Datei noch nicht existiert, kann sie nach Anfrage + eingerichtet werden. Dabei müssen dann die Feld­ + namen angegeben werden. + + Es wird gefragt, ob die Datei geändert werden soll. In + diesem Fall wird eine Arbeitskopie hergestellt. Fast + alle EUDAS-Funktionen beziehen sich nachher auf die + so eingestellte Datei. + + Ist ein Mehrbenutzer-Manager eingestellt, kann auch + eine Datei aus dieser Managertask als Parameter + angegeben werden. Die Datei wird dann automatisch + von dort kopiert und eine Sperre im Manager gesetzt, + falls Änderungen vorgenommen werden sollen. + +Verweise: Abschnitt 3.2 + Benutzerhandbuch Abschnitt 5.1 und 9.1 + + +#linefeed (0.5)# +#on("b")#E EUDAS-Datei Ketten#off("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: EUDAS-Dateiname, mit Zeigen, mehrfache Wahl + +Zweck: Falls bereits eine EUDAS-Datei geöffnet ist, kann eine + weitere Datei gleicher Struktur logisch angekettet + werden. Bei der Bearbeitung werden dann beide Datei­ + en wie eine zusammenhängende Datei behandelt. + + Die gekettete Datei kann ebenfalls verändert werden, + wenn dies beim Öffnen der ersten Datei angegeben + wurde. Die angegebene Datei kann auch aus einem + Manager stammen. + +Verweise: Abschnitt 3.2 + Benutzerhandbuch Abschnitt 9.2 + + +#linefeed (0.5)# +#on("b")#K EUDAS-Datei Koppeln#off("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: EUDAS-Dateiname, mit Zeigen, mehrfache Wahl + +Zweck: Falls bereits eine Datei geöffnet ist, kann eine andere + EUDAS-Datei dazugekoppelt werden. Dazu muß min­ + destens das erste Feld der zu koppelnden Datei in der + bereits geöffneten Datei vorkommen. + + Nach dem Koppeln erscheinen beide Dateien wie eine + Datei. Zu jedem Satz der ersten Datei erscheinen je­ + weils alle Sätze der Koppeldatei, die in dem Koppelfeld + übereinstimmen. + + Die gekoppelte Datei kann ebenfalls verändert werden, + wenn dies beim Öffnen der ersten Datei angegeben + wurde. Die angegebene Datei kann auch aus einem + Manager stammen. + +Verweise: Abschnitt 3.3 + Benutzerhandbuch Abschnitt 9.3 und 9.4 + + +#linefeed (0.5)# +#on("b")#S Arbeitskopie Sichern#off("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Wurde eine EUDAS-Datei geöffnet und verändert, muß + zum Schluß die veränderte Arbeitskopie wieder ge­ + sichert werden. Die Arbeitskopie kann entweder ge­ + löscht werden, die alte Version ersetzen oder unter + einem neuen Namen registriert werden. + + Für jede veränderte Datei wird zunächst erfragt, ob + die alte Version überschrieben werden soll. Dies ist + der Normalfall. Bei Verneinung dieser Frage muß ein + neuer Name für die Arbeitskopie angegeben werden. + + Zum Schluß wird erfragt, ob alle Arbeitskopien ge­ + löscht werden sollen (Normalfall: ja). Anderenfalls + bleiben die Dateien weiter geöffnet. + +Verweise: Abschnitt 3.5 + Benutzerhandbuch Abschnitt 6.4 + + +#linefeed (0.5)# +#on("b")#N Notizen ansehen/ändern#off("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Zu jeder EUDAS-Datei kann als Notiz ein beliebiger + Text gespeichert werden. Dieser Text der aktuellen + Datei wird mit dieser Funktion im Editor angezeigt + und kann verändert werden, wenn eine Arbeitskopie + angelegt wurde. Anderenfalls werden etwaige Verän­ + derungen einfach ignoriert. + +Verweise: Abschnitt 3.1 + + +#linefeed (0.5)# +#on("b")#F Feldstruktur ändern#off("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Mit dieser Funktion können neue Felder an die aktu­ + elle Datei angefügt werden. Außerdem lassen sich + Feldnamen und Feldtypen ändern. Die Feldtypen be­ + stimmen die Behandlung eines Feldes beim Suchen oder + Sortieren (z.B. von Zahlen). + + Zunächst wird erfragt, ob neue Feldnamen angefügt + werden sollen. Diese können dann im Editor eingege­ + ben werden. Danach wird gefragt, ob Feldnamen oder + Feldtypen geändert werden sollen (neu angefügte + Felder erhalten erst einmal den Typ TEXT). Falls die + Frage bejaht wird, können in einer Auswahl die zu + ändernden Felder angekreuzt werden. Für jedes ange­ + kreuzte Feld werden dann der Name und der Typ zum + Überschreiben angeboten. + +Verweise: Abschnitt 3.1 + Benutzerhandbuch Abschnitt 11.1 + + +#linefeed (0.5)# +#on("b")#P Prüfbedingungen ansehen/ändern#off("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Beim Tragen in eine EUDAS-Datei können Bedingungen + für die zu tragenden Sätze überprüft werden. Diese + Bedingungen für die aktuelle Datei können mit dieser + Funktion angezeigt und, falls erlaubt, auch geändert + werden. + +Verweise: Abschnitt 3.1 und 4.4 + Benutzerhandbuch Abschnitt 11.3 + + +#linefeed (0.5)# +#on("b")#M Mehrbenutzer Manager einstellen#off("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: Managertaskname, kein Zeigen + +Zweck: EUDAS kann beim Öffnen eine Datei von einer anderen + Task des Systems kopieren. Dadurch können mehrere + Benutzer kontrolliert auf die gleiche Datei zugreifen. + Wenn diese Möglichkeit verwendet werden soll, muß + mit dieser Funktion zunächst die in Frage kommende + Managertask angegeben werden. + +Verweise: Abschnitt 3.7 + Benutzerhandbuch Abschnitt 9.6 + + +2.2 Menü 'Einzelsatz' + + +#linefeed (0.5)# +#on("b")#W Weiter#off("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Geht einen Satz weiter in der aktuellen Datei - falls + eine Suchbedingung eingestellt ist, weiter zum näch­ + sten ausgewählten Satz. + +Verweise: Abschnitt 4.2 + Benutzerhandbuch Abschnitt 5.2 + + +#linefeed (0.5)# +#on("b")#Z Zurück#off("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Geht einen Satz zurück in der aktuellen Datei - falls + eine Suchbedingung eingestellt ist, zurück zum vori­ + gen ausgewählten Satz. + +Verweise: Abschnitt 4.2 + Benutzerhandbuch Abschnitt 5.2 + + +#linefeed (0.5)# +#on("b")#N Auf Satz Nr. ..#off("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Positioniert auf einen bestimmten Satz der aktuellen + Datei, dessen Satznummer eingegeben werden muß, und + zwar unabhängig, ob der Satz durch die Suchbedingung + ausgewählt wird oder nicht. Trifft die eingestellte + Suchbedingung nicht auf den Satz zu, erscheint + 'SUCH-' in der Überschrift. Existiert die eingegebene + Satznummer nicht, positioniert EUDAS hinter den + letzten Satz der Datei. + +Verweise: Benutzerhandbuch Abschnitt 5.2 + + +#linefeed (0.5)# +#on("b")#S Suchbedingung Setzen#off("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Es kann eine neue Suchbedingung für die aktuelle + Datei eingegeben werden, bzw. eine vorher eingestellte + Suchbedingung wird zum Ändern angeboten. Die Such­ + bedingung wird in Form eines Suchmusters in das + Satzformular geschrieben. + + Die eingestellte Suchbedingung wird beim Positionieren + und bei allen Bearbeitungsfunktionen beachtet. + +Verweise: Abschnitt 4.2 + Benutzerhandbuch Abschnitt 5.3, 5.4 und 10.3 + + +#linefeed (0.5)# +#on("b")#L Suchbedingung Löschen#off("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Die eingestellte Suchbedingung wird wieder gelöscht. + +Verweise: Abschnitt 4.2 + Benutzerhandbuch Abschnitt 5.3 + + +#linefeed (0.5)# +#on ("b")#M Markierung umkehren#off("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Mit dieser Funktion können einzelne Sätze zur späte­ + ren Bearbeitung markiert werden. Falls der aktuelle + Satz bereits markiert ist, wird die Markierung wieder + entfernt, ansonsten wird er markiert. + + Wenn mindestens ein Satz markiert ist, beachten die + Bearbeitungsfunktionen nur die markierten Sätze. So + kann eine manuelle Auswahl durchgeführt werden. Die + Markierung bleibt nur bis zum Sichern bestehen. Sie + ist keine permanente Eigenschaft einer EUDAS-Datei. + +Verweise: Abschnitt 4.2 + Benutzerhandbuch Abschnitt 10.4 + + +#linefeed (0.5)# +#on ("b")#E Datensatz Einfügen#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Mit dieser Funktion wird vor dem aktuellen Satz ein + leerer Satz eingefügt, für den anschließend die Feld­ + inhalte im Satzformular eingetragen werden können. + +Verweise: Abschnitt 3.4 + Benutzerhandbuch Abschnitt 6.2 und 10.2 + + +#linefeed (0.5)# +#on ("b")#A Datensatz Ändern#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Die Inhalte des aktuellen Satzes werden im Satzformu­ + lar zum Ändern angeboten. + +Verweise: Abschnitt 3.4 + Benutzerhandbuch Abschnitt 6.3 und 10.2 + + +#linefeed (0.5)# +#on ("b")#T Datensatz Tragen#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: EUDAS-Dateiname, mit Zeigen, eine Wahl + +Zweck: Mit dieser Funktion kann der aktuelle Satz in eine + anderen EUDAS-Datei gleicher Struktur transportiert + werden. In der Zieldatei wird er am Ende angefügt. + +Verweise: Abschnitt 4.4 + Benutzerhandbuch Abschnitt 6.3 + + +#linefeed (0.5)# +#on ("b")#H Datensatz Holen#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: EUDAS-Dateiname, mit Zeigen, eine Wahl + +Zweck: Mit dieser Funktion kann der letzte Satz einer ande­ + ren Datei vor dem aktuellen Satz eingefügt werden, + sofern die Struktur gleich ist. Damit kann ein vorher­ + gegangenes Tragen rückgängig gemacht werden. + +Verweise: Abschnitt 4.4 + Benutzerhandbuch Abschnitt 6.3 + + +#linefeed (0.5)# +#on ("b")#F Feldauswahl#off("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Die Felder der aktuellen Datei werden in einer Aus­ + wahl angeboten. Am Bildschirm werden danach nur die + ausgewählten Felder in der gewählten Reihenfolge + dargestellt. Die Auswahl hat jedoch nur Auswirkung + auf die Darstellung am Bildschirm, anderen Funktionen + stehen nach wie vor alle Felder zur Verfügung. Die + Auswahl gilt bis zum Sichern, sie wird also nicht mit + der Datei abgespeichert. + +Verweise: Abschnitt 4.1 + Benutzerhandbuch Abschnitt 10.1 + + +2.3 Menü 'Gesamtdatei' + + +#linefeed (0.5)# +#on ("b")#K Satzauswahl Kopieren#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: EUDAS-Dateiname, mit Zeigen, eine Wahl + Name Kopiermuster, ohne Zeigen + +Zweck: Mit dieser Funktion werden die ausgewählten bzw. + markierten Sätze der aktuellen Datei in eine andere + Datei kopiert. Welche Felder kopiert werden sollen und + in welcher Reihenfolge, wird durch ein Kopiermuster + festgelegt. Dieses Kopiermuster kann benannt werden + oder unbenannt nur für ein Mal erstellt werden. Wird + das Kopiermuster neu erstellt, wird ein Standard- + Kopiermuster zum Ändern angeboten. + +Verweise: Abschnitt 4.4 + Benutzerhandbuch Abschnitt 11.2 + + +#linefeed (0.5)# +#on ("b")#T Satzauswahl Tragen#off("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: EUDAS-Dateiname, mit Zeigen, eine Wahl + +Zweck: Transportieren der ausgewählten bzw. markierten + Sätze in eine andere Datei gleicher Struktur. Die Sätze + werden in der Zieldatei am Ende eingefügt. + +Verweise: Abschnitt 4.4 + Benutzerhandbuch Abschnitt 11.3 + + +#linefeed (0.5)# +#on ("b")#V Satzauswahl Verändern#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: Name Änderungsmuster, mit Zeigen, mehrfache Wahl + +Zweck: Bearbeiten der ausgewählten bzw. markierten Sätze + der aktuellen Datei nach Vorgabe einer Änderungs­ + vorschrift. + +Verweise: Abschnitt 4.4 + Benutzerhandbuch Abschnitt 11.4 + + +#linefeed (0.5)# +#on ("b")#U Übersicht Satzauswahl#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Anzeige aller ausgewählten Sätze in einem Über­ + sichtsformat mit einem Satz pro Bildschirmzeile. Die + Felder, die in der Übersicht angezeigt werden sollen, + können vorher ausgewählt werden. In der Übersicht ist + Blättern und Markieren von Sätzen möglich. + +Verweise: Abschnitt 4.1 + Benutzerhandbuch Abschnitt 10.5 + + +#linefeed (0.5)# +#on ("b")#S Aktuelle Datei Sortieren#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Sortieren der aktuellen Datei in beliebiger Reihenfolge + auf- oder absteigend. Zum Sortieren muß eine Ar­ + beitskopie angelegt sein. Die Feldreihenfolge, in der + sortiert werden soll, wird vorher erfragt. + +Verweise: Abschnitt 4.3 + Benutzerhandbuch Abschnitt 11.1 + + +#linefeed (0.5)# +#on ("b")#L Alle Markierungen Löschen#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Löschen aller Markierungen der aktuellen Datei. + +Verweise: Abschnitt 4.2 + Benutzerhandbuch Abschnitt 10.4 + + +2.4 Menü 'Drucken' + + +#linefeed (0.5)# +#on ("b")#D Satzauswahl Drucken#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: Name Druckmuster, mit Zeigen, mehrfache Wahl + +Zweck: Ausdruck des Inhalts der ausgewählten oder markier­ + ten Sätze in druckbarer Form nach Vorgabe eines + Druckmusters. Die Ausgabe kann automatisch zum + Drucker geschickt werden oder erst in einer Datei + zwischengespeichert werden. + +Verweise: Kapitel 5 + Benutzerhandbuch Abschnitt 7.1 und 7.2 + + +#linefeed (0.5)# +#on ("b")#R Richtung Druckausgabe#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Mit dieser Funktion kann festgelegt werden, ob die + Druckausgabe automatisch zum Drucker geschickt wird, + in eine bestimmte Datei oder in eine automatisch + eingerichtete Datei geschrieben wird. + + Die Angabe einer bestimmten Datei gilt nur für den + nächsten Druckvorgang. Sie muß also gegebenenfalls + wieder neu eingestellt werden. + +Verweise: Abschnitt 5.2 + Benutzerhandbuch Abschnitt 7.2 und 12.1 + + +#linefeed (0.5)# +#on ("b")#E Textdatei Editieren#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: Name Textdatei, mit Zeigen, mehrfache Wahl + +Zweck: Aufruf des EUMEL-Editors zum Erstellen und Ändern + von Druckmustern und Änderungsmustern sowie zum + Ansehen der Druckausgabe. + +Verweise: Benutzerhandbuch Abschnitt 7.2 + + +#linefeed (0.5)# +#on ("b")#A Textdatei Ausdrucken#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: Name Textdatei, mit Zeigen, mehrfache Wahl + +Zweck: Mit dieser Funktion kann eine Textdatei oder die + zwischengespeicherte Ausgabe des Druckens einer + EUDAS-Datei zum Drucker geschickt werden. + +Verweise: Benutzerhandbuch Abschnitt 7.2 + + +#linefeed (0.5)# +#on ("b")#N Textdatei Nachbearbeiten#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: Name Textdatei, mit Zeigen, mehrfache Wahl + +Zweck: Mit dieser Funktion kann die zwischengespeicherte + Ausgabe des Druckens einer EUDAS-Datei mit den + Textkosmetikprogrammen 'lineform' und 'pageform' + bearbeitet werden. + +Verweise: Benutzerhandbuch Abschnitt 12.1 + + +2.5 Menü 'Dateien' + + +#linefeed (0.5)# +#on ("b")#U Übersicht Dateien System#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Übersicht über die Dateien im System in der aktuellen + Benutzertask. + +Verweise: Benutzerhandbuch Abschnitt 16.1 + + +#linefeed (0.5)# +#on ("b")#L Datei Löschen#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: Dateiname, mit Zeigen, mehrfache Wahl + +Zweck: Löschen einer beliebigen Datei in der aktuellen Be­ + nutzertask nach Anfrage. + +Verweise: Benutzerhandbuch Abschnitt 16.1 + + +#linefeed (0.5)# +#on ("b")#N Datei Umbenennen#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: Dateiname, mit Zeigen, mehrfache Wahl + Neuer Name, ohne Zeigen + +Zweck: Umbenennen einer beliebigen Datei in der aktuellen + Benutzertask. + +Verweise: Benutzerhandbuch Abschnitt 16.1 + + +#linefeed (0.5)# +#on ("b")#K Datei Kopieren#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: Dateiname, mit Zeigen, mehrfache Wahl + Zieldateiname, ohne Zeigen + +Zweck: Anfertigen einer logischen Kopie einer beliebigen + Datei in der aktuellen Benutzertask. + +Verweise: Benutzerhandbuch Abschnitt 16.1 + + +#linefeed (0.5)# +#on ("b")#P Platzbedarf einer Datei#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: Dateiname, mit Zeigen, mehrfache Wahl + +Zweck: Zeigt den belegten Speicherplatz einer beliebigen + Datei in der aktuellen Benutzertask. + +Verweise: Benutzerhandbuch Abschnitt 16.1 + + +#linefeed (0.5)# +#on ("b")#A Datei Aufräumen#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: Dateiname, mit Zeigen, mehrfache Wahl + +Zweck: Reorganisieren einer Textdatei oder einer EUDAS- + Datei, um Platz zu sparen oder den Zugriff zu be­ + schleunigen. Empfiehlt sich bei stark veränderten + oder umsortierten Dateien. + +Verweise: Benutzerhandbuch Abschnitt 16.1 + + +2.6 Menü 'Archiv' + + +#linefeed (0.5)# +#on ("b")#U Übersicht Dateien Archiv#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Übersicht aller Dateien auf der eingelegten Archivdis­ + kette. + +Verweise: Benutzerhandbuch Abschnitt 16.2 + + +#linefeed (0.5)# +#on ("b")#D Archivübersicht Drucken#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Die Archivübersicht wird direkt zum Drucker ge­ + schickt. + +Verweise: Benutzerhandbuch Abschnitt 16.2 + + +#linefeed (0.5)# +#on ("b")#K Datei Kopieren vom Archiv#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: Dateiname, mit Zeigen, mehrfache Wahl + +Zweck: Eine Datei auf der Archivdiskette wird in die aktuelle + Benutzertask kopiert. + +Verweise: Benutzerhandbuch Abschnitt 16.2 + + +#linefeed (0.5)# +#on ("b")#S Datei Schreiben auf Archiv#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: Archivname + Dateiname, mit Zeigen, mehrfache Wahl + +Zweck: Eine Datei aus der aktuellen Benutzertask wird auf + die eingelegte Archivdiskette geschrieben. + +Verweise: Benutzerhandbuch Abschnitt 16.2 + + +#linefeed (0.5)# +#on ("b")#L Datei Löschen auf Archiv#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: Archivname + Dateiname, mit Zeigen, mehrfache Wahl + +Zweck: Löschen einer Datei auf der eingelegten Archivdisket­ + te. Der Platz kann jedoch nicht immer wiederverwendet + werden. + +Verweis: Benutzerhandbuch Abschnitt 16.2 + + +#linefeed (0.5)# +#on ("b")#I Archivdiskette Initialisieren#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: keine + +Zweck: Mit dieser Funktion kann eine Archivdiskette komplett + gelöscht werden. Die Diskette kann dabei auch gleich­ + zeitig formatiert werden, falls der Rechner dies zu­ + läßt. Das Initialisieren ist notwendig, bevor eine neue + Diskette als Archiv verwendet werden kann. + +Verweise: Benutzerhandbuch Abschnitt 16.2 + + +#linefeed (0.5)# +#on ("b")#Z Zielarchiv einstellen#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: Managertaskname, ohne Zeigen + +Zweck: Mit dieser Funktion kann eine Managertask angegeben + werden, die als Ziel der Archivoperationen dient. + Damit können Dateien auch in beliebigen Managertasks + oder über das EUMEL-Netz gesichert werden. + + Es wird erfragt, ob die angegebene Task ein Archiv­ + manager oder ein gewöhnlicher Dateimanager ist. + +Verweise: Benutzerhandbuch Abschnitt 16.2 + + +#linefeed (0.5)# +#on ("b")#P Paßwort einstellen#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: Paßwort + +Zweck: Mit dieser Funktion kann ein Paßwort eingestellt + werden, das bei der Kommunikation mit allgemeinen + Managertasks überprüft wird. + +Verweise: Benutzerhandbuch Abschnitt 16.2 + + +#linefeed (0.5)# +#on ("b")#R Archivmanager Reservieren#off ("b")# +#linefeed (1.07)# +_____________________________________________________ + +Parameter: Reservierungstext + +Zweck: Falls als Zielarchiv eine Managertask eingestellt ist, + die zwar kein Archivmanager ist, aber reserviert + werden muß (z.B. 'DOS'), kann die Reservierung mit + dieser Funktion ausgeführt werden. Die Freigabe + erfolgt automatisch beim Verlassen des Menüs. + +Verweise: Benutzerhandbuch Abschnitt 16.2 + + + +2.7 Kurzabfrage + +Wird 'eudas' innerhalb des EUMEL-Editors aufgerufen, so wird eine +spezielle Kurzabfrage gestartet. Diese ermöglicht die Übernahme von +Druckdaten direkt in die editierte Datei. + Zunächst wird der Dateiname der zu verwendenden EUDAS- +Datei erfragt. Diese Datei wird dann geöffnet. Vorher geöffnete und +veränderte Dateien werden nach Anfrage gesichert. + Als nächstes kann für die folgende Übersicht eine Feldauswahl +eingestellt werden, damit die relevanten Felder auch auf dem Bild­ +schirm erscheinen. + Danach beginnt ein wiederholbarer Prozeß mit der Eingabe +eines Suchmusters nach Anfrage. Die ausgewählten Sätze werden +dann in einer Übersicht gezeigt. In der Übersicht können auch Sätze +markiert werden. + Nach Verlassen der Übersicht bestehen drei Möglichkeiten zum +Drucken: Falls mindestens ein Satz markiert wurde, können nach +Anfrage alle markierten Sätze gedruckt werden. Wurde kein Satz +markiert, können nach Anfrage alle ausgewählten (bzw. vorher +angezeigten) Sätze gedruckt werden. Wird diese Frage jeweils ver­ +neint, kann nach Anfrage auch der aktuelle Satz als einziger ge­ +druckt werden. + Wurde eine der Fragen bejaht, wird der Name des Druckmusters +erfragt, das bereits existieren muß. Das Ergebnis der Druckausgabe +wird dann an der aktuellen Cursorposition in der editierten Datei +eingefügt. + Der Prozeß kann danach mit einem anderen Suchmuster wieder­ +holt werden. Dabei werden alle Markierungen wieder gelöscht. + diff --git a/doc/eudas/eudas.ref.3 b/doc/eudas/eudas.ref.3 new file mode 100644 index 0000000..9b58b9b --- /dev/null +++ b/doc/eudas/eudas.ref.3 @@ -0,0 +1,270 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (31)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +3 Das virtuelle Dateimodell + + + +3.1 Dateistruktur + +Eine EUDAS-Datei hat folgende Bestandteile: + +- 0 bis 5000 #on("i")#Sätze#off("i")#, von 1 an durchnumeriert. Jeder Satz enthält für + jedes Feld einen variabel langen Text als Inhalt, der standard­ + mäßig leer ist. + +- 1 bis 256 #on("i")#Felder#off("i")#, die die Sätze aufteilen. Jedes Feld besitzt einen + #on("i")#Feldnamen#off("i")# als Text und einen von vier #on("i")#Feldtypen#off("i")# (TEXT, ZAHL, + DATUM oder DIN). Der Feldname dient zur Identifizierung des + Feldes, der Feldtyp spezifiziert die Art der Behandlung beim Ver­ + gleichen von Feldern. + +- Drei Zusatztexte. Der erste nimmt die #on("i")#Prüfbedingungen#off("i")# auf, der + zweite speichert das Datum der letzten Veränderung und der + dritte kann allgemeine #on("i")#Notizen#off("i")# aufnehmen. + +- Einen #on("i")#Satzzeiger#off("i")#, der einen bestimmten Satz als aktuellen Satz + auszeichnet. Der Satzzeiger kann durch Positionierungsoperatio­ + nen verändert werden. + +- Eine #on("i")#Sortierreihenfolge#off("i")#, die angibt, in welcher Feldreihenfolge die + Datei zuletzt sortiert worden ist. Dazu für jeden Satz eine Anga­ + be, ob er entsprechend dieser Reihenfolge an der richtigen Posi­ + tion steht. + +- Eine interne Datenstruktur, die beschleunigten Zugriff auf eine + Satz nach dem Inhalt des ersten Feldes ermöglicht. Diese Struktur + steht ganz unter Kontrolle von EUDAS und kann nicht von außen + manipuliert werden. + + +3.2 Öffnen + +#on("b")#Virtuelle Datei#off("b")# Die meisten EUDAS-Funktionen arbeiten +nicht +direkt auf einer EUDAS-Datei, sondern auf der sogenannten #on("i")#vir­ +tuellen Datei#off("i")#, die aus mehreren realen Dateien bestehen kann. Die +virtuelle Datei erscheint nach außen hin wie eine einzelne +EUDAS-Datei. Die Operationen auf der virtuellen Datei werden je­ +weils auf die einzelnen Bestandteile abgebildet. + Damit eine EUDAS-Datei Bestandteil der virtuellen Datei wird, +muß sie geöffnet werden. Dieses Öffnen kann auf dreierlei Art und +Weise geschehen. + Das Öffnen der ersten Datei stellt eine neue virtuelle Datei +her. Die Feldnamen und Feldeigenschaften der ersten Datei werden +in der virtuellen Datei übernommen. Dies ist der Normalfall, in dem +sich die virtuelle Datei noch nicht von der zugrundeliegenden Datei +unterscheidet. + Bei diesem ersten Öffnen muß angegeben werden, ob die vir­ +tuelle Datei verändert werden soll oder nicht. Falls die virtuelle +Datei verändert werden soll, wird eine Arbeitskopie aller geöffneten +Dateien angelegt. Die Ursprungsdateien können erst am Ende der +Arbeit mit den geänderten Kopien überschrieben werden. + +#on("b")#Weitere Dateien#off("b")# Weitere Dateien können gekettet oder +gekoppelt +werden. Gekettete Dateien werden logisch an die zuerst geöffnete +Datei angehängt. Ihre Dateistruktur wird ignoriert, sollte aber mit +der ersten Datei übereinstimmen. Die Folge aneinander geketteter +EUDAS-Dateien wird als #on("i")#Hauptdatei#off("i")# bezeichnet. + In der Hauptdatei werden die Sätze von 1 an durchnumeriert; +die Aufeinanderfolge der Sätze wird durch die Anordnung der Sätze +in den einzelnen Dateien und die Reihenfolge bestimmt, in der die +Dateien gekettet wurden. + Die gekoppelten Dateien werden der Hauptdatei untergeordnet. +Die in ihnen enthaltenen Informationen werden nur angezeigt, wenn +sie mit einem Satzinhalt der Hauptdatei korrespondieren. Der +Mechanismus dieser Satzkopplung wird im nächsten Abschnitt +beschrieben. + + +#free (8.0)# + +#center#Abb. 3-1 Schematischer Aufbau der virtuellen Datei + + + +3.3 Koppeln + + Die Sätze der gekoppelten Dateien werden in Relation zu den +Sätzen in der Hauptdatei gesetzt. Zu jedem Satz in der Hauptdatei +kann eine Anzahl von Sätzen aus jeder Koppeldatei gehören. Diese +Sätze müssen in den Inhalten der sogenannten #on("i")#Koppelfelder#off("i")# über­ +einstimmen. + Welche Felder Koppelfelder sind, richtet sich nach den Feld­ +namen. Die ersten Felder der Koppeldatei, die auch in der Haupt­ +datei vorhanden sind, werden als Koppelfelder betrachtet. Die Kop­ +pelfelder müssen also bei der Koppeldatei am Anfang stehen - in +der Hauptdatei kann jedes beliebige Feld ein Koppelfeld sein. + Wenn eine Datei zur virtuellen Datei gekoppelt wird, werden +alle Felder, die nicht Koppelfelder sind, in die virtuelle Datei auf­ +genommen. Die Koppelfelder brauchen nicht noch mal wiederholt zu +werden, da ihr Inhalt ja immer identisch ist. + Zu beachten ist, daß bei diesem Verfahren auch Namenskonflik­ +te entstehen können, wenn nach den Koppelfeldern später wieder +ein Feldname vorkommt, der auch in der Hauptdatei vorhanden ist. +In den Fällen, in denen Felder durch ihren Namen angesprochen +werden, ist dann das zweite Feld gleichen Namens nicht verfügbar. + + +#free (7.0)# + +#center#Abb. 3-2 Schema des Koppelvorgangs + + +#on("b")#Kombinationen#off("b")# Beim Vorwärtsgehen in der virtuellen Datei +werden +zu jedem Satz der Hauptdatei nacheinander alle möglichen Kombina­ +tionen der zugehörigen Koppelsätze angezeigt, denn es können +mehrere passende Koppelsätze vorhanden sein. Die Satznummer +bleibt dabei gleich; die einzelnen Kombinationen werden von 1 an +durchgezählt. Beim Rückwärtsgehen wird aus technischen Gründen +immer nur die erste Kombination angezeigt. + Existiert zu einem Satz kein passender Koppelsatz, so bleiben +die entsprechenden Felder leer. Die Koppelsätze müssen in der +ganzen Koppeldatei gesucht werden, daher ist bei großen Koppel­ +dateien die Suchzeit zu berücksichtigen. + + +3.4 Änderungen + +In der virtuellen Datei kann auch geändert werden. Dabei ist jedoch +Vorsicht angebracht. Es muß festgelegt sein, wie Änderungen der +einzelnen Felder auf die beteiligten Dateien abgebildet werden. + Falls die virtuelle Datei keine Koppeldateien enthält, werden +Änderungen am aktuellen Satz an der zugehörigen Datei durchge­ +führt. Das Löschen eines Satzes wird auch direkt in der Datei +durchgeführt. Ein neuer Satz wird immer in der Datei eingefügt, zu +der der aktuelle Satz gehört - am Ende der ersten Datei kann also +kein Satz eingefügt werden, wenn noch weitere Dateien folgen. + Enthält die virtuelle Datei Koppeldateien, werden die Änderun­ +gen in der Hauptdatei wie oben beschrieben durchgeführt. Änderun­ +gen, die Felder in den Koppeldateien betreffen, werden nach folgen­ +der Entscheidungstabelle behandelt: + + 1 2 3 4 5 + --------------- + Koppelfelder verändert N J J N N + Übrige Felder verändert N - - J J + Übrige Felder leer - J N - N + Vorher Koppelsatz vorhanden - - - J N + --------------- + Neuen Satz einfügen x x + Koppelsatz ändern x + Kopplung aktualisieren x + +Fall 1: Es wurden keine Veränderungen an den Feldern des Kop­ + pelsatzes vorgenommen, daher ist auch keine Aktion not­ + wendig. + +Fall 2: Eines der Koppelfelder wurde verändert. Die Änderung wird + in der Hauptdatei durchgeführt. Die übrigen Felder des + Koppelsatzes sind jedoch als leer angegeben. In diesem Fall + wird der Koppelsatz nicht verändert, sondern nur eine + neue Korrespondenz gesucht. + +Fall 3: Eines der Koppelfelder wurde verändert, gleichzeitig ent­ + halten aber auch die anderen Felder Informationen. In + diesem Fall wird ein neuer Satz in der Koppeldatei ange­ + fügt, der die neuen Inhalte enthält. So wird vermieden, + daß an anderer Stelle plötzlich kein passender Koppelsatz + mehr vorhanden ist. + +Fall 4: Nur Felder der Koppeldatei, die nicht Koppelfelder sind, + wurden verändert, außerdem existierte ein korrespondie­ + render Satz in der Koppeldatei. In diesem Fall werden die + Informationen im Koppelsatz abgeändert. + +Fall 5: Wie 4, nur war vorher noch kein Koppelsatz vorhanden + (Felder waren leer). In diesem Fall muß ein neuer Satz in + die Koppeldatei eingefügt werden. Einfügungen in die + Koppeldatei geschehen immer am Dateiende. + +#on("b")#Einfügen/Löschen#off("b")# Beim Löschen eines Satzes der virtuellen +Datei +durch Tragen bleiben die Koppeldateien unverändert. Nach dem +Einfügen eines neuen Satzes wird nur dann ein Satz in einer Kop­ +peldatei eingefügt, wenn dieser Satz nicht nur Koppelfelder enthal­ +ten würde. Falls beim Einfügen nur die Koppelfelder angegeben +werden, wird ein korrespondierender Satz in der Koppeldatei ge­ +sucht. Vergleichen Sie hierzu die Regeln beim Ändern. + + +3.5 Sichern + +Falls Änderungen der virtuellen Datei erlaubt sind, arbeitet EUDAS +immer auf Sicherheitskopien der beteiligten Dateien. Eine Datei, die +wirklich verändert wurde, muß vor dem Aufbau einer neuen virtuel­ +len Datei gesichert oder explizit gelöscht werden. + Für jede einzelne Datei kann festgelegt werden, ob sie gesi­ +chert werden soll oder nicht. Als Hilfe wird dazu für jede Datei +angegeben, ob sie tatsächlich verändert wurde oder nicht. Die +Arbeitskopie kann beim Sichern die alte Version überschreiben oder +unter einem neuen Namen gesichert werden. + Am Ende des Sicherns können die Arbeitskopien gelöscht wer­ +den. Anderenfalls werden die Dateien so betrachtet, als ob sie di­ +rekt nach dem Sichern wieder geöffnet worden wären und stehen +weiterhin zur Verfügung. + Falls alle Dateien entweder gesichert oder nicht verändert +sind, werden beim nächsten Öffnen einer neuen virtuellen Datei die +vorherigen Arbeitskopien gelöscht. + + +3.6 Umschalten auf Koppeldatei + +Falls eine Datei gekoppelt ist, kann man die virtuelle Datei auf +diese Koppeldatei umschalten. Dadurch verhält sich die virtuelle +Datei so, als ob nur diese Koppeldatei geöffnet wäre. Die Einstel­ +lungen der Hauptdatei wie Markierungen und Suchbedingung bleiben +jedoch erhalten und stehen beim Zurückschalten wieder zur Verfü­ +gung. + Die Satzposition der Koppeldatei beim letzten Umschalten wird +ebenfalls gespeichert und wird beim nächsten Umschalten wieder +eingenommen, unabhängig von der tatsächlichen Satzposition der +Koppeldatei zu diesem Zeitpunkt. + Für die Koppeldatei können eigene Markierungen vergeben +werden, die auch nach dem Umschalten gespeichert bleiben. Auch +ein Suchmuster kann für die Koppeldatei eingestellt werden, dies +geht jedoch beim Zurückschalten wieder verloren. Die eingestellte +Feldauswahl für die Bildschirmanzeige geht leider bei jedem Um­ +schalten verloren. + Das Umschalten kann entweder im Menü 'Einzelsatz' oder beim +Einfügen und Ändern durch ESC 'K' bewirkt werden, ebenso das +Zurückschalten nur im Menü 'Einzelsatz'. Beim Umschalten aus Ein­ +fügen oder Ändern erfolgt beim Zurückschalten eine Rückkehr in +diesen Zustand. Dabei können nach Anfrage die Koppelfelder des +aktuellen Satzes der Koppeldatei in die Hauptdatei übernommen und +damit eine bestimmte Kopplung bewirkt werden. + + +3.7 Mehrbenutzerbetrieb + +Durch Einstellen einer Managertask für den Mehrbenutzerbetrieb +können auch Dateien dieser Managertask beim Öffnen direkt ver­ +wendet werden. Die Datei wird automatisch aus der Managertask +kopiert und geöffnet. + Falls die Datei geändert werden soll, wird eine Sperre in der +Managertask gesetzt, die verhindert, daß auch ein anderer Benutzer +diese Datei zum Ändern öffnet. Beim Sichern erfolgt dann ein Rück­ +schreiben der Arbeitskopie. Die Sperre wird jedoch erst dann zu­ +rückgesetzt, wenn alle Arbeitskopien gelöscht werden, da erst dann +keine Möglichkeit des Rückschreibens mehr besteht. + Alle Dateien der Managertask werden bei der Dateiauswahl zum +Öffnen mit angeboten. Falls eine Datei in beiden Tasks existiert, +wird die Datei in der Managertask genommen, die Datei der eigenen +Task jedoch erst nach Anfrage überschrieben. + Damit die Sperre funktionieren kann, muß EUDAS in der Mana­ +gertask zur Verfügung stehen und die Task muß #on("i")#nach#off("i")# dem Insertie­ +ren von EUDAS als 'global manager' definiert werden (nicht 'free +global manager' verwenden). + diff --git a/doc/eudas/eudas.ref.4 b/doc/eudas/eudas.ref.4 new file mode 100644 index 0000000..cfd6daf --- /dev/null +++ b/doc/eudas/eudas.ref.4 @@ -0,0 +1,441 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (39)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +4 Ansehen und Bearbeiten + + + +4.1 Anzeige + +Die Anzeige und Eingabe von Einzelsätzen sowie die Eingabe von +Suchmustern geschieht in einem Standardformular in einem recht­ +eckigen Fenster. Dieses Fenster befindet sich in der rechten Bild­ +schirmhälfte. + Das Formular besteht aus vier Teilen: der Überschrift, den +Feldnamen, den Feldinhalten und der Abschlußzeile (s. Abbildung). + + Überschrift +#free (0.3)# + Satz 33 ..SUCH+..MARK-... datei ............... Feld 1 + Feld 1 + Feld 2 + Feld 3 Feldinhalte + + Feld 4 + .............................................................. +#free (0.3)# + Feldnamen Abschlußzeile + + + +#on("b")#Überschrift#off("b")# Die Überschrift zeigt folgende Informationen +an: + + Satz n[-m] + Die Satznummer des aktuellen Satzes, bei gekoppelten Dateien + auch die Satzkombination. + + SUCH+/- + Zeigt an, ob der aktuelle Satz die eingestellte Suchbedingung + erfüllt oder nicht (wird während Eintragungen nicht angezeigt). + Wenn keine Suchbedingung eingestellt ist, erscheint diese An­ + zeige nicht. + + MARK+/- + Zeigt an, ob der aktuelle Satz markiert ist oder nicht (Wird + während Eintragungen nicht angezeigt). Wenn kein Satz mar­ + kiert ist, erscheint diese Anzeige nicht. + + ENDE + Wird hinter dem letzten Satz der Datei als Kennzeichnung des + Endesatzes ausgegeben. + + 'Dateiname' + Gibt den Namen der ersten geöffneten Datei an. + + + Erscheint statt des Dateinamens, wenn auf eine Koppeldatei + umgeschaltet wurde. + + Feld n/Zeile n + Zeilennummer des obersten angezeigten Feldes (bei Anzeige) + bzw. der aktuellen Cursorzeile (während Eintragungen). + +#on("b")#Feldteil#off("b")# Die Feldnamen sind zur Unterscheidung von den +Feld­ +inhalten invers dargestellt. Die Breite der Feldnamen richtet sich +nach der Länge des längsten Feldnamens. Ist dieser zu lang, um +noch eine ordentliche Anzeige zu ermöglichen, wird bei einer be­ +stimmten Länge der Rest des Namens abgeschnitten. + Zwischen dem Feldnamen an der linken Seite und dem dane­ +benstehenden Feldinhalt besteht immer eine Korrespondenz, d.h. der +Inhalt eines Feldes wird direkt neben dem Namen dargestellt. In der +Regel wird pro Feld eine Bildschirmzeile reserviert. Kann der Feld­ +inhalt jedoch nicht mehr in einer Zeile untergebracht werden, wer­ +den weitere Zeilen zur Darstellung dieses Feldes herangezogen. In +diesen Zeilen steht statt des Feldnamens nur ein markierter Leer­ +raum. + Alle folgenden Zeilen ohne Namen gehören zu dem gleichen +Feld. Der Inhalt wird auf diese Zeilen umbrochen, d.h. wenn ein +Wort nicht mehr auf die Zeile paßt, wird es komplett in die nächste +Zeile geschrieben (wie beim Editor). Wörter werden nur dann zer­ +schnitten, wenn sie nicht als Ganzes auf eine Zeile passen. Wörter +werden untereinander durch Leerzeichen getrennt. + Aus Effizienzgründen werden in bestimmten Fällen auch mehr +Folgezeilen als nötig angezeigt. Hat nämlich ein neuer Satz einen +kürzeren Inhalt als der vorige, so werden die Feldnamen nur dann +wieder zusammengerückt, wenn das ganze Bild neugeschrieben wer­ +den muß. Anderenfalls werden nur die Feldinhalte aktualisiert. + Die Bildausgabe wird unterbrochen, wenn 'w' oder 'z' gedrückt +wurde, da dann die Inhalte des aktuellen Satzes nicht mehr inter­ +essieren. + +#on("b")#Rollen#off("b")# Da nicht alle Felder auf den Bildschirm passen +müssen, kann das Bild gerollt werden. + Mit ESC UNTEN wird um eine Seite nach unten geblättert, mit +ESC OBEN wieder zurück. Hinter dem letzten Feld erscheint ein +markierter Balken als Abschlußzeile. Weiter als bis zum Erscheinen +dieses Balken kann nicht gerollt werden. Mit ESC '1' wird ganz an +den Anfang gerollt, mit ESC '9' ganz ans Ende. + Bei Feldern, die sich über mehrere Zeilen erstrecken, kann es +passieren, daß nach dem Rollen die erste Bildschirmzeile nicht die +erste Zeile eines Feldes ist, also der erste Teil eines Feldes nicht +dargestellt wird. Trotzdem wird in diesem Fall in der ersten Anzei­ +gezeile der Feldname angezeigt. + +#on("b")#Feldauswahl#off("b")# Man kann auswählen, welche Felder in welcher +Rei­ +henfolge angezeigt werden sollen. Dies dient der besseren Übersicht. +Von der Anzeige werden nur die ausgewählten Felder behandelt, die +anderen Felder bleiben leer, werden nicht verändert oder berück­ +sichtigt. Die Anzeigeauswahl ändert jedoch nichts an der Datei­ +struktur. + Die Feldauswahl ist keine permanente Eigenschaft einer +EUDAS-Datei. Sie geht daher bei einem neuen Öffnen oder beim +Umschalten auf eine Koppeldatei verloren. + +#on("b")#Übersicht#off("b")# Im Gegensatz zur normalen Anzeige, bei der ein +Satz pro +Bildschirm dargestellt wird, können in der Übersicht mehrere Sätze +gleichzeitig überschaut werden. Dabei wird jeder Satz in einer Zeile +untergebracht. Die Auswahl der Felder, die in der Übersicht er­ +scheinen sollen, wird vor Beginn der Funktion erfragt. + In jeder Zeile steht die Nummer des jeweiligen Satzes, eine +Anzeige, ob er markiert ist (+) oder nicht (-) und die Feldinhalte +in der gewählten Reihenfolge und Auswahl, jeweils duch Komma und +Leerzeichen getrennt. Inhalte, die nicht mehr auf die Zeile passen, +werden abgeschnitten. + Es werden nur durch das Suchmuster ausgewählte Sätze ange­ +zeigt. Ist der aktuelle Satz nicht ausgewählt, so erscheint an seiner +Stelle '<< >>' als Hinweis. In der Überschrift sind die Feldnamen +angegeben - durch Komma getrennt, so viele wie hinpassen. + Die Satznummer des aktuellen Satzes ist jeweils markiert. In +der Übersicht kann geblättert werden. HOP OBEN und HOP UNTEN, +OBEN und UNTEN wirken wie im Editor. + Durch '+' oder '-' kann auch die Markierung des aktuellen +Satzes verändert werden. + + +4.2 Satzauswahl + +Die Auswahl der Sätze, die gedruckt oder mit den Funktionen aus +Abschnitt 4.4 bearbeitet werden sollen, kann entweder durch eine +Suchbedingung oder durch Markierung vorgenommen werden. Wenn +mindestens ein Satz markiert ist, werden von den Bearbeitungs­ +funktionen nur die markierten Sätze behandelt. Anderenfalls wird +die eingestellte Suchbedingung beachtet. + Die Bildschirmanzeige richtet sich immer nur nach der einge­ +stellten Suchbedingung. + +#on("b")#Suchmuster#off("b")# Ein Suchmuster gibt für jedes Feld bestimmte +Bedin­ +gungen an. Es wird im Standardformular mit Hilfe des Satzeditors +eingegeben. Dabei stehen neben jedem Feld die Bedingungen für +dieses Feld in einer intuitiv verständlichen Form. Folgende Einzel­ +bedingungen sind möglich: + + Muster Inhalt ist gleich Muster + Muster.. Inhalt ist größergleich Muster + ..Muster Inhalt ist kleiner Muster + Muster1..Muster2 Inhalt liegt dazwischen + *Muster Inhalt endet mit Muster + Muster* Inhalt beginnt mit Muster + *Muster* Inhalt enthält Muster + * Inhalt ist nicht leer + ++ Satz markiert (unabhängig vom Feldinhalt) + +Die ersten vier Einzelbedingungen beachten auch den Typ eines +Feldes (wie er bei der Feldstruktur eingegeben werden kann und +beim Sortieren beachtet wird). So werden z.B. bei der Gleichheit von +Zahlen alle nicht-numerischen Zeichen ignoriert (s. Sortieren). + Die drei Bedingungen mit Stern können auch miteinander ver­ +knüpft werden. Die Einzelbedingungen müssen dann alle zutreffen, +damit der Satz ausgewählt wird. So bedeutet zum Beispiel das +Muster 'M1*M2*M3*M4', daß das Feld mit 'M1' beginnen und mit 'M4' +enden muß. Außerdem muß es 'M2' und 'M3' enthalten, jedoch nicht +unbedingt in der angegebenen Reihenfolge. + Wird der Mustertext durch '&' und einen gültigen Feldnamen der +aktuellen Datei ersetzt, findet der Vergleich nicht mit einem +Mustertext, sondern mit dem Inhalt des angegebenen Feldes statt. +Als Feldtyp für den Vergleich wird in diesem Fall der Typ des Fel­ +des genommen, in dem der Vergleich steht. + +#on("b")#Verknüpfung#off("b")# Einzelbedingungen können durch Voranstellen +von +'--' verneint werden. Einzelbedingungen für verschiedene Felder +werden mit UND verknüpft. + Es gibt zwei Arten der ODER-Verknüpfung: die lokale und die +globale. Die lokale ODER-Verknüpfung wird durch ein Komma zwi­ +schen Einzelbedingungen realisiert. Sie hat eine höhere Priorität als +das UND zwischen verschiedenen Feldern. So hat folgendes Such­ +muster + + + Feld1 Bed1,Bed2 + Feld2 Bed3 + + +die Bedeutung + + + ( Bed1 (Feld1) ODER Bed2 (Feld2) ) UND Bed3 (Feld3) + + +Die globale ODER-Verknüpfung wird durch ein Semikolon repräsen­ +tiert. Alle Einzelbedingungen nach dem n-ten Semikolon aller Zeilen +werden zu einer Alternative zusammengefaßt. Damit hat das Such­ +muster + + + Feld1 Bed1;Bed2 + Feld2 Bed3 + + +die Bedeutung + + + ( Bed1 (Feld1) UND Bed3 (Feld2) ) ODER Bed2 (Feld1) + + +Damit ergibt sich für die Priorität der einzelnen Konstruktionen +folgende Reihenfolge: + + höchste Einzelbedingung + Verkettung von Einzelbedingungen (UND) + Verneinung + lokales ODER + UND zwischen Feldern + niedrigste globales ODER + +#on("b")#Optimierung#off("b")# Wenn für das erste Feld einer Datei eine +Gleich- +Bedingung angegeben wurde und keine globale Alternative vorhan­ +den ist, kann der Suchvorgang wegen der Dateistruktur optimiert +werden, indem nur Sätze untersucht werden müssen, die im ersten +Feld den gesuchten Text enthalten. + +#on("b")#Reservierte Zeichen#off("b")# Im Rahmen der Analyse einer +Musterzeile +wirken folgende Zeichenfolgen als unbeschränkt reservierte Zeichen: + + + , ; .. * + + +Sie dürfen daher in keinem Mustertext oder Feldnamen vorkommen, +da sie als Separator wirken. Die beiden folgenden Zeichenfolgen +werden nur zu Anfang eines durch die vorstehenden Separatoren +gebildeten Abschnitts erkannt: + + + -- & ++ + + +Sie dürfen daher prinzipiell an weiterer Stelle vorkommen, ohne als +Sonderzeichen erkannt zu werden. Alle anderen Zeichen in der Zeile +werden dem Mustertext bzw. Feldnamen ohne weitere Interpretation +zugeordnet. + + +4.3 Sortieren und Reorganisieren + +Eine EUDAS-Datei kann in einer beliebigen Feldreihenfolge sortiert +werden. Mit dieser Angabe kann man bestimmen, welche Felder beim +Vergleich zweier Sätze berücksichtigt werden sollen und in welcher +Reihenfolge. + Die Sortierreihenfolge wird in der Datei gespeichert und wird +anschließend immer wieder verwendet, wenn keine anderen Angaben +gemacht wurden. + Der Sortierzustand einer Datei wird ebenfalls gespeichert. Wenn +nur wenige Sätze seit der letzten Sortierung verändert wurden, +müssen auch nur diese Sätze einsortiert werden. + +#on("b")#Feldtypen#off("b")# Um eine korrekte Sortierung auch von Zahlen oder +Daten sicherzustellen, wird jedem Feld einer EUDAS-Datei ein Feld­ +typ zugeordnet, der beim Sortieren (und auch beim Suchen) berück­ +sichtigt wird. + Es gibt folgende Feldtypen (als Standard wird der Typ TEXT +verwendet): + + TEXT Vergleich von Texten nach dem EUMEL-Code der einzel­ + nen Zeichen. Dies ist Standard und sorgt für schnellst­ + möglichen Vergleich. Die weiteren Typen brauchen erheb­ + lich mehr Zeit. + + DIN Vergleich nach DIN 5007 (s. EUMEL-Benutzerhandbuch). + Umlaute werden korrekt eingeordnet, Groß- und Klein­ + buchstaben werden gleichbehandelt, Sonderzeichen werden + ignoriert. + + ZAHL Der Wert einer Zahl wird verglichen. Außer den Ziffern, + dem Dezimalkomma und dem Minuszeichen vor der ersten + Ziffer werden alle anderen Zeichen ignoriert. Das Dezi­ + malkomma ist standardmäßig auf ',' eingestellt, kann aber + verändert werden (s. Abschnitt 6.5). Die nicht ignorierten + Zeichen werden in eine REAL-Zahl umgewandelt und dann + verglichen. + + DATUM Es werden Daten der Form 'tt.mm.jj' verglichen. In diesem + Fall werden Tag und Jahr vertauscht und dann vergli­ + chen. Texte mit einer anderen Länge als 8 werden alle + als gleich betrachtet. + +#on("b")#Reorganisieren#off("b")# Wenn viele Änderungen an einer EUDAS-Datei +vorgenommen worden sind, steigt ihr Platzbedarf durch viele Text­ +leichen an. In diesem Fall empfiehlt es sich, die Datei zu reorgani­ +sieren. Auch wenn beim Sortieren viele Sätze vertauscht wurden, +sollte die Datei reorganisiert werden, da beim Sortieren die physi­ +kalische Reihenfolge der Sätze nicht verändert wird. In diesem Fall +ergibt sich nach dem Reorganisieren ein Geschwindigkeitsvorteil. + + +4.4 Bearbeiten + +#on("b")#Kopieren#off("b")# Durch Kopieren kann ein Ausschnitt aus der +virtuellen +Datei in eine andere EUDAS-Datei kopiert werden. Es werden alle +ausgewählten Sätze kopiert. Wenn mindestens ein Satz markiert ist, +werden alle markierten Sätze als ausgewählt betrachtet, ansonsten +alle, die durch die Suchbedingung angegeben sind. Die kopierten +Sätze werden am Ende der Zieldatei angefügt. + Welche Felder kopiert werden sollen, wird durch das Kopier­ +muster angegeben. Hierbei können auch mehrere Felder zu einem +verschmolzen werden. Allgemein ergeben sich die Felder der Ziel­ +datei aus einem beliebigen ELAN-Ausdruck. + Das Kopiermuster ist ein ELAN-Programm und enthält im we­ +sentlichen Ausdrücke der Form + + + "Feldname" K Ausdruck ; + + +Durch diese Anweisung wird der Ausdruck in das Feld der Zieldatei +mit dem angegebenen Namen kopiert. Existiert dieses Feld in der +Zieldatei noch nicht, so wird es als letztes angefügt. Falls die +Zieldatei noch nicht existiert, wird sie eingerichtet. In diesem Fall +bestimmt also die Reihenfolge der 'K'-Ausdrücke die Reihenfolge der +Feldnamen in der Zieldatei. + Da die Reihenfolge der 'K'-Ausdrücke wichtig ist, dürfen diese +nicht in einer IF-Anweisung stehen, sondern müssen für jeden Satz +komplett in der gleichen Reihenfolge ausgeführt werden. + +#on("b")#Standard-Kopiermuster#off("b")# Vor dem Kopieren wird ein Standard- +Kopiermuster zum Editieren angeboten, das sich nach der Zieldatei +richtet. Existiert die Zieldatei noch nicht, wird das Muster so kon­ +struiert, daß alle Felder der virtuellen Datei unverändert kopiert +werden. Wollen Sie einige Felder nicht kopieren, brauchen Sie nur +die entsprechenden Zeilen zu löschen; wollen Sie die Felder in eine +andere Reihenfolge bringen, müssen Sie die Zeilen umordnen. + Existiert die Zieldatei bereits, gibt das Standard-Kopiermuster +an, daß alle Felder der Zieldatei einen Wert erhalten. Ist ein Feld +der Zieldatei in der virtuellen Datei enthalten, so wird dieses ko­ +piert, ansonsten erhält das Feld einen leeren Inhalt. Sie können in +diesem Fall weitere Felder angeben oder für die leeren Felder Aus­ +drücke formulieren. + +#on("b")#Tragen#off("b")# Durch Tragen werden alle ausgewählten Sätze der +virtuel­ +len Datei in eine andere Datei transportiert. Sie sind in der vir­ +tuellen Datei dann nicht mehr vorhanden. Damit bei diesem Vorgang +keine Informationen verlorengehen können, muß die Zieldatei so +viele Felder haben wie die virtuelle Datei. Normalerweise sollte sie +in der Feldstruktur mit der virtuellen Datei übereinstimmen. + Die getragenen Sätze werden jeweils am Ende der Datei ange­ +fügt. + Beim Tragen können zusätzlich noch Konsistenzbedingungen +überprüft werden. Die Prüfbedingungen sind in der Zieldatei gespei­ +chert und können beim Ändern der Feldstruktur angegeben werden. + Die Prüfbedingung ist ein ELAN-Programm, das vor dem Tragen +des jeweiligen Satzes ausgeführt wird. Durch spezielle Testprozedu­ +ren kann das Tragen des Satzes verhindert werden, wenn diese +Prozeduren ein negatives Ergebnis liefern. Gleichzeitig wird eine +Meldung in eine Protokolldatei geschrieben, die dann zur Identifi­ +zierung der fehlerhaften Sätze dienen kann. + Folgende Prüfprozeduren stehen zur Verfügung (siehe auch +Abschnitt 8.3): + + + pruefe ("Feldname", Bedingung) + + Hiermit kann eine beliebige Bedingung (BOOL-Ausdruck in + ELAN) überprüft werden. + + + wertemenge ("Feldname", "Wert1,Wert2,...,Wertn") + + Das Feld muß einen in der angegebenen Liste enthaltenen + Werte annehmen. + + + feldmaske ("Feldname", "Maske") + + Das Feld wird auf Übereinstimmung mit der Maske geprüft. + Fünf spezielle Zeichen in der Maske können dabei auf + mehrere Zeichen zutreffen: + '9' alle Ziffern + 'a' alle Kleinbuchstaben, Umlaute, 'ß' + 'A' alle Großbuchstaben, Umlaute + 'X' alle Zeichen + '*' Folge von beliebigen Zeichen + Der Stern sollte sparsam angewendet werden, da er verar­ + beitungsaufwendig ist. + + + eindeutige felder (n) + + Die Zahl 'n' gibt an, die wieviel ersten Felder der Zieldatei + eindeutig sein müssen. Stimmt der zu tragende Satz mit + einem Satz der Zieldatei in diesen Feldern überein, wird + eine Fehlermeldung erzeugt. + +Es können auch einzelne Sätze manuell getragen werden. In diesem +Fall wird die Prüfbedingung nicht getestet. Ebenso kann der Satz +wieder zurückgeholt und in der aktuellen Datei eingefügt werden. + +#on("b")#Nach Vorschrift ändern#off("b")# Die ausgewählten Sätze der +virtuellen +Datei können automatisch nach einer Verarbeitungsvorchrift geän­ +dert werden. Die Verarbeitungsvorschrift ist ein ELAN-Programm, in +dem mit Hilfe des Operators 'V' Änderungen angegeben werden: + + + "Feldname" V TEXT-Ausdruck ; + + +Das angegebene Feld erhält den Inhalt, der durch den Ausdruck +angegeben ist. Änderungen an Koppeldateien werden wie im Dialog +behandelt (s. Abschnitt 3.4). + + + + diff --git a/doc/eudas/eudas.ref.5 b/doc/eudas/eudas.ref.5 new file mode 100644 index 0000000..02971ea --- /dev/null +++ b/doc/eudas/eudas.ref.5 @@ -0,0 +1,432 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (49)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +5 Drucken und Druckmuster + + + +5.1 Druckmustersyntax + +Ein Druckmuster ist eine Beschreibung für die Form, in der die In­ +halte einer EUDAS-Datei ausgedruckt werden sollen. Der syntakti­ +sche Aufbau des Druckmusters ist zeilenorientiert und gehorcht +folgender Syntax: + + Druckmuster : + [ Initialisierungsteil ] + [ Vorspann ] + [ Wiederholungsteil ] + [ Nachspann ] + + Initialisierungsteil : + ( Kommandozeile #char (""124"")# Textzeile )* + ( GRUPPE-Anweisung #char(""124"")# Textzeile )* + + Vorspann : + VORSPANN-Anweisung Abschnitt + + Wiederholungsteil : + WIEDERHOLUNG-Anweisung Abschnitt + + Nachspann : + NACHSPANN-Anweisung Abschnitt + + Abschnitt : + Musterteil + [ ABKUERZUNGEN-Anweisung Abkürzungsteil ] + + Musterteil : + ( Musterzeile #char(""124"")# Kommandozeile #char(""124"")# + MODUS-Anweisung #char (""124"")# MEHR-Anweisung )* + +Zur Notation: [] bedeutet optional, ()* beliebig häufige Wiederho­ +lung, #char(""124"")# Alternative und keine Angabe einfache Aneinanderreihung. +Die verschiedenen Zeilentypen werden weiter unten beschrieben. + Zusätzlich gilt die Bedingung, daß von Vorspann, Wiederho­ +lungsteil und Nachspann mindestens einer vorhanden sein muß. + +#on("b")#Zeilentypen#off("b")# Im Druckmuster gibt es 6 verschiedene +Zeilentypen: + +#on("i")#Kommandozeilen#off("i")# + Eine Kommandozeile beginnt mit '%%' in der ersten und zweiten + Spalte. Der Inhalt der Zeile ab Spalte 3 wird dem ELAN-Compi­ + ler übergeben. Die Bedeutung dieser Zeilen ergibt sich aus dem + in 5.4 beschriebenen Übersetzungsmechanismus. + +#on("i")#Anweisungen#off("i")# + Anweisungen beginnen mit '%' in der ersten Spalte und dienen + zur Steuerung des Druckgenerators. Der Name der Anweisung + muß in Großbuchstaben und ohne Leerzeichen geschrieben + werden. Davor dürfen sich noch Leerzeichen befinden. An­ + schließend können noch Parameter folgen, die nur durch Leer­ + zeichen getrennt aneinander gereiht werden. Die Syntax einer + Anweisung ähnelt der eines Operators in ELAN. + +#on("i")#Textzeilen#off("i")# + Textzeilen sind die nicht anderweitig markierten Zeilen im + Initialisierungsteil. Sie werden unverändert an den Anfang + jeder Druckdatei gestellt. + +#on("i")#Musterzeilen#off("i")# + Musterzeilen sind nicht besonders gekennzeichnete Zeilen im + Musterteil. Sie enthalten Feldmuster und werden nach dem + Einsetzen von Inhalten in die Ausgabedatei übernommen. Die + Interpretation der Musterzeilen wird in Abschnitt 5.3 beschrie­ + ben. + +#on("i")#Abkürzungszeilen#off("i")# + Abkürzungszeilen markieren den Beginn einer Abkürzung im + Abkürzungsteil eines Abschnittes. Sie werden durch '&' in der + ersten Spalte gekennzeichnet. Darauf folgt ohne Zwischenraum + der Name einer Abkürzung (ohne Leerzeichen) und danach + durch Leerzeichen getrennt ein Semikolon. Der Name der Ab­ + kürzung wird bei der Übersetzung durch einen Refinementnamen + ersetzt und die Zeile dem ELAN-Compiler übergeben. Der Rest + der Zeile kann also den Beginn eines werteliefernden Refine­ + ments enthalten. + +#on("i")#Programmzeilen#off("i")# + Programmzeilen sind die nicht durch '&' markierten Zeilen im + Abkürzungsteil. Sie werden unverändert an den ELAN-Compiler + übergeben. Der erlaubte Inhalt richtet sich nach dem Überset­ + zungsmechanismus (5.4). + + +5.2 Der Druckvorgang + +Der Druckvorgang besteht im wesentlichen darin, daß für alle zu +bearbeitenden Sätze der Wiederholungsteil einmal interpretiert wird +und das Ergebnis in eine Ausgabedatei geschrieben wird, die dann +gedruckt werden kann. Wenn mindestens ein Satz markiert ist, wer­ +den alle markierten Sätze der virtuellen Datei bearbeitet, ansonsten +alle durch die Suchbedingung erfaßten. + +#on("b")#Gruppen#off("b")# Eine #on("i")#Gruppe#off("i")# ist eine Folge von Sätzen, die in einem be­ +stimmten Merkmal übereinstimmen. Durch eine GRUPPE-Anweisung +der Form + + + % GRUPPE n Ausdruck + + +werden aufeinanderfolgende Sätze mit gleichem Wert des angegebe­ +nen Ausdrucks gruppiert. Über die Nummer 'n' kann festgestellt +werden, ob sich das angegebene Merkmal verändert hat. Dies ge­ +schieht mit der Prozedur + + + BOOL PROC gruppenwechsel (INT CONST gruppennr) + + +Immer wenn zwischen zwei Sätzen ein Gruppenwechsel stattfindet, +wird beim vorigen Satz der Nachspann und beim folgenden Satz der +Vorspann einmal interpretiert. Dies führt dazu, daß entsprechende +Vorspann- bzw. Nachspannzeilen gedruckt werden. + Vor dem ersten und nach dem letzten zu bearbeitenden Satz +wechseln alle Gruppen, d.h. dort wird immer ein Vorspann bzw. +Nachspann erzeugt. + Ist ein zu interpretierender Abschnitt nicht vorhanden, so wird +an dieser Stelle keine Ausgabe erzeugt. Die Textzeilen des Initali­ +sierungsteils werden auf jeden Fall bei Beginn des Druckvorganges +in die Ausgabedatei geschrieben. Falls die Ausgabedatei voll ist, +wird eine neue Datei angefangen und die Zeilen des Initialisie­ +rungsteils erneut an den Anfang gestellt. + + + Satz- Gruppen- Ausgabe + nummer merkmal +#free (0.1)# + Initialisierungsteil + ------------------------------------------------- + 1 x Vorspann + WDH-Teil + 2 x WDH-Teil + Nachspann + ------------------------------------------------- + 3 y Vorspann + WDH-Teil + 4 y WDH-Teil + 5 y WDH-Teil + Nachspann + ------------------------------------------------- + ENDE + +#center#Abb. 5-1 Ablauf des Druckvorganges mit Gruppen + + +#on("b")#Spaltendruck#off("b")# Normalerweise werden die Ausgaben der +einzelnen +Abschnitte hintereinander in der Ausgabedatei plaziert. Durch An­ +gabe einer Nummer als Parameter in der WIEDERHOLUNG-Anweisung +können auch soviel Spalten wie angegeben nebeneinander gedruckt +werden. Die Spaltenbreite wird dabei durch das Dateilimit (Komman­ +do 'limit' im Editor) festgelegt. Alternativ kann die Spaltenbreite +auch als zweiter Parameter durch Leerzeichen getrennt angegeben +werden. + Vorspann und Nachspann werden jedoch auf jeden Fall wieder +in eine eigene Zeile geschrieben, der Spaltendruck also unterbro­ +chen. + + +5.3 Interpretation von Musterzeilen + +Musterzeilen können Feldmuster enthalten, die bei der Interpreta­ +tion durch entsprechende Inhalte ersetzt werden, ehe die Muster­ +zeile in die Ausgabedatei übernommen wird. Der Beginn eines Feld­ +musters wird durch ein Musterzeichen ('&' oder '%') markiert. Wo +und wie der Inhalt eingesetzt wird, kann durch folgende Variationen +angegeben werden: + + + Typ ! Beispiel ! Position ! Länge ! bündig + ----+-----------+------------------------------ + 1 ! &Name ! fest ! variabel ! links + 2 ! %Name ! variabel ! variabel ! links + 3 ! &Name&&& ! fest ! fest ! links + 4 ! %Name%%% ! variabel ! fest ! links + 5 ! &&&Name& ! fest ! fest ! rechts + 6 ! %%%Name% ! variabel ! fest ! rechts + + +Der in dem Feldmuster angegebene Name muß Name einer Abkür­ +zung in irgendeinem Abkürzungsteil oder eines Feldes sein. Der +Name darf kein Leerzeichen oder Musterzeichen enthalten. Falls dies +doch der Fall ist, muß der Name in spitze Klammern eingeschlossen +werden. + Bei fester Länge wird bei zu kurzem Inhalt mit Leerzeichen +aufgefüllt, bei zu langem Inhalt abgeschnitten. Bei linksbündigem +Einsetzen geschieht dies an der rechten, sonst an der linken Seite. + Feldmuster variabler Länge können je nach Inhalt dazu führen, +daß der folgende Teil der Musterzeile verschoben wird. Für diesen +Einsetzprozeß gelten die folgenden Regeln: + +#on("b")#Position#off("b")# Feldmuster fester Position (mit '&' beginnend) +werden +immer in der Position eingesetzt, in der sie stehen. Feldmuster +variabler Position (mit '%' beginnen) können nach rechts verschoben +werden, wenn vorherige Inhalte länger als ihre Muster sind, und +nach links, wenn Modus 1 oder 3 eingestellt ist und vorherige In­ +halte kürzer sind. + +#on("b")#Länge#off("b")# Feldmuster variabler Länge erhalten auf jeden Fall +den +Platz, der durch die Länge des Feldmusters reserviert ist. Sind die +Inhalte kürzer, kann der gewonnene Platz als Reserve für andere +Feldmuster verwendet werden; sind die Inhalte länger, so wird der +Inhalt so weit eingesetzt, wie noch Reserve vorhanden ist und der +Rest abgeschnitten. + Muß in ein Feldmuster variabler Länge ein leerer Inhalt einge­ +setzt werden, so werden beim Drucken auch die auf das Feldmuster +folgenden Leerzeichen unterdrückt, falls vor dem Feldmuster noch +ein Leerzeichen steht oder das Feldmuster in Spalte 1 beginnt. + Feldmuster fester Länge werden immer in ihrer reservierten +Länge eingesetzt. Sie werden im folgenden behandelt wie Feldmuster +variabler Länge, deren Inhalt so lang ist wie das Feldmuster. + +#on("b")#Verteilung#off("b")# Die Verteilung der verschiebbaren Feldmuster +auf der +Zeile geschieht jeweils in dem Abschnitt zwischen zwei Feldmustern +fester Position bzw. Zeilenanfang oder Zeilenende. Für jeden Ab­ +schnitt wird festgestellt, wieviel Stellen die Inhalte insgesamt mehr +oder weniger als ihre Muster benötigen. + Der Längenausgleich geschieht zwischen dem letzten Feldmuster +und dem Ende des Abschnitts. Dort wird ein Pufferplatz bestimmt, +der bei Überlänge bis auf ein Leerzeichen verkleinert werden kann +und an dem bei Unterlänge zusätzliche Leerzeichen eingefügt wer­ +den. + Außer am Pufferplatz wird an keinem Mustertext des Abschnitts +etwas geändert. Zwischentexte zwischen den Feldmustern werden +unverändert übertragen und mit den umgebenden Feldmustern ver­ +schoben. + Als Pufferplatz wird die erste Lücke hinter dem letzten Feld­ +muster eines Abschnittes verwendet, die mehr als ein Leerzeichen +enthält. Ist keine solche Lücke vorhanden, wird das Ende des Ab­ +schnitts verwendet, falls dort ein Leerzeichen steht, und sonst das +Ende des letzten Feldmusters. + Die durch den Pufferplatz und kürzere Inhalte gewonnene Re­ +serve wird von links an die Feldmuster mit Überlänge verteilt, bis +die Reserve verbraucht ist. + +#on("b")#Zeilende#off("b")# Das Zeilenende wird als ein Quasi-Feldmuster mit +fester +Position aufgefaßt, das am Limit der Druckmusterdatei steht. Es +sind also keine Einsetzungen möglich, die über das Limit der Datei +hinausgehen. Als Pufferplatz wird hier jedoch die erste Blanklücke +vom Zeilenende her verwendet, damit Mustertexte am Zeilenende +gegebenenfalls stehenbleiben. Ist keine solche Lücke vorhanden, so +wird das Zeilenende als Pufferplatz verwendet. + Obwohl nicht als Pufferplatz ausgewiesen, kann der Raum zwi­ +schen Zeilenende und Dateilimit als Reserve verwendet werden. + +#on("b")#Modi#off("b")# Der Einsetzmechanismus kann durch die MODUS-Anweisung +mit einem Parameter verändert werden. Folgende Modi stehen zur +Verfügung: + + + Modus ! Effekt + ------+---------------------------------------- + 1 ! Normalmodus. + ! '%'-Feldmuster werden auch + ! nach links geschoben. + ! Keine Zeilenwiederholung. + ------+---------------------------------------- + 2 ! Tabellenmodus. + ! '%'-Feldmuster werden nicht + ! nach links geschoben. + ! Keine Zeilenwiederholung. + ------+---------------------------------------- + 3 ! Normalmodus mit Zeilenwiederholung. + ! '%'-Feldmuster werden auch + ! nach links geschoben. + ! Zeilenwiederholung ohne Zwischentexte. + ------+---------------------------------------- + 4 ! Tabellenmodus mit Zeilenwiederholung. + ! '%'-Feldmuster werden nicht + ! nach links geschoben. + ! Zeilenwiederholung mit Zwischentexten. + ------+---------------------------------------- + + +Bei Zeilenwiederholung werden Inhalte in einer folgenden Zeile +fortgesetzt, falls sie in der ersten Zeile nicht untergebracht werden +konnten. Dazu wird die Musterzeile mit den Restinhalten erneut +interpretiert. Je nach Modus werden auch die Zwischentexte noch +wiederholt. Der Restinhalt umfaßt immer noch das ganze letzte Wort, +das nicht mehr auf die vorige Zeile paßte. Es findet also ein Um­ +bruch statt. Die Positionen, die in der vorigen Zeile vom Anfang des +Wortes eingenommen würden, werden durch Leerzeichen ersetzt. + Durch die MEHR-Anweisung mit einem Parameter kann die Zahl +der Zeilenwiederholungen für die nächste Musterzeile festgesetzt +werden. Dies hat jedoch nur eine Auswirkung, falls Zeilenwieder­ +holung zugelassen ist. Stehen zur Interpretation keine Restinhalte +mehr zur Verfügung, wird mit leeren Inhalten weitergearbeitet. Kann +ein Inhalt bei der vorgegebenen Anzahl von Zeilen nicht ganz dar­ +gestellt werden, wird der Rest nicht ausgegeben. + + +5.4 Anschluß zum ELAN-Compiler + +Falls in einem Druckmuster Abkürzungen, Kommandozeilen oder +Gruppendefinitionen vorkommen, wird das Druckmuster in ein +ELAN-Programm umgewandelt, das dann vom ELAN-Compiler über­ +setzt wird. + Alle Zeilen eines Abkürzungsteils werden direkt in das Pro­ +gramm übernommen, wobei der Name einer Abkürzung durch einen +beliebig gewählten Refinementnamen ersetzt wird ('abk' + eine lau­ +fende Nummer). Alle Abkürzungen und Refinements werden als glo­ +bale Refinements definiert, also außerhalb von Prozeduren. Dadurch +wird erreicht, daß sie an jeder Stelle verwendet werden können. + Damit eine Abkürzung richtig als Refinement übersetzt wird, +muß sie ein TEXT-Objekt als Wert liefern. Die anderen Refinements +sind beliebig, da sie nur in selbstdefinierten Anweisungen verwen­ +det werden. Die Refinements der Abkürzungen werden in einer Zu­ +weisung an eine TEXT-Variable verwendet, damit der Druckgenera­ +tor auf den entsprechenden Wert zugreifen kann. + Jeder Abschnitt wird dagegen als eine Prozedur übersetzt. Eine +Folge von Musterzeilen wird in eine Anweisung übersetzt, diese +Musterzeilen einzusetzen und zu drucken. Eine '%%'-Anweisung wird +einfach unverändert dazwischengeschrieben. Die Prozedur für den +Wiederholungsteil wird einmal für jeden ausgewählten Satz aufgeru­ +fen, die Vorspann- und die Nachspann-Prozedur einmal bei jedem +Gruppenwechsel. + Anweisungen im Initialisierungsteil werden an den Anfang des +Programms als globale Definitionen gestellt. + +#on("b")#Fehler#off("b")# Findet sich in dem erzeugten ELAN-Programm ein +Fehler, +der durch den Druckgenerator nicht erkannt werden konnte (z.B. +eine Abkürzung liefert keinen Wert), so muß der ELAN-Compiler +diesen Fehler erkennen. Anschließend zeigt er das erzeugte Pro­ +gramm zusammen mit seinen Fehlermeldungen im Paralleleditor. Sie +müssen nun die Fehlermeldung lokalisieren und anhand der eben +gegebenen Hinweise in das ursprüngliche Druckmuster zurücküber­ +setzen, damit Sie dort den Fehler korrigieren können. + + +5.5 Fehlermeldungen + +Folgende Fehlermeldungen können bei der Übersetzung eines Druck­ +musters auftreten: + +#on("i")#keine schliessende Klammer in Feldmuster#off("i")# + Wenn der Name in einem Feldmuster in spitze Klammern einge­ + schlossen werden soll, muß noch in der gleichen Zeile eine + schließende Klammer vorhanden sein. + +#on("i")#kein Kommando in Kommandozeile#off("i")# + Eine Zeile, die mit '%' beginnt, enthält keinen weiteren Text. + +#on("i")#unbekanntes Kommando#off("i")# + Das erste Wort in einer Kommandozeile ist kein bekanntes Kom­ + mando. + +#on("i")#kein % WIEDERHOLUNG gefunden#off("i")# + Das Druckmuster enthält keine Anweisung, die den Beginn eines + Abschnittes markiert. Es muß aber mindestens ein Abschnitt + vorhanden sein. + +#on("i")#nur GRUPPE-Anweisung erlaubt#off("i")# + Im Initialisierungsteil ist nur die GRUPPE-Anweisung erlaubt. + +#on("i")#keine ELAN-Anweisung im Initialisierungsteil nach Gruppen­ +definition#off("i")# + Sobald im Initialisierungsteil eine GRUPPE-Anweisung aufgetreten + ist, ist keine Kommandozeile mehr möglich. + +#on("i")#illegale Gruppennummer#off("i")# + In einer GRUPPE-Anweisung wurde eine zu große Nummer angege­ + ben. Gruppen sollten von 1 an durchnumeriert werden. + +#on("i")#diese Gruppe wurde schon definiert#off("i")# + Eine Gruppennummer wurde mehrfach verwendet. + +#on("i")#diese Abkürzung ist nicht definiert#off("i")# + Ein Name in einem Feldmuster tritt nicht als Feld-oder Abkür­ + zungsname auf. Eventuell enthält er ein Leerzeichen! + +#on("i")#dieser Abschnitt wurde schon einmal definiert#off("i")# + Kein Abschnitt kann mehrmals angegeben werden. + +#on("i")#falscher Modus#off("i")# + In einer MODUS-Anweisung wurde ein nicht definierter Modus als + Parameter angegeben. + +#on("i")#diese Anweisung darf im Musterteil nicht vorkommen#off("i")# + +#on("i")#im Abkürzungsteil darf keine Anweisung auftreten#off("i")# + +#on("i")#in dieser Zeile stehen zu viele Feldmuster#off("i")# + Es können maximal 24 Feldmuster in einer Zeile stehen. Abhilfe: + mehrere Feldmuster durch eine Abkürzung zusammenfassen. + +#on("i")#das Druckmuster enthält zu viele Feldmuster#off("i")# + Die Gesamtanzahl der Feldmuster ist begrenzt. Abhilfe: mehrere + Feldmuster durch eine Abkürzung zusammenfassen. + +#on("i")#nach dem "&" soll direkt der Name einer Abkürzung folgen#off("i")# + In einer Abkürzungszeile stehen Leerzeichen hinter dem '&'. + +#on("i")#kein Doppelpunkt nach Abkürzung#off("i")# + Nach dem Abkürzungsnamen in einer Abkürzungszeile muß durch + ein Leerzeichen getrennt ein Doppelpunkt folgen. + +#on("i")#Abkürzung mehrfach definiert#off("i")# + Die Abkürzung wurde unter dem gleichen Namen schon einmal, + vielleicht in einem anderen Abschnitt, definiert. + +#on("i")#das Druckmuster enthält zu viele Abkürzungen#off("i")# + Abhilfe: mehrere Abkürzungen zu einem Ausdruck zusammenfas­ + sen. + + diff --git a/doc/eudas/eudas.ref.6 b/doc/eudas/eudas.ref.6 new file mode 100644 index 0000000..7c8ada6 --- /dev/null +++ b/doc/eudas/eudas.ref.6 @@ -0,0 +1,399 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (61)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +6 Struktur von EUDAS-Dateien + + + +EUDAS-Dateien können unabhängig von EUDAS über den Daten­ +typ EUDAT manipuliert werden. Die zur Verfügung stehenden Zu­ +griffsoperationen sind in diesem Kapitel beschrieben. + Der Datentyp EUDAT ist analog zum Datentyp FILE. Jede +EUDAT-Variable kann an eine EUDAS-Datei angekoppelt werden. +Dadurch lassen sich beliebig viele EUDAS-Dateien gleichzeitig be­ +arbeiten. Wie der Abschnitt 6.6 zeigt, sind so auch ganz andere +Anwendungen realisierbar. + Die wesentlichen EUDAS-Funktionen (Ansehen, Suchen, Druk­ +ken) können jedoch nicht direkt auf EUDAT-Variablen angewendet +werden, sondern greifen auf die virtuelle Datei zu, die im nächsten +Kapitel beschreiben wird. + + +6.1 Der Datentyp SATZ + +Der Datentyp SATZ stellt einen einzelnen EUDAS-Satz dar, der +intern als TEXT realisiert ist. Ein SATZ besteht aus bis zu 256 +Feldern, die jeweils einen TEXT enthalten können. Nach dem Initi­ +alisieren sind alle Felder mit "" vorbelegt. Die Felder können über +Nummern von 1 bis 256 angesprochen werden. + Damit kann man sich einen SATZ als dynamisches ROW n TEXT +vorstellen, das bis zu 256 Elemente haben kann. Anders als ein +entsprechendes ROW belegt ein leerer SATZ praktisch keinen Spei­ +cherplatz. + Folgende Zugriffsprozeduren stehen zur Verfügung: + +TYPE SATZ + +OP := (SATZ VAR, SATZ CONST) + +PROC satz initialisieren (SATZ VAR) + Jeder SATZ muß vor Benutzung initialisiert werden. + +INT PROC felderzahl (SATZ CONST) + Liefert die Nummer des höchsten belegten Feldes. + +PROC feld lesen (SATZ CONST, INT CONST feldnr, + TEXT VAR inhalt) + Liest den Inhalt des Feldes 'feldnr' in 'inhalt'. + + FEHLER: + + #on("i")#n ist keine Feldnummer#off("i")# + 'n' liegt außerhalb des Bereiches 1..256. + +PROC feld bearbeiten (SATZ CONST, INT CONST feldnr, + PROC (TEXT CONST, INT CONST, INT CONST) bearbeite) + Ruft 'bearbeite' auf, wobei 'bearbeite' ein Text und zwei Posi­ + tionen in diesem Text übergeben werden. Die Positionen geben + das erste und das letzte Zeichen des durch 'feldnr' ausgewähl­ + ten Feldes an. Ist der Anfang größer als das Ende, so ist das + Feld leer. + + FEHLER: + + #on("i")#n ist keine Feldnummer#off("i")# + 'n' liegt außerhalb des Bereiches 1..256. + +PROC feld aendern (SATZ VAR, INT CONST feldnr, + TEXT CONST inhalt) + Schreibt 'inhalt' in das Feld mit der Nummer 'feldnr' + + FEHLER: + + #on("i")#n ist keine Feldnummer#off("i")# + 'n' liegt außerhalb des Bereiches 1..256. + +INT PROC feldindex (SATZ CONST, TEXT CONST muster) + Falls eines der Felder 'muster' enthält, wird die Nummer dieses + Feldes geliefert, sonst 0. + + +6.2 Der Datentyp EUDAT + +Der Datentyp EUDAT muß ähnlich wie ein FILE an einen benann­ +ten oder unbenannten Datenraum angekoppelt werden. Der Daten­ +raum hat anschließend den Typ 3243. Weitere Zugriffe auf eine +EUDAT-Variable sind erst nach erfolgtem Ankoppeln zulässig. An­ +derenfalls können undefinierte Fehler entstehen. + +TYPE EUDAT + +PROC oeffne (EUDAT VAR, TEXT CONST dateiname) + Koppelt die EUDAT-Variable an die EUDAS-Datei mit dem + Namen 'dateiname' an. Die Datei wird eingerichtet, falls sie + noch nicht existiert. + + FEHLER: + + #on("i")#Datei ist keine EUDAS-Datei#off("i")# + Die angegebene Datei hat nicht den Typ 3243. + +PROC oeffne (EUDAT VAR, DATASPACE CONST ds) + Koppelt die EUDAT-Variable an den Datenraum 'ds'. + + FEHLER: + + #on("i")#Datei ist keine EUDAS-Datei#off("i")# + Der Datenraum wurde bereits verwendet und hat nicht den Typ + 3243. + +Eine EUDAS-Datei ist in Felder und Sätze unterteilt. Die Felder +werden beim Zugriff über Nummern angesprochen. Jedem Feld ist +jedoch zur Identifikation ein TEXT als Feldname zugeordnet. Die +Feldnamen werden als SATZ gespeichert, wobei jedes Feld seinen +zugeordneten Namen enthält. + +INT PROC felderzahl (EUDAT CONST) + Liefert Anzahl der benannten Felder. Ist zu Anfang 0. + +PROC feldnamen aendern (EUDAT VAR, + SATZ CONST neue namen) + Setzt die Feldnamen einer Datei. Ist 'felderzahl (neue namen)' + größer als die Felderzahl der Datei, so wird die Felderzahl der + Datei entsprechend heraufgesetzt. + +PROC feldnamen lesen (EUDAT CONST, SATZ VAR namen) + Liefert alle Feldnamen in einer SATZ-Variablen. + +Eine EUDAS-Datei enthält drei zusätzliche Notiztexte. Zwei davon +sind bereits reserviert, und zwar: +#free (0.2)# + 1: Prüfbedingungen + 2: Datum der letzten Änderung + +Der dritte kann für freie Notizen verwendet werden. + +PROC notizen lesen (EUDAT CONST, INT CONST notiz nr, + TEXT VAR notizen) + Schreibt die Notizen der EUDAS-Datei in 'notizen' ('notiz nr' = + 1,2,3). + +PROC notizen aendern (EUDAT VAR, INT CONST notiz nr, + TEXT CONST notizen) + Ändert die Notizen. Alte Notizen werden dabei überschrieben + ('notiz nr' = 1,2,3). + + +6.3 Satzposition + +Eine EUDAS-Datei läßt sich sequentiell vorwärts und rückwärts +bearbeiten. Dazu gibt es eine aktuelle Satzposition. Ein bestimmter +Satz kann auch direkt angesprungen werden. Die Prozeduren, die +nach dem Inhalt des ersten Feldes suchen, arbeiten besonders +schnell, da die entsprechenden Sätze über eine Hashmethode gefun­ +den werden. + +INT PROC satznr (EUDAT CONST) + Liefert aktuelle Satzposition. + +INT PROC saetze (EUDAT CONST) + Liefert Anzahl der Sätze. + +BOOL PROC dateiende (EUDAT CONST) + Liefert TRUE, wenn 'satznr' groesser als 'saetze' ist. Die letzte + erreichbare Satzposition liegt um eins hinter dem letzten Satz + (um auch am Ende anfügen zu können). + +PROC auf satz (EUDAT VAR, INT CONST satznr) + Positioniert auf den gewünschten Satz. Bei nicht existierenden + Sätzen wird auf den ersten bzw. hinter den letzten Satz ge­ + sprungen. + +PROC weiter (EUDAT VAR) + Geht einen Satz weiter, jedoch nicht über das Dateiende hinaus. + +PROC zurueck (EUDAT VAR) + Geht einen Satz zurück, falls der erste Satz noch nicht erreicht + ist. + +PROC auf satz (EUDAT VAR, TEXT CONST muster) + Positioniert auf den ersten Satz, der als erstes Feld 'muster' + enthält, anderenfalls hinter den letzten Satz. + +PROC weiter (EUDAT VAR, TEXT CONST muster) + Geht weiter, bis das erste Feld 'muster' enthält, bzw. bis hinter + den letzten Satz. + +PROC zurueck (EUDAT VAR, TEXT CONST muster) + Geht zurück, bis das erste Feld 'muster' enthält, bzw. auf den + ersten Satz der EUDAS-Datei. + + +6.4 Satzzugriffe + +Der aktuelle Satz ist ein SATZ-Objekt. Auf die Felder des aktuellen +Satzes kann direkt zugegriffen werden. + +PROC feld lesen (EUDAT CONST, INT CONST feldnr, + TEXT VAR inhalt) + Wirkt wie 'feld lesen' auf den aktuellen Satz. + +PROC feld aendern (EUDAT VAR, INT CONST feldnr, + TEXT CONST inhalt) + Wirkt wie 'feld aendern' auf den aktuellen Satz. + +PROC feld bearbeiten (EUDAT CONST, INT CONST feldnr, + PROC (TEXT CONST, INT CONST, INT CONST) bearbeite) + Wirkt wie 'feld bearbeiten' auf den aktuellen Satz. + +Der aktuelle Satz kann auch als Ganzes bearbeitet werden. + +PROC satz lesen (EUDAT CONST, SATZ VAR satz) + Liefert den aktuellen Satz. + +PROC satz aendern (EUDAT VAR, SATZ CONST satz) + Ersetzt den aktuellen Satz durch 'satz'. + +PROC satz einfuegen (EUDAT VAR, SATZ CONST satz) + Fügt 'satz' vor dem aktuellen Satz ein. + + FEHLER: + + #on("i")#EUDAS-Datei voll#off("i")# + Eine EUDAS-Datei faßt mindestens 5000 Sätze. + +PROC satz loeschen (EUDAT VAR) + Löscht den aktuellen Satz. + + +6.5 Sortieren und Reorganisieren + +Zum Sortieren können für die einzelnen Felder Typen angegeben +werden, damit auch Zahlen und Daten richtig sortiert werden kön­ +nen. Außerdem kann die Feldreihenfolge angegeben werden, nach +der sortiert werden soll. + +PROC feldinfo (EUDAT VAR, INT CONST feldnr, info) + Setzt den Feldtyp des Feldes 'feldnr'. Es bedeuten + -1 : normaler Text (Standard) + 0 : Text nach DIN. Ziffern und Sonderzeichen werden igno­ + riert. Groß-und Kleinbuchstaben gelten gleich. Umlaute + werden beachtet. + 1 : Zahl (beim Vergleich werden alle Zeichen außer Zif­ + fern ignoriert). + 2 : Datum. Es werden Daten der Form "tt.mm.jj" vergli­ + chen. + +INT PROC feldinfo (EUDAT CONST, INT CONST feldnr) + Der Feldtyp des angegebenen Feldes wird geliefert. Zu Anfang + ist -1 voreingestellt. + +INT PROC unsortierte saetze (EUDAT CONST) + Liefert die Anzahl von Sätzen, die seit dem letzten Sortiervor­ + gang geändert wurden. Bei einer neuen Datei, die noch nie + sortiert wurde, wird immer 0 geliefert. + +PROC dezimalkomma (TEXT CONST komma) + Stellt das Dezimalkomma ein, das beim Vergleich von Zahlen + gelten soll. + + FEHLER: + + #on("i")#Nicht erlaubtes Dezimalkomma#off("i")# + Nur Texte der Länge 1 sind zugelassen. + +TEXT PROC dezimalkomma + Liefert das eingestellte Dezimalkomma ("," ist voreingestellt). + +PROC sortiere (EUDAT VAR, TEXT CONST reihenfolge) + Sortiert die Datei in der von 'reihenfolge' angegebenen Reihen­ + folge. Dabei enthält 'reihenfolge' an der Stelle 2*i+1 den Code + der Feldnummer, die als i-te in der Sortierung berücksichtigt + werden soll. Das Zeichen an der Stelle 2*i gibt an, ob das Feld + mit der davorstehenden Feldnummer aufsteigend ('+') oder + absteigend ('-') sortiert werden soll. + +PROC sortiere (EUDAT VAR) + Sortiert die Datei in der zuletzt eingestellten Reihenfolge. + Wurde noch keine Reihenfolge angegeben, wird die Datei in der + Feldreihenfolge sortiert. + +TEXT PROC sortierreihenfolge (EUDAT CONST) + Liefert die zuletzt eingestellte Reihenfolge. Wurde noch nicht + sortiert, so wird "" geliefert. + +Nach umfangreichen Änderungen an einer EUDAS-Datei ist eine +Reorganisation sinnvoll, um "Textleichen" zu beseitigen. + +PROC reorganisiere (TEXT CONST dateiname) + Die EUDAS-Datei mit dem Namen 'dateiname' wird reorgani­ + siert. + + +6.6 EUDAS-Dateien als Assoziativspeicher + +In diesem Abschnitt soll ein Beispiel erläutert werden, in dem +EUDAS-Dateien unabhängig von EUDAS für einen ganz anderen +Zweck benutzt werden. Das folgende kurze Paket soll ein Abkür­ +zungsverzeichnis realisieren, das auf einer EUDAS-Datei basiert. + + + PACKET abkuerzungsverzeichnis + DEFINES + verzeichnis laden, + abkuerzung einfuegen, + abkuerzung aendern, + abkuerzung loeschen, + langform : + + EUDAT VAR verz; + SATZ VAR satz; + TEXT VAR inhalt; + + PROC verzeichnis laden (TEXT CONST dateiname) : + + oeffne (verz, dateiname) + + END PROC verzeichnis laden; + + PROC abkuerzung einfuegen (TEXT CONST abk, lang) : + + auf satz (verz, abk); + IF NOT dateiende (verz) THEN + errorstop ("Abkürzung existiert bereits") + ELSE + satz initialisieren (satz); + feld aendern (satz, 1, abk); + feld aendern (satz, 2, lang); + satz einfuegen (satz) + END IF + + END PROC abkuerzung einfuegen; + + PROC abkuerzung aendern (TEXT CONST abk, lang) : + + auf satz (verz, abk); + IF dateiende (verz) THEN + errorstop ("Abkürzung existiert nicht") + ELSE + feld aendern (verz, 2, lang) + END IF + + END PROC abkuerzung aendern; + + PROC abkuerzung loeschen (TEXT CONST abk) : + + auf satz (verz, abk); + IF NOT dateiende (verz) THEN + satz loeschen (verz) + END IF + + END PROC abkuerzung loeschen; + + TEXT PROC langform (TEXT CONST abk) : + + auf satz (verz, abk); + IF dateiende (verz) THEN + inhalt := ""; + errorstop ("Abkürzung nicht vorhanden") + ELSE + feld lesen (verz, 2, inhalt) + END IF; + inhalt + + END PROC langform; + + END PACKET abkuerzungsverzeichnis; + + +Die Prozedur 'verzeichnis laden' koppelt die interne EUDAT-Vari­ +able 'verz' an eine benannte EUDAS-Datei, die eventuell vorher mit +EUDAS erstellt wurde. In diesem Beispiel sind die Feldnamen egal; +falls die übergebene EUDAS-Datei noch nicht existiert, wird sie mit +0 Feldern eingerichtet, was aber nur für eine spätere Anzeige mit +EUDAS störend wäre. + Grundlage für das Aufsuchen einer bestimmten Abkürzung bil­ +det immer die Prozedur 'auf satz', die nach dem Inhalt des ersten +Feldes optimiert sucht. Falls die Abkürzung nicht gefunden wurde, +wird auf das Dateiende positioniert, daher wird jeweils 'dateiende' +abgefragt. + Beim Einfügen eines neuen Satzes muß eine komplette Satz­ +variable angegeben werden, die bereits mit den Inhalten gefüllt ist. +Beim späteren Ändern kann jedoch direkt auf ein Feld zugegriffen +werden, ohne die Satzvariable explizit rauszuholen. + Die Abfrage einer bestimmten Abkürzung bereitet dann keine +Schwierigkeiten mehr. + Für die Verwendung von EUDAS-Dateien in diesem Beispiel +spricht zum einen die einfache Programmierung, zum anderen aber +auch die Möglichkeit, das erstellte Verzeichnis mit den Hilfsmitteln + diff --git a/doc/eudas/eudas.ref.7 b/doc/eudas/eudas.ref.7 new file mode 100644 index 0000000..31b3031 --- /dev/null +++ b/doc/eudas/eudas.ref.7 @@ -0,0 +1,447 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (71)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +7 Verwaltung der offenen Dateien + + +Die in diesem Kapitel beschriebene Schnittstelle verbindet mehrere +EUDAS-Dateien zu einem großen Dateimodell. Diese virtuelle Datei +dient als Grundlage für die meisten EUDAS-Funktionen. Zuerst muß +eine Datei als Bestandteil der virtuellen Datei geöffnet werden, ehe +sie bearbeitet werden kann. Es ist so bei den Funktionen keine +Angabe mehr nötig, welche Datei gemeint ist. + Diese Schnittstelle ist in vielen Teilen für die interne +EUDAS-Anwendung ausgelegt. Bei einigen Prozeduren werden aus +Effizienzgründen keinerlei Überprüfungen auf illegale Aufrufe oder +Parameter durchgeführt. Wollen Sie eine solche Prozedur dennoch +verwenden, sollten Sie die Einhaltung der angegebenen Bedingungen +sorgfältig überprüfen. + + +7.1 Dateiverwaltung + +Mit 'oeffne' wird eine Datei zum Bearbeiten geöffnet. Mit 'kette' und +'kopple' können weitere Dateien dazugekettet bzw. dazugekoppelt +werden. Durch 'sichere' können veränderte Kopien zurückgeschrie­ +ben werden. Durch 'dateien loeschen' werden die internen Kopien +gelöscht. + Mit 'anzahl dateien' kann die Anzahl der vorhandenen Dateien +erfragt werden. 'anzahl koppeldateien' gibt Auskunft darüber, wie­ +viel Dateien davon gekoppelt sind. 'aendern erlaubt' gibt den Status +wieder, der beim Öffnen der ersten Datei angegeben wurde. 'inhalt +veraendert' gibt an, ob die angegebene Datei verändert wurde. Mit +'eudas dateiname' können die Namen der geöffneten Dateien erfragt +werden. Bei jedem 'oeffne' wird 'dateiversion' um 1 erhöht. Dies +dient dazu, ein erfolgtes neues Öffnen von anderen Stellen aus zu +entdecken. + Mit 'auf koppeldatei' kann die virtuelle Datei auf eine Koppel­ +datei umgeschaltet werden, so daß der Eindruck entsteht, nur diese +Datei wäre geöffnet worden. + +PROC oeffne (TEXT CONST dateiname, + BOOL CONST aendern erlaubt) + Falls Ändern erlaubt sein soll, wird eine Kopie der angegebenen + Datei zur Bearbeitung für EUDAS angelegt. Vorher geöffnete + Dateien werden gelöscht. Die Änderungserlaubnis wird entspre­ + chend gesetzt. Es wird die Satzposition der EUDAS-Datei ange­ + nommen (Ausnahme: steht die EUDAS-Datei hinter dem letzten + Satz, wird auf Satz 1 positioniert). 'dateiversion' sowie 'anzahl + dateien' werden um 1 erhöht. + + FEHLER: +#f1# + #on("i")#Datei nicht gesichert#off("i")# + Eine vorher geöffnete Datei war verändert, aber nicht gesi­ + chert. +#f1# + #on("i")#Datei existiert nicht#off("i")# + Die angegebene Datei ist nicht vorhanden. +#f1# + #on("i")#Datei ist keine EUDAS-Datei#off("i")# + Die angegebene Datei hat nicht den für EUDAS-Dateien festge­ + legten Typ. + +PROC kopple (TEXT CONST dateiname) + Die angegebene Datei wird zu den bereits geöffneten Dateien + dazugekoppelt. Falls Ändern erlaubt ist, wird eine Kopie dieser + Datei verwendet. Dabei werden die ersten Felder der Datei, die + bereits in der Hauptdatei vorhanden sind, als Koppelfelder + festgelegt. Alle weiteren Felder werden zusätzlich zu den bis­ + herigen angelegt. 'dateiversion', 'anzahl dateien' und 'anzahl  + koppeldateien' werden um 1 erhöht. + + FEHLER: +#f1# + #on("i")#keine Datei geoeffnet#off("i")# + Es muß vorher eine Datei geöffnet werden. +#f1# + #on("i")#Zuviel Dateien geoeffnet#off("i")# + Die Anzahl der gleichzeitig geöffneten Dateien ist begrenzt. +#f1# + #on("i")#Datei existiert nicht#off("i")# + Die angegebene Datei ist nicht vorhanden. +#f1# + #on("i")#Datei ist keine EUDAS-Datei#off("i")# + Die angegebene Datei hat nicht den für EUDAS-Dateien festge­ + legten Typ. +#f1# + #on("i")#Zu viele Felder#off("i")# + Die Anzahl der Felder insgesamt ist begrenzt. +#f1# + #on("i")#Zu viele Koppelfelder#off("i")# + Die Anzahl der Koppelfelder ist begrenzt. +#f1# + #on("i")#keine Koppelfelder vorhanden#off("i")# + Das erste Feld der zu koppelnden Datei ist in der Hauptdatei + nicht vorhanden (unterschiedliche Feldnamen). + +PROC kette (TEXT CONST dateiname) + Die angegebene Datei wird an die Hauptdatei angekettet, d.h. + die Sätze der neuen Datei werden am bisherigen Dateiende + angefügt. Falls Ändern erlaubt ist, wird eine Kopie dieser Datei + verwendet. Die zu kettende Datei muß in der Feldstruktur nicht + mit der Hauptdatei übereinstimmen. Die aktuelle Satzposition + wird beibehalten. 'dateiversion' und 'anzahl dateien' werden um + 1 erhöht. + + FEHLER: +#f1# + #on("i")#keine Datei geoeffnet#off("i")# + Es muß vorher eine Datei geöffnet werden. +#f1# + #on("i")#Zuviel Dateien geoeffnet#off("i")# + Die Anzahl der gleichzeitig geöffneten Dateien ist begrenzt. +#f1# + #on("i")#Datei existiert nicht#off("i")# + Die angegebene Datei ist nicht vorhanden. +#f1# + #on("i")#Datei ist keine EUDAS-Datei#off("i")# + Die angegebene Datei hat nicht den für EUDAS-Dateien festge­ + legten Typ. + +PROC sichere (INT CONST dateinr, TEXT CONST dateiname) + Die geöffneten Dateien werden in der Reihenfolge ihres Öffnens + durchnumeriert (von 1 an). Die Arbeitskopie mit der angegebe­ + nen Nummer wird unter dem angegebenen Namen gesichert, aber + selbst nicht verändert. Die vorher unter diesem Namen vorhan­ + dene Datei wird gelöscht. War die zu sichernde Arbeitskopie + verändert worden, so wird sie anschließend als nicht verändert + angesehen. + Bedingungen: + 1 <= dateinr <= anzahl dateien + +PROC dateien loeschen (BOOL CONST auch geaenderte) + Es werden alle geöffneten Arbeitskopien gelöscht. EUDAS wird + wieder in den Anfangszustand versetzt. Wird 'auch geaenderte' + angegeben, wird bei geänderten, aber nicht gesicherten Dateien + die Fehlermeldung unterdrückt. + + FEHLER: +#f1# + #on("i")#Datei nicht gesichert#off("i")# + Eine vorher geöffnete Datei war verändert, aber nicht gesi­ + chert. + +BOOL PROC auf koppeldatei + Liefert TRUE, wenn auf eine Koppeldatei umgeschaltet wurde. + +PROC auf koppeldatei (INT CONST nr) + Umschalten auf Koppeldatei 'nr'. Ist bereits umgeschaltet, wird + wieder zurückgeschaltet. In diesem Fall werden bei 'nr' = 1 die + Koppelfelder übernommen, anderenfalls nicht. Beim Umschalten + bleiben Satzposition, Markierungen und Suchmuster gespeichert. + In der Koppeldatei wird die beim letzten Umschalten eingestell­ + te Position wieder eingenommen. 'dateiversion' wird um 1 er­ + höht. + +INT PROC anzahl dateien + Gibt die Anzahl der insgesamt geöffneten Dateien an. + +INT PROC anzahl koppeldateien + Gibt die Anzahl der gekoppelten Dateien an. + +BOOL PROC aendern erlaubt + Reflektiert den Status, der bei 'oeffne' gesetzt wurde. + +BOOL PROC inhalt veraendert (INT CONST dateinr) + Gibt an, ob die geöffnete Datei mit der angegebenen Nummer + verändert wurde. Wird ggf. von 'sichere' zurückgesetzt. + Bedingung: + 1 <= dateinr <= anzahl dateien + +TEXT PROC eudas dateiname (INT CONST dateinr) + Liefert den Namen, unter dem die entsprechende Datei geöffnet + wurde. + Bedingung: + 1 <= dateinr <= anzahl dateien + +INT PROC dateiversion + Wird bei jedem 'oeffne', 'kette' und 'kopple' zyklisch erhöht. + +INT PROC folgedatei (INT CONST dateinr) + Eine geöffnete EUDAS-Datei wird in eine von zwei Listen auf­ + genommen, die der geketteten Dateien und die der gekoppelten. + Diese Prozedur liefert jeweils die Nummer der nächsten Datei in + der Liste, am Ende aber 0. Die Liste der geketteten Dateien + beginnt immer mit 1, mit 'folgedatei (0)' erhält man die erste + gekoppelte Datei. + Bedingung: + 0 <= dateinr <= anzahl dateien + + +7.2 Feldstruktur + +Die einzelnen Sätze der kombinierten EUDAS-Datei sind in Felder +unterteilt. Diese setzen sich zusammen aus den Feldern der Haupt­ +datei und der einzelnen Koppeldateien, wobei die Koppelfelder je­ +weils nur einmal auftauchen. + 'anzahl felder' liefert die Anzahl der vorhanden Felder. Mit +'feldnamen lesen' und 'feldnamen bearbeiten' können die Feldnamen +abgefragt werden. 'feldnummer' liefert einen Index für einen vor­ +gegebenen Feldnamen, da die Felder immer über Nummern angespro­ +chen werden. + Die Prozeduren 'feld lesen' und 'feld bearbeiten' ermöglichen +den Zugriff auf den Feldinhalt des aktuellen Satzes; durch 'feld +aendern' kann dieser Inhalt abgeändert werden. + +INT PROC anzahl felder + Liefert die Anzahl der vorhanden Felder. + +PROC feldnamen lesen (INT CONST feldnr, + TEXT VAR feldname) + Liefert in 'feldname' den Namen des Feldes mit der Nummer + 'feldnr'. + Bedingung: + 1 <= feldnr <= anzahl felder + +PROC feldnamen bearbeiten (INT CONST feldnr, + PROC (TEXT CONST, INT CONST, INT CONST) bearbeite) + Die Prozedur 'bearbeite' wird aufgerufen. Als Parameter werden + ein Text und Anfangs- und Endposition des gewünschten Feld­ + namens in diesem Text übergeben. Verhindert unnötiges Kopie­ + ren des Feldnamens in eine TEXT-Variable. Der übergebene + Text darf nicht verändert werden! + Bedingung: + 1 <= feldnr <= anzahl felder + +INT PROC feldnummer (TEXT CONST feldname) + Liefert den index zu dem angegebenen Feldnamen. Falls ein + solcher Name nicht existiert, wird 0 geliefert. + +PROC feld lesen (INT CONST feldnr, TEXT VAR inhalt) + Liefert den Inhalt des angegebenen Feldes. + Bedingung: + 1 <= feldnr <= anzahl felder + +PROC feld bearbeiten (INT CONST feldnr, + PROC (TEXT CONST, INT CONST, INT CONST) bearbeite) + Die Prozedur 'bearbeite' wird aufgerufen. Der Feldinhalt des + angegebenen Feldes steht im übergebenen Text innerhalb der + Grenzen. Ist die Obergrenze kleiner als die Untergrenze, so ist + das Feld leer. + Bedingung: + 1 <= feldnr <= anzahl felder + +PROC feld aendern (INT CONST feldnr, TEXT CONST inhalt) + Ändert den Inhalt des angegebenen Feldes. + Bedingung: + NOT ende der datei + 1 <= feldnr <= anzahl felder + +INT PROC feldinfo (INT CONST feldnummer) + Liefert den Typ des angegebenen Feldes. + Bedingung: + 1 <= feldnummer <= anzahl felder + +PROC notizen lesen (INT CONST nr, TEXT VAR inhalt) + Liest die angegebenen Notizen ('nr' = 1,2,3) aus der ersten + Datei oder der umgeschalteten Koppeldatei. + +PROC notizen aendern (INT CONST nr, TEXT CONST inhalt) + Ändert die Notizen ('nr' = 1,2,3) der ersten Datei oder der um­ + geschalteten Koppeldatei. + + +7.3 Positionierung + +Das virtuelle Dateimodell von EUDAS verfügt ebenfalls über eine +Satzposition, die verändert werden kann. + Durch 'satznummer' wird die aktuelle Satznummer geliefert, +beim Koppeln kann über 'satzkombination' die Reihenfolge der Kop­ +pelkombinationen bestimmt werden. 'dateiende' zeigt an, ob die +Satzposition hinter dem letzten Satz liegt. Mit 'weiter' und 'zurueck' +erfolgt die eigentliche Positionierung. Hier kann außer der Positio­ +nierung um Einzelsätze auch die Positionierung auf den nächsten +ausgewählten oder markierten Satz angefordert werden. Mit 'auf  +satz' schließlich kann ein bestimmter Satz angesprungen werden. + +INT PROC satznummer + Liefert die Nummer des aktuellen Satzes. Die Sätze werden von + 1 an durchnumeriert, wobei über die geketteten Dateien wei­ + tergezählt wird. + Bedingung: + anzahl dateien > 0 + +INT PROC satzkombination + Liefert die laufende Nummer der Koppelkombination des aktuel­ + len Satzes. Wird nur durch 'weiter' im Einzelsatzmodus erhöht. + Normalerweise 1. + Bedingung: + anzahl dateien > 0 + +BOOL PROC dateiende + Gibt an, ob die Satzposition hinter dem letzten Satz liegt. + +PROC weiter (INT CONST modus) + Erhöht die aktuelle Satzposition. Für 'modus' gibt es 3 Möglich­ + keiten: + 1: Falls eine weitere Satzkombination besteht, wird diese ein­ + genommen, sonst zum nächsten Satz. + 2: Zum nächsten durch Suchbedingung ausgewählten Satz. Wird + optimiert. + 3: Zum nächsten markierten Satz. Wird optimiert. + Ist kein Satz mehr vorhanden, wird die Satzposition hinter dem + letzten Satz eingenommen. + Bedingung: + anzahl dateien > 0 + +PROC zurueck (INT CONST modus) + Geht um einen Satz zurück. Die Modusangabe ist wie bei 'wei­ + ter', jedoch wird im Modus 1 keine weitere Satzkombination + ausprobiert. Die Positionierung endet bei Satz 1. + Bedingung: + anzahl dateien > 0 + +PROC auf satz (INT CONST satznr) + Geht auf den angegebenen Satz. Ist 'satznr' < 1, wird auf Satz 1 + positioniert, ist der angegebene Satz nicht vorhanden, wird + hinter den letzten Satz positioniert. Es wird jeweils die erste + Satzkombination eingenommen. + Bedingung: + anzahl dateien > 0 + + +7.4 Änderungen + +Sätze des Dateimodells können eingefügt oder gelöscht werden. +Durch das Einfügen entsteht ein leerer Satz vor dem aktuellen Satz; +alle weiteren Sätze rücken eine Stelle weiter. Beim Löschen wird +dieser Vorgang wieder rückgängig gemacht. + Durch 'satz einfuegen' wird ein Leersatz eingefügt; durch +'satz loeschen' wird der aktuelle Satz gelöscht. + Sätze in gekoppelten Dateien werden grundsätzlich nicht ge­ +löscht; auch beim Einfügen entsteht nicht automatisch ein Leersatz +in den gekoppelten Dateien. Änderungen in den Koppeldateien +(durch 'feld aendern') werden gepuffert. Durch 'aenderungen ein­ +tragen' werden die Änderungen dann in die Koppeldateien eingetra­ +gen. Dabei kann auch ein neuer Satz in die Koppeldatei eingefügt +werden. Bei Positionierungen wird diese Prozedur automatisch auf­ +gerufen. + +PROC satz einfuegen + Fügt vor dem aktuellen Satz einen Leersatz ein. + Bedingung: + anzahl dateien > 0 + +PROC satz loeschen + Löscht den aktuellen Satz. Hat hinter dem letzten Satz keine + Wirkung. + Bedingung: + anzahl dateien > 0 + +PROC aenderungen eintragen + Trägt die gepufferten Änderungen in die Koppeldateien ein. + Dabei können die folgenden Fälle auftreten: + 1. Der Satz in der Koppeldatei wird geändert. + Dies geschieht dann, wenn vorher ein passender Satz in der + Koppeldatei vorhanden war und die Koppelfelder nicht ver­ + ändert wurden. + 2. In der Koppeldatei wird ein neuer Satz eingefügt. + Wenn die Koppelfelder und noch andere Felder einer Datei + geändert wurden, wird in dieser Datei ein neuer Satz einge­ + fügt. + 3. Es wird neu gekoppelt. + Wurden nur die Koppelfelder einer Datei geändert, wird ein + neuer, zu diesen Feldern passender Satz gesucht. Nach + 'aenderungen eintragen' erscheinen unter den Feldern der + Datei die neuen Inhalte. + + +7.5 Suchbedingungen + +Über 'suchbedingung' kann eine Suchbedingung eingetragen werden, +die für jeden Satz geprüft werden soll. Mit 'satz ausgewaehlt' wird +erfragt, ob der aktuelle Satz die Suchbedingung erfüllt. Die Such­ +bedingung kann mit 'suchbedingung loeschen' wieder ausgeschaltet +werden. + Einzelne Sätze können auch markiert werden. Nach einem Öff­ +nen ist zunächst kein Satz markiert. Durch 'markierung  aendern' +kann die Markierung eines Satzes geändert werden. 'satz markiert' +fragt ab, ob der aktuelle Satz markiert ist. 'markierte saetze' liefert +die Anzahl der markierten Sätze. Mit 'markierungen loeschen' wer­ +den alle Markierungen entfernt. + +PROC suchbedingung (INT CONST feldnr, + TEXT CONST bedingung) + Stellt für das angegebene Feld die im Text als Muster angege­ + bene Suchbedingung ein. Weitere Aufrufe verknüpfen die Be­ + dingungen mit UND (auch wenn das gleiche Feld erneut angege­ + ben wird). + Bedingung: + anzahl dateien > 0 + 1 <= feldnr <= anzahl felder + + FEHLER: +#f1# + #on("i")#Suchmuster zu umfangreich#off("i")# + Es wurden zu viele Vergleiche gefordert. + +BOOL PROC satz ausgewaehlt + Gibt an, ob die Suchbedingung auf den aktuellen Satz zutrifft. + Hinter dem letzten Satz wird immer FALSE geliefert. + Bedingung: + anzahl dateien > 0 + +PROC suchbedingung lesen (INT CONST feldnr, TEXT VAR bedingung) + Liefert die zuletzt für das angegebene Feld eingestellte Bedin­ + gung, falls die Suchbedingung nicht gelöscht und keine Datei + neu geöffnet wurde. + Bedingung: + 1 <= feldnr <= anzahl felder + +PROC suchbedingung loeschen + Löscht die eingestellte Suchbedingung wieder. Anschließend + sind alle Sätze ausgewählt. + Bedingung: + anzahl dateien > 0 + +PROC markierung aendern + Ändert die Markierung des aktuellen Satzes ins Gegenteil. + Bedingung: + anzahl dateien > 0 + +BOOL PROC satz markiert + Gibt an, ob der aktuelle Satz markiert ist. + Bedingung: + anzahl dateien > 0 + +INT PROC markierte saetze + Gibt an, wieviel Sätze insgesamt markiert sind. + Bedingung: + anzahl dateien > 0 + +PROC markierungen loeschen + Löscht alle Markierungen. + Bedingung: + anzahl dateien > 0 + diff --git a/doc/eudas/eudas.ref.8 b/doc/eudas/eudas.ref.8 new file mode 100644 index 0000000..fc2b3bc --- /dev/null +++ b/doc/eudas/eudas.ref.8 @@ -0,0 +1,454 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (83)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +8 Funktionen zur Bearbeitung + + + +Die Verarbeitungsfunktionen arbeiten jeweils auf der aktuell geöff­ +neten Datei. Falls mindestens ein Satz markiert ist, werden nur +markierte Sätze bearbeitet, anderenfalls die durch die Suchbedin­ +gung ausgewählten Sätze. + + +8.1 Drucken + +Zum Drucken wird ein Druckmuster als Textdatei benötigt. Dessen +Name muß beim Aufruf der Prozedur 'drucke' angegeben werden. +Werden beim Übersetzen des Druckmusters Fehler entdeckt, so wird +der Paralleleditor aufgerufen und kein Druckvorgang durchgeführt. + Normalerweise sendet der Druckgenerator die Ausgabe direkt +zum Drucker. Alternativ kann die Ausgabe auch in eine Datei ge­ +schrieben werden. Dieses Verfahren kann mit 'direkt drucken' umge­ +stellt werden. Der Aufruf + + + direkt drucken (TRUE) + + +sendet alle Dateien direkt zum Drucker, mit + + + direkt drucken (FALSE) + + +wird die Ausgabe in Dateien abgelegt. Diese Dateien erhalten Namen +der Form + + + "Druckmustername.a$n" + + +wobei 'n' eine laufende Nummer zur Unterscheidung ist. + Soll die Druckausgabe in eine ganz bestimmte Datei geleitet +werden, so kann vor dem Aufruf von 'drucke' die Prozedur 'druck­ +datei' aufgerufen werden, die als Parameter den Namen der Ausga­ +bedatei erhält. Existiert die Datei noch nicht, wird sie eingerichtet, +ansonsten wird die Ausgabe am Ende angehängt. + Die Einstellung der Ausgabedatei gilt nur für einen Druckvor­ +gang und überschreibt für diesen Druckvorgang 'direkt drucken'. +Beim nächsten Druckvorgang wird wieder die durch 'direkt drucken' +festgelegte Einstellung verwendet. + Wenn beim Drucken ein großes Ausgabevolumen anfällt, kann es +sinnvoll sein, die Ausgabe in mehrere kleine Dateien aufzuteilen. +Dies gilt auch, wenn direkt gedruckt werden soll, da auch in diesem +Fall eine Zwischendatei erzeugt werden muß. Die maximale Anzahl +von Zeilen pro Datei wird durch 'max druckzeilen' angegeben. + Der dort angegeben Wert gilt nur ungefähr - ein Wechsel der +Ausgabedatei findet dann statt, wenn die Ausgabedatei nach Bear­ +beitung eines Satzes die Maximalanzahl überschritten hat. In die +neue Datei wird anschließend zuerst der Initialisierungsteil des +Druckmusters kopiert, ehe mit der Ausgabe des nächsten Satzes +fortgefahren wird. + +Die Prozeduren im einzelnen: + + +PROC drucke (TEXT CONST druckmuster) + + Die aktuell geöffnete Datei wird nach dem angegebenen Druck­ + muster gedruckt. + + FEHLER: +#f1# + #on("i")#Datei "druckmuster" existiert nicht#off("i")# + Das angegebene Druckmuster ist nicht vorhanden. +#f1# + #on("i")#keine Datei geoeffnet#off("i")# + Zum Drucken muß eine Datei geöffnet sein. +#f1# + #on("i")#direkt Drucken nicht möglich#off("i")# + Es ist kein Druckprogramm installiert oder der Spooler läßt sich + mit 'print' nicht ansprechen. Der Druck wird abgebrochen, die + Ausgabedatei ist noch vorhanden. + + +PROC direkt drucken (BOOL CONST ja) + + Gibt an, ob die Druckausgaben direkt gedruckt oder in einer + Datei gesammelt werden sollen. + + +PROC druckdatei (TEXT CONST ausgabedatei) + + Leitet die Druckausgabe des nächsten Druckvorgangs in die + Datei 'ausgabedatei'. Die Einstellung von 'direkt drucken' wird + für diesen Druckvorgang überschrieben. Die Ausgabe wird am + Ende der Datei angehängt, falls nötig, wird die Ausgabedatei + vorher eingerichtet. + + +PROC maxdruckzeilen (INT CONST zeilen) + + Stellt die maximale Anzahl von Zeilen für die Ausgabedatei ein. + Beim Überschreiten dieses Wertes wird eine neue Datei ange­ + fangen. Standardwert ist 4000. + + +TEXT PROC lfd nr + + Liefert während des Druckens die laufende Nummer des gerade + gedruckten Satzes als Text. + + +BOOL PROC gruppenwechsel (INT CONST gruppennr) + + Kann innerhalb eines Vor- oder Nachspanns beim Drucken ab­ + gefragt werden, um festzustellen, ob die angegebene Gruppe + gewechselt und damit den Vor- bzw. Nachspann mitverursacht + hat (es können zu einem Zeitpunkt mehrere Gruppen wechseln). + Die Gruppennummer 0 gibt die Standardgruppe an, die nur vor + dem ersten und nach dem letzten Satz wechselt. + + +8.2 Kopieren + +Zum selektiven Kopieren von EUDAS-Dateien wird ein Kopiermuster +benötigt. Dieses gibt die Zuordnung zwischen Feldern der Ziel- und +der Quelldatei an. Die Quelldatei ist immer die aktuell geöffnete +Datei. + Die Kopierfunktion wird durch 'kopiere' aufgerufen. Parameter +sind der Name der Zieldatei und das Kopiermuster als FILE. Alter­ +nativ kann statt des Kopiermusters eine Prozedur übergeben wer­ +den, die die Kopieranweisungen erhält. + Der eigentliche Kopiervorgang wird durch den Operator 'K' +bewirkt. Dieser erhält den Zielfeldnamen und einen TEXT-Aus­ +druck als Parameter. Der Wert des TEXT-Ausdrucks wird in das +jeweilige Feld der Zieldatei geschrieben. + Existiert die Zieldatei noch nicht, so wird sie mit den Feldern +eingerichtet, die in den einzelnen 'K'-Ausdrücken angegeben sind +und zwar in der angeführten Reihenfolge. Existiert die Zieldatei, so +werden gegebenenfalls noch nicht vorhandene Felder am Ende ange­ +fügt. + Die Prozedur 'std kopiermuster' liefert zu einer gegebenen +Zieldatei ein Standard-Muster, das als Auswahlgrundlage dienen +kann. Existiert die Zieldatei nicht, werden alle Felder der Quell­ +datei 1 : 1 kopiert, anderenfalls wird zu jedem Feld der Zieldatei +ein passendes Feld der Quelldatei gesucht - die Feldreihenfolge +richtet sich in diesem Fall nach der Zieldatei. + + +PROC kopiere (TEXT CONST dateiname, + FILE VAR kopiermuster) + + Die aktuell geöffnete Datei wird nach den Angaben in 'kopier­ + muster' in die Datei 'dateiname' kopiert. Das Kopiermuster wird + dem ELAN-Compiler übergeben. Tritt bei der Übersetzung ein + Fehler auf, wird der Paralleleditor aufgerufen. + + FEHLER: +#f1# + #on("i")#Datei ist keine EUDAS-Datei#off("i")# + Zieldatei existiert, ist aber keine EUDAS-Datei. +#f1# + #on("i")#keine Datei geoeffnet#off("i")# + Es muß eine virtuelle Datei vorhanden sein. + + +PROC kopiere (TEXT CONST dateiname, PROC kopierfunktion) + + Wie oben, nur ist die Kopierfunktion gleich als Prozedur vor­ + handen. + + FEHLER: +#f1# + #on("i")#Datei ist keine EUDAS-Datei#off("i")# + Zieldatei existiert, ist aber keine EUDAS-Datei. +#f1# + #on("i")#keine Datei geoeffnet#off("i")# + Es muß eine virtuelle Datei vorhanden sein. + + +OP K (TEXT CONST feldname, ausdruck) + + Kopiert den Ausdruck in das Feld 'feldname' der Zieldatei. + Dieses Feld wird eingerichtet, falls es noch nicht existiert. + Dieser Operator ist nur während eines Kopiervorganges de­ + finiert (also in einem Kopiermuster oder einer Kopierfunktion). + Er darf nicht in einer IF-Klausel stehen, sondern muß bei + jedem Satz mit gleichem Feldnamen an der gleichen Stelle auf­ + gerufen werden. + + +PROC std kopiermuster (TEXT CONST dateiname, + FILE VAR kopiermuster) + + Liefert ein Standard-Kopiermuster, abhängig von der Zieldatei + 'dateiname'. Existiert diese nicht, wird die Quelldatei unverän­ + dert kopiert, ansonsten richtet sich das Kopiermuster nach der + Zieldatei. + + +8.3 Tragen + +Durch Tragen können Sätze komplett in eine Zieldatei transportiert +werden. In der Quelldatei sind sie anschließend nicht mehr vorhan­ +den. Eine ganze Auswahl von Sätzen kann mit 'trage' transportiert +werden. 'trage satz' transportiert nur den aktuellen Satz. Mit +'hole satz' kann der letzte Satz der Zieldatei wieder zurückgeholt +werden, so daß eine EUDAS-Datei auch als Zwischenspeicher für +Einzelsätze verwendet werden kann. + Existiert die Zieldatei bereits, muß sie mindestens so viele +Felder wie die Quelldatei besitzen, damit keine Informationen ver­ +lorengehen können. Die Feldnamen müssen nicht übereinstimmen. +Existiert die Zieldatei noch nicht, wird sie mit den Feldern der +Quelldatei eingerichtet. + Die Tragefunktion kann um eine gleichzeitige Prüfung erweitert +werden. Dabei werden Bedingungen überprüft, die bei der Zieldatei +gespeichert sind. Sätze, die diese Bedingungen verletzen, werden +nicht getragen. Eine entsprechende Meldung wird in eine Protokoll­ +datei geschrieben, die als Parameter übergeben werden muß. + Die Prüfbedingungen stehen als ausführbares Programm in den +Notizen der Zieldatei. Prüfbedingungen können mit mehreren Proze­ +duren formuliert werden. 'pruefe' nimmt eine beliebige Bedingung als +Parameter und gibt bei Mißerfolg eine Meldung aus. 'wertemenge' +prüft auf Übereinstimmung mit einem der angegebenen Werte. 'feld­ +maske' legt eine Maske für ein Feld fest, die auf den Inhalt zutref­ +fen muß. + Mit Hilfe der Prozedur 'eindeutige felder' können Satzduplikate +erkannt werden. Auch diese werden nicht getragen. + Die bei den Prüfbedingungen angegebenen Feldnamen müssen in +der Quelldatei vorhanden sein. Falls eine Prüfprozedur außerhalb +von 'trage' aufgerufen wird, führt eine Verletzung der Prüfbedin­ +gung zu einem 'errorstop'. + + +PROC trage (TEXT CONST dateiname, + FILE VAR protokoll, BOOL CONST test) + + Alle ausgewählten Sätze werden in die Datei 'dateiname' getra­ + gen. Diese wird gegebenenfalls eingerichtet. Falls 'test' ange­ + geben ist, werden die in den Notizen der Zieldatei enthaltenen + Bedingungen geprüft. Nur in diesem Fall muß 'protokoll' initial­ + isiert sein. + + FEHLER: +#f1# + #on("i")#kein Satz zum Tragen vorhanden#off("i")# + Die Quelldatei ist leer oder es ist keine Datei geöffnet. +#f1# + #on("i")#Datei ist keine EUDAS-Datei#off("i")# + Zieldatei existiert, ist aber keine EUDAS-Datei. +#f1# + #on("i")#Zieldatei hat falsche Felderzahl#off("i")# + Zu wenig Felder in der Zieldatei. + + +PROC trage satz (TEXT CONST dateiname) + + Der aktuelle Satz wird in die Datei 'dateiname' getragen. + + FEHLER: +#f1# + #on("i")#kein Satz zum Tragen vorhanden#off("i")# + Keine Datei geöffnet oder Datei ist am Ende. +#f1# + #on("i")#Datei ist keine EUDAS-Datei#off("i")# + Zieldatei existiert, ist aber keine EUDAS-Datei. +#f1# + #on("i")#Zieldatei hat falsche Felderzahl#off("i")# + Zu wenig Felder in der Zieldatei. + + +PROC pruefe (TEXT CONST feldname, BOOL CONST bedingung) + + Wenn die angegebene Bedingung FALSE liefert, wird eine Mel­ + dung in die Protokolldatei geschrieben und der jeweilige Satz + nicht getragen. + + +PROC wertemenge (TEXT CONST feldname. menge) + + Es wird geprüft, ob das angegebene Feld in der Wertemenge + enthalten ist. Die einzelnen Werte in der Wertemenge werden + dabei durch Komma getrennt. Leerzeichen sind signifikant. + + +PROC feldmaske (TEXT CONST feldname, maske) + + Es wird geprüft, ob das angegebene Feld zu der Maske paßt. Die + Zeichen in der Maske haben dabei folgende Bedeutung: + '9' trifft auf jede Ziffer zu + 'X' trifft auf jedes Zeichen zu + 'A' trifft auf jeden Großbuchstaben zu (einschließlich + Umlaute) + 'a' trifft auf jeden Kleinbuchstaben zu (einschließlich + Umlaute und 'ß') + '*' trifft auf eine Folge beliebiger Zeichen zu (auch die + leere Folge). Eine sparsame Verwendung wird empfoh­ + len, da die Bearbeitung sehr aufwendig ist. + Alle anderen Zeichen treffen nur auf ein gleiches Zeichen zu. + + +PROC eindeutige felder (INT CONST anzahl) + + Gibt an, die wieviel ersten Felder einen Satz eindeutig identifi­ + zieren sollen. Ein Satz, der mit einem Satz der Datei in diesen + Feldern übereinstimmt, wird nicht getragen. Ohne diese Angabe + wird keine derartige Prüfung vorgenommen. + + +PROC hole satz (TEXT CONST dateiname) + + Holt den letzten Satz der angegebenen Datei und fügt ihn vor + dem aktuellen Satz ein. + + FEHLER: +#f1# + #on("i")#"dateiname" existiert nicht#off("i")# +#f1# + #on("i")#Datei ist keine EUDAS-Datei#off("i")# + Zieldatei existiert, ist aber keine EUDAS-Datei. +#f1# + #on("i")#Zieldatei hat falsche Felderzahl#off("i")# + Zu viele Felder in der angegebenen Datei. +#f1# + #on("i")#Kein Satz zum Tragen vorhanden#off("i")# + Die angegebene Datei ist leer. +#f1# + #on("i")#keine Datei geoeffnet#off("i")# + Es muß eine virtuelle Datei vorhanden sein. + + +8.4 Verarbeitung + +Die ausgewählten Sätze der aktuellen Datei können nach einer +Verarbeitungsvorschrift verändert oder geprüft werden. Dies ge­ +schieht durch die Prozedur 'verarbeite'. Als Parameter kann ent­ +weder ein Verarbeitungsmuster als FILE oder die Verarbeitungs­ +funktion direkt als Prozedur übergeben werden. + Die Vorschrift wird durch den Operator 'V' realisiert. + + +PROC verarbeite (FILE VAR verarbeitungsmuster) + + Die aktuelle Datei wird nach dem angegebenen Muster bearbei­ + tet. Enthält die Vorschrift, die dem ELAN-Compiler übergeben + wird, einen Fehler, wird der Paralleleditor aufgerufen. + + FEHLER: +#f1# + #on("i")#keine Datei geoeffnet#off("i")# + Es muß eine virtuelle Datei vorhanden sein. + + +PROC verarbeite (PROC verarbeitungsfunktion) + + Wie oben, nur wird die Vorschrift direkt als Prozedur überge­ + ben. + + FEHLER: +#f1# + #on("i")#keine Datei geoeffnet#off("i")# + Es muß eine virtuelle Datei vorhanden sein. + + +OP V (TEXT CONST feldname, ausdruck) + + Das angegebene Feld des aktuellen Satzes wird durch den Aus­ + druck ersetzt. + + FEHLER: +#f1# + #on("i")#Das Feld "feldname" ist nicht definiert.#off("i")# + Das angegebene Feld ist nicht vorhanden. + + +8.5 Funktionen in Ausdrücken + +Für Ausdrücke bei den in diesem Kapitel beschriebenen Prozeduren +sind einfache Funktionen zur Abfrage von Feldinhalten vorhanden. +Mit 'f' kann der Inhalt eines benannten Feldes erfragt werden, bei +'wert' wird der Inhalt erst in eine REAL-Zahl umgewandelt, wobei +nichtnumerische Zeichen ignoriert werden. + Die Prozedur 'textdarstellung' kann dazu verwendet werden, +den Wert einer TEXT-Variablen als TEXT-Denoter in ELAN-Syntax +darzustellen. + Die Prozedur 'zahltext' kann dazu verwendet werden, aus einer +REAL-Zahl einen mit der richtigen Zahl von Nachkommastellen ver­ +sehenen, variabel langen Text zu machen. + + +TEXT PROC f (TEXT CONST feldname) + + Liefert den Inhalt des angegebenen Feldes. + + FEHLER: +#f1# + #on("i")#Das Feld "feldname" ist nicht definiert.#off("i")# + + +REAL PROC wert (TEXT CONST feldname) + + Liefert den Inhalt des angegebenen Feldes als REAL. Dabei + werden nichtnumerische Zeichen ignoriert, ausgenommen das + Minuszeichen und das eingestellte Dezimalkomma (s. 'dezimal­ + komma'). Tritt kein numerisches Zeichen auf, wird der Wert 0.0 + geliefert. + + FEHLER: +#f1# + #on("i")#Das Feld "feldname" ist nicht definiert.#off("i")# + + +REAL PROC wert (TEXT CONST feldname, INT CONST kommastellen) + + Wie 'wert' mit einem Parameter, nur daß das Ergebnis auf die + angegebene Anzahl von Nachkommastellen gerundet wird. + + FEHLER: +#f1# + #on("i")#Das Feld "feldname" ist nicht definiert.#off("i")# + + +TEXT PROC textdarstellung (TEXT CONST anzeigetext) + + Liefert 'anzeigetext' als TEXT-Denoter, also in Anführungs­ + strichen. Anführungsstriche im Text werden dabei verdoppelt. + Steuerzeichen von 0 bis 31 werden in lesbare Form gebracht. + + +TEXT PROC zahltext (REAL CONST wert, INT CONST kommastellen) + + Liefert den Text des angegebenen Werts mit dem eingestellten + Dezimalkomma und mit der angegebenen Zahl von Nachkomma­ + stellen. Sind die Kommastellen 0, wird auch das Komma unter­ + drückt. Der Text erhält soviel Stellen, wie zur Darstellung + benötigt werden. + + +TEXT PROC zahltext (TEXT CONST feldname, + INT CONST kommastellen) + + Wirkt wie 'zahltext (wert (feldname), kommastellen)'. + diff --git a/doc/eudas/eudas.ref.9 b/doc/eudas/eudas.ref.9 new file mode 100644 index 0000000..dc2dd0d --- /dev/null +++ b/doc/eudas/eudas.ref.9 @@ -0,0 +1,194 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (93)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +9 Anzeige + + + +9.1 Fensterverwalter + +Funktionen, die einen Teil des Bildschirms in einem rechteckigen +Fenster beschreiben, werden über den Fensterverwalter untereinan­ +der koordiniert. Jede Funktion fordert für ihren Fensterbereich eine +Variable vom Typ FENSTER an. Vor jedem Bildschirmzugriff kann die +Funktion erfahren, ob andere Programme den Bildschirm im Fenster­ +bereich überschrieben haben. Gleichzeitig meldet sie damit Verän­ +derungen an anderen Fenstern an, die sich mit dem eigenen über­ +schneiden. + + +PROC fenster initialisieren (FENSTER VAR neu) + + Jede Fenstervariable muß vor Benutzung initialisiert werden. + + +PROC fenstergroesse setzen (FENSTER VAR fenster, + INT CONST x anf, y anf, + x laenge, y laenge) + + Die Fenstergröße des Fensters wird gesetzt. 'x anf' und 'y anf' + werden von 1..n gezählt. Die Größe eines 24x80-Bildschirms + entspricht den Angaben (1, 1, 79, 24). Da das letzte Zeichen + einer Zeile wegen Rollgefahr nicht benutzt werden kann, werden + nur 79 Spalten angegeben. + + FEHLER: + + #on("i")#zu viele Fenster#off("i")# + Es sind nur 16 verschiedene Fenstergrößen möglich. + + +PROC fenstergroesse (FENSTER CONST fenster, + INT VAR x anf, y anf, + x laenge, y laenge) + + Meldet die eingestellte Größe des Fensters. + + +PROC fensterzugriff (FENSTER CONST mein fenster, + BOOL VAR veraendert) + + Ein Zugriff auf 'mein fenster' wird angemeldet. 'veraendert' gibt + an, ob das Fenster seit dem letzten Zugriff durch einen über­ + schneidenden Zugriff verändert wurde. Beim ersten Zugriff ist + 'veraendert' immer TRUE. + + +PROC fenster veraendert (FENSTER CONST fenster) + + Falls ein Unterprogramm eine FENSTER-Variable des Hauptpro­ + grammes benutzt, kennzeichnet das Unterprogramm das Fenster + mit dieser Prozedur als benutzt, damit das Hauptprogramm das + Bild neu ausgibt. + + +PROC bildschirm neu + + Gibt an, daß der Bildschirm von einer Funktion benutzt wurde, + die ihre Zugriffe nicht über den Fensterverwalter anmeldet. + Alle Fenster werden als verändert gekennzeichnet. + + +9.2 Anzeigegrundfunktionen + +Sämtliche Anzeigefunktionen werden in einem Fenster abgewickelt, +dessen Größe durch 'anzeigefenster' bestimmt wird. + Die Funktion 'bildausgeben' übernimmt die eigentliche Ausgabe. +Dabei kann durch Parameter mitgeteilt werden, ob sich an der Datei +außer der Markierung etwas geändert hat. Hat sich nichts geändert, +wird zur Optimierung unter Umständen nur die Markierung neu +ausgegeben. Das Bild wird jedoch auf jeden Fall ganz ausgegeben, +wenn das Fenster von anderer Seite verändert wurde. Auch das +Öffnen einer neuen Datei wird automatisch erkannt und richtig +behandelt. + Welche Felder dargestellt werden sollen, kann durch 'feldaus­ +wahl' angegeben werden. Dabei ist für jeden Anzeigemodus eine +eigene Feldauswahl möglich. Die Darstellung kann durch 'rollen' in +vertikaler Richtung verschoben werden. + Mit 'uebersicht' kann die Übersicht ausgegeben werden. Ihre +Größe wird durch 'uebersichtsfenster' angegeben. + + +PROC anzeigefenster (INT CONST x anf, y anf, + x laenge, y laenge) + + Das Anzeigefenster wird in der entsprechenden Größe reser­ + viert. + + FEHLER: + + #on("i")#Anzeigefenster zu klein#off("i")# + Das Fenster ist zu schmal (< 40 Zeichen), um eine sinnvolle + Anzeige zuzulassen. + + +PROC bild ausgeben (BOOL CONST datei veraendert) + + Im Anzeigefenster wird das Bild je nach eingestelltem Modus + ausgegeben, wenn das Fenster verändert wurde oder 'satz ver­ + aendert' TRUE ist. 'satz veraendert' muß immer dann angegeben + werden, wenn am Inhalt der virtuellen Datei etwas verändert + wurde. + + +PROC feldauswahl (TEXT CONST feldcode) + + Die im aktuellen Modus anzuzeigenden Felder und ihre Reihen­ + folge werden ausgewählt. Dabei enthält 'feldcodes' an der i-ten + Stelle den Code der Feldnummer des Feldes, das an i-ter Posi­ + tion erscheinen soll. + + +PROC rollen (INT CONST anzahl) + + Die Darstellung wird um die angegebene Anzahl von Zeilen + gerollt. Bei einer positiven Angabe wird zu höheren Feld- bzw. + Satznummern gerollt (Bild bewegt sich umgekehrt). Beim ersten + bzw. letzten Feld bzw. Satz hört das Rollen automatisch auf. + + +PROC uebersichtsfenster (INT CONST x anf, y anf, + x laenge, y laenge) + + Legt die Größe des Übersichtsfensters fest. + + +PROC uebersicht (TEXT CONST feldauswahl) + + Ruft eine Übersicht der aktuellen Datei auf, in der geblättert + und markiert werden kann. In 'feldauswahl' steht an der Stelle + i der Code der Feldnummer, die als i-tes in der Aufzählung + erscheinen soll. + + +9.3 Editorfunktionen + +Es stehen drei Funktionen zur Verfügung, die den Editor im Anzei­ +gemodus benutzen. Sie dienen zum Einfügen und Ändern sowie zum +Eingeben eines Suchmusters. + Der Editor wird durch ESC 'q' verlassen. Weitere ESC-Funk­ +tionen, die zum Verlassen führen sollen, können durch 'exit zeichen' +angegegeben und nach Funktionsausführung mit 'exit durch' abge­ +fragt werden. + + +PROC aendern (PROC hilfe) + + Bietet den aktuellen Satz zum Ändern an. Steht die virtuelle + Datei am Ende, wird automatisch 'einfuegen' durchgeführt. Bei + ESC '?' wird 'hilfe' aufgerufen. + + +PROC einfuegen (PROC hilfe) + + Fügt vor dem aktuellen Satz einen Satz ein, dessen Inhalt im + Editor angegeben wird. Bei ESC '?' wird 'hilfe' aufgerufen. + + +PROC suchen (PROC hilfe) + + Im Editor wird eine neue Suchbedingung eingegeben. Bei ESC '?' + wird 'hilfe' aufgerufen. + + +PROC exit durch (TEXT CONST zeichenkette) + + Gibt die Zeichen an, die beim Drücken nach ESC zum Verlassen + des Editors führen sollen. Die eingegebenen Daten werden je­ + doch vorher auf jeden Fall noch verarbeitet. + + +TEXT PROC exit durch + + Gibt an, durch welches Zeichen der Editor verlassen wurde. + diff --git a/doc/eudas/eudas.ref.fehler b/doc/eudas/eudas.ref.fehler new file mode 100644 index 0000000..736d009 --- /dev/null +++ b/doc/eudas/eudas.ref.fehler @@ -0,0 +1,139 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (115)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +Fehlermeldungen + + + +In diesem Kapitel sind alle Fehlermeldungen aufgeführt, die von +EUDAS erzeugt werden und zum Abbruch einer Funktion führen +können. + +#on("i")#'n' ist keine Feldnummer#off("i")# + Es wurde eine Nummer als Feldnummer angegeben, die nicht er­ + laubt ist. + +#on("i")#Datei ist keine EUDAS-Datei#off("i")# + Es wurde versucht, eine andere Datei als EUDAS-Datei zu bear­ + beiten. + +#on("i")#inkonsistente EUDAS-Datei#off("i")# + Die interne Struktur der Datei ist zerstört. Kann durch Hardware­ + probleme (Archiv-Lesefehler) oder EUDAS-interne Fehler ent­ + standen sein. + +#on("i")#EUDAS-Datei voll#off("i")# + Eine EUDAS-Datei kann nur eine bestimmte Anzahl von Sätzen + aufnehmen (mindestens 5000). + +#on("i")#Nicht erlaubtes Dezimalkomma#off("i")# + Als Dezimalkomma kann nur ein einzelnes Zeichen angegeben + werden. + +#on("i")#Zuviel Dateien geoeffnet#off("i")# + Es können nicht mehr als 10 Dateien gleichzeitig geöffnet, geket­ + tet und gekoppelt sein. + +#on("i")#Zu viele Felder#off("i")# + Alle geöffneten Dateien zusammen dürfen nicht mehr als 256 + Felder der virtuellen Datei ergeben. + +#on("i")#Zu viele Koppelfelder#off("i")# + Es dürfen insgesamt nicht mehr als 32 Koppelfelder entstehen. + +#on("i")#keine Koppelfelder vorhanden#off("i")# + Eine Datei kann nicht gekoppelt werden, wenn Sie kein Koppelfeld + besitzt. + +#on("i")#keine Datei geoeffnet#off("i")# + Es kann nicht gekettet oder gekoppelt werden, wenn noch keine + Datei geöffnet wurde. Ebenfalls sind keine Verarbeitungsproze­ + duren möglich. + +#on("i")#Nicht möglich, wenn auf Koppeldatei geschaltet#off("i")# + Wenn auf eine Koppeldatei umgeschaltet wurde, ist Öffnen, Ketten + und Koppeln nicht möglich. + +#on("i")#kein direkter Dateizugriff bei geketteten oder gekoppelten Dateien#off("i")# + Wenn Dateien gekettet oder gekoppelt sind, ist Sortieren und + Ändern der Feldstruktur nicht möglich. + +#on("i")#Datei nicht gesichert#off("i")# + Eine vorher geöffnete Datei ist verändert und nicht gesichert. + +#on("i")#Datei wird von anderer Task geändert#off("i")# + Das Öffnen der Datei zum Ändern ist im Moment nicht möglich, da + ein anderer Benutzer sie bereits ändert. + +#on("i")#Suchmuster zu umfangreich#off("i")# + Ein Suchmuster darf nicht mehr als 100 Vergleiche erfordern. + +#on("i")#direkt Drucken nicht moeglich#off("i")# + Entweder ist kein Druckprogramm installiert oder die Spooltask + reagiert nicht. + +#on("i")#Das Feld "Feldname" ist nicht definiert#off("i")# + Sie haben einen falschen Namen angegeben. + +#on("i")#Kein Satz zum Tragen vorhanden#off("i")# + Es wurde versucht, aus einer leeren Datei oder am Dateiende zu + tragen. + +#on("i")#Zieldatei hat falsche Felderzahl#off("i")# + Eine Zieldatei beim Tragen hat weniger Felder als die aktuelle + Datei. Daher würden beim Tragen Informationen verlorengehen. + +#on("i")#Zieldatei darf nicht geöffnet sein#off("i")# + Eine geöffnete Datei ist als Zieldatei nicht zulässig. + +#on("i")#Das Feld "Feldname" verletzt die Pruefbedingung#off("i")# + Eine Prüfprozedur wurde außerhalb des Tragens aufgerufen und + die Bedingung war nicht erfüllt. + +#on("i")#Das Feld "Feldname" ist nicht in der Wertemenge#off("i")# + Eine Prüfprozedur wurde außerhalb des Tragens aufgerufen und + die Bedingung war nicht erfüllt. + +#on("i")#Das Feld "Feldname" stimmt nicht mit der Maske ueberein#off("i")# + Eine Prüfprozedur wurde außerhalb des Tragens aufgerufen und + die Bedingung war nicht erfüllt. + +#on("i")#Zu viele Fenster#off("i")# + Es sind nicht mehr als 16 verschiedene Größen von Fenstern + möglich. + +#on("i")#Fenster zu klein#off("i")# + Ein Menü wurde in einem zu kleinen Fenster aufgerufen. + +#on("i")#Hilfe existiert nicht#off("i")# + Es wurde versucht, eine nicht vorhandene Hilfestellung aufzu­ + rufen. + +#on("i")#Hilfe ist leer#off("i")# + Die angewählte Hilfestellung enthält keinen Text. + +#on("i")#Anzeigefenster zu klein#off("i")# + Das Anzeigefenster muß mindestens 40 Zeichen breit sein. + +#on("i")#Ungueltige Satznummer#off("i")# + Der angegebene Text stellt keine Satznummer dar. + +#on("i")#kein rekursiver Aufruf#off("i")# + Innerhalb von EUDAS darf 'eudas' nicht erneut aufgerufen wer­ + den. + +#on("i")#Task existiert nicht#off("i")# + Es wurde versucht, eine nicht existente Task als Manager einzu­ + stellen. + + diff --git a/doc/eudas/eudas.ref.inhalt b/doc/eudas/eudas.ref.inhalt new file mode 100644 index 0000000..ae997cb --- /dev/null +++ b/doc/eudas/eudas.ref.inhalt @@ -0,0 +1,120 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (3)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +Inhalt + + + + Vorwort . . . . . . . . . . . . . . . . . . . i + Inhalt . . . . . . . . . . . . . . . . . . . . iii + + +I. Funktionen zum Nachschlagen + +#on("b")#1 Zustände und Bedienung#off("b")# +#free (0.2)# +1.1 Zustände . . . . . . . . . . . . . . . . . . . 3 +1.2 Menüs . . . . . . . . . . . . . . . . . . . . 8 +1.3 Auswahl . . . . . . . . . . . . . . . . . . . 8 +1.4 Hilfe und Dialog . . . . . . . . . . . . . . . 9 +1.5 Editor . . . . . . . . . . . . . . . . . . . . 9 + +#on("b")#2 Zusammenstellung der Funktionen#off("b")# +#free (0.2)# +2.1 Menü 'Öffnen' . . . . . . . . . . . . . . . . 13 +2.2 Menü 'Einzelsatz' . . . . . . . . . . . . . . 17 +2.3 Menü 'Gesamtdatei' . . . . . . . . . . . . . . 21 +2.4 Menü 'Drucken' . . . . . . . . . . . . . . . . 23 +2.5 Menü 'Dateien' . . . . . . . . . . . . . . . . 25 +2.6 Menü 'Archiv' . . . . . . . . . . . . . . . . 27 +2.7 Kurzabfrage . . . . . . . . . . . . . . . . . 29 + +#on("b")#3 Das virtuelle Dateimodell#off("b")# +#free (0.2)# +3.1 Dateistruktur . . . . . . . . . . . . . . . . 31 +3.2 Öffnen . . . . . . . . . . . . . . . . . . . . 32 +3.3 Koppeln . . . . . . . . . . . . . . . . . . . 33 +3.4 Änderungen . . . . . . . . . . . . . . . . . . 34 +3.5 Sichern . . . . . . . . . . . . . . . . . . . 36 +3.6 Umschalten auf Koppeldatei . . . . . . . . . . 36 +3.7 Mehrbenutzerbetrieb . . . . . . . . . . . . . 37 + +#on("b")#4 Ansehen und Bearbeiten#off("b")# +#free (0.2)# +4.1 Anzeige . . . . . . . . . . . . . . . . . . . 39 +4.2 Satzauswahl . . . . . . . . . . . . . . . . . 42 +4.3 Sortieren und Reorganisieren . . . . . . . . . 44 +4.4 Bearbeiten . . . . . . . . . . . . . . . . . . 46 + +#on("b")#5 Drucken und Druckmuster#off("b")# +#free (0.2)# +5.1 Druckmustersyntax . . . . . . . . . . . . . . 49 +5.2 Der Druckvorgang . . . . . . . . . . . . . . . 51 +5.3 Interpretation von Musterzeilen . . . . . . . 52 +5.4 Anschluß zum ELAN-Compiler . . . . . . . . . . 56 +5.5 Fehlermeldungen . . . . . . . . . . . . . . . 57 + + +II. EUDAS für Programmierer + +#on("b")#6 Struktur von EUDAS-Dateien#off("b")# +#free (0.2)# +6.1 Der Datentyp SATZ . . . . . . . . . . . . . . 61 +6.2 Der Datentyp EUDAT . . . . . . . . . . . . . . 63 +6.3 Satzposition . . . . . . . . . . . . . . . . . 64 +6.4 Satzzugriffe . . . . . . . . . . . . . . . . . 65 +6.5 Sortieren und Reorganisieren . . . . . . . . . 66 +6.6 EUDAS-Dateien als Assoziativspeicher . . . . . 68 + +#on("b")#7 Verwaltung der offenen Dateien#off("b")# +#free (0.2)# +7.1 Dateiverwaltung . . . . . . . . . . . . . . . 71 +7.2 Feldstruktur . . . . . . . . . . . . . . . . . 75 +7.3 Positionierung . . . . . . . . . . . . . . . . 77 +7.4 Änderungen . . . . . . . . . . . . . . . . . . 78 +7.5 Suchbedingungen . . . . . . . . . . . . . . . 79 + +#on("b")#8 Funktionen zur Bearbeitung#off("b")# +#free (0.2)# +8.1 Drucken . . . . . . . . . . . . . . . . . . . 83 +8.2 Kopieren . . . . . . . . . . . . . . . . . . . 85 +8.3 Tragen . . . . . . . . . . . . . . . . . . . . 87 +8.4 Verarbeitung . . . . . . . . . . . . . . . . . 89 +8.5 Funktionen in Ausdrücken . . . . . . . . . . . 90 + +#on("b")#9 Anzeige#off("b")# +#free (0.2)# +9.1 Fensterverwalter . . . . . . . . . . . . . . . 93 +9.2 Anzeigegrundfunktionen . . . . . . . . . . . . 94 +9.3 Editorfunktionen . . . . . . . . . . . . . . . 95 + +#on("b")#10 Programmierung der Menüs#off("b")# +#free (0.2)# +10.1 Menüformat . . . . . . . . . . . . . . . . . . 97 +10.2 Verwaltung der Menüs . . . . . . . . . . . . . 99 +10.3 Aufruf . . . . . . . . . . . . . . . . . . . . 101 +10.4 Dialog . . . . . . . . . . . . . . . . . . . . 103 + +#on("b")#11 Programmierung von Anwendungen#off("b")# +#free (0.2)# +11.1 Musterprogramme . . . . . . . . . . . . . . . 105 +11.2 Dateianwendungen . . . . . . . . . . . . . . . 109 +11.3 Integrierte Anwendungen . . . . . . . . . . . 111 + + +III. Anhang + + Fehlermeldungen . . . . . . . . . . . . . . . 115 + Prozeduren mit Parametern . . . . . . . . . . 119 + Register . . . . . . . . . . . . . . . . . . . 125 + diff --git a/doc/eudas/eudas.ref.macros b/doc/eudas/eudas.ref.macros new file mode 100644 index 0000000..1d24468 --- /dev/null +++ b/doc/eudas/eudas.ref.macros @@ -0,0 +1,73 @@ +#*format# +#limit (13.5)##start (3.5,2.5)##pagelength (21.0)##block# +#:firsthead (false)# +#linefeed (1.07)# +#*macro end# +#*text# +#type ("prop10")# +#linefeed (1.07)# +#*macro end# +#*beispiel# +#type ("12")# +#linefeed (0.97)# +#*macro end# +#*bildschirm# +#type ("15")# +#linefeed(0.83)# +#*macro end# +#*proc# +#type ("12")# +#*macro end# +#*endproc# +#free (0.1)# +#type ("prop10")# +#linefeed (1.07)# +#*macro end# +#*abschnitt ($1,$2,$3)# +#headodd# +#on("b")#$1#right#$3 %#off("b")# +#free (1.0)# +#end# +#on("b")##ib(9)#$1#ie(9,"   $3")# $2#off("b")# +#*macro end# +#*char($1)# +$1 +#*macro end# +#*kapitel ($1,$2,$3,$4)# +#free (1.3)# +#"nlq"# +#type("roman.24")# +#on("b")##center#$1#off("b")# +#free (0.2)# +#type ("roman.18")# +#on("b")##center#$2 #off("b")# +#on("b")##center# $3#off("b")# +#on("b")##center#$4#off("b")# +#type ("prop10")# +#free (0.6)# +#headeven# +#on("b")#% $2 $3 $4#off("b")# +#free (1.0)# +#end# +#headodd# +#right##on("b")#%#off("b")# +#free (1.0)# +#end# +#*macro end# +#*f2# +#free (0.2)# +#*macro end# +#*a ($1)# +#on("b")#$1.#off("b")#  +#*macro end# +#*bsp ($1)# +#type("12")#$1#type("prop")# +#*macro end# +#*f1# +#free (0.1)# +#*macro end# + + + + + diff --git a/doc/eudas/eudas.ref.proz b/doc/eudas/eudas.ref.proz new file mode 100644 index 0000000..2007bc1 --- /dev/null +++ b/doc/eudas/eudas.ref.proz @@ -0,0 +1,205 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (119)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +Prozeduren mit Parametern + + + + +:= (SATZ VAR, SATZ CONST) 6.1 + +aendern (PROC hilfe) 9.3 +aendern erlaubt : BOOL 7.1 +aenderungen eintragen 7.4 +anzahl dateien : INT 7.1 +anzahl felder : INT 7.2 +anzahl koppeldateien : INT 7.1 +anzeigefenster (INT CONST x anf, y anf, + x laenge, y laenge) 9.2 +auf satz (EUDAT VAR, INT CONST satznr) 6.3 +auf satz (EUDAT VAR, TEXT CONST muster) 6.3 +auf satz (INT CONST satznr) 7.3 +ausfuehrtaste (TEXT CONST taste) 10.3 +auswahl anbieten (TEXT CONST name, FENSTER CONST f, + TEXT CONST hilfe, + PROC (TEXT VAR, INT CONST) inhalt) 10.3 + +bild ausgeben (BOOL CONST datei veraendert) 9.2 +bildschirm neu 9.1 + +dateiende (EUDAT CONST) : BOOL 6.3 +dateiende : BOOL 7.3 +dateien loeschen (BOOL CONST auch geaenderte) 7.1 +dateiversion : INT 7.1 +dezimalkomma (TEXT CONST komma) 6.5 +dezimalkomma : TEXT 6.5 +dialog 10.4 +dialogfenster (INT CONST x anf, y anf, + x laenge, y laenge) 10.4 +direkt drucken (BOOL CONST ja) 8.1 +druckdatei (TEXT CONST dateiname) 8.1 +drucke (TEXT CONST mustername) 8.1 + +editget (TEXT CONST prompt, TEXT VAR eingabe, + TEXT CONST res, hilfe) 10.4 +eindeutige felder (INT CONST anzahl) 8.3 +einfuegen (PROC hilfe) 9.3 +eudas dateiname (INT CONST dateinr) : TEXT 7.1 +EUDAT 6.2 +exit durch (TEXT CONST exit zeichen) 9.3 +exit durch : TEXT 9.3 + +f (TEXT CONST feldname) : TEXT 8.5 +fehler ausgeben 10.4 +feld aendern (SATZ VAR, INT CONST feldnr, + TEXT CONST inhalt) 6.1 +feld aendern (EUDAT VAR, INT CONST feldnr, + TEXT CONST inhalt) 6.4 +feld aendern (INT CONST feldnr, TEXT CONST inhalt) 7.2 +feldauswahl (TEXT CONST feldcodes) 9.2 +feld bearbeiten (SATZ CONST, INT CONST feldnr, + PROC (TEXT CONST, INT CONST, INT CONST) bearbeite) 6.1 +feld bearbeiten (EUDAT CONST, INT CONST feldnr, + PROC (TEXT CONST, INT CONST, INT CONST) bearbeite) 6.4 +feld bearbeiten (INT CONST feldnr, + PROC (TEXT CONST, INT CONST, INT CONST) bearbeite) 7.2 +felderzahl (SATZ CONST) : INT 6.1 +felderzahl (EUDAT CONST) : INT 6.2 +feldindex (SATZ CONST, TEXT CONST muster) : INT 6.1 +feldinfo (EUDAT VAR, INT CONST feldnr, info) 6.5 +feldinfo (EUDAT CONST, INT CONST feldnr) : INT 6.5 +feld lesen (SATZ CONST, INT CONST feldnr, + TEXT VAR inhalt) 6.1 +feld lesen (EUDAT CONST, INT CONST feldnr, + TEXT VAR inhalt) 6.4 +feld lesen (INT CONST feldnr, TEXT VAR inhalt) 7.2 +feldmaske (TEXT CONST feldname, maske) 8.3 +feldnamen aendern (EUDAT VAR, SATZ CONST namen) 6.2 +feldnamen bearbeiten (INT CONST feldnr, + PROC (TEXT CONST, INT CONST, INT CONST) bearbeite) 7.2 +feldnamen lesen (EUDAT CONST, SATZ VAR namen) 6.2 +feldnamen lesen (INT CONST feldnr, TEXT VAR name) 7.2 +feldnummer (TEXT CONST feldname) : INT 7.2 +FENSTER 9.1 +fenstergroesse (FENSTER CONST f, + INT VAR x anf, y anf, + x laenge, y laenge) 9.1 +fenstergroesse setzen (FENSTER VAR fenster, + INT CONST x anf, y anf, + x laenge, y laenge) 9.1 +fenster initialisieren (FENSTER VAR fenster) 9.1 +fenster veraendert (FENSTER CONST fenster) 9.1 +fensterzugriff (FENSTER CONST fenster, + BOOL VAR veraendert) 9.1 + +global manager 10.2 +gruppenwechsel (INT CONST gruppennr) : BOOL 8.1 + +hilfe anbieten (TEXT CONST name, FENSTER CONST f) 10.3 +hole satz (TEXT CONST dateiname) 8.3 + +inhalt veraendert (INT CONST dateinr) : BOOL 7.1 +ja (TEXT CONST frage, hilfe) : BOOL 10.4 + +K (TEXT CONST feldname, ausdruck) 8.2 +kette (TEXT CONST dateiname) 7.1 +kopiere (TEXT CONST dateiname, FILE VAR muster) 8.2 +kopiere (TEXT CONST dateiname, PROC kopierfunktion) 8.2 +kopple (TEXT CONST dateiname) 7.1 + +lfd nr : TEXT 8.1 + +markierte saetze : INT 7.5 +markierung aendern 7.5 +markierungen loeschen 7.5 +maxdruckzeilen (INT CONST anzahl zeilen) 8.1 +menue anbieten (ROW 6 TEXT CONST menuenamen, + FENSTER VAR f, + BOOL CONST esc erlaubt, + PROC (INT CONST, INT CONST) interpreter) 10.3 +menuedaten einlesen (TEXT CONST dateiname) 10.2 +menue loeschen (TEXT CONST name, INT CONST index) 10.2 +menue loeschen (BOOL CONST hilfen reduzieren) 10.2 +menue manager (DATASPACE VAR ds, + INT CONST order, phase, + TASK CONST order task) 10.2 +menuenamen (INT CONST index) : THESAURUS 10.2 + +neuer dialog 10.4 +notizen aendern (EUDAT VAR, INT CONST notiz nr, + TEXT CONST notizen) 6.2 +notizen lesen (EUDAT CONST, INT CONST notiz nr, + TEXT VAR notizen) 6.2 + +oeffne (EUDAT VAR, TEXT CONST dateiname) 6.2 +oeffne (TEXT CONST dateiname, + BOOL CONST aendern erlaubt) 7.1 + +pruefe (TEXT CONST feldname, BOOL CONST bedingung) 8.3 + +reorganisiere (TEXT CONST dateiname) 6.5 +rollen (INT CONST anzahl) 9.2 + +saetze (EUDAT CONST) : INT 6.3 +SATZ 6.1 +satz aendern (EUDAT VAR, SATZ CONST neuer satz) 6.4 +satz ausgewaehlt : BOOL 7.5 +satz einfuegen (EUDAT VAR, SATZ CONST satz) 6.4 +satz einfuegen 7.4 +satz initialisieren (SATZ VAR satz) 6.1 +satzkombination : INT 7.3 +satz lesen (EUDAT CONST, SATZ VAR satz) 6.4 +satz loeschen (EUDAT VAR) 6.4 +satz loeschen 7.4 +satz markiert : BOOL 7.5 +satznr (EUDAT CONST) : INT 6.3 +satznummer : INT 7.3 +sichere (INT CONST dateinr, TEXT CONST dateiname) 7.1 +sortiere (EUDAT VAR, TEXT CONST reihenfolge) 6.5 +sortiere (EUDAT VAR) 6.5 +sortierreihenfolge (EUDAT CONST) : TEXT 6.5 +status anzeigen (TEXT CONST zeile) 10.3 +std kopiermuster (TEXT CONST dateiname, FILE VAR f) 8.2 +suchbedingung (INT CONST feldnr, + TEXT CONST bedingung) 7.5 +suchbedingung loeschen 7.5 +suchen (PROC hilfe) 9.3 + +textdarstellung (TEXT CONST text) : TEXT 8.5 +trage (TEXT CONST dateiname, FILE VAR protokoll, + BOOL CONST test) 8.3 +trage satz (TEXT CONST dateiname) 8.3 + +unsortierte saetze (EUDAT CONST) : INT 6.5 + +V (TEXT CONST feldname, ausdruck) 8.4 +verarbeite (FILE VAR verarbeitungsmuster) 8.4 +verarbeite (PROC verarbeitungsfunktion) 8.4 + +waehlbar (INT CONST menuenr, funktionsnr, + BOOL CONST moeglich) 10.3 +wahl (INT CONST stelle) : INT 10.3 +weiter (EUDAT VAR) 6.3 +weiter (EUDAT VAR, TEXT CONST muster) 6.3 +weiter (INT CONST modus) 7.3 +wert (TEXT CONST feldname) : REAL 8.5 +wert (TEXT CONST feldname, INT CONST kommastellen) : REAL 8.5 +wertemenge (TEXT CONST feldname, menge) 8.3 + +zahltext (REAL CONST wert, INT CONST kommastellen) : TEXT 8.5 +zahltext (TEXT CONST feldname, + INT CONST kommastellen) : TEXT 8.5 +zurueck (EUDAT VAR) 6.3 +zurueck (EUDAT VAR, TEXT CONST muster) 6.3 +zurueck (INT CONST modus) 7.3 + diff --git a/doc/eudas/eudas.ref.reg b/doc/eudas/eudas.ref.reg new file mode 100644 index 0000000..a34307a --- /dev/null +++ b/doc/eudas/eudas.ref.reg @@ -0,0 +1,436 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (125)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +Register + + + +#columns (2, 0.5)# +#limit (6.5)# +ABKUERZUNGEN-Anweisung 49 +Abkürzungsteil 49 +Abkürzungsverzeichnis 68 +Abkürzungszeile 50 +Abschlußzeile 39 +aendern 96 +Ändern 10, 19 + -, nach Vorschrift 48 +aendern erlaubt 74 +Änderungen 34 +aenderungen eintragen 79 +Änderungsmuster 21 +Alternative 43 +Ankreuzen 8 +anzahl dateien 74 +anzahl felder 75 +anzahl koppeldateien 74 +Anzeige 39, 93 +anzeigefenster 95 +Arbeitskopie 13, 32 + -, löschen 15, 36 + -, sichern 15, 36 +Archivmanager 28 + -, reservieren 29 +Archiv (Menü) 27 +Archivübersicht drucken 27 +Assoziativspeicher 68 +auf koppeldatei 74 +Aufräumen 26 +auf satz 65, 78 +Auf Satz Nr. 17 +Ausdrucken 24 +Ausführen 8 +ausfuehrtaste 8, 102 +AUSWAHL 97 +AUSWAHL: 4 +Auswahl 8 + -, Format 98 +auswahl anbieten 103 + +Bearbeiten 46 +BILD 97 +bild ausgeben 95 +bildschirm neu 94 + +Datei, aufräumen 26 + -, kopieren (logisch) 25 + -, kopieren vom Archiv 27 + -, löschen 25 + -, löschen auf Archiv 28 + -, Platzbedarf 26 + -, reorganisieren 26 + -, schreiben auf Archiv 27 + -, umbenennen 25 + -, virtuelle 32, 71 +Dateianwendungen 109 +Dateien Archiv, Übersicht 27 +dateiende 64, 78 +dateien loeschen 74 +Dateien (Menü) 25 +Dateien System, Übersicht 25 +Dateilimit 52 +Dateimanager 28 +Dateiname 40 +dateiversion 75 +DATUM 45 +Dezimalkomma 45 +dezimalkomma 67 +dialog 104 +Dialog 9, 103 +dialogfenster 104 +DIN 45 +direkt drucken 83f. +Druckausgabe, Richtung 23 +druckdatei 85 +drucke 84 +Drucken 23, 49, 83 + -, Archivübersicht 27 +Drucken (Menü) 23 +Druckmuster 23, 49, 83 + -, Fehler 56 +Druckvorgang 51 + +editget 104 +EDITIEREN: 6 +Editieren 23 + -, Zeile 9 +Editor 9, 29 +eindeutige felder 47, 89 +einfuegen 96 +Einfügen 10, 19 + -, Satz 36 + -, Zeile 10 +EINGABE: 4 +Eingabe 9 +Einzelsatz (Menü) 17 +ELAN-Compiler 56 +ELAN-Kommandos 8 +ENDE 97 +Endekennzeichnung 40 +ESC '?' 6 +ESC '9' 4 +ESC '1' 4 +ESC '?' 4 +ESC '?' 3 +ESC 'D' 5 +ESC ESC 3 +ESC 'F' 5f. +ESC 'g' 5 +ESC 'h' 4ff. +ESC 'K' 36 +ESC OBEN 5 +ESC 'p' 5 +ESC 'q' 4, 6 +ESC RUBIN 5 +ESC RUBOUT 5 +ESC UNTEN 5 +ESC 'w' 4f. +ESC 'z' 4f. +eudas 29 +EUDAS: 3 +EUDAS-Datei, aufspalten 110 + -, drucken 23, 49, 83 + -, einrichten 13 + -, ketten 14, 32 + -, kopieren 21, 46, 85 + -, koppeln 14, 32 + -, nach Vorschrift ändern 48 + -, öffnen 13, 32 + -, reorganisieren 67 + -, sortieren 22 + -, Struktur 31, 61 + -, tragen 46, 87 + -, Übersicht 22 + -, verändern 21 +eudas dateiname 75 +EUDAT 61, 63, 109 +EUMEL-Netz 28 +exit durch 96 + +f 91 +FEHLER 5 +fehler ausgeben 104 +Feld 31 +FELD 98 +feld aendern 62, 65, 76 +Feldauswahl 20, 41, 95 +feld bearbeiten 62, 65, 76 +felderzahl 62, 63 +feldindex 62 +feldinfo 66, 77 +Feldinhalt 31, 39 +feld lesen 65, 76 +feldmaske 47, 89 +Feldmuster 53 +Feldname 31, 39 + -, ändern 16 + -, anfügen 16 +feldnamen aendern 63 +feldnamen bearbeiten 76 +feldnamen lesen 64, 76 +feldnummer 76 +Feldstruktur 15 +Feldtyp 31, 42 +Feldtypen 45, 66 + -, ändern 16 +Feldvergleich 43 +Fenster 93 +fenstergroesse 94 +fenstergroesse setzen 93 +fenster initialisieren 93 +fenster veraendert 94 +fensterzugriff 94 +folgedatei 75 +Folgezeilen 41 +Formular 39 +FRAGE: 5 +Fragen 9 +Funktion, ausführen 8 + -, gesperrte 8 + +Gesamtdatei (Menü) 21 +Gib Kommando: 6 +global manager 36, 100 +Gruppe 51 +GRUPPE-Anweisung 49 +gruppenwechsel 51, 85 + +Hauptdatei 32 +HILFE: 4 +HILFE 97, 99 +Hilfe 9 + -, Format 98 +hilfe anbieten 103 +Holen 19 +hole satz 89 +HOP LINKS 4 +HOP 'o' 4 +HOP OBEN 3ff. +HOP RECHTS 4 +HOP RETURN 4 +HOP RUBOUT 4 +HOP UNTEN 3ff. +HOP 'x' 4 + +inhalt veraendert 74 +Initialisieren 28 +Initialisierungsteil 49 + +ja 104 + +K 46, 86 +kette 73 +Ketten 14, 32 +Klassenwechsel 106 +Kombinationen 34 +Kommandos 8 +Kommandozeile 50 +kopiere 86 +Kopieren 21, 46, 85 +Kopieren (logisch) 25 +Kopieren vom Archiv 27 +Kopiermuster 21, 46 +KOPPEL 40 +Koppeldatei, umschalten auf 36 +Koppelfelder 33 +Koppeln 14, 32f. +kopple 72 +Kurzabfrage 29 + +LEER 3f. +Leertaste 8 +lfd nr 85 +lineform 24 +LINKS 3f. +Literaturangaben 108 +Löschen 25 + -, Satz 36 + -, Zeile 10 +Löschen auf Archiv 28 + +Manager 13 +Manager (Mehrbenutzer) 16, 36 +markierte saetze 81 +Markierung 18, 40, 42 +markierung aendern 81 +Markierungen löschen 22 +markierungen loeschen 81 +maxdruckzeilen 85 +MEHR-Anweisung 50 +MENUE 97 +Menü 8 + -, Aufruf 101 + -, Verwaltung 99 +menue anbieten 101 +menuedaten einlesen 99 +Menüformat 97 +menue loeschen 100 +menue manager 100 +menuenamen 100 +Modi 55 +MODUS-Anweisung 50 +Musterprogramme 105 +Musterteil 50 +Musterzeichen 53 +Musterzeile 50 + -, Interpretation 52 + +Nachbearbeiten 24 +Nachspann 49 +NACHSPANN-Anweisung 49 +Namenskonflikte 33 +neuer dialog 104 +Normalmodus 55 +Notizen 15, 31, 64 +notizen aendern 64, 77 +notizen lesen 64, 77 + +'o' 4 +OBEN 3f. +ODER-Verknüpfung 43 +oeffne 63, 72 +Öffnen 32 +Öffnen (Menü) 13 + +pageform 24 +Paralleleditor 56, 83 +Paßwort 29 +Platzbedarf 26 +Positionieren 17, 31, 64, 77 +Priorität 44 +Programmzeile 51 +Protokolldatei 47 +Prüfbedingungen 16, 31, 47, 64, + 87 +pruefe 47, 88 +Pufferplatz 54 + +RECHTS 3f. +Refinement 56 +reorganisiere 67 +Reorganisieren 26, 45, 67 +Reservieren 29 +RETURN 4 +Richtung Druckausgabe 23 +rollen 95 +Rollen 41 +RUBIN 4 +RUBOUT 4 + +saetze 64 +SATZ 61 +Satz 31 +satz aendern 66 +satz ausgewaehlt 80 +Satzauswahl 42 +Satzeditor 9 +satz einfuegen 66, 79 +Satzformular 39 +satz initialisieren 62 +satzkombination 77 +satz lesen 66 +satz loeschen 66, 79 +satz markiert 81 +satznr 64 +satznummer 77 +Satznummer 39 +Satzposition 64 +Satzzeiger 31 +Satzzugriffe 65 +Schreiben auf Archiv 27 +SEITE 99 +sichere 73 +Sichern 15, 36 +sortiere 67 +Sortieren 22, 31, 44, 66 +Sortierreihenfolge 31, 44 +sortierreihenfolge 67 +Sortierzustand 45 +Spaltendruck 52 +Sperre 36 +Standard-Kopiermuster 21, 46 +status anzeigen 103 +Statuszeile 3 +std kopiermuster 87 +Suchbedingung 17, 39, 42 + -, löschen 18 + -, setzen 18 +suchbedingung 80 +suchbedingung lesen 80 +suchbedingung loeschen 80 +suchen 96 +Suchen, Optimierung 44 +Suchmuster 42 + -, eingeben 10 + +Tabellenmodus 55 +Tasten 3 +Tastenfunktionen 3 +TEXT 45 +textdarstellung 91 +Textdatei, ausdrucken 24 + -, editieren 23 + -, nachbearbeiten 24 +Textzeile 49f. +trage 88 +Tragen 16, 19, 21, 46, 87 +trage satz 88 + +uebersicht 95 +uebersichtsfenster 95 +Umbenennen 25 +Umbruch 40, 55 +Umschalten auf Koppeldatei 36 +UND-Verknüpfung 43 +unsortierte saetze 67 +UNTEN 3f. +Überschrift 39 +Übersicht 22, 41 +Übersicht Dateien Archiv 27 +Übersicht Dateien System 25 + +V 48, 90 +Verändern 21 +verarbeite 90 +Verarbeitung 89 +Verknüpfung von Bedingungen +43 +virtuelle Datei 32, 71 +VORSPANN 98 +Vorspann 49 +VORSPANN-Anweisung 49 + +waehlbar 102 +wahl 103 +Warten 6 +weiter 65, 78 +Weiter 17 +wert 91 +wertemenge 47, 88 +WIEDERHOLUNG-Anweisung 49 +Wiederholungsteil 49 + +'x' 4 + +ZAHL 45 +zahltext 91 +Zeichen, reservierte 44 +ZEIGEN: 6 +Zeilenende 54 +Zeilenwiederholung 55 +Zielarchiv 28 +Zurück 17 +zurueck 65, 78 +Zustand 3 +Zustandsübergänge 7 + diff --git a/doc/eudas/eudas.ref.titel b/doc/eudas/eudas.ref.titel new file mode 100644 index 0000000..223a839 --- /dev/null +++ b/doc/eudas/eudas.ref.titel @@ -0,0 +1,91 @@ +#limit (14.0)# +____________________________________________________________________________ + + +#on("b")##on ("u")# +#center#Betriebssystem E U M E L +#off ("u")# + + +#center#gs-MP BAP + + + + +#off("b")# +#center#Lizenzfreie Software der +#on ("b")# + +#center#Gesellschaft für Mathematik und Datenverarbeitung mbH, +#center#5205 Sankt Augustin + + +#off("b")# +#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für +#center#nichtkommerzielle Zwecke gestattet. + +#center#Gewährleistung und Haftung werden ausgeschlossen + + +____________________________________________________________________________ +#page# +#free (6.0)# +#on("b")#EUDAS#off("b")# +#free (1.0)# +#on("b")#Anwender-#off("b")# +#on("b")#Datenverwaltungssystem#off("b")# +#free (2.0)# +#on ("b")#VERSION 4#off("b")# +#free(1.0)# +#on("u")#                                                    #off("u")# +#free (0.5)# +#on("b")#REFERENZHANDBUCH#off("b")# +#block# +#page# +#free (9.5)# +Hergestellt mit Hilfe der EUMEL-Textverarbeitung und des Pro­ +gramms FontMaster der Martin Schönbeck GmbH. +#free (1.7)# +Ausgabe September 1987 + +Dieses Handbuch und das zugehörige Programm sind urheberrechtlich +geschützt. Die dadurch begründeten Rechte, insbesondere der Ver­ +vielfältigung in irgendeiner Form, bleiben dem Autor vorbehalten. + +Es kann keine Garantie dafür übernommen werden, daß das Pro­ +gramm für eine bestimmte Anwendung geeignet ist. Die Verantwor­ +tung dafür liegt beim Kunden. + +Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrekt­ +heit und Vollständigkeit der Angaben wird aber keine Gewähr über­ +nommen. Das Handbuch kann jederzeit ohne Ankündigung geändert +werden. + +(c) Copyright 1987 Thomas Berlage + Software-Systeme + Im alten Keller 3 +#free (0.1)# + D-5205 Sankt Augustin 1 +#page# +#free (7.0)# +#center##on("b")#I.#off("b")# +#free (1.0)# +#center##on("b")#FUNKTIONEN#off("b")# +#center##on("b")#ZUM#off ("b")# +#center##on("b")#NACHSCHLAGEN#off("b")# +#page# +#free (7.0)# +#center##on("b")#II.#off("b")# +#free (1.0)# +#center##on("b")#EUDAS#off("b")# +#center##on("b")#FÜR#off ("b")# +#center##on("b")#PROGRAMMIERER#off("b")# +#page# +#free (7.0)# +#center##on("b")#III.#off("b")# +#free (1.0)# +#center##on("b")#ANHANG#off("b")# + + + + diff --git a/doc/eudas/eudas.ref.vorwort b/doc/eudas/eudas.ref.vorwort new file mode 100644 index 0000000..f911be8 --- /dev/null +++ b/doc/eudas/eudas.ref.vorwort @@ -0,0 +1,81 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (1)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +____________________________________________________________________________ + + +#on("b")##on ("u")# +#center#Betriebssystem E U M E L +#off ("u")# + + +#center#EUDAS + + + + +#off("b")# +#center#Lizenzfreie Software der +#on ("b")# + +#center#Gesellschaft für Mathematik und Datenverarbeitung mbH, +#center#5205 Sankt Augustin + + +#off("b")# +#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für +#center#nichtkommerzielle Zwecke gestattet. + +#center#Gewährleistung und Haftung werden ausgeschlossen + + +____________________________________________________________________________ +#page# +#center#1 + +Vorwort + + + +Lieber EUDAS-Benutzer! + +Dies ist das zweite Handbuch, das Sie zu EUDAS bekommen. Wenn +Sie sich mit EUDAS noch nicht auskennen, sollten Sie zunächst das +#on("i")#Benutzerhandbuch#off("i")# zu Rate ziehen, ehe Sie in dieses Handbuch +schauen. + + Das #on("i")#Referenzhandbuch#off("i")# ist in zwei Teile geteilt. Im ersten Teil +finden Sie eine Übersicht über alle EUDAS-Funktionen (im Kapitel +2) sowie zusammengefaßte Informationen über die Bedienung (Kapi­ +tel 1) und die genaue Wirkung der einzelnen Funktionen (Kapitel 3 +bis 5). Dieser Teil soll Ihnen zum Nachschlagen dienen, wenn Sie +eine bestimmte Information suchen. + Im zweiten Teil sind alle Informationen zusammengefaßt, die +ein Programmierer zur Benutzung der EUDAS-Funktionen braucht. Es +sei an dieser Stelle jedoch davon abgeraten, sofort eigene Program­ +me zu schreiben, da sich in vielen Fällen die gleiche Wirkung auch +durch Programmierung innerhalb von EUDAS-Funktionen erreichen +läßt (zum Beispiel in Druck- und Änderungsmustern). + Im Zweifelsfall orientieren Sie sich anhand von Kapitel 11, wie +Sie Ihr Problem am besten lösen können. + + + + + + + + + + + + + diff --git a/doc/eudas/ref.abb.1-1 b/doc/eudas/ref.abb.1-1 new file mode 100644 index 0000000..d3b3217 --- /dev/null +++ b/doc/eudas/ref.abb.1-1 @@ -0,0 +1,42 @@ +#limit (13.5)# +#start (3.5, 5.0)# +#lpos (0.5)##c pos (3.5)##c pos (4.7)##cpos (7.0)##c pos (10.5)# +#table# +      eudas   ESC q   + +    ESC ESC   ESC h +#free (0.2)# +GIB KDO:     EUDAS   +#free (0.2)# +    ESC h     +    RET        LEER  'Buchst.'   + +        ESC q           + +        FEHLER + + +  WARTEN       +      n, j   +        FRAGE + +      RET   +        EINGABE +#linefeed (0.5)# + + +        ESC z           +      ESC q   +#linefeed (1.0)# +        AUSWAHL + +      ESC q   +        EDITIEREN + +      ESC q   +        SATZEDITOR +ESC ?   ESC q         +      ESC q   +HILFE       ZEIGEN + + diff --git a/doc/eudas/register b/doc/eudas/register new file mode 100644 index 0000000..9cca0fc --- /dev/null +++ b/doc/eudas/register @@ -0,0 +1,490 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (181)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +Register + + + +#columns (2, 0.5)# +#limit (6.5)# +% 63, 69, 148 +%% 141 +& 63, 69, 103, 148 + 57 +-- 103 +.. 102 +.a$ 65 +'+' 107 +'-' 107 + +Abbruch 35 +Abkürzungen 133 +Abkürzungsteil 134, 140 +Absatzmarken 125, 129 +Abschlußzeile 45 +Abschneiden 71 +Abschnitt 67, 69, 134 +Alternative 99 + -, globale 100 + -, lokale 99 +AND 162 +Ändern 55 +Änderungen 83, 85, 90, 95 + -, automatisch 121 +Änderungsmuster 121, 166 +Anführungsstrich 27, 34 +Ankreuzen 36, 40 +Anrede 138 +Anweisung 63 + -, Textkosmetik 74 +Anzeige 44 + -, rollen 97 +Arbeitsbereich 16 +Arbeitskopie 56, 84, 173 + -, Beispiel 58 + -, löschen 57 +Arbeitstask 16 +Archiv 32 + -, anmelden 34 + -diskette 36 + -, lesen 34 + -, löschen 176 + -manager 175, 177 + -menü 33, 174 + -name 34, 36 + -, schreiben 36 + -übersicht 175 +Arithmetik 161 +Attribut 4, 29 +Aufräumen 173 +Ausdrucken 66 +Ausdrücke 116, 151 + -, Zusammensetzung 152 +Ausgabedatei 66 +Ausgaberichtung 65 +Auswahlzustand 36, 40 +Automatische Änderungen 121 + +Bedienungsregeln 39 +begin 16 +Benutzerhandbuch i +Berechnungen 8 +Bewegen 45 +Bildschirmaufbau 45 +Bitte warten 34, 40 +blättern 46 +BOOL 154, 162 + +Carriage Return 15 +CAT 167 +CONST 155 +CR 15 +Cursor 35, 46 + -tasten 54 + +date 137 +Datei 27 + -arten 27 + -, aufräumen 173 + -auswahl 36 + -größe, Begrenzung 124 + -, kopieren 172 + -limit 71 + -, löschen 38, 172 + -namen 172 + -, Platzbedarf 173 + -, reorganisieren 174 + -sperre 95 + -, umbenennen 172 + -verwaltung 37 + -, virtuelle 83 +Dateien, Archiv 174 + - (Menü) 38, 171 + -, System 171 +DATEIENDE 106 +Daten, ändern 55 + -, anzeigen 44 + -, sichern 33 + -typen 152 + -typen, umwandeln 154 + -verwaltung 3 +Datum 44, 99, 133, 137 +DATUM 112 +DECR 167 +Denotation 154 +Dezimalkomma 111, 161 +Dezimalpunkt 148 +DIN 112 +Diskette 28, 32 + -, formatieren 176 + -, initialisieren 176 +Diskettenlaufwerk 175 +Doppeleinträge 121 +DOS 178 +Druckausgabe, Bearbeitung 125 +Drucken 7, 61 + -, Ablauf 66 + -, Aufruf 64, 66 + - (Menü) 22, 65 + -, Übersicht 175 +Druckersteuerungsanweisungen + 74, 124 +Druckmuster 13, 23, 61, 166 + -, Fehler 134 + -, Übersetzung 134, 142 + -, Zeilenlänge 71 +Druckrichtung 123 +Druckverfahren 62 + +Editieren 64 +Editor 34, 41, 52, 125 +eindeutige felder 121 +Einfügen 18, 52 +Eingabe, Daten 52 + -, Suchmuster 46 +Eingabeüberprüfung 112 +Eingabezustand 35, 40 +Eingangsmenü 17 +Einzelsatz (Menü) 18, 44, 92, 97 +ELAN-Anweisungen 141 +ELAN-Ausdrücke 116, 151 +ELAN-Compiler 134 +ELIF 168 +ELSE 139 +ENDE 45 +Endesatz 45, 48, 53, 85 +ENTER 15 +ESC '1' 107 +ESC '?' 31, 39, 40 +ESC '9' 107 +ESC 'D' 99 +ESC ESC 41, 111 +ESC 'F' 67 +ESC 'g' 99 +ESC 'h' 35, 39, 40, 55, 107 +ESC 'K' 92 +ESC OBEN 97 +ESC 'p' 99 +ESC 'P' 118 +ESC 'q' 32ff.,40 , 47, 65, 107 +ESC RUBIN 54 +ESC RUBOUT 54 +ESC UNTEN 97 +ESC 'w' 32, 40, 53 +ESC 'z' 32, 36, 40, 95 +Etiketten 126 +eudas 30, 125 +EUDAS-Archivdiskette 11, 29 +EUDAS-Datei 27, 61, 171 + -, drucken 61 + -, einrichten 17, 51 + -, Grenzen 29 + -, kopieren 113 + -, Mehrfachbenutzung 93 + -, Struktur 28 +EUDAS, Aufruf 30 + -, Installation 11 + -, Start 15 + -, Verlassen 24, 32 +EUMEL-Netz 175 +EUMEL-Textverarbeitung 5 +EUMEL-Zeichencode 110 + +f 117, 134, 156 +FALSE 154 +Fehler, Druckmuster 66 + -, quittieren 36 + -zustand 35, 40 +Feld 29 +Feldauswahl 97, 106 +Felder, anfügen 111, 114 +Feldinhalt 29, 156, 160 +feldmaske 120 +Feldmuster 63, 69 +Feldmustertypen 71 +Feldnamen 29, 67 + -, abfragen 67 + -, Abgrenzung 72 + -, ändern 112 + -, eingeben 51 + -, Länge 133 +Feldreihenfolge 113 +Feldstruktur 111 +Feldteil 45 +Feldtypen 110, 154 + -, ändern 111 +Feldvergleich 103 +Formatieren 177 +Formbrief 74 +Formular 8, 44 +Fragezustand 38, 40 +Funktionen 152 + -, ausführen 31, 46 + -, auswählen 30 + -, gesperrt 31 +Fußzeile 44 + +Gib Kommando 41, 11 +global manager 93 +GRUPPE 145 +Gruppen 144 + -definition 145 + -, mehrere 145 + -wechsel 145 +gruppenwechsel 145 + +halt 39, 110 +Hardwarefehler 33 +Hauptdatei 87ff. +Hilfe 31 +Hilfezustand 31, 40 +Hilfstexte 13, 31 +Hintergrunddiskette 12 +Hintergrundengpaß 124 +Holen 56 +HOP OBEN 40, 98, 106 +HOP RETURN 106 +HOP RUBIN 54 +HOP RUBOUT 54 +HOP UNTEN 40, 98, 106 +HOP 'x' 98 + +IF 117 +IF-Abfragen 161, 168 +IF-Anweisungen 138 +INCR 167 +Init 176 +Initialisierungsteil 124, 143 +Installation 11 +int 140 +INT 153 + +K 113 +Karteikarten 5 +KB 173 +Ketten 13, 83, 85, 95 +Kilobyte 173 +Klammern 163 + -, spitze 72 +Kombination 89 +Kombinationsnummer 90 +Kopieren, logisch 172 + -, EUDAS-Datei 112 + - (vom Archiv) 34, 176 +Kopieranweisung 113 +Kopiermuster 113, 115, 166 + -, Übersetzung 116 +KOPPEL 92 +Koppeldatei, Markierung 105 + -, Position 93 + -, umschalten 92 +Koppelfeld 86, 89 + -, übernehmen 92 +Koppeln 13, 83, 85, 95 + -, mehrere Dateien 87 +Koppelvorgang, Schema 87 +Korrekturversion 14 + +Länge, feste 70, 137 + -, variable 70 +Leerautomatik 73 +Leertaste 17, 31 +length 158 +lfd nr 137, 157 +limit 71, 125 +lineform 125, 129 +LINKS 31, 35 +linksbündig 71 +Linksschieben 128 +list (archive) 34 +Löschen 55 + - (auf Archiv) 176 + - (Datei) 172 + +Manager 93, 95 +Managertask 175 +MARK 104 +Markieren 104 + -, in Übersicht 107 +Markierung 104 + -, löschen 105 +maxdruckzeilen 124 +MEHR 129 +Mehrfachbenutzung 93 +Menü 30 +Menüzustand 31, 40 +min 155 +Modi 128 +Multi-User 12 +Multi-User-System 16 +Musterbrief 139 +Musterteil 135 +Musterzeichen 70 + +Nachbearbeitung 125 +Nachspann 68, 144 +NACHSPANN 68 +Negation 103 +Netz 175 +Numerieren 137 + +'o' 40, 98 +OBEN 30, 106 +ODER 100 +Öffnen 17, 21, 43, 51, 57, 83, 95 + - (Menü) 30 +Operatoren 152, 155 + -, Priorität 163 +OR 163 + +pageform 125 +Paralleleditor 67, 142 +Parameter 152 +Paßwort 94, 177 +Pfeiltasten 54 +Platzbedarf, Datei 173 +pos 159 +Position, feste 69 + -, variable 69 +Positionierung 48 +Proportionalschrift 129 +Prüfbedingungen 118 +pruefe 120 +PUBLIC 13 + +REAL 153 +real 155 +RECHTS 31, 55 +rechtsbündig 71, 137 +Referenzhandbuch i, 79 +Refinement 134, 140, 163 +Reorganisieren 174 +Reservieren 178 +RET 15 +RETURN 15 +Richtung, Druckausgabe 65, 123 +Rollen 97, 106 +RUBIN 35, 54 +RUBOUT 35, 54 +Runden 160 + +Satz 29 + -, anwählen 46 + -editor 41, 47, 53, 92, 98 + -, einfügen 52 + -, holen 56 + -, löschen 55 + -, tragen 55 +Satz.Nr 46, 48 +Satznummer 45, 90 +Satzauswahl, kopieren 114 +Schreiben (auf Archiv) 36, 176 +Schreibmarke 35 +Schrifttypen 125 +Selektion 48 +Sichern 20, 56, 84, 95 +Single-User 12 +Single-User-System 16 +Sortieren 109 + -, Optimierung 110 + -, Zieldatei 115 +Sortierreihenfolge 109 +Spaltenbreite 126 +Spaltendruck 126 +Speicherplatz 14, 38, 176 + -, Datei 173 +Sperren von Dateien 95 +Standard-Kopiermuster 115 +Stationsnummer 175 +Statistik 169 +Statuszeile 31, 39 +Stern 50, 101 +SUB 158, 163 +subtext 158 +SUCH 47 +Suchbedingung f. Drucken 67 +Suchbedingung, Kombination 49 +Suchbedingung löschen 48 +Suchbedingung setzen 46 +Suchen 21, 46 + -, Optimierung 104 +Suchmuster 47, 99 + -, Eingabe 47 +SV-Taste 16, 39 +System 32 + +Tabellenmodus 128 +Tagesdatum 99 +Task, Manager 93 +Tasks 13 +Teildatei 114 +Teiltexte 158 +TEXT 112, 153 +text 140 +Textdatei 28, 61, 171 + -, ändern 65 + -, ansehen 65 + -, ausdrucken 66 + -, editieren 64 +Texte, verketten 156 +Text-Funktionen 156 +Textkonstanten 139 +Text, konstanter 117 +Text, Länge 158 +Textverarbeitung 3, 123 +THEN 139 +Tragen 55, 118 +TRUE 154 + +Uhrzeit 133 +Umbruch 129 +Umlaute 143 +Umschalten auf Koppeldatei 92 +UND 100ff. +UNTEN 30, 106 +Überschrift 45, 68 +Übersicht (Archiv) 34, 175 + - (Dateien) 37, 171 + - (Sätze) 105 + +V 122 +VAR 165 +Variablen 165 + -, Initialisierung 143, 167 + -, Lebensdauer 166 + -, Typ 165 +Verändern 121 +Vergleiche 102, 162 +virtuelle Datei 83 +Vorspann 68, 144 +VORSPANN 68 + +Weiter 45, 48, 90 +wert 148, 160 +wertemenge 119 +WIEDERHOLUNG 63, 126 + +'x' 36, 40 + +ZAHL 110 +zahltext 148, 160 +Zeichen, reservierte 64, 69, 103 +Zeigen 40 +Zeile einfügen 54 +Zeilenfortsetzung 129 +Zeilenlänge 71 +Zielarchiv 175 +Zieldatei, Struktur 113 +Zurück 45, 48, 90 +Zustand 31, 40 +Zuweisung 166 + + diff --git a/doc/eudas/uedas.hdb.4 b/doc/eudas/uedas.hdb.4 new file mode 100644 index 0000000..ecbfd58 --- /dev/null +++ b/doc/eudas/uedas.hdb.4 @@ -0,0 +1,686 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (27)# +#headodd# +#center#EUDAS#right#% + +#end# +#headeven# +%#center#EUDAS + +#end# +#center#1 + +4 Umgang mit Dateien und Menüs + + + +Zu Anfang dieses Teils sollen Sie zunächst die Terminologie von +EUDAS kennenlernen. Das Karteikartenmodell des ersten Kapitels +muß ja auf einem Rechner realisiert werden. Dazu müssen erst eini­ +ge Ausdrücke erklärt werden. + + +4.1 EUDAS-Dateien + +Der wichtigste Ausdruck, der Ihnen noch sehr häufig begegnen wird, +ist #on("i")#Datei#off("i")#. Eine Datei ist eine Sammlung von Informationen in einem +Computer, die als ein Objekt transportiert und behandelt werden +können. Dieser Name wurde analog zu "Kartei" gebildet, mit dem +Unterschied, daß eine "Daten-Kartei" gemeint ist. + Jede Datei hat einen eigenen Namen, durch den sie identifiziert +wird. Der Name ist oft in Anführungsstriche eingeschlossen - die +Anführungsstriche gehören jedoch nicht zum Namen, sondern dienen +nur zur Abgrenzung, welche Zeichen zum Namen gehören. Der Name +ist also wie die Aufschrift auf einem Aktenordner. Wenn alle Ordner +im Schrank stehen, können Sie anhand des Namens den richtigen +Ordner finden, anderenfalls müßten Sie alle Ordner öffnen. + +#on("b")#Dateiarten#off("b")# Dateien werden nun für viele verschiedene Arten +von +Informationen benutzt. Sie können einerseits Texte enthalten oder +auch Karteien, Grafiken, Formeln oder Zahlenkolonnen. Sie haben +bereits im ersten Kapitel den Unterschied zwischen Datenverwaltung +und Textverarbeitung kennengelernt. In diesem Zusammenhang sind +die beiden ersten Verwendungsweisen wichtig. + +#limit (12.0)# + #on("i")#Textdateien#off("i")# + sind Dateien, die normale Texte enthalten, die mit + dem Editor verändert und einfach ausgedruckt + werden können. In ihnen werden also Informationen + gespeichert, wie die Textverarbeitung sie benötigt. + + #on("i")#EUDAS-Dateien#off("i")# + sind dagegen Dateien, die Informationen in der + Form von Karteikarten enthalten. Sie haben also + die Struktur, wie sie von der Datenverwaltung be­ + nötigt wird. +#limit (13.5)# + + Der Computer kann aber auch alle Arten von Dateien gleich­ +behandeln, und zwar dann, wenn der Inhalt der Dateien nicht be­ +trachtet werden muß. + Ein häufiger Fall ist zum Beispiel, wenn Dateien zur Sicherung +auf eine Diskette geschrieben werden sollen. In diesem Fall genügt +die Angabe des Namens; dem Rechner ist es egal, welchen Inhalt die +Datei hat. + Anders ist es aber, wenn Sie den Inhalt betrachten wollen. +Dazu brauchen Sie dann ein Programm, das die innere Struktur der +Datei kennt. Textdateien können Sie zum Beispiel mit dem Editor +ansehen. EUDAS-Dateien müssen Sie jedoch mit EUDAS ansehen, da +der Editor die EUDAS-Struktur nicht kennt. Es ist in vielen Fällen +sinnvoll, durch einen Zusatz im Dateinamen zu kennzeichnen, ob es +sich um eine Textdatei oder eine EUDAS-Datei handelt. + + +#free (3.7)# + +#center#Abb. 4-1 Struktur einer EUDAS-Datei + + +#on("b")#Terminologie#off("b")# EUDAS verwendet bestimmte Ausdrücke, um die +Strukturelemente einer EUDAS-Datei zu kennzeichnen. Die Struktur +einer EUDAS-Datei ist schematisch in Abb. 4-1 dargestellt. Die +Ausdrücke wurden nun nicht direkt aus dem Karteikartenmodell +übernommen, da es auch noch andere Modelle gibt und keine fal­ +schen Assoziationen auftreten sollen. + EUDAS verwendet die Bezeichnung #on("i")#Satz#off("i")# für eine Karteikarte. +Eine EUDAS-Datei besteht also aus einer Anzahl von gleichartigen +Sätzen. Zur Veranschaulichung kann man sich diese nebeneinander­ +gelegt vorstellen. + Jeder Satz ist unterteilt in sogenannte #on("i")#Felder#off("i")#. Ein Feld ent­ +spricht einem Attribut bzw. einem Eintrag auf der Karteikarte. Ein +Feld ist wiederum unterteilt in einen #on("i")#Feldnamen#off("i")# und einen #on("i")#Feldin­ +halt#off("i")#. + Der Feldname identifiziert ein bestimmtes Feld innerhalb eines +Satzes. Die Feldnamen sind natürlich für alle Sätze gleich. Die +Feldnamen einer EUDAS-Datei sind beliebig und können von Ihnen +selbst festgelegt werden. + Der Feldinhalt enthält die eigentliche Information des entspre­ +chenden Attributs. Der Feldinhalt darf ebenfalls aus beliebig vielen +Zeichen bestehen. Die Feldinhalte sind natürlich für jeden Satz +verschieden und stellen die eigentliche gespeicherte Information +dar. + +#on("b")#Grenzen#off("b")# Aus technischen Gründen gibt es natürlich auch +einige +Beschränkungen, die hier nicht verschwiegen werden sollen. Eine +Datei kann maximal etwa 5000 Sätze enthalten, ein Satz darf aus +maximal 255 Feldern bestehen. Insgesamt kann ein Satz etwa 32000 +Zeichen umfassen. Die einzelnen Sätze in der EUDAS-Datei werden +durch ihre jeweilige Positionsnummer identifiziert, also quasi von 1 +bis 5000 durchnumeriert. + + +4.2 EUDAS-Menüs + +In den folgenden Abschnitten sollen Sie lernen, wie die Bedienung +von EUDAS funktioniert. Dazu sollen Sie eine EUDAS-Beispieldatei +von der EUDAS-Diskette in Ihr System holen. Diese Datei brauchen +Sie dann später, um die Funktionen von EUDAS zu kennenzulernen. + Die Beispieldatei hat den gleichen Inhalt wie die in Kapitel 3 +von Ihnen erstellte Datei. Falls Ihnen also die EUDAS-Archiv­ +diskette nicht zur Verfügung steht, können Sie in diesem Kapitel +auch jede andere Archivdiskette verwenden. + Bitte beachten Sie im folgenden, daß Sie einfache Anführungs­ +striche nicht mit eingeben, doppelte Anführungsstriche aber wohl. + +#on("b")#EUDAS-Aufruf#off("b")# Zuerst müssen Sie EUDAS aufrufen. Dazu +begeben +Sie sich in die in Kapitel 3 eingerichtete Task ('continue ("arbeit")') +und geben bei 'gib kommando:' das Kommando 'eudas': + + + gib kommando: + #on("i")#eudas#off("i")# + + +Falls Ihr System über Menüs gesteuert wird, müssen Sie eine ent­ +sprechende Funktion wählen. Anschließend erscheint folgendes +Menü: + +___________________________________________________________________________________________ + + EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv + --------------: + EUDAS-Datei : + O Öffnen : + - Ketten : + - Koppeln : + --------------: + Arbeitskopie : + - Sichern : + --------------: + Aktuelle Datei: + - Notizen : + - Feldstrukt. : + - Prüfbeding. : + --------------: + Mehrbenutzer : + M Manager : + --------------: + : + : + : + : + : + Akt.Datei: Manager: Datum: 22.07.87 +___________________________________________________________________________________________ + + +#on("b")#Menüs#off("b")# Ein #on("i")#Menü#off("i")# ist eine Auswahl für einige verschiedene Funk­ +tionen. Die Funktionen sind jeweils benannt und werden durch einen +davorstehenden Buchstaben oder ein Minuszeichen gekennzeichnet. +Eine der Funktionen ist immer durch inverse Darstellung markiert. + Diese Markierung können Sie nun mit Hilfe der Pfeiltasten OBEN +und UNTEN verschieben. Auf diese Weise können Sie sich die ge­ +wünschte Funktion auswählen. Die Funktionen werden jedoch durch +das Markieren nicht ausgeführt. Sie können also beliebig mit den +Pfeiltasten herumexperimentieren. + Ausgeführt wird die markierte Funktion, wenn Sie die Leertaste +drücken. Sofort erscheint ein Stern vor dem Funktionsnamen, um +anzuzeigen, daß die Ausführung beginnt. Probieren Sie dies jetzt +nicht aus, dazu ist später Gelegenheit. + Funktionen mit einem Minuszeichen davor können Sie zwar +anwählen (markieren), aber nicht ausführen. Solche Funktionen sind +momentan gesperrt, weil ihre Ausführung keinen Sinn hat oder sogar +Fehler erzeugen würde. + Mit den Pfeiltasten LINKS und RECHTS können Sie im Menüzu­ +stand weitere EUDAS-Menüs abrufen. Welche Menüs zur Verfügung +stehen, zeigt Ihnen die oberste Bildschirmzeile. Das aktuelle Menü +ist jeweils invers dargestellt. + +#on("b")#Hilfe#off("b")# Wenn Sie nun wissen möchten, welche Bedeutung die +mar­ +kierte Funktion hat (die Funktionsbezeichnungen sind aus Platz­ +gründen sehr kurz gehalten), können Sie einen #on("i")#Hilfstext#off("i")# zu dieser +Funktion abrufen. Dies erfolgt durch die Betätigung der Tasten ESC +und '?' hintereinander. Diese doppelten Tastenkombinationen mit der +ESC-Taste am Anfang werden Ihnen noch sehr häufig begegnen - +denken Sie immer daran, die Tasten hintereinander und nicht +gleichzeitig zu tippen. Der zeitliche Abstand zwischen den Tasten­ +drücken kann beliebig lang sein; hingegen sollten Sie eine Taste +nicht zu lange drücken, da sonst eventuell eine automatische Wie­ +derholfunktion Ihrer Tastatur startet. + Probieren Sie nun die Tastenkombination ESC '?' aus. Als Reak­ +tion erscheint in der rechten Hälfte des Bildschirms ein Text. Dieser +sollte Ihnen die gewünschten Informationen bieten. + Gleichzeitig hat sich aber auch die oberste Bildschirmzeile +verändert. Sie zeigt jetzt folgendes Bild: + +___________________________________________________________________________________________ + + HILFE: Beenden: ESC q Seite weiter: ESC w Seite zurueck: ESC z +___________________________________________________________________________________________ + + +#on("b")#Zustände#off("b")# Wenn Sie sich nicht im Menü befinden, fungiert +die ober­ +ste Zeile als sogenannte #on("i")#Statuszeile#off("i")#. Diese Zeile zeigt immer an, in +welchem #on("i")#Zustand#off("i")# das Programm sich befindet. Der Zustand des Pro­ +gramms hat nämlich Einfluß darauf, welche Tasten Sie drücken +können und wie das Programm darauf reagiert. Die Statuszeile zeigt +daher außer dem Zustand auch die wichtigsten Tastenfunktionen. + Sie kennen jetzt also schon zwei Zustände von EUDAS: den +Menüzustand und den Hilfe-Zustand. + +#on("b")#Hilfe-Zustand#off("b")# Vom Menüzustand kommen Sie über die +Tastenkom­ +bination ESC '?' in den Hilfe-Zustand. Im Hilfe-Zustand haben die +Pfeiltasten OBEN und UNTEN keine Wirkung mehr (probieren Sie dies +aus). + Ein Hilfstext besteht im allgemeinen aus mehreren Seiten. Die +erste Seite enthält dabei die speziellen Informationen, danach +folgen dann allgemeine Informationen. Mit den Tastenkombinationen +ESC 'w' und ESC 'z' können Sie zwischen den Seiten umschalten +(denken Sie daran, was oben über Tastenkombinationen gesagt +wurde). Wenn Sie dies ausprobieren, werden Sie auf der zweiten +Seite allgemeine Hinweise zur Menübedienung finden. Auf der letz­ +ten Seite wird ESC 'w' ignoriert, ebenso ESC 'z' auf der ersten Seite. + Mit der Tastenkombination ESC 'q' (quit) kehren Sie aus dem +Hilfezustand in den vorherigen Zustand zurück. Diese Tastenkombi­ +nation löst allgemein in EUDAS die Rückkehr in den alten Zustand +aus. Wenn Sie ESC 'q' getippt haben, erscheint die alte Menüzeile +und Sie können wieder Funktionen auswählen. + Der Hilfszustand läßt sich von nahezu allen (noch zu bespre­ +chenden) Zuständen mit ESC '?' aufrufen. Es wird jeweils ein zum +aktuellen Zustand passender Hilfstext ausgegeben. + Die möglichen Zustandsübergange sind nochmal in Abb. 4-2 +zusammengefaßt. + + +#free (2.5)# + +#center#Abb. 4-2 Menü- und Hilfezustand + + +#on("b")#EUDAS verlassen#off("b")# Im Menüzustand können Sie EUDAS jederzeit +durch Tippen von ESC 'q' verlassen. Sie landen dann wieder bei 'gib +kommando:'. + + +4.3 Archivmenü + +#on("b")#System/Archiv#off("b")# An dieser Stelle müssen Sie sich die Begriffe #on("i")#Archiv#off("i")# +und #on("i")#System#off("i")# klarmachen. Als Archiv bezeichnet man die Möglichkeit, +bei Bedarf Disketten in Ihren Rechner einlegen können, um Dateien +(und Programme) von anderen Rechnern zu übernehmen. Um diese +Dateien bearbeiten zu können, müssen Sie sie in das System (Ihre +Festplatte oder Hintergrunddiskette) kopieren. + Die wichtigste Aufgabe des Archivs ist es, Daten vor Beschädi­ +gung zu sichern. Durch Fehlbedienung oder Systemfehler kann es +nämlich leicht geschehen, daß die Daten in Ihrem System verloren +gehen oder zerstört werden. Wenn Sie die Daten jedoch auf einer +Diskette gesichert und die Diskette sicher verwahrt haben, können +Sie die Daten wiederherstellen. + Es ist sehr wichtig, daß Sie Ihre Dateien auf Archivdisketten +sichern, denn ein einziger Hardwarefehler kann die Arbeit von +Jahren vernichten (Sagen Sie nicht: "Mir passiert so etwas nicht" - +bis jetzt hat es noch jeden erwischt). + +___________________________________________________________________________________________ + + EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv + --------------: + Dateien Archiv: + U Übersicht : + D Üb. Drucken : + --------------: + Datei : + K Kopieren : + vom Archiv : + S Schreiben : + auf Archiv : + L Löschen : + auf Archiv : + --------------: + Archivdiskette: + I Init : + --------------: + Z Zielarchiv : + P Paßwort : + - Reservieren : + --------------: + : + : + Akt.Datei: Ziel: "ARCHIVE" Datum: 22.07.87 +___________________________________________________________________________________________ + + +#center#Abb. 4-3 Archivmenü + + +#on("b")#Archivmenü#off("b")# Wenn Sie EUDAS aufrufen, befinden Sie sich +immer im +ersten Menü. Sie benötigen jedoch jetzt Funktionen aus dem sech­ +sten Menü 'Archiv'. Wählen Sie dieses Menü jetzt an. Es erscheint +das in Abb. 4-3 dargestellte Bild. Die Funktionen in diesem Menü +befassen sich mit beliebigen Dateien auf dem Archiv. + Für den Versuch legen Sie bitte die EUDAS-Archivdiskette ein. +Dann wählen Sie die Funktion 'Übersicht' in dem Menü an, wenn sie +nicht schon markiert ist. Sie können nun die ausgewählte Funktion +durch Tippen der Leertaste ausführen. + In der obersten Zeile erscheint nun der Hinweis 'Bitte war­ +ten..'. Er zeigt an, daß nun eine Funktion ausgeführt wird, bei der +Sie zunächst nichts tun können. Sie sollten in diesem Zustand keine +Tasten drücken, denn EUDAS kann nicht darauf reagieren. + +#on("b")#Archivübersicht#off("b")# Nach einer mehr oder minder langen +Aktivitäts­ +phase Ihres Diskettenlaufwerks erscheint dann die Archivübersicht. +Das Erscheinungsbild mit dem markierten Editorbalken in der ober­ +sten Zeile kommt Ihnen vielleicht bekannt vor. Sie haben nämlich +nichts anderes als das EUMEL-Kommando 'list (archive)' ausgeführt. +Neu ist lediglich die Statuszeile: + +___________________________________________________________________________________________ + + ZEIGEN: Blättern: HOP OBEN, HOP UNTEN Beenden: ESC q Hilfe: ESC ? +___________________________________________________________________________________________ + + +Wenn Sie sich die Übersicht angeschaut haben, verlassen Sie den +Editor wieder mit ESC 'q'. + Beachten Sie, daß Sie unter EUDAS das Archiv nicht extra an­ +melden müssen; dies geschieht automatisch, wenn Sie eine Funktion +aufrufen. Bei Leseoperationen müssen Sie nicht einmal den Archiv­ +namen wissen. Das Archiv wird automatisch wieder abgemeldet, +wenn Sie das Archivmenü verlassen. + +#on("b")#Archiv lesen#off("b")# Unter den in der Übersicht aufgelisteten +Dateien +sollten Sie auch die Datei finden, die Sie brauchen. Sie heißt +'Adressen'. An dieser Stelle ein kleiner Hinweis: An vielen Stellen +werden Sie sehen, daß Dateinamen in Anführungsstriche einge­ +schlossen sind. Die Anführungsstriche gehören jedoch #on("i")#nicht#off("i")# zum +Namen. Sie dienen nur zur Abgrenzung, da in Dateinamen beliebige +Zeichen erlaubt sind. Wenn Sie aufgefordert werden, einen Datei­ +namen einzugeben, müssen Sie dies immer ohne Anführungsstriche +tun. + Hoffentlich haben Sie in der ganzen Diskussion nicht das Ziel +aus den Augen verloren: Sie sollten eine Datei ins System holen, um +nachher mit ihr zu experimentieren. Zu diesem Zweck gibt es im +Archivmenü die Funktion +#free (0.2)# + + K Kopieren + (vom Archiv) + +#free (0.2)# +Wählen Sie diese Funktion jetzt mit den Pfeiltasten aus und drücken +Sie zum Ausführen die Leertaste. + +#on("b")#Eingabezustand#off("b")# Nach kurzem 'Bitte warten..'-Zustand werden +Sie +im rechten Bildschirmteil nach dem Namen der Datei gefragt. Gleich­ +zeitig erscheint eine neue Statuszeile. Es ergibt sich folgendes Bild: + +___________________________________________________________________________________________ + + EINGABE: Bestätigen: RETURN Zeigen: ESC z Abbrechen: ESC h Hilfe: ESC ? + --------------:Dateiname: + Dateien Archiv: + U Übersicht : + D Üb. drucken : + --------------: + Datei : + * Kopieren : + vom Archiv : + ... + +___________________________________________________________________________________________ + + +Sie können in diesem Zustand den Namen der gewünschten Datei +eingeben. Außer den in der Statuszeile genannten Funktionen kön­ +nen Sie die aus dem Editor bekannten Tasten benutzen, um den +Text in der Zeile gegebenenfalls zu korrigieren (Pfeiltasten LINKS +und RECHTS, RUBOUT, RUBIN). Die Schreibmarke (Cursor) zeigt Ihnen +an, wo das nächste Zeichen plaziert wird. + +#on("b")#Abbruch#off("b")# Eine Tastenkombination verdient noch besondere +Beach­ +tung: Mit ESC 'h' können Sie in vielen Situationen eine Funktion +noch abbrechen - zum Beispiel wenn Sie irrtümlich die falsche +Funktion gewählt haben. + Im Gegensatz zu ESC 'q' erfolgt hier die sofortige Rückkehr aus +der Funktion ins Menü, möglichst ohne daß die Funktion Auswir­ +kungen hinterläßt. Bei einem Abbruch bleibt also in der Regel das +System unverändert. + +#on("b")#Fehlerzustand#off("b")# Um auch die Fehlerbehandlung von EUDAS +auszu­ +probieren, sollten Sie hier einen falschen Namen eingeben, zum +Beispiel: +#free (0.2)# + + Dateiname: #on("i")#Adresen#off("i")# + +#free (0.2)# +EUDAS sucht jetzt auf der Diskette nach einer Datei dieses Namens, +findet sie aber nicht. Als Reaktion erscheint dann die Meldung: + +___________________________________________________________________________________________ + + !!! FEHLER !!! Quittieren: ESC q Hilfe zur Meldung: ESC ? + --------------:Dateiname: Adresen + Dateien Archiv:>>> "Adresen" gibt es nicht + U Übersicht : + D Üb. drucken : + --------------: + ... + +___________________________________________________________________________________________ + + +Im Normalfall sollten Sie die Fehlermeldung mit ESC 'q' quittieren, +damit Sie den Befehl erneut versuchen können. Auch hier haben Sie +die Möglichkeit, eine besondere Information zu dem Fehler abzurufen +(es liegen jedoch nicht für alle möglichen Fehler spezielle Texte +vor). + Nach dem Quittieren des Fehlers befinden Sie sich wieder im +Menüzustand. Wiederholen Sie jetzt die Funktion, indem Sie die +Leertaste tippen. Sie werden dann erneut nach dem Namen gefragt. + +#on("b")#Auswahlzustand#off("b")# Um endlich ans Ziel zu kommen, benutzen Sie +diesmal eine sehr komfortable Abkürzung, die EUDAS Ihnen bietet. +Durch Drücken von ESC 'z' können Sie sich nämlich alle möglichen +Namen anzeigen lassen und den gewünschten einfach ankreuzen. + Anschließend sieht der Bildschirm wie in Abb. 4-4 aus. In die­ +sem Zustand können Sie mit den Pfeiltasten den Cursor zur ge­ +wünschten Datei bewegen und diese ankreuzen. Da Sie auch meh­ +rere Dateien in beliebiger Folge ankreuzen können, erscheint eine +'1' vor der Datei zur Anzeige der Reihenfolge. Sie wollen aber nur +diese eine Datei 'Adressen' holen und beenden die Auswahl daher +mit ESC 'q'. Wenn alles glattgeht, wird jetzt die Datei vom Archiv +ins System kopiert. + +#on("b")#Archiv schreiben#off("b")# Auf nahezu gleiche Weise können Sie mit +der Funktion + + + S Schreiben + auf Archiv + + +eine Datei wieder auf die Diskette schreiben. Als erstes müssen Sie +dann den Namen der Archivdiskette eingeben, damit Sie nicht aus +Versehen auf eine falsche Archivdiskette schreiben. + Auch hier können Sie die gewünschten Dateien ankreuzen (na­ +türlich bietet EUDAS dann die Dateien des Systems an). Sie brau­ +chen keine Angst zu haben, aus Versehen eine Datei mit gleichem +Namen zu überschreiben - EUDAS fragt in solchen Fällen immer +nochmal an. + +___________________________________________________________________________________________ + + AUSWAHL: Ankreuzen: 'x' Durchstreichen: 'o' Beenden: ESC q Hilfe: ESC ? + --------------:-------------------------------------------------------------- + Dateien Archiv: Auswahl der Dateien auf dem Archiv. + U Übersicht : Gewuenschte Datei(en) bitte ankreuzen: + D Üb. Drucken :-------------------------------------------------------------- + --------------: o "eudas.1" + Datei : o "eudas.2" + * Kopieren : o "eudas.3" + vom Archiv : o "eudas.4" + S Schreiben : o "eudas.init" + auf Archiv : o "eudas.generator" + L Löschen : o "Adressen" + auf Archiv :-------------------------------------------------------------- + --------------: + Archivdiskette: + I Init : + --------------: + Z Zielarchiv : + P Paßwort : + - Reservieren : + --------------: + : + : + Akt.Datei: Ziel: "ARCHIVE" Datum: 22.07.87 +___________________________________________________________________________________________ + + +#center#Abb. 4-4 Dateiauswahl + + + +4.4 Dateiverwaltung + +So: nach dieser anstrengenden Arbeit sollen Sie sich überzeugen, +daß die Datei 'Adressen' nun wirklich im System zur Verfügung +steht. Dazu gehen Sie mit LINKS ein Menü zurück. Dieses Menü +beschäftigt sich mit Dateien im System und ist in Abb. 4-5 gezeigt. + Auch hier finden Sie eine Funktion "Übersicht". Rufen Sie diese +auf. Ganz analog zum Archiv erscheint eine Übersicht aller Dateien +im Editor. Verlassen Sie die Übersicht wieder mit ESC 'q'. + +___________________________________________________________________________________________ + + EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv + --------------: + Dateien System: + U Übersicht : + --------------: + Datei : + L Löschen : + N Umbenennen : + K Kopieren : + P Platzbedarf : + A Aufräumen : + --------------: + : + : + : + : + : + : + : + : + : + : + : + Akt.Datei: Task: "arbeit" Datum: 22.07.87 +___________________________________________________________________________________________ + + +#center#Abb. 4-5 Menü 'Dateien' + + +#on("b")#Datei löschen#off("b")# Eine weitere Funktion aus diesem Menü werden +Sie ebenfalls noch öfter brauchen, nämlich +#free (0.2)# + + L Löschen + +#free (0.2)# +Mit dieser Funktion können Sie eine Datei wieder aus dem System +entfernen - zum Beispiel wenn Sie sich die Adressen angesehen +haben und danach den Speicherplatz nicht weiter verschwenden +wollen. Als letztes Beispiel sollen Sie auch diese Funktion aufrufen +(keine Angst, wir löschen die Datei nicht wirklich, es gibt vorher +noch eine Notbremse). + +#on("b")#Fragezustand#off("b")# Als erstes werden Sie wieder nach dem +Dateinamen +gefragt (dies ist Ihnen schon bekannt). Hier haben Sie jetzt die +Wahl, ob Sie den Namen eingeben oder mit ESC 'z' ankreuzen. Da das +Löschen unwiederbringlich ist, werden Sie anschließend zur Sicher­ +heit gefragt, ob Sie die Datei wirklich löschen wollen: + +___________________________________________________________________________________________ + + FRAGE: Bejahen: j,J Verneinen: n,N Abbrechen: ESC h Hilfe: ESC ? + --------------:Dateiname: Adressen + Dateien System:"Adressen" im System loeschen (j/n) ? + U Übersicht : + --------------: + ... + +___________________________________________________________________________________________ + + +Diese Frage können Sie bejahen oder verneinen (oder die Funktion +ohne Auswirkungen abbrechen). In diesem Fall sollten Sie die Frage +verneinen - es sei denn, Ihnen hat das Spielen mit EUDAS so gut +gefallen, daß Sie die ganze Prozedur wiederholen und die Datei +nochmal vom Archiv holen wollen. + + +4.5 Bedienungsregeln + +Mit dieser letzten Demonstration haben Sie jetzt schon fast alle +Arten des Umgangs mit EUDAS kennengelernt. Sicher ist dies beim +ersten Mal sehr verwirrend. Mit vier Regeln können Sie jedoch +EUDAS immer bedienen: + +#limit (12.0)# + 1. Achten Sie darauf, welche möglichen Tastendrücke + in der Statuszeile stehen. Richten Sie sich danach! +#free (0.2)# + 2. Sind Sie sich unsicher, rufen Sie Hilfsfunktion mit + ESC '?' auf. Damit erhalten Sie weitere Informatio­ + nen. +#free (0.2)# + 3. Funktioniert diese Tastenkombination nicht (geben + Sie dem Rechner eine kurze Zeit zum Reagieren), + versuchen Sie die Tastenkombinationen ESC 'h' (Ab­ + bruch) oder ESC 'q' (Verlassen). Falls sich daraufhin + etwas verändert, fangen Sie wieder mit 1. an. +#free (0.2)# + 4. Erfolgt darauf keine Reaktion, drücken Sie die SV- + Taste und versuchen Sie das Programm mit 'halt' zu + stoppen. Führt auch das nicht zum Erfolg, hat sich + Ihr Rechner "aufgehängt". Sie müssen den Rechner + dann neu starten. Wenn Sie keine Erfahrung mit + einer solchen Situation haben, wenden Sie sich an + Ihren Händler oder Systembetreuer. +#limit (13.5)# + +Im Zusammenhang mit dem letzten Punkt sei nochmal auf die Wich­ +tigkeit einer regelmäßigen Datensicherung auf Archivdisketten +hingewiesen. Im Normalfall sollten Sie aber mit den Punkten 1 bis 3 +zurechtkommen. + +#on("b")#Zustände#off("b")# Im letzten Abschnitt haben Sie eine ganze Reihe +von +Zuständen kennengelernt, die EUDAS einnehmen kann. In jedem +Zustand haben Sie verschiedene Möglichkeiten zur Reaktion. Glück­ +licherweise erscheinen diese Möglichkeiten zum großen Teil in der +Statuszeile. + Damit Sie die verwirrenden Erfahrungen des letzten Abschnitts +etwas ordnen können, wollen wir an dieser Stelle die verschiedenen +Zustände noch einmal zusammenfassen. Der Beschreibung vorange­ +stellt ist die jeweilige Kennzeichnung am Beginn der Statuszeile. + +EUDAS: #on("b")# Sie können mit ESC 'w' und ESC 'z' im Hilfstext blättern. Mit + ESC 'q' kommen Sie in den alten Zustand. + +AUSWAHL: Hier können Sie die gewünschten Namen mit 'x' ankreuzen + und mit 'o' wieder entfernen. Normales Beenden mit ESC 'q'. + Hilfestellung durch ESC '?'. Abbruch der gesamten Funktion mit + ESC 'h'. + +EINGABE: Hier können Sie eine einzelne Zeile eingeben oder ändern + (wie im Editor). Einfügen und Löschen mit RUBIN und RUBOUT. + Abbruch und Hilfestellung möglich. + +FRAGE: Beantworten Sie die gestellte Frage mit 'j' oder 'n'. Abbruch + (ESC 'h') und Hilfestellung (ESC '?') möglich. + +ZEIGEN: Mit HOP OBEN und HOP UNTEN können Sie in der Übersicht + blättern. Ende der Übersicht mit ESC 'q'. Hilfestellung möglich. + +!!! FEHLER !!! Quittieren Sie die Meldung mit ESC 'q'. Hilfestellung + möglich. + +Bitte warten.. In diesem Zustand keine Taste drücken, der Rechner + ist beschäftigt. + +Drei weitere Zustände, die Sie noch nicht kennengelernt haben, sind +hier schon mal der Vollständigkeit halber aufgeführt: + +SATZ ÄNDERN: +SATZ EINFÜGEN: +SUCHMUSTER EINGEBEN: Satzeditor zum Eingeben von Feldinhalten. + Normales Verlassen mit ESC 'q'. Abbruch und Hilfestellung mög­ + lich. Beschreibung s. 6.2. + +EDITIEREN: EUMEL-Editor mit Änderungsmöglichkeit für beliebige + Texte. Normales Verlassen mit ESC 'q'. Hilfestellung möglich. + Beschreibung der Möglichkeiten siehe EUMEL-Benutzerhand­ + buch. + +Gib Kommando: Hier können Sie ein beliebiges ELAN-Kommando ein­ + geben und mit RETURN bestätigen. Abbruch und Hilfestellung + möglich. Kann im Menü durch ESC ESC aufgerufen werden. + +Wie Sie sehen, werden auch hier wieder die gleichen Tastenkombi­ +nationen verwendet, die Sie schon kennen. + In dieser Übersicht sind jeweils nur die wichtigsten Tastenkom­ +binationen aufgeführt. Informieren Sie sich gegebenenfalls mit ESC +'?'. Einige weitere Tastenfunktionen werden Sie im folgenden noch +kennenlernen. Eine vollständige Übersicht finden Sie im Referenz­ +handbuch. + diff --git a/doc/graphic/Altes Handbuch - Teil 10 - Graphik b/doc/graphic/Altes Handbuch - Teil 10 - Graphik new file mode 100644 index 0000000..36fa31e --- /dev/null +++ b/doc/graphic/Altes Handbuch - Teil 10 - Graphik @@ -0,0 +1,831 @@ +#type ("trium10")##limit (13.5)# +#block##start(2.5,2.5)##pagelength(21.0)##pagenr("%",418)##setcount(22)# +#headeven# +% EUMEL-Benutzerhandbuch + + + +#end# +#headodd# + TEIL 10: Graphik % + + + +#end# +#type("triumb14")# +#ib(9)##center#TEIL 10: Graphik#ie(9)# +#type("trium10")# +#free(2.0)# +#on("bold")##ib(9)##type("triumb14")#1. Übersicht#ie(9)# +#type("trium10")# + + #limit(12.0)##on("italics")#Dieser Teil des Benutzer-Handbuchs beschreibt die Graphik- + Möglichkeiten des EUMEL-Systems. Die Graphik-Pakete ge­ + hören nicht zum EUMEL-Standard, sondern sind Anwender­ + pakete, die im Quellcode ausgeliefert und von jeder Installation + in das System aufgenommen werden können. Unter Umständen + müssen Programme erstellt werden, die die Anpassungen für + spezielle graphische Geräte einer Installation vornehmen. +#limit(13.5)##off("italics")# + +Das Graphik-System ermöglicht es, durch ELAN-Programme geräteunab­ +hängige Informationen für Zeichnungen ("#ib#Graphiken#ie#") zu erstellen. Die Graphik +erzeugenden Programme brauchen dabei keine gerätespezifischen Größen sowie +gerätespezifischen Unterprogramme zu enthalten. Sie befassen sich somit +ausschließlich mit der Erzeugung der problemorientierten Information für die +Konstruktion einer Zeichnung. Nach der geräteunabhängigen Erzeugung einer +Graphik kann diese auf unterschiedlichen Geräten ausgegeben werden (z.B. erst +auf einem Terminal zur Kontrolle und dann auf einem Plotter). + +Die EUMEL-Graphik umfaßt zwei- und dreidimensionale Graphik. Dabei +entspricht die Y-Achse bei der zweidimensionalen Graphik der Z-Achse (Höhe) +bei der dreidimensionalen Graphik. Im dreidimensionalen Fall sind perspektivi­ +sche, orthografische und schiefwinklige Projektionen mit beliebigen Betrach­ +tungswinkeln möglich. + +Bei der EUMEL-Graphik wird streng zwischen Erzeugung und Manipulation von +Graphiken (Bildern) auf der einen und Darstellung der erzeugten Bilder auf der +anderen Seite unterschieden. Für die Erzeugung und Manipulation der Graphi­ +ken existiert der Typ PICTURE, für die Darstellung der Bilder gibt es den Typ +PICFILE. Dabei müssen Ausschnitt, Maßstab, Betrachtungswinkel und Pro­ +jektionsart erst bei der Darstellung festgelegt werden. Diese Konstruktion des +Graphik-Systems hat folgende Vorteile: + +a) Programme, die Graphik-Informationen erzeugen, sind geräteunabhängig. + Das bedeutet, daß Programmierer sich ausschließlich mit einem logischen + Problem zu befassen brauchen und nicht mit gerätespezifischen Besonder­ + heiten. + +b) Graphiken können auf mehreren unterschiedlich gearteten Geräten mehrmals + dargestellt werden, ohne daß das erzeugende Programm geändert oder neu + gestartet werden muß. Z.B. kann ein Programmierer eine Graphik erst auf + dem Terminal auf Richtigkeit und Größenverhältnisse überprüfen, bevor er die + Zeichnung auf einem Plotter zeichnen läßt. + +c) Graphiken können leicht geändert (z.B. vergrößert oder in eine Richtung + gestreckt) werden, ohne daß das erzeugende Programm erneut durchlaufen + werden muß. Zudem können Graphiken aneinander oder übereinander gelegt + werden. + +d) Graphiken mit unterschiedlichen Farben, Strichen usw. können leicht erzeugt + werden. + +e) Der Anschluß von neuen Graphik-Geräten durch Benutzer ist leicht möglich, + ohne daß die Graphik erzeugenden Programme modifiziert werden müssen. + +f) Plotter können wie Drucker an einen SPOOLER gehängt werden. + +g) Bilder können als PICFILEs gespeichert und versandt werden. +#free(2.0)# +#ib(9)##type("triumb14")#Erzeugung von Bildern#ie(9)# +#type("trium10")# + +Bilder entstehen in Objekten vom Datentyp + +#type("modern12")# + PICTURE +#type("trium10")# + +Diese müssen mit der Prozedur + +#type("modern12")# + nilpicture +#type("trium10")# + +initialisiert werden. Sie enthalten dann ein leeres Bild, dessen Dimension noch +nicht festgelegt ist. Die Dimension eines PICTUREs wird mit dem ersten +Schreibzugriff ('move' oder 'draw') festgelegt. Ein PICTURE kann immer nur +entweder zwei- oder dreidimensional sein. Außerdem kann einem PICTURE mit +der Prozedur + +#type("modern12")# + pen +#type("trium10")# + +genau ein virtueller Stift zugeordnet oder der aktuelle Stift erfragt werden. + +Die Erzeugung eines Bildes basiert auf dem Modell eines Plotters. Der (virtuelle) +Zeichenstift kann mit + +#type("modern12")# + move +#type("trium10")# + +ohne zu zeichnen an beliebige Stellen gefahren werden (reine Positionierung). +Mit + +#type("modern12")# + draw +#type("trium10")# + +wird der Stift veranlaßt, eine Linie von der aktuellen zur angegebenen Zielposi­ +tion zu zeichnen. 'move' löst also Bewegungen mit gehobenem, 'draw' solche mit +gesenktem Stift aus. Um auch 'relatives' Zeichnen zu ermöglichen, existiert die +Prozedur + +#type("modern12")# + where +#type("trium10")# + +die die aktuelle Stiftposition liefert. +#free(2.0)# +#ib(9)##type("triumb14")#Manipulation von Bildern#ie(9)# +#type("trium10")# + +Erstellte Bilder können als Ganzes manipuliert werden. Die Prozeduren + +#type("modern12")# + translate (* verschieben *) + stretch (* strecken bzw. stauchen *) + rotate (* drehen *) + reflect (* spiegeln *) +#type("trium10")# + +verändern jeweils das ganze Bild. Es ist aber auch möglich, mehrere Bilder +zusammenzufügen. Mit + +#type("modern12")# + CAT +#type("trium10")# + +kann ein weiteres Bild angefügt werden. Dabei müssen allerdings beide +PICTURE die gleiche Dimension haben. In solchen als ganzes manipulierten +Bildern kann man ohne Einschränkung mit 'draw' und 'move' weiterzeichnen. +#free(2.0)# +#ib(9)##type("triumb14")#Darstellung#ie(9)# +#type("trium10")# + +Für die Darstellung der erzeugten Bilder existiert der Typ + +#type("modern12")# + PICFILE +#type("trium10")# + +Dieser besteht aus max. 128 PICTUREs, die mit den Prozeduren + +#type("modern12")# + put + get +#type("trium10")# + +eingegeben bzw. ausgegeben werden können. PICFILE wird durch Datenräume +realisiert, deshalb erfolgt die Assoziation an einen benannten Datenraum ähnlich +wie beim FILE. Dafür wird die Prozedur + +#type("modern12")# + picture file +#type("trium10")# + +verwandt. Ein neuer PICFILE enthält genau ein leeres PICTURE. Die Darstellung +der PICFILEs auf Zeichengeräten erfolgt mit der Prozedur + +#type("modern12")# + plot +#type("trium10")# + +Da die Graphiken aber in "Weltkoordinaten" erzeugt werden und die spätere +Darstellung vollkommen unbeachtet bleibt, müssen gewisse Darstellungspara­ +meter für die Zeichnung gesetzt werden. Diese Parameter werden im PICFILE +abgelegt und gelten jeweils für den gesamten PICFILE. Dadurch ist es möglich, +einen PICFILE mit spezifizierter Darstellungsart über einen SPOOLER an einen +Plotter zu senden oder die bei der letzten Betrachtung gewählte Darstellung mit +in dem PICFILE gespeichert zu halten. Für die Darstellung können den virtuellen +Stiften mit der Prozedur + +#type("modern12")# + select pen +#type("trium10")# + +reale Stifte zugeordnet werden. Voreingestellt ist für alle virtuellen Stifte: +Standardfarbe, Standardstärke, durchgängige Linie. + +Indem man einigen virtuellen Stiften den leeren Stift als realen Stift zuordnet, +kann man einzelne PICTUREs ausblenden. Sowohl bei der Darstellung von +zwei- als auch dreidimensionaler Graphik kann die gewählte Zeichenfläche auf +dem Endgerät mit der Prozedur + +#type("modern12")# + viewport +#type("trium10")# + +festgelegt werden. Voreingestellt ist das Quadrat mit der größtmöglichen Seiten­ +länge, d.h. der kürzeren Seite der hardwaremäßigen Zeichenfläche. +#free(2.0)# +#ib(9)##type("triumb14")#Darstellung zweidimensionaler Graphik#ie(9)# +#type("trium10")# + +Bei der Darstellung zweidimensionaler Bilder muß der zu zeichnende Ausschnitt +(das 'Fenster') angegeben werden. Mit der Prozedur + +#type("modern12")# + window +#type("trium10")# + +wird durch Angabe der minimalen und maximalen X- bzw. Y-Koordinaten ein +Fenster definiert. Da das so definierte Fenster auf die ganze (mit 'viewport' +definierbare) Zeichenfläche abgebildet wird, ist der Abbildungsmaßstab durch das +Zusammenspiel von 'viewport' und 'window' bestimmt. Da bei 'viewport' stan­ +dardmäßig das maximale Zeichenquadrat voreingestellt ist, wird in diesem Fall +durch gleiche X- und Y-Fenstergröße eine winkeltreue Darstellung erreicht. +#free(2.0)# +#ib(9)##type("triumb14")#Darstellung dreidimensionaler Graphik#ie(9)# +#type("trium10")# + +Im dreidimensionalen Fall wird das Fenster ebenfalls mit + +#type("modern12")# + window +#type("trium10")# + +definiert, wobei dann allerdings auch der Bereich der dritten Dimension +(Z-Koordinaten) zu berücksichtigen ist. Da die dreidimensionale Graphik auf +eine zweidimensionale Fläche projiziert wird, können aber noch weitere Darstel­ +lungsparameter angegeben werden. Der Betrachtungswinkel wird mit Hilfe der +Prozedur + +#type("modern12")# + view +#type("trium10")# + +angegeben. Zur Spezifikation der gewünschten Projektionsart gibt es + +#type("modern12")# + orthographic (* orthographische Projektion *) + perspective (* perspektivische Projektion, + der Fluchtpunkt ist frei wählbar *) + oblique (* schiefwinklige Projektion *) +#type("trium10")# +#free(2.0)# +#ib(9)##type("triumb14")#Beispiel (Sinuskurve)#ie(9)# +#type("modern12")# + + funktion zeichnen; + bild darstellen . + +funktion zeichen : + PICTURE VAR pic :: nilpicture; + REAL VAR x := -pi; + move (pic, x, sin (x)); + REP x INCR 0.1; + draw (pic, x, sin (x)) + UNTIL x >= pi PER . + +bild darstellen : + PICFILE VAR p :: picture file ("sinus"); + window (p, -pi, pi, -1.0, 1.0); + put (p, pic); + plot (p) . +#type("trium10")# +#free(2.0)# +#ib(9)##type("triumb14")#Beispiel (Würfel)#ie(9)# +#type("modern12")# + + wuerfel zeichen; + wuerfel darstellen. + +wuerfel zeichnen : + zeichne vorderseite; + zeichne rueckseite; + zeichne verbindungskanten. + +zeichne vorderseite : + PICTURE VAR vorderseite :: nilpicture; + move (vorderseite, 0.0, 0.0, 0.0); + draw (vorderseite, 1.0, 0.0, 0.0); + draw (vorderseite, 1.0, 0.0, 1.0); + draw (vorderseite, 0.0, 0.0, 1.0); + draw (vorderseite, 0.0, 0.0, 0.0). + +zeichne rueckseite : + PICTURE VAR rueckseite :: translate + (vorderseite, 0.0, 1.0, 0.0). + +zeichne verbindungskanten : + PICTURE VAR verbindungskanten :: nilpicture; + move (verbindungskanten, 0.0, 0.0, 0.0); + draw (verbindungskanten, 0.0, 1.0, 0.0); + + move (verbindungskanten, 1.0, 0.0, 0.0); + draw (verbindungskanten, 1.0, 1.0, 0.0); + + move (verbindungskanten, 1.0, 0.0, 1.0); + draw (verbindungskanten, 1.0, 1.0, 1.0); + + move (verbindungskanten, 0.0, 0.0, 1.0); + draw (verbindungskanten, 0.0, 1.0, 1.0). + +wuerfel darstellen : + PICFILE VAR p := picture file ("wuerfel"); + put (p, vorderseite); + put (p, rueckseite); + put (p, verbindungskanten); + window (p, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0); + view (p, 0.0, 40.0, 20.0); + orthographic (p); + plot (p). +#type("trium10")# +#free(2.0)# +#ib(9)##type("triumb14")#Beschreibung der Graphik-Prozeduren#ie(9)# +#type("trium10")# + + #limit(12.0)##on("italics")#Zweidimensionale PICTUREs brauchen weniger Speicherplatz + als dreidimensionale. Daher werden in einigen Fehlermeldun­ + gen unterschiedliche Größen angegeben. +#limit(13.5)##off("italics")# + +:= + OP := (PICTURE VAR dest, PICTURE CONST source) + Zweck: Zuweisung + + OP := (PICFILE VAR dest, DATASPACE CONST source) + Zweck: Assoziiert die PICFILE Variable 'dest' mit der DATASPACE CONST + 'source' und initialisiert die PICFILE Variable sofern nötig. + Fehlerfall: + * dataspace is no PICFILE + Der anzukoppelnde Datenraum hat einen falschen Typ. + +#ib#CAT#ie# + OP CAT (PICTURE VAR dest, PICTURE CONST source) + Zweck: Aneinanderfügen von zwei PICTURE's. + Fehlerfälle: + * OP CAT: left dimension <> right dimension + Es können nur PICTUREs mit gleicher Dimension angefügt werden. + * OP CAT: Picture overflow + Die beiden PICTURE überschreiten die maximale Größe eines + Pictures. + +#ib#act picture#ie# + PICTURE PROC act picture (PICFILE VAR p) + Zweck: Liefert das PICTURE des PICFILEs 'p', auf das mit 'backward' o.ä. + positioniert wurde. + +#ib#backward#ie# + PROC backward (PICFILE VAR p) + Zweck: Positioniert den PICFILE 'p' um ein PICTURE zurück. + Fehlerfall: + * backward at begin of file + Es wurde versucht vor den Anfang des PICFILEs zu positionieren. + +#ib#draw#ie# + PROC draw (PICTURE VAR pic, REAL CONST x, y) + Zweck: Die Prozedur zeichnet in dem (zweidimensionalen) Bild 'pic' eine + Linie von der aktuellen Position zur Position (x, y). + Fehlerfälle: + * picture overflow + Zu viele Befehle in einem PICTURE (z. Zeit max. 1927) + * picture is three dimensional + Ein PICTURE kann nur entweder zwei- oder dreidimensional sein. + + PROC draw (PICTURE VAR pic, REAL CONST x, y, z) + Zweck: Die Prozedur zeichnet in dem (dreidimensionalen) Bild 'pic' eine + gerade Linie von der aktuellen Position zur Position (x, y, z). + Fehlerfälle: + * picture overflow + Zu viele Befehle in einem PICTURE (z. Zeit max. 1310) + * picture is only two dimensional + Ein PICTURE kann nur entweder zwei- oder dreidimensional sein. + + PROC draw (PICTURE VAR pic, TEXT CONST text) + Zweck: Der angegebene Text wird in das Bild 'pic' eingetragen. Der Anfang + ist dabei die aktuelle Stiftposition. Diese wird nicht verändert. + Fehlerfall: + * picture overflow + Der Text paßt nicht mehr in das PICTURE. + + PROC draw (PICTURE VAR pic, TEXT CONST text, + REAL CONST angle, height) + Zweck: Der angegebene Text wird unter dem Winkel 'angle' gegenüber der + Waagerechten und in der Größe 'height' in das PICTURE 'pic' + eingetragen. Der Anfang ist dabei die aktuelle Stiftposition. Diese + wird nicht verändert. + Fehlerfall: + * picture overflow + Der Text paßt nicht mehr in das PICTURE. + + PROC draw (PICFILE VAR pic, REAL CONST x, y) + Zweck: Die Prozedur zeichnet in dem aktuellen (zweidimensionalen) + PICTURE des PICFILEs 'p' eine gerade Linie. Der (virtuelle) Stift wird + von der aktuellen Position zur Position (x, y) gefahren. Falls das + aktuelle PICTURE zu voll ist, wird automatisch auf das nächste + umgeschaltet. + Fehlerfälle: + * picfile overflow + Das letzte PICTURE ist voll (z. Zeit max. 128 PICTURE) + * picture is threedimensional + Das aktuelle PICTURE ist dreidimensional. + + PROC draw (PICTFILE VAR pic, REAL CONST x, y, z) + Zweck: s. o. + Fehlerfälle: + * picfile overflow + Das letzte PICTURE ist voll (z. Zeit max. 128) + * picfile is only twodimensional + Das aktuelle PICTURE ist zweidimensional. + + PROC draw (PICTFILE VAR pic, TEXT CONST text) + Zweck: Der angegebene Text wird in das aktuelle PICTURE des PICFILEs 'p' + eingetragen. Falls das aktuelle PICTURE zu voll ist, wird automatisch + auf das nächste umgeschaltet. Der Anfang ist dabei die aktuelle + Stiftposition. Diese wird nicht verändert. + Fehlerfall: + * picfile overflow + Das letzte PICTURE ist voll (z. Zeit max. 128) + + PROC draw (PICFILE VAR pic, TEXT CONST text, + REAL CONST angle, height) + Zweck: Der angegebene Text wird unter dem Winkel 'angle' gegenüber der + Waagerechten und in der Größe 'height' in das aktuelle PICTURE + des PICFILES 'p' eingetragen. Falls das aktuelle PICTURE zu voll ist, + wird automatisch auf das nächste umgeschaltet. Der Anfang ist + dabei die aktuelle Stiftposition. Diese wird nicht verändert. + Fehlerfall: + * picfile overflow + Das letzte PICTURE ist voll (z. Zeit max. 128) + +#ib#eof#ie# + BOOL PROC eof (PICFILE CONST p) + Zweck: Liefert 'TRUE' wenn hinter das Ende des PICFILEs positioniert + wurde. + +#ib#extrema#ie# + PROC extrema (PICTURE CONST p, + REAL VAR x min, x max, y min, y max) + Zweck: Die Prozedur liefert die größten und kleinsten X- und Y-Koordi­ + naten des PICTUREs 'p'. Diese werden in die Parameter 'x min', 'x + max', 'y min' und 'y max' eingetragen. + + PROC extrema (PICTURE CONST p, + REAL VAR x min, x max, y min, y max, z min, z max) + Zweck: s.o. + + PROC extrema (PICFILE VAR p, REAL VAR x min, x max, y min, y max) + Zweck: s.o. + + PROC extrema (PICFILE VAR p, + REAL VAR x min, x max, y min, y max, z min, z max) + Zweck: s.o. + +#ib#forward#ie# + PROC forward (PICFILE VAR p) + Zweck: Positioniert den PICFILE um ein PICTURE weiter. + Fehlerfall: + * picfile overflow + Es sollte hinter das Ende des PICFILEs positioniert werden. + +#ib#get#ie# + PROC get (PICFILE VAR p, PICTURE VAR pic) + Zweck: Liest ein PICTURE aus einem PICFILE und positioniert auf das + Nächste. + Fehlerfall: + * input after end of picfile + Es sollte nach dem Ende des Picfiles gelesen werden. + +#ib#move#ie# + PROC move (PICTURE VAR pic, REAL CONST x, y) + Zweck: Der (virtuelle) Stift wird zur Position (x, y) gefahren. + Fehlerfälle: + * picture overflow + Zu viele Befehle in einem PICTURE (z. Zeit max. 1927 'moves') + * picture is three dimensional + Ein PICTURE kann nur entweder zwei- oder dreidimensional sein. + + PROC move (PICTURE VAR pic, REAL CONST x, y, z) + Zweck: Der (virtuelle) Stift wird zur Position (x, y, z) gefahren. + Fehlerfälle: + * picture overflow + Zu viele Befehle in einem PICTURE (z. Zeit max. 1310) + * picture is only twodimensional + Ein PICTURE kann nur entweder zwei- oder dreidimensional sein. + + PROC move (PICFILE VAR p, REAL CONST x, y) + Zweck: Der (virtuelle) Stift wird zur Position (x, y) gefahren. Falls das aktuelle + PICTURE des PICFILEs 'p' zu voll ist, wird automatisch auf das + nächste umgeschaltet. + Fehlerfall: + * picfile overflow + Das letzte PICTURE ist voll (z. Zeit max. 128 PICTUREs) + + PROC move (PICFILE VAR p, REAL CONST x, y, z) + Zweck: Der (virtuelle) Stift wird zur Position (x, y, z) gefahren. Falls das + aktuelle PICTURE des PICFILEs 'p' zu voll ist, wird automatisch auf + das nächste umgeschaltet. + Fehlerfall: + * picfile overflow + Das letzte PICTURE ist voll (z. Zeit max. 128 PICTUREs) + +#ib#nilpicture#ie# + PICTURE PROC nilpicture + Zweck: Die Prozedure liefert ein leeres PICTURE zur Initialisierung. + +#ib#oblique#ie# + PROC oblique (PICFILE VAR p, REAL CONST a, b) + Zweck: Bei dem (dreidimensionalen!) Bild 'p' wird 'schiefwinklig' als + gewünschte Projektionsart eingestellt. Dabei ist (a, b) der Punkt in + der X-Y-Ebene, auf den der Einheitsvector in Z-Richtung + abgebildet werden soll. + +#ib#orthographic#ie# + PROC orthographic (PICFILE VAR p) + Zweck: Bei dem (dreidimensionalen!) Bild 'p' wird "orthografisch" als Pro­ + jektionsart eingestellt. Bei der orthografischen Projektion wird ein + dreidimensionaler Körper mit parallelen Strahlen senkrecht auf die + Projektionsebene abgebildet. + +#ib#pen#ie# + INT PROC pen (PICTURE CONST pic) + Zweck: Liefert die Nummer des 'virtuellen Stifts'. + + PICTURE PROC pen (PICTURE CONST pic, INT CONST pen) + Zweck: Liefert ein PICTURE mit dem Inhalt 'pic' und dem 'virtuellen Stift' mit + der Nummer 'pen'. Möglich sind die Nummern 1 - 16. + Fehlerfälle: + * PROC pen: pen [No] < 1 + Der gewünschte Stift ist kleiner als 1. + * PROC pen: pen [No] > 16 + Der gewünschte Stift ist größer als 16. + +#ib#perspective#ie# + PROC perspective (PICFILE VAR p, REAL CONST cx, cy, cz) + Zweck: Bei den dreidimensionalen PICTUREs des PICFILE's 'p' wird + "perspektivisch" als gewünschte Projektionsart eingestellt. Der Punkt + (cx, cy, cz) ist der Fluchtpunkt der Projektion, d.h. alle Parallelen zur + Blickrichtung schneiden sich in diesem Punkt. + +#ib#pic no#ie# + INT PROC pic no (PICFILE CONST p) + Zweck: Liefert die Nummer des aktuellen PICTUREs. + +#ib#picture file#ie# + DATASPACE PROC picture file (TEXT CONST name) + Zweck: Die Prozedur dient zur Assoziation eines benannten Datenraumes mit + einem PICFILE (s. Operator ':='). + +#ib#plot#ie# + PROC plot (TEXT CONST name) + Zweck: Der PICFILE mit dem Namen 'name' wird entspechend der angege­ + benen Darstellungsart gezeichnet. Diese Parameter ('perspective', + 'orthographic', 'oblique', 'view', 'window' etc.) müssen vorher + eingestellt werden. + Fehlerfall: + * FILE does not exist + Es existiert kein PICFILE mit dem Namen 'name' + + PROC plot (PICFILE VAR p) + Zweck: Der PICFILE 'p' wird entspechend der angegebenen Darstellungsart + gezeichnet. Diese Parameter müssen vorher eingestellt werden. + + #on("bold")#Zweidimensional: +#off("bold")# + obligat: 'window' (zweidimensional) + optional: 'view' (zweidimensional) + 'select pen' + 'viewport' + + #on("bold")#Dreidimensional: +#off("bold")# + obligat: 'window' (dreidimensional) + optional: 'view' (dreidimensional) + 'orthographic', 'perspective', 'oblique' + 'viewport' + 'select pen' + +#ib#put#ie# + PROC put (PICFILE VAR p, PICTURE CONST pic) + Zweck: Schreibt ein PICTURE in einen PICFILE und positioniert um eins + vor. + Fehlerfall: + * picfile overflow + Der PICFILE ist voll. (z. Z. max. 128 PICTURE) + +#ib#reset#ie# + PROC reset (PICFILE VAR p) + Zweck: Positioniert auf den Anfang eines Picfiles. + +#ib#rotate#ie# + PICTURE PROC rotate (PICTURE CONST pic, REAL CONST alpha) + Zweck: Das PICTURE 'pic' wird um den Punkt (0, 0) um den Winkel 'alpha' + (im Gradmaß) im mathematisch positiven Sinn gedreht. + + PICTURE PROC rotate (PICTURE CONST pic, + REAL CONST alpha, beta, gamma) + Zweck: Das dreidimensionale PICTURE 'pic' wird um den Winkel 'alpha', + 'beta' oder 'gamma' im mathematisch positiven Sinn gedreht. Der + Winkel 'alpha' dreht um die X-Achse, der Winkel 'beta' um die + Y-Achse und 'gamma' um die Z-Achse. Es darf dabei nur jeweils + ein Winkel von 0.0 verschieden sein. Alle Winkel werden im + Gradmaß angegeben. + +#ib#select pen#ie# + PROC select pen (PICFILE VAR p, + INT CONST pen, colour, thickness, linetype) + Zweck: Für die Darstellung des Bildes 'p' soll dem "virtuellen Stift" 'pen' ein + realer Stift zugeordnet werden, der möglichst die Farbe 'colour' und + die Dicke 'thickness' hat und dabei Linien mit dem Typ 'line type' + zeichnet. Es wird die beste Annäherung für das Ausgabegerät für + diese Parameter genommen. Dabei gelten folgende Vereinbarun­ + gen: + + Farbe: negative Farben setzten den Hintergrund, positive Farben + zeichnen im Vordergrund. + + 0 Löschstift (falls vorhanden) + 1 Standardfarbe des Endgeräts (schwarz oder weiß) + 2 rot + 3 blau + 4 grün + 5 schwarz + 6 weiß > 20 nicht normierte Sonderfarben + + Dicke: 0 + Standardstrichstärke des Endgerätes > 0 + Strichstärke in 1/10 mm + + Typ: + 0 keine sichtbare Linie + 1 durchgängige Linie + 2 gepunktete Linie + 3 kurz gestrichelte Linie + 4 lang gestrichelte Linie + 5 Strichpunktlinie + + Die hier aufgeführten Möglichkeiten müssen nicht an allen grafischen + Endgeräten vorhanden sein. Der geräteabhängige Graphik-Treiber + wählt jeweils die für ihn bestmögliche Annäherung. + + Fehlerfälle: + * pen < 1 + * pen > 16 + +#ib#size#ie# + INT PROC size (PICFILE CONST p) + Zweck: Liefert die aktuelle Größe eines PICFILEs in Bytes. + +#ib#stretch#ie# + PICTURE PROC stretch (PICTURE CONST pic, REAL CONST xc, yc) + Zweck: Das PICTURE 'pic' wird in X-Richtung um den Faktor 'xc', in + Y-Richtung um den Faktor 'yc' gestreckt (bzw. gestaucht). Dabei + bewirkt der Faktor + c > 1 eine Streckung + 0 < c < 1 eine Stauchung + c < 0 zusätzlich eine Achsenspiegelung + + PICTURE PROC stretch (PICTURE CONST pic, REAL CONST xc, yc, zc) + Zweck: Das dreidimensionale PICTURE 'pic' wird entsprechend den + angegeben Faktoren 'xc', 'yc' und 'zc' gestreckt. Wirkung s.o. + +#ib#translate#ie# + PICTURE PROC translate (PICTURE CONST pic, REAL CONST dx, dy) + Zweck: Das PICTURE 'pic' wird um 'dx' und 'dy' verschoben. + Fehlerfall: + * picture is threedimensional + 'pic' ist dreidimensional. + + PICTURE PROC translate (PICTURE CONST pic, REAL CONST dx, dy, dz) + Zweck: Das PICTURE 'pic' wird um 'dx', 'dy' und 'dz' verschoben. + Fehlerfall: + * picture is twodimensional + Das PICTURE 'pic' ist zweidimensional + +#ib#two dimensional#ie# + PROC two dimensional (PICFILE VAR p) + Zweck: Setzt als Projektionsart zweidimensional. + +#ib#view#ie# + PROC view (PICFILE VAR p, REAL CONST alpha, phi, theta) + Zweck: Dreidimensionale Bilder werden häufig nicht direkt von vorne + dargestellt, sondern für die Betrachtung gedreht. Mit der Prozedur + 'view' kann diese Betrachtungsrichtung durch die Polarwinkel 'phi' + und 'theta' angegeben werden. Mit dem Winkel 'alpha' kann dann + das Bild um den Mittelpunkt der Zeichenfläche gedreht werden. + Dadurch kann ein Bild auch auf einem Terminal hochkant gestellt + werden. Voreingestellt ist 'phi = 0, theta = 0 und alpha = 0', d.h. + direkt von oben. + + Im Gegensatz zu 'rotate' hat 'view' keine Wirkung auf das eigentli­ + che Bild (PICFILE), sondern nur auf die gewählte Darstellung. So + addieren sich zwar aufeinanderfolgende "Rotationen", 'view' aber + geht immer von der Nullstellung aus. Auch kann das Bild durch eine + "Rotation" ganz oder teilweise aus oder in das Darstellungsfenster + ('window') gedreht werden. Bei 'view' verändern sich die Koordina­ + ten der Punkte nicht, d.h. das Fenster wird mitgedreht. + +#ib#viewport#ie# + PROC viewport (PICFILE VAR p, + REAL CONST hormin, hormax, vertmin, vertmax) + Zweck: Die Zeichenfläche auf dem Endgerät, auf dem das Bild dargestellt + werden soll, wird spezifiziert. Dabei wird sowohl die Größe als auch + die relative Lage der Zeichenfläche definiert. Der linke untere + Eckpunkt der physikalischen Zeichenfläche des Gerätes hat die + Koordinaten (0.0, 0.0). Die definierte Zeichenfläche erstreckt sich + +#type("modern12")# + 'hormin' - 'hormax' in der Horizontalen, + 'vertmin' - 'vertmax' in der Vertikalen. +#type("trium10")# + + So liegt der linke untere Eckpunkt dann bei (hormin, vertmin), der + rechte obere bei (hormax, vertmax). + + Damit sowohl geräteunabhängige als auch maßstabsgerechte + Zeichnungen möglich sind, können die Koordinaten in zwei Arten + spezifiziert werden : + + a) Gerätekoordinaten + Die Koordinaten können Werte von 0.0 bis 2.0 annehmen. Dabei + hat die kürzere Seite der physikalischen Zeichenfläche defini­ + tionsgemäß die Länge 1.0. + + b) absolute Koordinaten + Die Werte werden in cm angegeben. Für die Maximalwerte sind + nur Werte größer als 2.0 möglich. + + Voreingestellt ist + +#type("modern12")# + viewport (0.0, 1.0, 0.0, 1.0), +#type("trium10")# + + d.h. das größtmöglichste Quadrat, beginnend in der linken unteren + Ecke der physikalischen Zeichenfläche. In vielen Fällen wird diese + Einstellung ausreichen, so daß der Anwender kein eigenes 'viewport' + definieren muß. + + Der Abbildungsmaßstab wird durch das Zusammenspiel von 'view­ + port' und 'window' festgelegt (siehe dort). Dabei ist insbesondere + darauf zu achten, daß winkeltreue Darstellungen nur bei gleichem + X- und Y-Maßstab möglich sind. Da man oft quadratische Fenster + ('window') verwendet, wurde als Standardfall auch ein quadratisches + 'viewport' gewählt. + +#ib#where#ie# + PROC where (PICTURE CONST pic, REAL VAR x, y) + Zweck: Die aktuelle Stiftposition wird in 'x' und 'y' eingetragen. + Fehlerfall: + * picture is threedimensional + Das PICTURE 'pic' ist dreidimensional + + PROC where (PICTURE CONST pic, REAL VAR x, y, z) + Zweck: Die aktuelle Stiftposition wird in 'x', 'y' und 'z' eingetragen. + Fehlerfall: + * picture is twodimensional + Das PICTURE 'pic' ist zweidimensional + +#ib#window#ie# + PROC window (PICFILE VAR p, REAL CONST x min, x max, y min, y max) + Zweck: Für die Darstellung eines zweidimensionalen Bildes wird das + darzustellende Fenster definiert. Alle Bildpunkte, deren X-Koordi­ + naten im Intervall [x min, x max] und deren Y-Koordinaten im + Intervall [y min, y max] liegen, gehören zum definierten Fenster. + Vektoren, die über dieses Fenster hinausgehen, werden abge­ + schnitten. Dieses Fenster wird auf die spezifizierte Zeichenfläche + abgebildet. (Das ist standardmäßig das größtmögliche Quadrat auf + dem ausgewählten Gerät). + + Der Darstellungsmaßstab ergibt sich als + +#type("modern12")# + x max - x min + ----------------------------------------- + horizontale Seitenlänge der Zeichenfläche + + y max - y min + ----------------------------------------- + vertikale Seitenlänge der Zeichenfläche +#type("trium10")# + + Für eine winkeltreue Darstellung müssen X- und Y-Maßstab + gleich sein! Einfach können winkeltreue Darstellung erreicht + werden, wenn das Fenster eine quadratische Form hat. Die + Zeichenfläche ('viewport') ist dementsprechend als Quadrat vorein­ + gestellt. + + PROC window (PICFILE VAR p, + REAL CONST x min, x max, y min, y max, z min, z max) + Zweck: Für die Darstellung eines dreidimensionalen Bildes wird das darzu­ + stellende Fenster definiert. Alle Bildpunkte, deren X-Koordinaten im + Intervall [x min, x max] und deren Y-Koordinaten im Intervall [y min, + y max] und deren Z-Koordinaten im Intervall [z min, z max] liegen, + gehören zum definierten Fenster. Dieses dreidimensionale Fenster + (Quader) wird entsprechend der eingestellten Projektionsart (ortho­ + grafisch, perspektivisch oder schiefwinklig) und den Betrachtungs­ + winkeln (s. 'view') auf die spezifizierte Zeichenfläche abgebildet. (Das + ist standardmäßig das größtmögliche Quadrat auf dem ausgewählten + Gerät.) Linien, die außerhalb dieses Quadrates liegen, werden + abgeschnitten. + + Anders als im zweidimensionalen Fall ist das Problem der Maßstäbe + nicht mehr nur durch das Zusammenspiel von 'window' und 'view­ + port' zu beschreiben. Hier spielen auch Projektionsart und Dar­ + stellungswinkel eine Rolle. Falls alle Darstellungswinkel den Wert 0.0 + haben, gilt das für den zweidimensionalen Fall gesagte für die Ebene + (y = 0.0) entsprechend. + +#ib#write is possible#ie# + BOOL PROC write is possible (PICTURE CONST pic, INT CONST space) + Zweck: Liefert 'TRUE', falls 'space' Bytes Platz in 'pic' vorhanden ist. + + + + + + diff --git a/doc/graphic/GRAPHIK.book b/doc/graphic/GRAPHIK.book new file mode 100644 index 0000000..435d9e4 --- /dev/null +++ b/doc/graphic/GRAPHIK.book @@ -0,0 +1,897 @@ +#type ("times8")##limit (11.0)##start (2.2, 1.5)##pagelength (17.4)##block# + +#head# +#type ("triumb14")# +#center#EUMEL-Grafik-System + +#type ("times8")# +#end# +#type ("triumb14")# Teil 10: Graphik#type ("times8")# + + +#type ("trium12")# +#on("b")#1. Übersicht#off("b")# +#type ("times8")# + +#limit (7.0)##type("times6")# + #on("i")#Dieser Teil des Benutzer-Handbuchs beschreibt die Graphik- + Fähigkeiten des EUMEL-Systems. Die Graphik-Pakete gehö­ + ren nicht zum Eumel-Standard, sondern sind Anwenderpake­ + te, die im Quellcode ausgeliefert und von jeder Installation in das + System aufgenommen werden können. #off("i")# +#limit (11.0)# +#foot# + Eventuell müssen Programme erstellt werden, die die Anpassungen für spezielle graphische Geräte einer Installation + vornehmen, soweit diese nicht von den EUMEL-Anbietern bezogen werden können. +#end# + +#type("times8")# + Das #on("b")#Graphik-System#off("b")# ermöglicht es, durch ELAN-Programme geräteunabhängige Infor­ + mationen für Zeichnungen (#on("i")#Graphiken#off("i")#) zu erstellen. Die Graphik erzeugenden Programme + brauchen dabei keine geräteabhängigen Größen oder Unterprogramme zu enthalten. Sie + befassen sich somit ausschließlich mit der Erzeugung der problemorientierten Information + für die Konstruktion einer Zeichnung. Nach der geräteunabhängigen Erzeugung einer + Graphik kann diese auf unterschiedlichen Geräten ausgegeben werden (z.B. erst auf einem + Terminal zur Kontrolle und dann auf einem Plotter). + + Die EUMEL-Graphik umfaßt zwei- und dreidimensionale Graphik. Im dreidimensiona­ + len Fall sind perspektivische, orthografische und schiefwinklige Projektionen mit beliebi­ + gen Betrachtungswinkeln möglich. + + Bei der EUMEL-Graphik wird streng zwischen Erzeugung und Manipulation von Gra­ + phiken auf der einen und der Darstellung der erzeugten Bilder auf der anderen Seite + unterschieden. Für die Erzeugung und Manipulation der Graphiken wird von den Paketen + #on("i")#picture#off("i")# und #on("i")#picfile#off("i")# der Datentype #on("b")#PICTURE#off("b")# bzw. #on("b")#PICFILE#off("b")# zur Verfügung gestellt. Dabei + müssen Ausschnitt, Maßstab, Betrachtungswinkel und Projektionsart erst bei der Darstel­ + lung festgelegt werden. Diese Konstruktion des Graphik-Systems hat folgende Vorteile: + + a) Programme, die Graphik-Information erzeugen, sind geräteunabhängig. Das bedeu­ + tet, das der Programmierer sich ausschließlich mit einem logischen Problem befassen + muß und nicht mit gerätespezifischen Besonderheiten. + + b) Graphiken können auf mehreren unterschiedlich gearteten Geräten mehrmals darge­ + stellt werden, ohne daß das erzeugende Programm geändert oder neu gestartet werden + muß. Z.B. kann ein Programmierer eine Graphik erst auf dem Terminal überprüfen, + bevor er die Graphik auf einem Plotter zeichnen läßt. + + c) Graphiken können leicht geändert (z. B. vergrößert oder in eine Richtung gestreckt + o.ä.) werden, ohne daß sie erneut erzeugt werden müssen. Zudem können Graphiken + aneinander oder übereinander gelegt werden. + + d) Graphiken mit unterschiedlichen Farben, Strichen usw. können leicht erzeugt werden. + + e) Der Anschluß von neuen Graphik.Geräten durch Benutzer ist leicht möglich, ohe daß + die Graphik-Programme geändert werden müssen. + + f) Plotter können wie Drucker an einen Spooler gehängt werden. + + g) Bilder können als PICFILEs gespeichert und versandt werden. + + h) Es können auch auf Systemen ohne graphische Ausgabegeräte Graphiken erzeugt + werden. + + i) Es können mit einfachen Mitteln universelle Unterprogrammpakete erstellt werden, + um die Standardzeichnungen (Darstellen einer Funktion, Balken oder Liniendiagram­ + me, Achsen etc.) zu erstellen. + + +#type ("trium12")# +#on("b")#2. Erzeugung von Bildern#off("b")# +#type ("times8")# + + Bilder entstehen in Objektion vom Datentyp #on("b")#PICTURE#off("b")#. Diese müssen mit der Prozedur + #on("i")#nilpicture#off("i")# initialisiert werden. Sie enthalten dann ein leeres Bild, dessen Dimension noch + nicht festgelegt ist. Die Dimension eines #on("i")#PICTURE#off("i")#s wird mit dem ersten Schreibzugriff + (#on("i")#move, draw#off("i")# o.ä.) festgelegt. Ein #on("i")#PICTURE#off("i")# kann immer nur entweder zwei- oder + dreidimensional sein. + Außerdem kann einem #on("i")#PICTURE#off("i")# mit der Prozedur #on("i")#pen#off("i")# genau ein virtueller Stift zugeord­ + net oder der aktuelle Stift erfragt werden (Standardeinstellung: 1). + + Für Erzeugung eines Bildes wird ein virtueller Zeichenstift benutzt, dem bei der Darstel­ + lung jeweils genau ein realer Stift zugeordnet wird. Dieser Stift kann mit der Prozedur + #on("b")#move#off("b")# oder #on("b")#move r #off("b")#auf eine bestimmte Stelle positioniert werden ohne zu zeichnen. Mit + #on("b")#draw#off("b")# oder #on("b")#draw r#off("b")# wird eine Linie von der letzten Position zur angegebene Position + gezeichnet. Die aktuelle Stiftposition kann dabei mit #on("b")#where#off("b")# abgefragt werden. + Außerdem existiert noch die Prozedur #on("b")#draw#off("b")# die einen Text zur Beschriftung der Zeich­ + nung darstellt, sowie #on("b")#bar#off("b")# zum Zeichnen eines Balkens für Balkendiagramme, #on("b")#circle#off("b")# zum + Zeichnen eines Kreisbogens für Kreisdiagramme und #on("b")#mark#off("b")# zum Markiern von Positionen. + Dabei wird die aktuelle Stiftposition aber nicht verändert. + +#type ("trium12")# +#on("b")#3. Manipulation von PICTUREs#off("b")# +#type ("times8")# + + Erstellte PICTUREs können auch als Ganzes manipuliert werde. Dazu dienen die Prozedu­ + ren #on("b")#translate, stretch#off("b")# und #on("b")#rotate#off("b")#. Es ist auch möglich mehrere PICTURE mit dem Opera­ + tor #on("b")#CAT#off("b")# aneinanderzufügen, wenn beide PICTURE die gleiche Dimension haben. In + solcherart manipulierten Bildern kann ohne Einschränkung weitergezeichnet werden, + solange die maximale Größe nicht überschritten wird. + +#type ("trium12")# +#on("b")#4. Darstellung und Speicherung #off("b")# +#type ("times8")# + + Für die Darstellung und Speicherung der erzeugten Bilder existiert der Typ #on("b")#PICFILE#off("b")#. + Dieser besteht aus eienm Datenraum mit max. 1024 PICTUREs, die mit den Prozeduren #on("b")# + delete picture, insert picture, read picture, write picture, get picture#off("b")# und #on("b")#put picture#off("b")# einge­ + geben bzw. ausgegeben werden können. + Für die Positionierung innerhalb eines PICFILES stehen die Prozeduren #on("b")#to pic, up, down, + eof, picture no, pictures#off("b")# zur Verfügung. + Für die Assoziation mit einem benannten Datenraum existiert ähnlich wie beim Datentyp + FILE die Prozedur #on("b")#picture file#off("b")#; unbenannte Datenräume können mit dem Operator #on("b")#:=#off("b")# + assoziert werden. + Die Darstellung des PICFILES auf einem Zeichengerät erfolgt mit der Prozdur #on("b")#plot#off("b")#. + Da die Graphiken aber in #on("i")#Weltkoordinaten#off("i")# erzeugt werden und die spätere Darstellung + vollkommen unbeachtet bleibt, müssen gewisse Darstellungsparameter für die Zeichnung + gesetzt werden. Dies Parameter werden im PICFILE abgelegt und gelten jeweils für alle + darin enthaltenen PICTURE. Dadurch ist es möglich, einen PICFILE mit spezifierter + Darstellungsart über einen SPOOLER an einen Plotter zu senden oder die bei der letzten + Betrachtung gewählte Darstellung beizubehalten oder zu ändern. + Für die Darstellung können den virtuellen Stiften mit der Prozedur #on("b")#select pen#off("b")# reale Stifte + zugeordnet werden. Voreingestellt ist für alle virtuellen Stifte die Standardfarbe, Standard­ + stärke und durchgängige Linie. Mit #on("b")#background#off("b")# kann eine bestimmte Hintergrundfarbe + gewählt werden. + Indem man einem PICTURE den Stift 0 zuordnet, kann man dieses auch Ausblenden + wenn es bei dieser Darstellung stört. + Die Größe der realen Zeichenfläche kann mit #on("b")#viewport#off("b")# eingestellt werden, wobei die + gesamte Zeichenfäche voreingestellt ist. Dadurch können auch mehrere PICFILE auf ein + Blatt oder einen Bildschirm gezeichnet werden, wenn man durch Angabe von #on("i")#background +  (0)#off("i")# das Löschen der Zeichenfläche unterdrückt. + + +#type ("trium12")# +#on("b")#5. Darstellung zweidimensionaler Graphik#off("b")# +#type ("times8")# + + Bei der Darstellung zweidimensionaler Bilder muß der zu zeichnende Ausschnitt (das + #on("i")#Fenster#off("i")#) angegeben werden. Mit der Prozedur #on("b")#window#off("b")# wird durch Angabe der minimalen + und maximalen X- bzw. Y-Koordinaten ein Fenster definiert. Linien, die über dieses + Fenster hinausgehen, werden abgeschnitten. Dadurch kann man einen beliebigen Detailaus­ + schnitt eines Bildes ausgeben, ohne das Bild neu generieren zu müssen. + Da das so definierte Fenster auf die mit #on("i")#viewport#off("i")# definierte Zeichenfläche abgebildet wird, + ist der Abbildungsmaßstab durch das Zusammenspiel von #on("i")#viewport#off("i")# und #on("i")#window#off("i")# bestimmt. + Wenn eine Winkeltreue Darstellung erreicht werdenn soll, muß das Verhältnis der durch + #on("i")#viewport#off("i")# eingestellten Breite und Höhe und das Verhältnis des durch #on("i")#window#off("i")# eingestellten + Ausschnitts gleich sein. + +#type ("trium12")# +#on("b")#6. Darstellung dreidimensionaler Graphik#off("b")# +#type ("times8")# + + Bei dreidimensionalen Zeichnungen wird das Fenster ebenfalls mit #on("b")#window#off("b")# definiert, + wobei dann allerdings auch der Wertebereich der dritten Dimension (Z-Koordinaten) zu + berücksichtigen ist. Auch hierbei werden Linien, die über die spezifierte Darstellungs­ + fläche hinausgehen abgeschnitten. Das Abschneiden erfolgt allerdings erst nach der Projek­ + tion auf die Darstellungsfläche, so daß auch Vektoren zu sehen sind, die über das mit + #on("i")#window#off("i")# angegebene Quader hinausgehen, wenn ihre Projektion innerhalb der Zeichen­ + fläche liegt. + Da die dreidimensionale Graphik auf eine zweidimensionale Fläche projeziert wird, + können aber noch weitere Darstellungsparameter angegeben werden. Der Betrachtungswin­ + kel wird mit Hilfe der Prozedur #on("b")#view#off("b")# angegeben. Ebenfalls kann mit #on("b")#view#off("b")# der Winkel der + Y-Achse zur Horizontalen angegeben werden. + Zur Spezifikation der gewünschten Projektionsart existieren #on("b")#orthographic#off("b")# (orthographische + Projektion), #on("b")#perspective#off("b")# (perspektivische Projektion, der Fluchtpunkt ist frei wählbar) und + #on("b")#oblique#off("b")# (schiefwinklige Projektion). + +#page# +#type ("trium12")# +#on("b")#7. Beispiele#off("b")# +#type ("times8")# + + #on("u")#Sinuskurve#off("u")# + +#type("micro")# +initialisiere picfile; +zeichne überschrift; +zeichne achsen; +zeichne sinuskurve; +wähle darstellung; +plot (p) . + +initialisiere picfile: + PICFILE VAR p :: picture file ("SINUS") . + +zeichne überschrift: + PICTURE VAR überschrift :: nilpicture; + move (überschrift, -pi/2.0, 1.0); + draw (überschrift, "sinus (x) [-pi, +pi]", 0.0, 1.0, 0.6); + put picture (p, überschrift) . + + zeichne achsen: + PICTURE VAR achsen :: nilpicture; + zeichne x achse; + zeichne y achse; + put picture (p, achsen) . + + zeichne x achse: + move (achsen, -pi, 0.0); + draw (achsen, pi, 0.0) . + + zeichne y achse: + move (achsen, 0.0, -1.0); + draw (achsen, 0.0, +1.0) . + + zeichne sinuskurve: + PICTURE VAR sinus :: nilpicture; + REAL VAR x :: -pi; + + move (sinus, x, sin (x)); + REP x INCR 0.1; + draw (sinus, x, sin (x)) + UNTIL x >= pi PER; + + put picture (p, sinus) . + + wähle darstellung: + window (p, -pi, pi, -1.0, 1.3); + viewport (p, 0.0, 0.0, 0.0, 0.0) . + +#page# +#type ("times8")# + #on("u")#Achsenkreuz#off("u")# + +#type("micro")# +initialisiere picfile; +zeichne die x achse; +zeichne die y achse; +zeichne die z achse; +stelle das achsenkreuz dar . + +initialisiere picfile: + PICFILE VAR p :: picture file ("KREUZ") . + + zeichne die x achse: + PICTURE VAR x achse := nilpicture; + move (x achse, -1.0, 0.0, 0.0); + draw (x achse, "-X", 0.0, 0.0, 0.0); + draw (x achse, 1.0, 0.0, 0.0); + draw (x achse, "+X", 0.0, 0.0, 0.0); + put picture (p, x achse) . + + zeichne die y achse: + PICTURE VAR y achse := nilpicture; + move (y achse, 0. 0, -1.0, 0.0); + draw (y achse, "-Y", 0.0, 0.0, 0.0); + draw (y achse, 0.0, 1.0, 0.0); + draw (y achse, "+Y", 0.0, 0.0, 0.0); + put picture (p, y achse) . + + zeichne die z achse: + PICTURE VAR z achse := nilpicture; + move (z achse, 0. 0, 0.0, -1.0); + draw (z achse, "-Z", 0.0, 0.0, 0.0); + draw (z achse, 0.0, 0.0, 1.0); + draw (z achse, "+Z", 0.0, 0.0, 0.0); + put picture (p, z achse) . + + stelle das achsenkreuz dar: + viewport (p, 0. 0, 1.0, 0.0, 1.0); + window (p, -1.1, 1.1, -1.1, 1.1); + oblique (p, 0.25, 0.15); + plot (p) . + +#foot# + #type("times6")# + Diese beiden Beispielprogramme befinden sich ebenfalls auf dem STD-Archive unter dem Namen #on("i")#Beispiel.Sinus#off("i")# und + #on("i")#Beispiel.Kreuz#off("i")#. +#end# + +#page# +#type ("triumb14")# Beschreibung der Graphik-Prozeduren +#type ("times8")# + + +#type ("trium12")# +#on("b")#1. PICTURE-Prozeduren#off("b")# +#type ("times8")# + +#limit (7.0)##type("times6")# + #on("i")#Zweidimensionale PICTURES brauchen weniger Speicherplatz + als dreidimensionale. Daher werden in einigen Fehlermeldungen + unterschiedliche Größen angegeben. + +#limit (11.0)##type("times8")# + +#type("times10")##on("b")#:=#off("b")##type("times8")# + OP := (PICTURE VAR l, PICTURE CONST r) + Zweck: Zuweisung + +#type("times10")##on("b")#CAT#off("b")##type("times8")# + OP CAT (PICTURE VAR l, PICTURE CONST r) + Zweck: Aneinanderfügen von zwei PICTURE. + Fehlerfälle: + * left dimension <> right dimension + Es können nur PICTURE mit gleicher Dimension angefügt werden. + * Picture overflow + Die beiden PICTURE überschreiten die maximale Größe eines PICTURE. + +#type("times10")##on("b")#nilpicture#off("b")##type("times8")# + PICTURE PROC nilpicture + Zweck: Die Prozedur liefert ein leeres PICTURE zur Initialisierung. + + PICTURE PROC nilpicture (INT CONST pen) + Zweck: Die Prozedur liefert ein leeres PICTURE mit dem Stift #on("i")#pen#off("i")# zur Initialisierung. + +#type("times10")##on("b")#draw#off("b")##type("times8")# + PROC draw (PICTURE VAR p, TEXT CONST text, REAL CONST angle, height, ­ + width) + Zweck: Der angegebene Text wird unter dem Winkel #on("i")#angle#off("i")# gegenüber der Waagerech­ + ten mit der Zeichenhöhe #on("i")#hight#off("i")# und der Breite #on("i")#width#off("i")# gezeichnet. #on("i")#angle#off("i")# wird in + Winkelgrad angegeben. #on("i")#height#off("i")# und #on("i")#width#off("i")# werden in #on("i")#Prozenten#off("i")# der Breite bzw. + Höhe der Zeichenfläche angegeben, bei 0 wird + die Standardhöhe- und breite angenommen. + Der Anfang ist dabei die aktuelle Stiftposition, die nicht verändert wird. Es könne + auch die Steuerzeichen ""1"", ""2"", ""3"", ""10"", ""13"" benutzt werden, + wobei sie immer in der Richtung #on("i")#angle#off("i")# wirken. + Fehlerfälle: + * Picture overflow + Der Text paßt nicht mehr in das PICTURE. + +#type("times10")##on("b")#draw#off("b")##type("times8")# + PROC draw (PICTURE VAR p, REAL CONST x, y, z) + Zweck: Zeichnen einer Linie von der aktuellen Position zur Position (x, y, z). + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is two dimensional + + PROC draw (PICTURE VAR p, REAL CONST x, y) + Zweck: Zeichnen einer Linie von der aktuellen Position zur Position (x, y). + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is three dimensional + +#type("times10")##on("b")#draw r#off("b")##type("times8")# + PROC draw r (PICTURE VAR p, REAL CONST x, y, z) + Zweck: Zeichnen einer Linie der Länge (x, y, z) relativ zur aktuellen Position. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is two dimensional + + PROC draw r (PICTURE VAR p, REAL CONST x, y) + Zweck: Zeichnen einer Linie der Länge (x, y) relativ zur aktuellen Position. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is three dimensional + +#type("times10")##on("b")#move#off("b")##type("times8")# + PROC move (PICTURE VAR p, REAL CONST x, y, z) + Zweck: Die aktuelle Position wird auf (x, y, z) gesetzt. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is two dimensional + + PROC move (PICTURE VAR p, REAL CONST x, y) + Zweck: Die aktuelle Position wird auf (x, y) gesetzt. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is three dimensional + +#type("times10")##on("b")#move r#off("b")##type("times8")# + PROC move r (PICTURE VAR p, REAL CONST x, y, z) + Zweck: Die aktuelle Position wird um (x, y, z) erhöht. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is two dimensional + + PROC move r (PICTURE VAR p, REAL CONST x, y) + Zweck: Die aktuelle Position wird um (x, y) erhöht. + Position. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is three dimensional + + +#type("times10")##on("b")#bar#off("b")##type("times8")# + PROC bar (PICTURE VAR p, REAL CONST width, hight, INT CONST pattern): + Zweck: Die Prozedur zeichnet an der aktuellen Position einen Balken mit dem Muster + #on("i")#pattern#off("i")#: + 0 = Leerer Balken + 1 = Gepunkteter Balken + 2 = Gefüllter Balken + 3 = Horizontale Linien + 4 = Vertikale Linien + 5 = Gekreuzte Linien + 6 = Diagonale Linien von Links nach Rechts + 7 = Diagonale Linien von Rechts nach Links + 8 = Gekreuzte diagonale Linien + > 8 = nicht normiertes Sondermuster + Die aktuelle Stiftposition wird dabei nicht verändert. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is three dimensional + + PROC bar (PICTURE VAR p, REAL CONST from, to, hight, INT CONST pattern): + Zweck: Die Prozedur zeichnet einen Balken von der Position #on("i")#from#off("i")# zur Position #on("i")#to#off("i")# und der + Höhe #on("i")#height#off("i")# mit dem Muster #on("i")#pattern#off("i")#. + s.o. + +#type("times10")##on("b")#circle#off("b")##type("times8")# + PROC circle (PICTURE VAR p, REAL CONST radius, from, to, INT CONST pattern) + Zweck: Die Prozedur zeichnet an der aktuellen Position ein Kreissegment vom Winkel + #on("i")#from#off("i")# bis #on("i")#to#off("i")# (im Gradmaß) mit dem Muster #on("i")#pattern#off("i")# (s.o.). Der #on("i")#radius#off("i")# wird in + Prozenten der Diagonalen der Zeichenfläche angegeben. + Die aktuelle Stiftposition wird dabei nicht verändert. Dieses Kreissegment ist in + jedem Fall 2-dimensional, so das es durch Drehungen nicht verändert wird. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is three dimensional + +#type("times10")##on("b")#mark#off("b")##type("times8")# + PROC mark (PICTURE VAR p, REAL CONST size, INT CONST no) + Zweck: Es wird ein Marker mit der Größe #on("i")#size#off("i")# in Prozenten der Diagonalen der Zeichen­ + fläche an der aktuellen Stiftposition ausgegeben, ohne diese zu verändern. Es + sollten dabei mindestens 10 verschiedene Marker gewählt werden können. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + +#type("times10")##on("b")#dim#off("b")##type("times8")# + INT PROC dim (PICTURE CONST pic) + Zweck: Liefert die Dimension eines PICTURE. + +#type("times10")##on("b")#pen#off("b")##type("times8")# + INT PROC pen (PICTURE CONST p) + Zweck: Liefert den virtuellen Stift des PICTURE + + PICTURE PROC pen (PICTURE CONST p, INT CONST pen) + Zweck: Setzen des (virtuellen) Stiftes eines PICTURE. + Bei #on("i")#pen#off("i")# = 0 wird das Picture nicht gezeichnet. + Fehlerfälle: + * pen out of range + Der gewünschte Stift ist kleiner als 0 oder größer als 16. + +#type("times10")##on("b")#extrema#off("b")##type("times8")# + PROC extrema (PICTURE CONST p, REAL VAR x min, x max, y min, y max) + Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICTURE. + Fehlerfälle: + * Picture is three dimensional + + PROC extrema (PICTURE CONST p, REAL VAR x min, x max, y min, y max,   + z min, z max) + Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICTURE. + Fehlerfälle: + * Picture is two dimensional + +#type("times10")##on("b")#where#off("b")##type("times8")# + PROC where (PICTURE CONST p, REAL VAR x, y, z) + Zweck: Die Prozedur liefert die aktuelle Stiftposition. + Fehlerfälle: + * Picture is two dimensional + + PROC where (PICTURE CONST p, REAL VAR x, y, z) + Zweck: Die Prozedur liefert die aktuelle Stiftposition. Fehlerfälle: + * Picture is three dimensional + +#type("times10")##on("b")#rotate#off("b")##type("times8")# + PROC rotate (PICTURE VAR p, REAL CONST angle) + Zweck: Das PICTURE wird um den Punkt (0, 0) um den Winkel #on("i")#angle#off("i")# (im Gradmaß) im + mathematisch positiven Sinn gedreht. + + PROC rotate (PICTURE CONST p, REAL CONST phi, theta, lambda) + Zweck: Das PICTURE wird um den Winkel #on("i")#lambda#off("i")# um die Drehachse #on("i")#(phi, theta)#off("i")# ge­ + dreht. + +#type("times10")##on("b")#stretch#off("b")##type("times8")# + PROC stretch (PICTURE VAR pic, REAL CONST sx, sy) + Zweck: Das PICTURE wird in X-Richtung um den Faktor #on("i")#sx#off("i")#, in Y-Richtung um den + Faktor #on("i")#sy#off("i")# gestreckt (bzw. gestaucht). Dabei bewirkt der Faktor + s > 1 eine Streckung + 0 < s < 1 eine Stauchung + s < 0 zusätzlich eine Achsenspiegelung. + Fehlerfälle: + * Picture is three dimensional + + PROC stretch (PICTURE VAR p, REAL CONST sx, sy, sz) + Zweck: s. o. + Fehlerfälle: + * Picture is two dimensional + +#type("times10")##on("b")#translate#off("b")##type("times8")# + PROC translate (PICTURE VAR p, REAL CONST dx, dy) + Zweck: Das PICTURE wird um #on("i")#dx#off("i")# und #on("i")#dy#off("i")# verschoben. Fehlerfälle: + * Picture is three dimensional + + PROC translate (PICTURE VAR p, REAL CONST dx, dy, dz) + Zweck: Das PICTURE wird um #on("i")#dx, dy#off("i")# und #on("i")#dz#off("i")# verschoben. Fehlerfälle: + * Picture is two dimensional + + +#type ("trium12")# +#on("b")#2. PICFILE-Prozeduren#off("b")# +#type ("times8")# + +#type("times10")##on("b")#plot#off("b")##type("times8")# + PROC plot (TEXT CONST name) + Zweck: Der PICFILE mit dem Namen #on("i")#name#off("i")# wird entsprechend der angegebenen Dar­ + stellungsart gezeichnet. Diese Parameter (#on("i")#perspective, orthographic, oblique, view, + window etc.#off("i")#) müssen vorher eingestellt werden. + Fehlerfälle: + * PICFILE does not exist + Es existiert kein PICFILE mit dem Namen #on("i")#name#off("i")# + + PROC plot (PICFILE VAR p) + Zweck: Der PICFILE #on("i")#p#off("i")# wird entsprechend der angegebenen Darstellungsart gezeichnet. + Diese Parameter müssen vorher eingestellt werden: + + #on("b")#zweidimensional:#off("b")# + obligat: #on("i")#window#off("i")# (zweidimensional) + optional: #on("i")#view#off("i")# (zweidimensional) + #on("i")#viewport#off("i")# + #on("i")#select pen#off("i")# + + #on("b")#dreidimensional:#off("b")# + obligat: #on("i")#window#off("i")# (dreidimensional) + optional: #on("i")#view#off("i")# (dreidimensional) + #on("i")#orthographic | perspective | oblique#off("i")# + #on("i")#viewport#off("i")# + #on("i")#select pen#off("i")# + + +#type("times10")##on("b")#select pen#off("b")##type("times8")# + PROC select pen (PICFILE VAR p, INT CONST pen, colour, thickness, line type) + Zweck: Für die Darstellung des Bildes #on("i")#p#off("i")# soll dem #on("i")#virtuellen#off("i")# Stift #on("i")#pen#off("i")# ein realer Stift + zugeordnet werden, der möglichst die Farbe #on("i")#colour#off("i")# und die Dicke #on("i")#thickness#off("i")# hat + und dabei Linien mit dem Typ #on("i")#line type#off("i")# zeichnet. Es wird die beste Annäherung + für das Ausgabegerät genommen. + Dabei gelten folgende Vereinbarungen: + + #on("b")#Farbe:#off("b")# Negative Farben werden XOR gezeichnet (dunkel wird hell und hell wird + dunkel), Farbe 0 ist der Löschstift und positive Farben überschreiben + (ersetzen) den alten Punkt mit folgenden Werten: + + 1 Standardfarbe des Endgerätes + 2 rot + 3 blau + 4 grün + 5 schwarz + 6 weiß + > 6 nicht normierte Sonderfarben + + + #on("b")#Dicke:#off("b")# 0 Standardstrichstärke des Endgerätes + > 0 Strichstärke in 1/10 mm. + + + #on("b")#Linientyp:#off("b")# + 0 keine sichtbare Linie + 1 durchgängige Linie + 2 gepunktete Linie + 3 kurz gestrichelte Linie + 4 lang gestrichelte Linie + 5 Strichpunktlinie + > 5 nicht normierte Linie + + + Die hier aufgeführten Möglichkeiten müssen nicht an allen graphischen Endge­ + räten vorhanden sein. Der geräteabhängige Graphik-Treiber wählt jeweils die + bestmögliche Annäherung. + + Fehlerfälle: + * pen out of range + #on("i")#pen#off("i")# muss im Bereich 1-16 sein. + +#type("times10")##on("b")#background#off("b")##type("times8")# + PROC background (PICFILE VAR p, INT CONST colour) + Zweck: Der Hintergrund wird auf die Farbe #on("i")#colour#off("i")# (s.o.) gesetzt wenn möglich. + Bei der Angabe #on("i")#background (p, 0)#off("i")# wird das Löschen des Bildschirms unterdrückt, + so daß das Zeichen mehrerer PICFILE auf einem Blatt möglich wird. + + INT PROC background (PICFILE CONST p): + Zweck: Liefert die eingestellte Hintergrundfarbe. + +#type("times10")##on("b")#view#off("b")##type("times8")# + PROC view (PICFILE VAR p, REAL CONST alpha) + Zweck: Setzt den Winkel der Y-Achse zur Senkrechten auf #on("i")#alpha#off("i")# Grad, falls diese nicht + senkrecht auf der Betrachtungsebene steht. + + PROC view (PICFILE VAR p, REAL CONST phi, theta) + Zweck: Dreidimensionale Bilder werden häufig nicht direkt von vorne dargestellt, son­ + dern für die Betrachtung gedreht. Mit der Prozedur #on("i")#view#off("i")# kann die Betrachtungs­ + richtung durch die Polarwinkel #on("i")#phi#off("i")# und #on("i")#theta#off("i")# (im Gradmass) angegeben werden. + Voreingestellt ist #on("i")#phi#off("i")# = 0 und #on("i")#theta#off("i")# = 0, d.h. senkrecht von oben (Die #on("i")#X- + Achse#off("i")# bildet die Horizontale und die #on("i")#Y-Achse#off("i")# bildet die Vertikale). + Im Gegensatz zu #on("i")#rotate#off("i")# hat #on("i")#view#off("i")# keine Wirkung auf das eigentliche Bild (die + PICTURE werden nicht verändert), sondern nur auf die gewählte Darstellung. So + addieren sich zwar aufeinanderfolgende #on("i")#Rotationen#off("i")#, #on("i")#view#off("i")# aber geht immer von der + Nullstellung aus. Auch kann das Bild durch eine #on("i")#Rotation#off("i")# ganz oder teilweise aus + oder in das Darstellungsfenster (#on("i")#window#off("i")# gedreht werden. Bei #on("i")#view#off("i")# verändern sich + die Koordinaten der Punkte nicht, d. h. das Fenster wird mitgedreht. + + PROC view (PICFILE VAR p, REAL CONST x, y, z) + Zweck: Wie oben, nur werden die Winkel nicht in Polarkoordinaten angegeben, sondern + es wird die Blickrichtung als Vektor in Karthesischen Koordinaten angegeben. + (Der Betrachtungsvektor muß nicht normiert sein). + +#type("times10")##on("b")#viewport#off("b")##type("times8")# + PROC viewport (PICFILE VAR p, REAL CONST hormin, hormax, vertmin, vertmax) + Zweck: Die Zeichenfläche auf dem Endgerät, auf dem das Bild dargestellt werden soll, + wird spezifiziert. Dabei wird sowohl die Größe als auch die relative Lage der + Zeichenfläche definiert. Der linke untere Eckpunkt der physikalischen Zeichen­ + fläche des Gerätes hat die Koordinaten (0, 0). Die definierte Zeichenfläche er­ + streckt sich + + #on("i")#hormin - hormax#off("i")# in der Horizontalen, + #on("i")#vertmin - vertmax#off("i")# in der Vertikalen. + + So liegt der linke untere Eckpunkt dann bei (#on("i")#hormin, hormax#off("i")#), der rechte obere + Eckpunkt bei (#on("i")#hormax, vertmax#off("i")#). + + Damit sowohl geräteunabhängige als auch maßstabgetreue Zeichnungen möglich + sind, können die Koordinaten in drei Arten spezifiziert werden: + a) #on("b")#Gerätekoordinaten#off("b")# + Die Koordinaten können Werte von 0.0 bis 2.0 annehmen. Dabei hat die + kürzere Seite der physikalischen Zeichenfläche definitionsgemäß die Länge + 1.0. + b) #on("b")#Absolute Koordinaten#off("b")# + Die Werte werden in #on("i")#cm#off("i")# angegeben. Dabei müssen die Maximalwerte aber + größer als 2.0 sein, da sonst Fall a) angenommen wird. + c) #on("b")#Maximale Zeichenfläche#off("b")# Bei der Angabe (0.0, 0.0, 0.0, 0.0) wird die maxi­ + male physikalische Zeichenfläche eingestellt. + + Voreingestellt ist + viewport (0.0, 0.0, 0.0, 0.0) + d.h. die größtmögliche physikalische Zeichenfläche, beginnend mit der linken + unteren Ecke. + Der Abbildungsmaßstab wird durch das Zusammenspiel von #on("i")#viewport#off("i")# und + #on("i")#window#off("i")# festgelegt (s. dort). Dabei ist insbesondere darauf zu achten, daß winkel­ + treue Darstellung nur bei gleichen Verhältnissen von X-Bereich und Breite bzw. + von Y-Bereich und Höhe möglich ist. + + +#type("times10")##on("b")#window#off("b")##type("times8")# + PROC window (PICFILE VAR p, REAL CONST x min, x max, y min, y max) + Zweck: Für die Darstellung eines zweidimensionalen Bildes wird das darzustellende + Fenster definiert. Alle Bildpunkte, deren X-Koordinaten im Intervall [#on("i")#x min, x + max#off("i")#] und deren Y-Koordinaten im Bereich [#on("i")#y min, y max#off("i")#] liegen, gehören zum + definierten Fenster.Vektoren, die außerhalb dieses Fensters liegen, gehen über die + durch #on("i")#viewport#off("i")# Fläche hinaus und werden abgeschnitten. + + Der Darstellungsmaßstab ergibt sich als + + #ub#               x max - x min               #ue# + horizontale Seitenlänge der Zeichenfläche + + + #ub#               y max - y min               #ue# + vertikale Seitenlänge der Zeichenfläche + + PROC window (PICFILE VAR p, REAL CONST x min, x max, y min, y max,   + z min, z max) + + Zweck: Für die darstellung eines dreidimensionalen Bildes wird das darzustellende Fenster + definiert. Alle Bildpunkte, deren X-Koordinaten im Intervall [#on("i")#x min, x max#off("i")#], + deren Y-Koordinaten im Bereich [#on("i")#y min, y max#off("i")#] und deren Z-Koordinaten im + Bereich [#on("i")#z min, z max#off("i")#] liegen, gehören zum definierten Fenster. Dieses dreidi­ + mensionale Fenster (#on("i")#Quader#off("i")#) wird entsprechend der eingestellten Projektionsart + (orthographisch, perspektivisch oder schiefwinklig) und den Betrachtungswinkeln + (s. #on("i")#view#off("i")#) auf die spezifizierte Zeichenfläche abgebildet. + Anders als im zweidimensionalen Fall ist das Problem der Maßstaäbe nicht mehr + nur durch das Zusammenspiel von #on("i")#window#off("i")# und #on("i")#viewport#off("i")# zu beschreiben. Hier + spielen auch die Projektionsart und Darstellungswinkel herein. + +#type("times10")##on("b")#oblique#off("b")##type("times8")# + PROC oblique (PICFILE VAR p, REAL CONST a, b) + Zweck: Bei dem (dreidimensionalen) Bild #on("i")#p#off("i")# wird #on("u")#schiefwinklig#off("u")# als gewünschte Projek­ + tionsart eingestellt. Dabei ist (#on("i")#a, b#off("i")#) der Punkt auf der X-Y-Ebene, auf den der + EinheitsVektor der Z-Richtung abgebildet werden soll. + +#type("times10")##on("b")#orthographic#off("b")##type("times8")# + PROC orthographic (PICFILE VAR p) + Zweck: Bei dem (dreidimensionalen) Bild #on("i")#p#off("i")# wird #on("u")#orthographisch#off("u")# als gewünschte Projek­ + tionsart eingestellt. Bei der orthographischen Projektion wird ein dreidimensio­ + naler Körper mit parallelen Strahlen senkrecht auf der Projektionsebene abge­ + bildet. + +#type("times10")##on("b")#perpective#off("b")##type("times8")# + PROC perspective (PICFILE VAR p, REAL CONST cx, cy, cz) + Zweck: Bei dem (dreidimensionalen) Bild #on("i")#p#off("i")# wird #on("u")#perspektivisch#off("u")# als gewünschte Projek­ + tionsart eingestellt. Der Punkt (#on("i")#cx, 1/cy, cz#off("i")#) ist der Fluchtpunkt der Projektion, + d. h. alle Parallen zur Z-Achse schneiden sich in diesem Punkt. + +#type("times10")##on("b")#extrema#off("b")##type("times8")# + PROC extrema (PICFILE VAR p, REAL VAR x min, x max, y min, y max) + Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICFILE. + + PROC extrema (PICFILE VAR p, REAL VAR x min,x max,y min,y max,z min,z max) + Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICFILE. + +#type ("trium12")# +#on("b")#3. Prozeduren zur Manipulation von PICFILE#off("b")# +#type("times 8")# + +#type("times10")##on("b")#:=#off("b")##type("times8")# + OP := (PICFILE VAR l, PICFILE CONST r) + Zweck: Zuweisung des PIFILEs #on("i")#r#off("i")# an das PICFILE #on("i")#l#off("i")# + + OP := (PICFILE VAR p, DATASPACE CONST d) + Zweck: Assoziert die PICFILE Variable #on("i")#p#off("i")# mit dem Datenraum #on("i")#d#off("i")# und initialisiert die + Variable, wenn nötig. + Fehlerfälle: + * dataspace is no PICFILE + Der anzukoppelnde Datenraum hat einen unzulässigen Typ + +#type("times10")##on("b")#picture file#off("b")##type("times8")# + DATASPACE PROC picture file (TEXT CONST name) + Zweck: Assoziaten eines benannten Datenraumes mit einem PICFILE (s.o.). + +#type("times10")##on("b")#to pic#off("b")##type("times8")# + PROC to pic (PICFILE VAR p, INT CONST pos) + Zweck: Positioniert auf das PICTURE Nummer #on("i")#pos#off("i")#. + Fehlerfälle: + * Position underflow + Es wurde eine Position kleiner Null angegeben. + * Position after eof + Es wurde versucht, hinter das Ende eines PICFILE zu positionieren. Die letzte + erlaubte Position ist #on("i")#pictures (p)+1#off("i")#. + +#type("times10")##on("b")#up#off("b")##type("times8")# + PROC up (PICFILE VAR p) + Zweck: Positioniert genau ein PICTURE zurück. + Fehlerfall: + * Position underflow + Es wurde versucht, vor das erste PICTURE zu positionieren + + PROC up (PICFILE VAR p, INT CONST n) + Zweck: Positioniert genau #on("i")#n#off("i")# Picture zurück. + Fehlerfall: + * Position underflow + Es wurde versucht, vor das erste PICTURE zu positionieren + +#type("times10")##on("b")#down#off("b")##type("times8")# + PROC down (PICFILE VAR p) + Zweck: Positioniert genau ein PICTURE vorwärts. + Fehlerfall: + * Position after eof + Es wurde versucht, hinter das Ende eines PICFILE zu positionieren. Die letzte + erlaubte Position ist #on("i")#pictures (p)+1#off("i")#. + + PROC down (PICFILE VAR p, INT CONST n) + Zweck: Positioniert genau #on("i")#n#off("i")# Picture vorwärts. + Fehlerfall: + * Position after eof + Es wurde versucht, hinter das Ende eines PICFILE zu positionieren Die letzte + erlaubte Position ist #on("i")#pictures (p)+1#off("i")#. + +#type("times10")##on("b")#delete picture#off("b")##type("times8")# + PROC delete picture (PICFILE VAR p) + Zweck: Löscht das aktuelle PICTURE + +#type("times10")##on("b")#insert picture#off("b")##type("times8")# + PROC insert picture (PICFILE VAR p) + Zweck: Fügt ein PICTURE #on("u")#vor#off("u")# der aktuellen Position ein. + +#type("times10")##on("b")#read picture#off("b")##type("times8")# + PROC read picture (PICFILE CONST p, PICTURE VAR pic) + Zweck: Liest das aktuelle PICTURE. + +#type("times10")##on("b")#write picture#off("b")##type("times8")# + PROC write picture (PICFILE VAR p, PICTURE CONST pic) + Zweck: Schreibt das PICTURE #on("i")#pic#off("i")# auf der aktuellen Position. + +#type("times10")##on("b")#put picture#off("b")##type("times8")# + PROC put picture (PICFILE VAR p, PICTURE CONST pic) + Zweck: Schreibt das PICTURE #on("i")#pic#off("i")# an die aktuelle Position und erhöht diese um 1. + +#type("times10")##on("b")#get picture#off("b")##type("times8")# + PROC get picture (PICFILE VAR p, PICTURE VAR pic) + Zweck: Liest das PICTURE #on("i")#pic#off("i")# an dir aktuellen Position und erhöht diese um 1. + +#type("times10")##on("b")#eof#off("b")##type("times8")# + BOOL PROC eof (PICFILE CONST p) + Zweck: Liefert genau dann #on("i")#TRUE#off("i")#, wenn das Ende eines PICFILE erreicht ist. + +#type("times10")##on("b")#picture no#off("b")##type("times8")# + INT PROC picture no (PICFILE CONST p) + Zweck: Liefert die Nummer des aktuellen PICTURE. + +#type("times10")##on("b")#pictures#off("b")##type("times8")# + INT PROC pictures (PICFILE CONST p) + Zweck: Liefert die Anzahl PICTURE eines PICFILE. + + +#page# +#type ("trium12")# +#on("b")#4. Auslieferungsumfang#off("b")# +#type ("times8")# + + Die EUMEL-GRAPHIK wird auf einer Diskette mit folgendem Inhalt ausgeliefert. + Archive #on("i")#Graphik#off("i")#: + + "gen Graphik" + "gen Plotter" + "GRAPHIK.book" + "GRAPHIK.Picfile" + "GRAPHIK.Transform" + "GRAPHIK.Plot" + "GRAPHIK.Plotter" + "GRAPHIK.Server" + "GRAPHIK.vektor plot" + "ZEICHENSATZ" + "PC.plot" + "HP7475.plot" + "Beispiel.Kreuz" + "Beispiel.Sinus" + + + + #on("u")#Dateiinhalte#off("u")# + + 1. "gen Graphik" Installationsprogramm für Terminals + 2. "gen Plotter" Installationsprogramm für Plotter + 3. "GRAPHIK.book" enthält diese Beschreibung. + 4. "GRAPHIK.Picfile" enthält die Pakete #on("i")#picture#off("i")# und #on("i")#picfile#off("i")#. + 5. "GRAPHIK.Transform" stellt das Paket #on("i")#transformation#off("i")# zur Verfügung, in dem + interne Prozeduren zur Projektion definiert werden. + 6. "GRAPHIK.Plot" definiert die Prozedur #on("i")#plot#off("i")# zur Darstellung eines + PICFILES auf dem Terminal + 7. "GRAPHIK.Plotter" definiert die Prozedur #on("i")#plotter#off("i")# zur Darstellung eines + PICFILES auf dem Plotter + 8. "GRAPHIK.Server" Server für einen Plotter-Spool + 9. "GRAPHIK.vektor plot" enthält Hilfsprogramme, die bei der Erstellung einer + eigenen Terminalanpassung benutzt werden können. + 10. "ZEICHENSATZ" enthält einen Zeichensatz für Terminals die im Graphik + Modus keinen Text ausgeben können. + 11. "PC.plot" Terminalanpassung für IBM-PC und ähnliche. + 12. "HP7475.plot" Terminalanpassung für HP7474-Plotter und Geräte mit + HP-GL. + 13. "Beispiel.Kreuz" Beispielprogramm + 14. "Beispiel.Sinus" Beispielprogramm + +#type ("trium12")# +#on("b")#5. Installation#off("b")# +#type ("times8")# + + + In der Datei #on("i")#gen Graphik#off("i")# ist ein Installationspragramm enthalten. Nach dem Starten des + Programms mit #on("i")#run ("gen Graphik")#off("i")# fragt es nach dem Dateinamen der Terminalanpas­ + sung. + Steht keine Terminalanpassung für ein Endgerät zur Verfügung (und kann auch nicht + beschafft werden) so kann man durch Insertieren der Datei #on("i")#GRAPHIK.Picfile#off("i")# lediglich die + Leistungen der Pakete #on("i")#Picture#off("i")# und #on("i")#Picfile#off("i")# nutzen, ohne die erzeugten Graphiken darstellen + zu können. + Zur Benutzung eines #on("i")#Plotters#off("i")# über einen Spooler wird die Datei #on("i")#gen Plotter#off("i")# gestartet. + + + Beispiel: + 1. archive ("Graphik") + 2. fetch all (archive) + 3. release (archive) + 4. run ("gen Graphik") + <-- PC.Plot + + +#type ("trium12")# +#on("b")#6. Besonderheiten der PC.plot-Anpassung#off("b")# +#type ("times8")# + + + Da der IBM-PC verschiedene Graphik- und Text-Modi kennt, wird durch das Pro­ + gramm #on("i")#PC.plot#off("i")# die Prozedur #on("i")#graphik#off("i")# zusätzlich zur Verfügung gestellt. Sie erlaubt es den + PC in verschiedenen Graphik-Modi zu betreiben. + + PROC graphik (INT CONST modus, pause) + + Modus: 0 --- Keine Graphik (normaler Textmodus) + 1 --- hochauflösende Graphik, 50 Zeilen, + 640 * 400 Punkte, einfarbig + 2 --- hochauflösende Graphik, 25 Zeilen, + 640 * 400 Punkte, einfarbig + 3 --- mittlere Auflösung, 640 * 200 Punkte, 3 Farben + 4 --- IBM-PC Auflösung, 320 * 200 Punkte, 3 Farben. + + Pause: Da der PC bei #on("i")#end plot#off("i")# wieder in den Normalmodus umschaltet und die Graphik + dann nicht mehr zu sehen ist, kann man eine #on("i")#pause#off("i")# angeben. Die hier eingestellte + Zeit ist aber nicht die Länge der Pause, sondern der Kehrwert der Blinkfrequenz + proportional. + + diff --git a/doc/graphic/graphik beschreibung b/doc/graphic/graphik beschreibung new file mode 100644 index 0000000..53ebe49 --- /dev/null +++ b/doc/graphic/graphik beschreibung @@ -0,0 +1,661 @@ +#type ("basker12")##limit (16.0)##block# + +#head# +#type ("triumb18")# +#center#EUMEL-Grafik-System +#type ("basker12")# +#end# + #on("italics")#gescheit, gescheiter, + gescheitert#off("italics")# + +#type ("basker14")# +#on("bold")#Beschreibung der Graphik-Prozeduren#off("bold")# +#type ("basker12")# + + #on("italics")#Zweidimensionale PICTURE brauchen weniger Speicherplatz als dreidimen­ + sionale. Daher werden in einigen Fehlermeldungen unterschiedliche Größen + angegeben.#off("italics")# + +#on("underline")#Picture-Prozeduren#off("underline")# +PICTURE + + +:= + OP := (PICTURE VAR l, PICTURE CONST r) + Zweck: Zuweisung + +CAT + OP CAT (PICTURE VAR l, PICTURE CONST r) + Zweck: Aneinanderfügen von zwei PICTURE. + Fehlerfälle: + * left dimension <> right dimension + Es können nur PICTURE mit gleicher Dimension angefügt werden. + * Picture overflow + Die beiden PICTURE überschreiten die maximale Größe eines + PICTURE. + +nilpicture + PICTURE PROC nilpicture + Zweck: Die Prozedur liefert ein leeres PICTURE zur Initialisierung. + +draw + PROC draw (PICTURE VAR p, TEXT CONST text) + Zweck: Der angegebene Text wird gezeichnet. Der Anfang ist dabei die aktuelle + Stiftposition, die nicht verändert wird. + Fehlerfälle: + * Picture overflow + Der Text paßt nicht mehr in das PICTURE. + + PROC draw (PICTURE VAR p, TEXT CONST text, REAL CONST angle, + height, bright) + Zweck: Der angegebene Text wird unter dem Winkel #on("italics")#angle#off("italics")# gegenüber der + Waagerechten mit der Zeichenhöhe #on("italics")#hight#off("italics")# und der Breite #on("italics")#bright#off("italics")# gezeich­ + net. Der Anfang ist dabei die aktuelle Stiftposition, die nicht verändert + wird. + Fehlerfälle: + * Picture overflow + Der Text paßt nicht mehr in das PICTURE. + + PROC draw (PICTURE VAR p, REAL CONST x, y, z) + Zweck: Zeichnen einer Linie von der aktuellen Position zur Position (x, y, z). + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is two dimensional + + PROC draw (PICTURE VAR p, REAL CONST x, y) + Zweck: Zeichnen einer Linie von der aktuellen Position zur Position (x, y). + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is three dimensional + +draw r PROC draw r (PICTURE VAR p, REAL CONST x, y, z) + Zweck: Zeichnen einer Linie der Länge (x, y, z) relativ zur aktuellen Position. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is two dimensional + + PROC draw r (PICTURE VAR p, REAL CONST x, y) + Zweck: Zeichnen einer Linie der Länge (x, y) relativ zur aktuellen Position. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is three dimensional + +draw cm + PROC draw cm (PICTURE VAR p, REAL CONST x, y) + Zweck: Zeichnen einer Linie von der aktuellen Position zur Position (x, y) cm. + Dabei werden die angegebenen Projektionsparameter nicht beachtet, + sondern die Angaben in #on("bold")#Zentimeter#off("bold")# berechnet. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + +draw cm r + PROC draw cm r (PICTURE VAR p, REAL CONST x, y) + Zweck: Zeichnen einer Linie der Länge (x, y) cm relativ zur aktuellen Position. + Dabei werden die angegebenen Projektionsparameter nicht beachtet, + sondern die Angaben in #on("bold")#Zentimeter#off("bold")# berechnet. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + +move + PROC move (PICTURE VAR p, REAL CONST x, y, z) + Zweck: Die aktuelle Position wird auf (x, y, z) gesetzt. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is two dimensional + + PROC move (PICTURE VAR p, REAL CONST x, y) + Zweck: Die aktuelle Position wird auf (x, y) gesetzt. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is three dimensional + +move r + PROC move r (PICTURE VAR p, REAL CONST x, y, z) + Zweck: Die aktuelle Position wird um (x, y, z) erhöht. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is two dimensional + + PROC move r (PICTURE VAR p, REAL CONST x, y) + Zweck: Die aktuelle Position wird um (x, y) erhöht. + Position. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is three dimensional + +move cm + PROC move cm (PICTURE VAR p, REAL CONST x, y) + Zweck: Die aktuelle Position wird auf (x, y) cm gesetzt. Dabei werden die an­ + gegebenen Projektionsparameter nicht beachtet, sondern die Angaben in #on("bold")# + Zentimeter#off("bold")# berechnet. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + +move cm r + PROC move cm r (PICTURE VAR p, REAL CONST x, y) + Zweck: Die aktuelle Position wird um (x, y) cm erhöht. Dabei werden die an­ + gegebenen Projektionsparameter nicht beachtet, sondern die Angaben in #on("bold")# + Zentimeter#off("bold")# berechnet. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + +bar + PROC bar (PICTURE VAR p, REAL CONST width, hight, INT CONST + pattern): + Zweck: Die Prozedur zeichnet an der aktuellen Position einen Balken mit dem + Muster #on("italics")#pattern#off("italics")#: 0 = Leerer Balken + 1 = Gepunkteter Balken + 2 = Gefüllter Balken + 3 = Horizontale Linien + 4 = Vertikale Linien + 5 = Gekreuzte Linien + 6 = Diagonale Linien von Links nach Rechts + 7 = Diagonale Linien von Rechts nach Links + 8 = Gekreuzte diagonale Linien. + Die aktuelle Stiftposition wird dabei nicht verändert. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is three dimensional + * Unknown pattern + Das angegebene Muster liegt nicht im Bereich 0-8 + +circle + PROC circle (PICTURE VAR p, REAL CONST from, to, INT CONST + pattern) + Zweck: Die Prozedur zeichnet an der aktuellen Position ein Kreissegment vom + Winkel #on("italics")#from#off("italics")# bis #on("italics")#to#off("italics")# (im Gradmaß) mit dem Muster #on("italics")#pattern#off("italics")# (s.o.). Die + aktuelle Stiftposition wird dabei nicht verändert. + Fehlerfälle: + * Picture overflow + Zu viele Befehle in einem PICTURE + * Picture is three dimensional + * Unknown pattern + Das angegebene Muster liegt nicht im Bereich 0-8 + +dim + INT PROC dim (PICTURE CONST pic) + Zweck: Liefert die Dimension eines PICTURE. + +pen + INT PROC pen (PICTURE CONST p) + Zweck: Liefert den virtuellen Stift des PICTURE + + PROC pen (PICTURE VAR p, INT CONST pen) + Zweck: Setzen des (virtuellen) Stiftes eines PICTURE. Bei pen=0 wird das + Picture nicht gezeichnet. + Fehlerfälle: + * pen out of range + Der gewünschte Stift ist kleiner als 0 oder größer als 16. + +extrema + PROC extrema (PICTURE CONST p, REAL VAR x min, x max, y min, y + max) + Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICTURE. + Fehlerfälle: + * Picture is three dimensional + + PROC extrema (PICTURE CONST p, REAL VAR x min, x max, y min, y + max, z min, z max) + Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICTURE. + Fehlerfälle: + * Picture is two dimensional + +where + PROC where (PICTURE CONST p, REAL VAR x, y, z) + Zweck: Die Prozedur liefert die aktuelle Stiftposition (Angaben mit #on("italics")#cm#off("italics")# werden + dabei nicht berücksichtigt). + Fehlerfälle: + * Picture is two dimensional + + PROC where (PICTURE CONST p, REAL VAR x, y, z) + Zweck: Die Prozedur liefert die aktuelle Stiftposition (Angaben mit #on("italics")#cm#off("italics")# werden + dabei nicht berücksichtigt). + Fehlerfälle: + * Picture is three dimensional + +rotate: + PROC rotate (PICTURE VAR p, REAL CONST angle) + Zweck: Das PICTURE wird um den Punkt (0, 0) um den Winkel #on("italics")#angle#off("italics")# (im + Gradmaß) im mathematisch positiven Sinn gedreht. + Dabei werden nur die Werte von #on("italics")#draw, draw r, move #off("italics")# und #on("italics")#move r#off("italics")# + verändert. + + PROC rotate (PICTURE CONST p, REAL CONST phi, theta, lambda ) : + PICTURE 1-397 + Zweck: Das PICTURE wird um den Winkel #on("italics")#lambda#off("italics")# um die Drehachse #on("italics")#(phi, + theta)#off("italics")# gedreht. + Dabei werden nur die Werte von #on("italics")#draw, draw r, move #off("italics")# und #on("italics")#move r#off("italics")# + verändert. + +stretch + PROC stretch (PICTURE VAR pic, REAL CONST sx, sy) + Zweck: Das PICTURE wird in X-Richtung um den Faktor #on("italics")#sx#off("italics")#, in Y-Rich­ + tung um den Faktor #on("italics")#sy#off("italics")# gestreckt (bzw. gestaucht). Dabei bewirkt der + Faktor + s > 1 eine Streckung + 0 < s < 1 eine Stauchung + s < 0 zusätzlich eine Achsenspiegelung. + Dabei werden nur die Werte von #on("italics")#draw, draw r, move #off("italics")# und #on("italics")#move r#off("italics")# + verändert. + Fehlerfälle: + * Picture is three dimensional + + PROC stretch (PICTURE VAR p, REAL CONST sx, sy, sz) + Zweck: s. o. + Fehlerfälle: + * Picture is two dimensional + +translate + PROC translate (PICTURE VAR p, REAL CONST dx, dy) + Zweck: Das PICTURE wird um #on("italics")#dx#off("italics")# und #on("italics")#dy#off("italics")# verschoben. + Dabei werden nur die Werte von #on("italics")#draw, draw r, move #off("italics")# und #on("italics")#move r#off("italics")# + verändert. + Fehlerfälle: + * Picture is three dimensional + + PROC translate (PICTURE VAR p, REAL CONST dx, dy, dz) + Zweck: s. o. + Fehlerfälle: + * Picture is two dimensional + +plot PROC plot (PICTURE CONST p) + Zweck: Das Picfile wird gezeichnet. + Achtung: Es wird kein #on("italics")#begin plot#off("italics")# oder #on("italics")#end plot#off("italics")# durchgeführt. Es wird + auch kein Stift gsetzt und die Projektionsparameter bleiben + unverändert. + + +#on("underline")#Graphische PICFILE-Prozeduren#off("underline")# +plot + PROC plot (TEXT CONST name) + Zweck: Der PICFILE mit dem Namen #on("italics")#name#off("italics")# wird entsprechend der angegebenen + Darstellungsart gezeichnet. Diese Parameter (#on("italics")#perspective, orthographic, + oblique, view, window etc.#off("italics")#) müssen vorher eingestellt werden. + Fehlerfälle: + * PICFILE does not exist + Es existiert kein PICFILE mit dem Namen #on("italics")#name#off("underline")# + + PROC plot (PICFILE VAR p) + Zweck: Der PICFILE #on("italics")#p#off("italics")# wird entsprechend der angegebenen Darstellungsart ge­ + zeichnet. Diese Parameter müssen vorher eingestellt werden: + + #on("bold")#zweidimensional:#off("bold")# + obligat: #on("italics")#window#off("italics")# (zweidimensional) + optional: #on("italics")#view#off("italics")# (zweidimensional) + #on("italics")#viewport#off("italics")# + #on("italics")#select pen#off("italics")# + + #on("bold")#dreidimensional:#off("bold")# + obligat: #on("italics")#window#off("italics")# (dreidimensional) + optional: #on("italics")#view#off("italics")# (dreidimensional) + #on("italics")#orthographic | perspective | oblique#off("italics")# + #on("italics")#viewport#off("italics")# + #on("italics")#select pen#off("italics")# + + +select pen + PROC select pen (PICFILE VAR p, INT CONST pen, colour, thickness, line + type, + BOOL VAR hidden lines) Zweck: Für die + Darstellung des Bildes #on("italics")#p#off("italics")# soll dem #on("italics")#virtuellen#off("italics")# Stift #on("italics")#pen#off("italics")# ein realer Stift + zugeordnet werden, der möglichst die Farbe #on("italics")#colour#off("italics")# und die Dicke #on("italics")#thick­ + ness#off("italics")# hat und dabei Linien mit dem Typ #on("italics")#line type#off("italics")# zeichnet. Es wird die + beste Annäherung für das Ausgabegerät genommen. + Wenn #on("italics")#hidden lines#off("italics")# auf TRUE gesetzt wird, werden bei dreidimensionalen + Zeichnungen die verdeckten Linien mitgezeichnet, ansonsten werden sie + unterdrückt. Um sicherzustellen, das der Algorithmus auch funktioniert, + müssen die Linien allerdings von vorn nach hinten gezeichnet werden. Es + ist also nicht möglich, das Bild so zu drehen, das die hinteren Linien + zuerst gezeichnet werden. + Dabei gelten folgende Vereinbarungen: + + #on("bold")#Farbe:#off("bold")# Negative Farben werden XOR gezeichnet (dunkel wird hell und + hell wird dunkel), Farbe 0 ist der Löschstift und positive Farben + überschreiben (ersetzen) den alten Punkt mit folgenden Werten: + + 1 Standardfarbe des Endgerätes + 2 rot + 3 blau + 4 grün + 5 schwarz + 6 weiß + > 6 nicht normierte Sonderfarben + + + #on("bold")#Dicke:#off("bold")# 0 Standardstrichstärke des Endgerätes, ansonsten Strichstärke in + 1/10 mm. + + + #on("bold")#Linientyp:#off("bold")# + 0 keine sichtbare Linie + 1 durchgängige Linie + 2 gepunktete Linie + 3 kurz gestrichelte Linie + 4 lang gestrichelte Linie + 5 Strichpunktlinie + > 5 nicht normierte Linie + + #on("bold")#Verdeckte Linien:#off("bold")# + TRUE Verdeckte Linien werden mitgezeichnet + FALSE Verdeckte Linien werden unterdrückt (nur bei drei­ + dimensionalen PICTURE) + + Die hier aufgeführten Möglichkeiten müssen nicht an allen graphischen + Endgeräten vorhanden sein. Der geräteabhängige Graphik-Treiber wählt + jeweils die bestmögliche Annäherung. + + Fehlerfälle: + * pen out of range + #on("italics")#pen#off("italics")# muss im Bereich 1-16 sein. + +background + PROC background (PICFILE VAR p, INT CONST colour) + Zweck: Der Hintergrund wird auf die Farbe #on("italics")#colour#off("italics")# (s.o.) gesetzt wenn möglich. + + INT PROC background (PICFILE CONST p): + Zweck: Liefert die eingestellte Hintergrundfarbe. + +view + PROC view (PICFILE VAR p, REAL CONST alpha) + Zweck: Setzt den Winkel der Y-Achse zur Senkrechten auf #on("italics")#alpha#off("italics")# Grad, falls + diese nicht senkrecht zur Betrachtungsebene steht. + + PROC view (PICFILE VAR p, REAL CONST phi, theta) + Zweck: Dreidimensionale Bilder werden häufig nicht direkt von vorne dargestellt, + sondern für die Betrachtung gedreht. Mit der Prozedur #on("italics")#view#off("italics")# kann die + Betrachtungsrichtung durch die Polarwinkel #on("italics")#phi#off("italics")# und #on("italics")#theta#off("italics")# (im Gradmass) + angegeben werden. Voreingestellt ist #on("italics")#phi#off("italics")# = 0 und #on("italics")#theta#off("bold")# = 0, d.h. senk­ + recht von oben. + + Im Gegensatz zu #on("italics")#rotate#off("italics")# hat #on("italics")#view#off("italics")# keine Wirkung auf das eigentliche Bild + (PICFILE), sondern nur auf die gewählte Darstellung. So addieren sich + zwar aufeinanderfolgende #on("italics")#Rotationen#off("italics")#, #on("italics")#view#off("italics")# aber geht immer von der + Nullstellung aus. Auch kann das Bild durch eine #on("italics")#Rotation#off("italics")# ganz oder + teilweise aus oder in das Darstellungsfenster (#on("italics")#window#off("italics")# gedreht werden. Bei + #on("italics")#view#off("italics")# verändern sich die Koordinaten der Punkte nicht, d. h. das Fenster + wird mitgedreht. + + PROC view (PICFILE VAR p, REAL CONST x, y, z) + Zweck: Wie oben, nur werden die Winkel nicht in Polarkoordinaten angegeben, + sondern es wird die Blickrichtung als Vektor in Karthesischen Koordina­ + ten angegeben. (Die Länge darf ungleich 1 sein). + +viewport + PROC viewport (PICFILE VAR p, REAL CONST hormin, hormax, vertmin, + vertmax) : 1-709 + Zweck: Die Zeichenfläche auf dem Endgerät, auf dem das Bild dargestellt werden + soll, wird spezifiziert. Dabei wird sowohl die Größe als auch die relative + Lage der Zeichenfläche definiert. Der linke untere Eckpunkt der physi­ + kalischen Zeichenfläche des Gerätes hat die Koordinaten (0, 0). Die + definierte Zeichenfläche erstreckt sich + + #on("italics")#hormin - hormax#off("italics")# in der Horizontalen, + #on("italics")#vertmin - vertmax#off("italics")# in der Vertikalen. + + So liegt der linke untere Eckpunkt dann bei (#on("italics")#hormin, hormax#off("italics")#), der rechte + obere Eckpunkt bei (#on("italics")#hormax, vertmax#off("italics")#). + + Damit sowohl geräteunabhängige als auch maßstabgetreue Zeichnungen + möglich sind, können die Koordinaten in zwei Arten spezifiziert werden: + a) #on("bold")#Gerätekoordinaten#off("bold")# + Die Koordinaten können Werte von 0.0 bis 2.0 annehmen. Dabei + hat die kürzere Seite der physikalischen Zeichenfläche definitionsge­ + mäß die Länge 1.0. + b) #on("bold")#Absolute Koordinaten#off("bold")# + Die Werte werden in #on("italics")#cm#off("italics")# angegeben. Dabei müssen die Maximal­ + werte aber größer als 2.0 sein, da sonst Fall a) angenommen wird. + + Voreingestellt ist + + viewport (0.0, 1.0, 0.0, 1.0) + + d.h. das größtmögliche Quadrat, beginnend mit der linken unteren Ecke + der physikalischen Zeichenfläche. In vielen Fällen wird diese Einstellung + ausreichen, so daß der Anwender kein eigenes #on("italics")#viewport#off("italics")# definieren muss. + + Der Abbildungsmaßstab wird durch das Zusammenspiel von #on("italics")#viewport#off("italics")# und + #on("italics")#window#off("italics")# festgelegt (s. dort). Dabei ist insbesondere darauf zu achten, daß + winkeltreue Darstellung nur bei gleichen X- und Y-Maßstab möglich + ist. Da man oft quadratische Fenster (#on("italics")#window#off("italics")#) verwendet, wurde als + Standardeinstellung auch ein quadratisches #on("italics")#viewport#off("italics")# gewählt. + + Hinweis: Mit der Prozedur #on("italics")#check limit#off("italics")# aus dem PACKET #on("italics")#basis plot#off("italics")# kann die + Überprüfung der Grenzen des eingestellten #on("italics")#viewport#off("italics")#-Bereiches ein- + bzw. ausgeschaltet werden. Bei eingeschateter Überprüfung, werden + Linien, die den Bereich überschreiten, am Rand abgetrennt. + + +window + PROC window (PICFILE VAR p, REAL CONST x min, x max, y min, y max) + Zweck: Für die Darstellung eines zweidimensionalen Bildes wird das darzustel­ + lende Fenster definiert. Alle Bildpunkte, deren X-Koordinaten im In- + tervall [#on("italics")#x min, x max#off("italics")#] und deren Y-Koordinaten im Bereich [#on("italics")#y min, y + max#off("italics")#] liegen, gehören zum definierten Fenster.Vektoren, die außerhalb + dieses Fensters liegen, gehen über die durch #on("italics")#viewport#off("italics")# Fläche hinaus + (s.dort). + + Der Darstellungsmaßstab ergibt sich als + + #ub#               x max - x min               #ue# + horizontale Seitenlänge der Zeichenfläche + + + #ub#               y max - y min               #ue# + vertikale Seitenlänge der Zeichenfläche + + PROC window (PICFILE VAR p, REAL CONST x min, x max, y min, y max, + z min, z max) + + Zweck: Für die darstellung eines dreidimensionalen Bildes wird das darzustellende + Fenster definiert. Alle Bildpunkte, deren X-Koordinaten im Intervall [#on("italics")#x + min, x max#off("italics")#], deren Y-Koordinaten im Bereich [#on("italics")#y min, y max#off("italics")#] und + deren Z-Koordinaten im Bereich [#on("italics")#z min, z max#off("italics")#] liegen, gehören zum + definierten Fenster. Dieses dreidimensionale Fenster (#on("italics")#Quader#off("italics")#) wird ent­ + sprechend der eingestellten Projektionsart (orthographisch, perspektivisch + oder schiefwinklig) und den Betrachtungswinkeln (s. #on("italics")#view#off("italics")#) auf die spezi­ + fizierte Zeichenfläche abgebildet. + Anders als im zweidimensionalen Fall ist das Problem der Maßstaäbe + nicht mehr nur durch das Zusammenspiel von #on("italics")#window#off("italics")# und #on("italics")#viewport#off("italics")# zu + beschreiben. Hier spielen auch die Projektionsart und Darstellungswinkel + herein. + +oblique: + PROC oblique (PICFILE VAR p, REAL CONST a, b) + Zweck: Bei dem (dreidimensionalen) Bild #on("italics")#p#off("italics")# wir #on("underline")#schiefwinklig#off("underline")# als gewünschte + Projektionsart eingestellt. Dabei ist (#on("italics")#a, b#off("italics")#) der Punkt auf der X-Y- + Ebene, auf den der Einheitsvektor der Z-Richtung abgebildet werden + soll. + +orthographic + PROC orthographic (PICFILE VAR p) + Zweck: Bei dem (dreidimensionalen) Bild #on("italics")#p#off("italics")# wir #on("underline")#orthographisch#off("underline")# als gewünschte + Projektionsart eingestellt. Bei der orthographischen Projektion wird ein + dreidimensionaler Körper mit parallelen Strahlen senkrecht auf der Pro­ + jektionsebene dabgebildet. + +perpective + PROC perspective (PICFILE VAR p, REAL CONST cx, cy, cz) + Zweck: Bei dem (dreidimensionalen) Bild #on("italics")#p#off("italics")# wir #on("underline")#perspectivisch#off("underline")# als gewünschte + Projektionsart eingestellt. Der Punkt (#on("italics")#cx, 1/cy, cz#off("underline")#) ist der Fluchtpunkt der + Projektion, d. h. alle Parallen zur Z-Achse schneiden sich in diesem + Punkt. + +extrema + PROC extrema (PICFILE VAR p, REAL VAR x min, x max, y min, y max) + Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICFILE. + + PROC extrema (PICFILE VAR p, REAL VAR x min,x max,y min,y max,z + min,z max) : 1-651 + Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICFILE. + + +#on("underline")#Prozeduren zur Manipulation von PICFILE#off("underline")# +:= + OP := (PICFILE VAR p, DATASPACE CONST d) + Zweck: Assoziert die PICFILE Variable #on("italics")#p#off("italics")# mit dem Datenraum #on("italics")#d#off("italics")# und initialisiert + die Variable, wenn nötig. + Fehlerfälle: + * dataspace is no PICFILE + Der anzukoppelnde Datenraum hat einen unzulässigen Typ + +picture file + DATASPACE PROC picture file (TEXT CONST name) + Zweck: Assoziaten eines benannten Datenraumes mit einem PICFILE (s.o.). + +put + PROC put (FILE VAR f, PICFILE VAR p) + Zweck: Schreibt den Inhalt eines PICFILE in ein FILE. Die Informationen + werden im internen Format abgelegt. + +get + PROC get (PICFILE VAR p, FILE VAR f) + Zweck: Liest den Inhalt eines PICFILE aus einem FILE. Die Informationen + müssen mit #on("italics")#put#off("italics")# geschrieben worden sein. + Fehlerfall: + * Picfile overflow + Es können nur maximal 1024 Picture (Sätze) in einem PICFILE abgelegt + werden. + +to first pic + PROC to first pic (PICFILE VAR p) + Zweck: Positioniert auf das erste PICTURE. + +to eof + PROC to last pic (PICFILE VAR p) + Zweck: Positioniert hinter das letzte PICTURE. + +to pic + PROC to pic (PICFILE VAR p, INT CONST pos) + Zweck: Positioniert auf das PICTURE Nummer #on("italics")#pos#off("italics")#. + Fehlerfälle: + * Position underflow + Es wurde eine Position kleiner Null angegeben. * Position after + eof Es wurde versucht, hinter das Ende eines PICFILE zu positionieren + +up + PROC up (PICFILE VAR p) + Zweck: Positioniert genau ein PICTURE zurück. + Fehlerfall: + * Position underflow + Es wurde versucht, vor das erste PICTURE zu positionieren + + PROC up (PICFILE VAR p, INT CONST n) + Zweck: Positioniert genau #on("italics")#n#off("italics")# Picture zurück. + Fehlerfall: + * Position underflow + Es wurde versucht, vor das erste PICTURE zu positionieren + +down + PROC down (PICFILE VAR p) + Zweck: Positioniert genau ein PICTURE vorwärts. + Fehlerfall: + * Position after eof + Es wurde versucht, hinter das Ende eines PICFILE zu positionieren + + PROC down (PICFILE VAR p, INT CONST n) + Zweck: Positioniert genau #on("italics")#n#off("italics")# Picture vorwärts. + Fehlerfall: + * Position after eof + Es wurde versucht, hinter das Ende eines PICFILE zu positionieren + +is first picture + BOOL PROC is first picture (PICFILE CONST p) + Zweck: Liefert genau dann #on("italics")#TRUE#off("italics")#, wenn das erste PICTURE erreicht ist. + +eof + BOOL PROC eof (PICFILE CONST p) + Zweck: Liefert genau dann #on("italics")#TRUE#off("italics")#, wenn das Ende eines PICFILE erreicht ist. + +picture no + INT PROC picture no (PICFILE CONST p) + Zweck: Liefert die Nummer des aktuellen PICTURE. + +pictures + INT PROC pictures (PICFILE CONST p) + Zweck: Liefert die Anzahl PICTURE eines PICFILE. + +delete picture + PROC delete picture (PICFILE VAR p) + Zweck: Löscht das aktuelle PICTURE + +insert picture + PROC insert picture (PICFILE VAR p) + Zweck: Fügt ein PICTURE #on("underline")#vor#off("underline")# der aktuellen Position ein. + +read picture + PROC read picture (PICFILE CONST p, PICTURE VAR pic) + Zweck: Liest das aktuelle PICTURE. + +write picture + PROC write picture (PICFILE VAR p, PICTURE CONST pic) + Zweck: Schreibt das PICTURE #on("italics")#pic#off("italics")# auf der aktuellen Position. + +put picture + PROC write picture (PICFILE VAR p, PICTURE CONST pic) + Zweck: Schreibt das PICTURE #on("italics")#pic#off("italics")# hinter das letzte PICTURE des PICFILE. + Die aktuelle Position wird nicht verändert. + +#page# + #on("italics")#Wo wir sind, da klappt nichts, + aber wir können nicht überall sein !#off("italics")# + +#type ("basker14")# +#on("bold")#Kurzbeschreibung des Graphik-Editors#off("bold")# +#type ("basker12")# + +In der Kommondozeile werden folgende Informationen angezeigt: + +#on("revers")#LEN nnnnn <...Name...> DIM n PEN nn Picture nnnn +#off("revers")# + + +Folgende Kommandos stehen zur Verfügung: + + PICTURE PROC pic neu + PICFILE PROC picfile neu + PROC neu zeichnen + + OP UP n (n PICTURE up) + OP DOWN n (n PICTURE down) + OP T n (to PICTURE n) + + PROC oblique (REAL CONST a, b) + PROC orthographic + PROC perspective (REAL CONST cx, cy, cz) + PROC window (BOOL CONST dev) + PROC window (REAL CONST x min, x max, y min, y max) + PROC window (REAL CONST x min, x max, y min, y max, z min, z max) + PROC viewport (REAL CONST h min, h max, v min, v max) + PROC view (REAL CONST alpha) + PROC view (REAL CONST phi, theta) + PROC view (REAL CONST x, y, z) + + PROC pen (INT CONST n) + PROC select pen (INT CONST pen, colour, thickness, line type, BOOL CONST + hidden) + PROC background (INT CONST colour) + + PROC extrema pic + PROC extrema picfile + PROC selected pen + + PROC rotate (REAL CONST angle) + PROC rotate (REAL CONST phi, theta, lambda ) + PROC stretch (REAL CONST sx, sy) + PROC stretch (REAL CONST sx, sy, sz) + PROC translate (REAL CONST dx, dy) + PROC translate (REAL CONST dx, dy, dz) + diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Inhaltsverzeichnis b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Inhaltsverzeichnis new file mode 100644 index 0000000..5726636 --- /dev/null +++ b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Inhaltsverzeichnis @@ -0,0 +1,45 @@ +#limit (11.5)##pagelength (16.5)# +#start (1.8,1.0)# +Inhaltsverzeichnis + + + +1 Was kann gs-Herbert und Robbi 3 + +2 Allgemeines zum Hamster-/Robotermodell 6 +2.1 Entstehung 6 +2.2 Kurzbeschreibung des Hamster-/Roboter- + Modells 7 +2.2.1 Befehle und Tests 7 +2.2.2 Landschafts-/Arbeitsfeldgestaltung 9 +2.3 Einsatzbereich 11 +2.4 Hinweise für den Einsatz in der Ausbildung 12 +2.5 Aufgabenmaterial 14 +2.6 Erfahrungen mit dem Hamster-/Roboter-Modell 14 + +3 Installation von gs-Herbert und Robbi 17 +3.1 Voraussetzungen 17 +3.2 Lieferumfang 17 +3.3 Installation 18 +3.4 Direktstart des Medells 20 + +4 Beschreibung der Menufunktionen 22 +4.1 Kurzhinweise zur Bedienung des Menus 23 +4.2 Menufunktionen zum Oberbegriff 'Info' 27 +4.3 Menufunktionen zum Oberbegriff 'Landschaft' 29 + Menufunktionen zum Oberbegriff 'Arbeitsfeld' 29 +4.4 Menufunktionen zum Oberbegriff 'Programm' 35 +4.5 Menufunktionen zum Oberbegriff 'Lauf' 41 +4.6 Menufunktionen zum Oberbegriff 'Archiv' 46 + +5 Detailbeschreibung der Basisbefehle 61 + +6 Zusätzliche Kommandos 66 + + + + + + + + diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 1 b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 1 new file mode 100644 index 0000000..73c95f9 --- /dev/null +++ b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 1 @@ -0,0 +1,93 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (3)# +#headodd# +#center#gs-Herbert und Robbi#right#% + +#end# +#headeven# +%#center#gs-Herbert und Robbi + +#end# +#center#1 + +#center#Was +#center#kann +#center#gs-Herbert und Robbi + + + Mit #on("b")#gs-Herbert und Robbi#off("b")# liegt das von Lothar Oppor +entwickelte und von Wolfgang Weber weiterentwickelte +Hamster-Modell nun eingebettet in die komfortable, +menuorientierte Benutzerschnittstelle #on("b")#gs-DIALOG#off("b")# vor. Das +Programm stellt eine wesentliche Erweiterung des 'alten' +Hamster - Modells dar. Neben einer zweiten Modellvarian­ +te (Roboter) wurden eine Reihe nützlicher Funktionen in +das Modell integriert. Sämtlich Funktionen werden über +ein übersichtliches Menu angeboten, was gerade dem An­ +fänger die Arbeit mit dem Computer erleichtert. + + #on("b")#gs-Herbert und Robbi#off("b")# kann zur Einführung in das al­ +gorithmische Problemlösen eingesetzt werden und soll +dazu dienen, Programmierung #on("u")#einfach#off("u")# und #on("u")#spielerisch#off("u")# zu +erlernen - ohne Ablenkung durch Betriebssystem oder gar +Hardware-Eigenheiten. + + Das Modell ist so einfach und überschaubar, daß ein +Anfänger schon nach einer halben Stunde in der Lage ist, +sich selbst kleine Aufgaben zu stellen und diese zu lösen. +Die Modellumgebung ist so komfortabel, daß der Anfänger +nach einer kurzen Einweisung selbständig mit dem Compu­ +termodell umgehen kann. + +- Durch die Menuführung sind nur noch wenige Be­ + triebssystemkommandos zur Bedienung des Systems + notwendig. + +- Der Benutzer kann jederzeit Informationen anfordern + über: + - den zur Verfügung stehenden Befehlsumfang, + - die Möglichkeiten, den Lauf des Hamsters/Robo­ + ters zu beeinflussen, + - die Möglichkeiten hinsichtlich der Landschafts­ + gestaltung/Arbeitsfeldgestaltung + - die Bedienung des Menusystems + - die Wirkung der einzelnen Menufunktionen + - die Möglichkeiten/Bedienung des Editors + +- Neben der Steuerung des Hamsters/Roboters durch + Programme kann der Hamster/Roboter auch interaktiv + gesteuert werden; dabei wird ein Protokoll der ausge­ + führten Aktionen in Form eines ablauffähigen ELAN- + Programms angelegt. Dieses Protokoll (Programm) kann + jederzeit eingesehen werden. Natürlich kann anschlie­ + ßend der Hamster/Roboter die gleichen Aktionen, die + zuvor von Hand ausgeführt wurden, auch nach diesem + Programm ausführen. + +- Durch den (optional) erweiterbaren Befehlssatz kann + #on("b")#gs-Herbert und Robbi#off("b")# den Erfordernissen und der Lei­ + stungsfähigkeit der Lernenden leicht angepaßt wer­ + den. + +- Auch das Editieren und Drucken von Programmen sowie + Landschaften/Arbeitsfeldern erfolgt vom Menu aus. + +- Die Archivoperationen, die gerade Anfängern zunächst + große Probleme bereiten, können sämtlichst komforta­ + bel vom Menu aus gehandhabt werden. Dabei werden + Anfragen an den Benutzer gestellt, die zumeist nur + mit 'ja' oder 'nein' zu beantworten sind; oder der Be­ + nutzer hat in einer Auswahlliste die gewünschten Da­ + teinamen anzukreuzen. + +- Die Archivoperationen stehen dem Benutzer auch unab­ + hängig vom Hamster-/Robotermodell unter #on("b")#gs-DIALOG#off("b")# + zur Verfügung, so daß beim Verlassen der Modellum­ + gebung "kein Bruch zu befürchten ist". + +- Die Fehlermeldungen sind detailliert und leicht ver­ + ständlich, so daß auch Anfänger die Fehlerquelle(n) + zumeist ohne zusätzliche Hilfen lokalisieren und be­ + seitigen können. + diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 2 b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 2 new file mode 100644 index 0000000..52526d6 --- /dev/null +++ b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 2 @@ -0,0 +1,389 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (6)# +#headodd# +#center#gs-Herbert und Robbi#right#% + +#end# +#headeven# +%#center#gs-Herbert und Robbi + +#end# +#center#2 + +#center#Allgemeines +#center#zum +#center#Hamster-/Robotermodell + + +2.1 Entstehung + + Das Hamster - Modell wurde in der Gesellschaft für +Mathematik und Datenverarbeitung (GMD), einer Großfor­ +schungseinrichtung des Bundes und des Landes Nord­ +rhein-Westfalen, von Lothar Oppor in Anlehnung an das +Modell 'Karel the Robot' von Richard E. Pattis (Stanford +University, USA) entwickelt und zunächst innerhalb der +GMD und schon bald im Schulbereich eingesetzt. + Wolfgang Weber, Lehrer an der Gesamtschule Leopolds­ +höhe bei Bielefeld, entwickelte in Zusammenhang mit sei­ +ner Arbeit am Landesinstitut für Schule und Weiterbil­ +dung in Soest dieses Modell seit 1984 weiter. Sein Ziel war +es, das Modell um solche Komponenten zu erweitern, daß es +auch für Schüler der Sekundarstufe I im Anfangsunter­ +richt eingesetzt werden kann. Besondere Bedeutung kam +dabei der Entwicklung einer komfortablen, einfach zu be­ +dienenden Benutzerschnittstelle zu, die es dem Anfänger +ermöglicht, sich von Beginn an mit der eigentlichen Pro­ +blemstellung auseinanderzusetzen, ohne von Betriebssy­ +stem oder gar Hardware-Eigenheiten abgelenkt zu werden. + Mit dem vorliegenden Programm #on("b")#gs-Herbert und Robbi#off("b")#, +das in die komfortable, menuorientierte Benutzer­ +schnittstelle #on("b")#gs-DIALOG#off("b")# eingebettet ist, dürfte diese Ar­ +beit vorerst zu einem Abschluß gebracht sein. Mit diesem +Programm liegt nun eine Modellumgebung vor, die den +gestellten Anforderungen gerecht wird. + + +2.2 Kurzbeschreibung des Hamster-/Roboter-Modells + + Das Hamster- und das Roboter - Modell sind analog +aufgebaut und in Art und Umfang der Befehle identisch. +Im ersten Modell kann 'Herbert der Hamster', im zweiten +Modell 'Robbi der Roboter' auf dem Bildschirm durch vier +sogenannte Basisbefehle gesteuert werden - 'Herbert' in +einer 'Landschaft', 'Robbi' auf einem 'Arbeitsfeld' - beides +Ebenen, die aus 23 x 40 Kacheln bestehen. + Auf dieser Ebene können sich noch Hindernisse und +'Körner' (für Herbert) oder 'Werkstücke' (für Robbi) befin­ +den. Die Hindernisse stellen auf dem Bildschirm Barrieren +dar, die umgangen werden müssen. Die Körner bzw. Werk­ +stücke können von Herbert in seinen 'Backentaschen' bzw. +von Robbi in seinem 'Behälter' aufgenommen oder daraus +(wieder) abgelegt werden. + + +2.2.1 Befehle und Tests + + Für die Steuerung von Herbert bzw.Robbi stehen vier +Basisbefehle zur Verfügung (die in beiden Modellvarian­ +ten gleich sind): + +#on("u")#vor#off("u")# + Gehe eine Kachel (einen Schritt) in Laufrichtung vor. + +#on("u")#links um#off("u")# + Drehe Dich, wo Du stehst, um 90 Grad nach links. + +#on("u")#nimm#off("u")# + Nimm da, wo Du stehst, ein Korn/Werkstück auf. + +#on("u")#gib#off("u")# + Lege da, wo Du stehst, aus den Backentaschen/dem Be­ + hälter ein Korn/Werkstück ab. + + Da nur dort ein Korn/Werkstück aufgenommen werden +kann, wo auch eines vorhanden ist oder nur vorgegangen +werden kann, wenn die nächste Kachel noch zur Land­ +schaft/zum Arbeitsfeld gehört und nicht blockiert ist, +sind die Befehle 'nimm', 'gib' und 'vor' nicht uneinge­ +schränkt ausführbar. Aus diesem Grunde sind noch die +folgenden #on("u")#Basistests#off("u")# definiert: + +#on("u")#vorn frei#off("u")# + testet, ob die vor ihm liegende Kachel frei ist. + +#on("u")#korn da / werkstueck da#off("u")# + testet, ob auf der Kachel, auf der er steht, mindestens + ein Korn/Werkstück liegt. + +#on("u")#backen leer /behaelter leer#off("u")# + testet, ob kein Korn/Werkstück in den Backentaschen/im + Behälter ist. + + Darüberhinaus können Sie bei der Installation des +Systems noch festlegen, ob die folgenden #on("u")#Zusatztests#off("u")# zur +Verfügung stehen sollen oder nicht: + +#on("u")#links frei#off("u")# + testet, ob die Kachel links neben ihm frei ist. + +#on("u")#rechts frei#off("u")# + testet, ob die Kachel rechts neben ihm frei ist. + +#on("u")#hinten frei#off("u")# + testet, ob die Kachel hinter ihm frei ist. + +#on("u")#korn vorn / werkstueck vorn#off("u")# + testet, ob auf der Kachel vor ihm mindestens ein Korn/ + Werkstück liegt. + +#on("u")#korn links / werkstueck links#off("u")# + testet, ob auf der Kachel links neben ihm mindestens + ein Korn/ Werkstück liegt. + +#on("u")#korn rechts / werkstueck rechts#off("u")# + testet, ob auf der Kachel rechts neben ihm mindestens + ein Korn/Werkstück liegt + +#on("u")#korn hinten / werkstueck hinten#off("u")# + testet, ob auf der Kachel hinter ihm mindestens ein + Korn/Werkstück liegt. + + Es gibt #on("u")#keinen#off("u")# Testbefehl, mit dem überprüft werden +kann, ob der Rand der Ebene erreicht ist. + + +2.2.2 Landschaftsgestaltung/Arbeitsfeldgestaltung + + Der Benutzer kann selber Landschaften/Arbeitsfelder +erstellen, auf denen Herbert bzw. Robbi bewegt werden +kann. Es können aber auch fertige Ebenen verändert wer­ +den. + Eine Landschaft/ein Arbeitsfeld ist eine Ebene aus +23 x 40 Kacheln. Eine Kachel kann auf dem Bildschirm so +aussehen: + + Leere Kachel : Blank und Punkt (" .") + Kornkachel : Blank und kleines o (" o") + Hindernis : zwei Nummernzeichen ("\#\#") + + In dieser Landschaft steht auf einer der Kacheln Her­ +bert bzw. Robbi: + + "A" mit Blickrichtung nach oben + ">" mit Blickrichtung nach rechts + "V" mit Blickrichtung nach unten + "<" mit Blickrichtung nach links + + +#on("u")#Beispiel:#off("u")# Ausschnitt aus einer Landschaft: + +#on("b")# + . . . . . . . . . . . . . . . . . . . . + . . o o o o o o o o o o . . . . . . . . + . . o . . . . . . . . o . . . . . . . . + . . o . . . . . . . . o . . . . . . . . + . o o .\#\#\#\#\#\#\#\#\#\#\#\# . o . . . . . . . . + . o . .\#\# .V. . .\#\# . o o o o o o o . . + . o . .\#\# . o . .\#\# . . . . . . . o . . + . o o o o o o . .\#\# . . . o o o o o . . + . . . .\#\# . . . .\#\# . . . o . . . . . . + . . . .\#\# . . . .\#\# . . . o o o o . . . + . . . .\#\#\#\#\#\#\#\#\#\#\#\# . . . . . . o o . . + . . . . . . . . . . . . . . . . . . . . + +Während der Landschaftsgestaltung wirken folgende +Tasten: + + halt, beende die Landschafts-/Arbeitsfeld­ + gestaltung +<\#> setze ein Hindernis und gehe ein Feld + weiter + leere das Feld und gehe ein Feld weiter + lege hier ein Korn/Werkstück ab + nimm ein Korn/Werkstück auf (falls hier + welche liegen) + zeige, wie viele Körner/Werkstücke hier + liegen + ersetze diese Landschaft/diese Arbeitsfeld + durch die Kopie einer bereits vorhandenen + anderen Landschaft/eines bereits vorhan­ + denen anderen Arbeitsfeldes + +- Durch Drücken der Fragezeichentaste () während der + Landschafts-/Arbeitsfeldgestaltung, können Sie sich + diese Hinweise auch auf dem Bildschirm einblenden + lassen. + +- Mit den Pfeiltasten kann Herbert/Robbi bewegt und + seine Richtung verändert werden. + +- Die Landschaftsgestaltung wird durch Tippen der + Taste abgeschlossen. Die Position und die Blick­ + richtung, die Herbert bzw. Robbi zu diesem Zeitpunkt + innehat, wird als Startposition vermerkt. + +- Auf dem Bildschirm wird dann noch die Zahl der Kör­ + ner/Werkstücke erfragt, die Herbert bzw.Robbi zu Be­ + ginn des Laufes in seinen Backentaschen/in seinem + Behälter haben soll. Hier muß eine Zahl zwischen 0 und + 32767 eingegeben werden. + + +2.3 Einsatzbereich + + Das Hamster-/Roboter-Modell soll dazu dienen, die +Grundelemente des algorithmischen Problemlösens (Folge, +Auswahl, Wiederholung etc.) #on("u")#einfach#off("u")# und #on("u")#spielerisch#off("u")# zu +erlernen und sie in der Programmiersprache ELAN zu co­ +dieren. In der Bildschirmdarstellung erinnert das Ham­ +ster-/Roboter-Modell zunächst an ein einfaches Tele­ +spiel, eine Anwendung des Computers, die sicher bekannt +ist. Darüberhinaus lassen sich leicht Bezüge zur Steue­ +rung von Industrierobotern herstellen. + Durch die komfortable Benutzerschnittstelle wird dem +Anwender in der Anfangsphase eine Auseinandersetzung +mit dem Betriebssystem "erspart". Die Arbeit mit dem Mo­ +dell setzt #on("u")#keine Vorerfahrungen und Kenntnisse#off("u")# voraus. +Das Modell ist schon nach weniger als einer halben Stun­ +de für den Anfänger überschaubar. Er kann dann schon +Aufgaben lösen, sich selbst Aufgaben stellen bzw. die +gegebene Aufgabenstellung erweitern. + Das Modell zielt auf die Aktivierung des Lernenden +und die Mitarbeit in allen Punkten: Aufgabenstellung, +Lösungsgestaltung, Lösungstest und -verifizierung. Der +Lernfortschritt kann in stärkerem Maße als im "herkömm­ +lichen Programmierunterricht" von den Lernenden selbst +bestimmt werden. Der spielerische Anfang, die Veran­ +schaulichung der Programmausführung auf dem Bild­ +schirm, die Möglichkeit Fehler direkt und eigenständig +zu erkennen, fördern die Motivation, die Kreativität und +die Fehler- und Frustrationstoleranz. + + +2.4 Hinweise für den Einsatz in der Ausbildung + + Das Hamster-/Roboter-Modell ist angelegt für "Pro­ +grammieren" mit Bleistift und (kariertem) Papier. Für die +Überlegungen, die anzustellen sind, ist der Computer +selbst in der Anfangsphase #on("u")#nicht notwendig#off("u")#. Man kann +Kachel-Landschaften / Kachel-Arbeitsfelder aufzeich­ +nen und vorgegebene oder sich selbst gestellte Aufgaben +lösen. Die erstellten Programme werden ausgeführt, indem +man z.B. eine kleine Büroklammer als Hamster/Roboter auf +dem Papier oder der Folie dem Programm entsprechend ver­ +schiebt. Heftzwecken oder Pfennigstücke können als Kör­ +ner/ Werkstücke und Streichholzstücke als Hindernisse +dienen. + #on("b")#gs-Herbert und Robbi#off("b")# verfügt auch über die Möglich­ +keit, den Hamster/Roboter interaktiv zu steuern. Auch +hierüber ist ein Einstieg in den Umgang mit dem Modell +möglich. Bei der interaktiven Steuerung kann der Ham­ +ster/Roboter von Hand durch Tastendruck auf dem Bild­ +schirm bewegt werden. Dabei können nur die vier Basisbe­ +fehle ('vor', 'links um', 'nimm' und 'gib') verwendet werden. +Während der Steuerung von Hand wird ein "Protokoll" der +ausgeführten Befehle angelegt - und zwar gleich in Form +eines ablauffähigen ELAN-Programms. Dadurch hat der +Benutzer einerseits die Möglichkeit, die Anweisungen, die +durch Tastendruck gegeben wurden, zu kontrollieren, +andererseits kann anschließend die Folge der eingegebe­ +nen Anweisungen auch als Programm vom Computer ausge­ +führt werden ('Teach in'). + + Nach diesem "ersten Kennenlernen des Modells" sollte +man dann aber bei Problemstellungen, die ein systemati­ +sches Vorgehen erfordern, die Arbeit mit dem Computer +unterbrechen und die Algorithmen jeweils auf dem Papier +entwerfen. Auf die Ausführung der erstellten Anwei­ +sungsfolgen von Hand auf Papier/Folie sollte man #on("u")#auf +keinen Fall gänzlich verzichten#off("u")# - auch, um den Lernen­ +den zu verdeutlichen, daß die Befehlsfolgen sowohl vom +"Prozessor Mensch" als auch vom "Prozessor Computer" +ausgeführt werden können; der Computer also nur ein +Hilfswerkzeug ist. + Erst wenn das Bilden eigener benannter Anweisungen +(Refinements/Prozeduren) den Lernenden hinreichend ver­ +traut ist, ist es sinnvoll, umfangreichere Problemstel­ +lungen anzugehen. Da dann auch die Programmausführung +von Hand mühsam wird und ihren Reiz verliert, sollte man +(wieder) zum Computermodell übergehen, um mit dessen Hil­ +fe die Programme auszuführen und zu überprüfen. + Nachdem die Lernenden die Basisbefehle sicher beherr­ +schen und eigene benannte Anweisungen unter Verwendung +der Basisbefehle konstruieren können, können dann nach +und nach die vorgegebenen Tests und damit auch die ande­ +ren Elemente der Algorithmenentwicklung (Auswahl, Wie­ +derholung etc.) in den Unterricht eingebracht werden. + Als notwendig hat es sich erwiesen, von Anfang an auf +eine saubere Strukturierung und Modularisierung der +Algorithmen zu achten. Gerade Lernende mit "Program­ +miererfahrung" neigen dazu, möglichst "kurze" Program­ +me schreiben zu wollen. Besonderen Wert sollten Sie auf +eine treffende Namensgebung der einzelnen Module legen, +selbst wenn die Lernenden das oft als "lästige Schreibar­ +beit" empfinden. Aufgaben können ein Einzel-, Partner- +und Gruppenarbeit bearbeitet werden. Dabei hat sich die +Arbeit in kleinen Gruppen als besonders effektiv erwie­ +sen. Die Lernenden sind untereinander zumeist sehr kri­ +tisch und fordern sich gegenseitig auf, "lesbare" Pro­ +gramme zu schreiben. Ein Austausch der Programme unter +den Gruppen kann diesen Anspruch noch zusätzlich för­ +dern. + + +2.5 Aufgabenmaterial + + Zum Hamster-Roboter-Modell sind inzwischen eine Rei­ +he von Aufgaben / Aufgabensystemen enstanden. An dieser +Stelle soll auf zwei Veröffentlichungen hingewiesen +werden, in denen Sie solche Aufgaben / Aufgabensysteme +finden können: + +Weber, Wolfgang et al., Das Hamster-/Roboter-Modell, + in: Landesinstitut für Schule und Weiterbildung + (Hrsg.), Materialien zur Lehrerfortbildung in + Nordrhein-Westfalen, Heft 1, Neue Technologien + - Informations- und Kommunikationstechnologi­ + sche Inhalte im Wahlpflichtunterricht der Klas­ + sen 9/10, Soest, 1986 + +Ambros, Wolfgang, Der Hamster, Programmieren lernen in + einer Modellwelt, J.B. Metzlersche Verlagsbuch­ + handlung, Stuttgart, 1987 + + +2.6 Erfahrungen mit dem Hamster-/Roboter-Modell + + Seit 1982 wird das Hamster - Modell in der GMD zur +Programmierausbildung eingesetzt. Die Ergebnisse sind +hervorragend: Die Teilnehmer bewältigen in derselben +Zeit erheblich mehr Inhalte als früher ohne Modell. Moti­ +vation, Selbständigkeit und Initiative prägen sich er­ +heblich früher und merklich stärker aus. Außerdem sind +die am Modell erworbenen Kenntnisse tiefer und sicherer. + Seit 1983 wird das Hamster - Modell auch in mehreren +Schulen mit sehr gutem Erfolg eingesetzt. Der Erfolg ist +am größten im Blockunterricht (3 - 5 Tage z.B. in Projekt­ +wochen, Schullandheimaufenthalten etc.). Aber auch im +stundenweisen Unterricht wird das Hamster-/Roboter- +Modell mit gutem Erfolg eingesetzt. + Beide Zugänge, der Einstieg über das Arbeiten mit +Bleistift und Papier und der Einstieg über die interakti­ +ve Steuerung des Hamsters/Roboters, haben sich als prak­ +tikabel erwiesen. Der Zugang über die interaktive Steue­ +rung bietet den Vorteil, die zumeist sehr hohe Motivation +der Lernenden, "endlich mit dem Computer arbeiten zu +können", auszunutzen. Sie lernen dabei das Computermo­ +dell auf einfache Weise kennen und haben einen ersten +Umgang mit Bildschirm und Tastatur. Kleine, einfache +Problemstellungen können von ihnen durch die interak­ +tive Steuerung schnell und sicher bearbeitet werden. +"Nebenbei" lernen sie, neben der Wirkung der Basisbefeh­ +le, durch das mitgeführte Protokoll auch die Codierung +in der Programmiersprache kennen. Allerdings verliert +die interaktive Steuerung relativ schnell ihren Reiz, +wenn die Lernenden erkennen, daß nur sehr einfache Pro­ +blemstellungen damit bearbeitet werden können. Dann +sollte aber zur Arbeit mit Papier und Bleistift überge­ +gangen werden. + Die Entscheidung, ganz auf das Arbeiten mit Papier +und Bleistift zu verzichten, hat sich als sehr nachteilig +erwiesen. Die Lernenden "hacken" die Programme in die +Maschine und handeln eher nach dem "Prinzip von Versuch +und Irrtum" als nach sorgfältigen Überlegungen. Bei +komplexeren Problemstellungen scheitern diese Teilneh­ +mer zumeist. + Erfahrungsgemäß nimmt nach einiger Zeit der Wunsch +stark zu, eigene Ausgaben auf dem Bildschirm zu erzeugen +und andere Problembereiche zu bearbeiten (zum "richtigen +Programmieren" überzugehen). Sie sollten diesen Schritt +dann auch nicht zu lange hinauszögern und das Modell +auf keinen Fall überstrapazieren. Da das Modell selbst +und auch der Umgang damit sehr einfach ist, besteht auch +später die Möglichkeit, zum Modell zurückzukehren, um +hieran weitere Elemente der Algorithmenentwicklung in +einfacher und anschaulicher Form einzuführen. + + diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 3 b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 3 new file mode 100644 index 0000000..c34b752 --- /dev/null +++ b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 3 @@ -0,0 +1,199 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (17)# +#headodd# +#center#gs-Herbert und Robbi#right#% + +#end# +#headeven# +%#center#gs-Herbert und Robbi + +#end# +#center#3 + +#center#Installation +#center#von +#center#gs-Herbert und Robbi + + + Bevor Sie #on("b")#gs-Herbert und Robbi#off("b")# auf Ihrem Computer +benutzen können, müssen Sie das Programm zunächst in­ +stallieren. Wenn #on("b")#gs-Herbert und Robbi#off("b")# auf Ihrem System +schon zur Verfügung steht, können Sie dieses Kapitel +ruhig überspringen. + + +3.1 Voraussetzungen + + Um #on("b")#gs-Herbert und Robbi#off("b")# auf Ihrem Computer betreiben +zu können, muß das EUMEL-Betriebssystem installiert +sein. #on("b")#gs-Herbert und Robbi#off("b")# setzt die Multi-User-Version +voraus und ist lauffähig ab Version 1.7.5. #on("b")#gs-Herbert und +Robbi#off("b")# setzt weiterhin voraus, daß auf Ihrem Computer +bereits das Programm #on("b")#gs-DIALOG#off("b")# installiert ist. + + +3.2 Lieferumfang + + #on("b")#gs-Herbert und Robbi#off("b")# wird auf einer Diskette gelie­ +fert, die alle notwendigen Programme enthält (die Instal­ +lation von #on("b")#gs-DIALOG#off("b")# wird dabei vorausgesetzt!). Um den +Inhalt der Diskette feststellen zu können, starten Sie +Ihr System und bringen es dazu, daß 'gib kommando:' er­ +scheint. Dann legen Sie die Diskette ein und geben das +Kommando: + +archive("gs-Herbert und Robbi");list(archive); +release(archive) + + Anschließend erscheint eine Übersicht der auf dem +Archiv vorhandenen Programme. Folgende Programme soll­ +ten sich in der Übersicht befinden: + + "gs-Herbert und Robbi 1" + "gs-Herbert und Robbi 2" + "gs-Herbert und Robbi 3" + "gs-MENUKARTE:Herbert und Robbi" + "gs-Herbert und Robbi/gen" + + Eventuell können noch weitere Namen auf der Diskette +vorhanden sein. Wenn Sie den Inhalt der Diskette kon­ +trolliert haben und diese Programme auf der Diskette +vorhanden sind, können Sie #on("b")#gs-Herbert und Robbi#off("b")# instal­ +lieren. + Sollten Sie statt der Übersicht eine Fehlermeldung +erhalten, überprüfen Sie bitte, ob die Diskette das rich­ +tige Format besitzt oder ob Ihr Diskettenlaufwerk Pro­ +bleme macht. Sollten dagegen Programme fehlen, so rekla­ +mieren Sie die Diskette. + + +3.3 Installation + + #on("b")#gs-Herbert und Robbi#off("b")# muß in einer Task installiert +werden, in der bereits das Programm #on("b")#gs-DIALOG#off("b")# zur Ver­ +fügung steht. Alle Söhne und Enkel der neuen Task kön­ +nen anschließend das Hamster-/ Roboter-Modell aufrufen. +Richten Sie also eine Task als Sohn der Task ein, in der +auf Ihrem Computer bereits #on("b")#gs-DIALOG#off("b")# installiert ist. Wir +nehmen hier an, daß #on("b")#gs-DIALOG#off("b")# in der Task 'MENU' instal­ +liert ist und die neue Task den Namen 'HAMSTER' erhalten +soll. (Sie können für die Task auch einen beliebigen an­ +deren Namen wählen): + +#on("b")# + (Supervisor - Taste) + +#off("b")# + --> gib supervisor kommando: +#on("b")# + begin ("HAMSTER","MENU") +#off("b")# + + --> gib kommando: + + (Arbeiten mehrere Personen mit dem Computer, dann ist +es sinnvoll, diese Task vor unbefugtem Zugriff durch ein +Passwort zu schützen. Wie das gemacht wird, können Sie in +Ihrem EUMEL-Benutzerhandbuch erfahren.) + + Legen Sie dann die Archivdiskette ein, auf der sich +#on("b")#gs-Herbert und Robbi#off("b")# befindet, und geben Sie das folgen­ +de Kommando: + +#on("b")# + archive("gs-Herbert und Robbi") + + fetch("gs-Herbert und Robbi/gen",archive) + + run +#off("b")# + + Sie haben damit das Generatorprogramm gestartet. +Zunächst werden Sie gefragt, ob Sie den erweiterten Be­ +fehlssatz (mit Zusatztests) für den Hamster und Roboter +zur Verfügung gestellt haben möchten. Beantworten Sie +diese Frage je nach Wunsch mit 'ja' oder 'nein' durch Tip­ +pen der Taste bzw. . + Daraufhin wird die Installation automatisch durchge­ +führt. Lassen Sie während des gesamten Vorgangs die Ar­ +chivdiskette eingelegt. Die Generierung ist beendet, wenn +der EUMEL-Eingangsbildschirm erscheint. Die Task, in der +die Generierung stattfindet, wird automatisch zur Mana­ +gertask, das heißt, daß Söhne von ihr eingerichtet werden +können. + Richten Sie sich gleich eine Sohntask (z.B mit dem Na­ +men 'hamster1') ein, dann können Sie das System sofort +ausprobieren. Gehen Sie dazu folgendermaßen vor: + +#on("b")# + (Supervisor - Taste) + +#off("b")# + --> gib supervisor kommando: +#on("b")# + begin ("hamster1","HAMSTER") +#off("b")# + + --> gib kommando: + + +Mit dem Kommando + +#center##on("b")#hamster bzw. roboter #off("b")# + +rufen Sie nun das + +#center#Hamster-Modell bzw. Roboter-Modell + +auf. + + +3.4 Direktstart des Modells + (Steht erst ab gs-DIALOG Version 1.1 zur Verfügung) + + In Kapitel 3.3 haben wir Ihnen gezeigt, wie sie eine +Sohntask einrichten und hier durch das Kommando 'ham­ +ster' bzw. 'roboter' das System aufrufen können. Wenn Sie +immer nur mit einer Modellvariante arbeiten oder vor dem +Benutzer die 'gib kommando:'-Ebene verbergen wollen, +können Sie das System auch so einrichten, daß sich sofort +nach Einrichten des Arbeitsbereichs das Menusystem mel­ +det. Für den Anfänger kann das die Arbeit durchaus er­ +leichtern. + Gehen Sie dazu in die Task, unterhalb der die Sohntasks +eingerichtet werden sollen: + +#on("b")# + (Supervisor - Taste) + +#off("b")# + --> gib supervisor kommando: +#on("b")# + continue ("HAMSTER") +#off("b")# + + --> gib kommando: +#on("b")# + direktstart ("hamster", TRUE) +#off("b")# + + Durch das Kommando haben Sie festgelegt, daß sich +alle Sohntasks direkt mit dem Hamstermenu melden. Möch­ +ten Sie lieber mit dem Roboter-Modell arbeiten, ist nur +'hamster' durch 'roboter' zu ersetzen. + Durch den zweiten Parameter 'TRUE' legen Sie fest, daß +in den Sohntasks nach Verlassen des Menus die jeweilige +Task automatisch gelöscht wird. Statt 'TRUE' können Sie +hier auch den Wert 'FALSE' eintragen. Dann wird nach Ver­ +lassen des Menus angefragt, ob die Task gelöscht werden +soll. Wird die Frage bejaht, wird gelöscht - sonst wird die +Task abgekoppelt (break) und kann durch 'continue' wieder +angekoppelt werden. + Anmerkung: In der Task, in der Sie das Kommando +'direktbefehl' gegeben haben, sollte nicht das Kommando +'monitor' gegeben werden, da Sie durch dieses Kommando +auch diese Task zu einer Task machen, die sich direkt mit +dem Menu meldet und ggf. bei Verlassen des Menus automa­ +tisch gelöscht wird! + diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 4 b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 4 new file mode 100644 index 0000000..4f2d79a --- /dev/null +++ b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 4 @@ -0,0 +1,1312 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (22)# +#headodd# +#center#gs-Herbert und Robbi#right#% + +#end# +#headeven# +%#center#gs-Herbert und Robbi + +#end# +#center#4 + +#center#Beschreibung +#center#der +#center#Menufunktionen + + + Nach Aufruf meldet sich #on("b")#gs-Herbert und Robbi mit +#on("u")#einem#off("u")# der folgenden Menus: + + +#on("b")# +HAMSTER: Info Landschaft Programm Lauf Archiv ++---------------------------+-------------------------------------------- +| l Landschaftsgestaltung | +| b Befehlsvorrat | +| s Steuerung des Laufs | ++---------------------------+ + + + + + + + + + + + + +------------------------------------------------------------------------- +Info:/ Wahl: Ausführen: Verlassen: +#off("b")# + +#on("u")#oder#off("u")# + +#on("b")# +ROBOTER: Info Arbeitsfeld Programm Lauf Archiv ++----------------------------+-------------------------------------------- +| a Arbeitsfeldgestaltung | +| b Befehlsvorrat | +| s Steuerung des Laufs | ++----------------------------+ + + + + + + + + + + + + +-------------------------------------------------------------------------- +Info:/ Wahl: Ausführen: Verlassen: +#off("b")# + + Beide Varianten sind, wie schon gesagt, analog auf­ +gebaut. Aus diesem Grunde werden wir uns in den folgen­ +den Ausführungen auf die Beschreibung der Hamster - +Variante beschränken. + + +4.1 Kurzhinweise zur Bedienung des Menus + + Die Bedienung des Menus ist sehr einfach. Eine aus­ +führliche Beschreibung dazu finden Sie in den Unterla­ +gen zum Programmsystem #on("b")#gs-DIALOG#off("b")#. An dieser Stelle sol­ +len nur die wesentlichen Bedienungsvorgänge beschrieben +werden. + +- Mit der Tastenfolge können Sie sich Informa­ + tionen zur Bedienung des Menusystems in das Menu + einblenden lassen + +- Mit den Pfeiltasten und können Sie + zwischen den "Oberbegriffen" in der Kopfzeile wählen. + Der aktuelle Oberbegriff ist jeweils invers darge­ + stellt. Das ausgeklappte 'Pull-Down-Menu' bezieht sich + auf diesen invers dargestellten Oberbegriff. + +- Mit den Pfeiltasten und können Sie + zwischen den Menufunktionen wählen, die Ihnen im + aktuellen Pull-Down-Menu zur Auswahl angeboten + werden. Die aktuell angewählte Menufunktion wird + jeweils invers dargestellt. Die Trennlinien, die in + einigen Pull-Down-Menus sichtbar sind, dienen nur + der optischen Untergliederung; sie können nicht an­ + gewählt werden und werden deshalb automatisch über­ + sprungen. Die einzelnen Menupunkte sind "zyklisch + miteinander verknüpft", das heißt, man gelangt vom + untersten Menupunkt wieder zum obersten und umge­ + kehrt. Menupunkte, vor denen ein Minuszeichen steht + ('-'), sind (zur Zeit) nicht aktivierbar; auch sie können + nicht angewählt werden und werden einfach über­ + sprungen. + +- Durch Tippen der Fragezeichentaste () können Sie + sich jeweils zur aktuellen Menufunktion (invers im + Pull-Down-Menu) Informationen in das Menu einblen­ + den lassen. + +- Um eine Menufunktion ausführen zu lassen, bewegen + Sie sich mit den Pfeiltasten auf die gewünschte Menu­ + funktion im aktuellen Pull-Down-Menu und tippen + dann die -Taste. Steht vor dem gewünschten + Menupunkt ein einzelner Buchstabe oder eine Ziffer, + so kann durch Tippen der entsprechenden Taste diese + Menufunktion dadurch direkt aufgerufen werden. So­ + bald eine Menufunktion aufgerufen worden ist, er­ + scheint davor ein Stern ('*'). Daraus können Sie ent­ + nehmen, daß das System bereits den Auftrag ausführt. + +- An verschiedenen Stellen werden Fragen an Sie ge­ + richtet, die Sie mit 'ja' oder 'nein' beantworten müssen. + Tippen Sie dazu entsprechend der Entscheidung die + Taste (für 'ja') bzw. (für 'nein'). + +- Werden Ihnen vom Menu aus Dateinamen zur Auswahl + angeboten, so können Sie den auf dem Bildschirm + sichtbaren Pfeil vor den gewünschten Namen positio­ + nieren. Mit den Tasten oder können Sie + den Namen ankreuzen. Ist die Auswahl mehrerer Datein­ + amen möglich, so können Sie den Vorgang wiederholen. + Mit den Tasten oder können Sie auch ein + Kreuz vor einem Namen wieder löschen. Daneben gibt es + noch einige Tastenfunktionen, die für die Bedienung + recht hilfreich sein können. Tippen Sie während der + Auswahl die Fragezeichentaste (), so werden Ihnen + alle Bedienungsmöglichkeiten auf dem Bildschirm an­ + gezeigt. Eine Auswahl, in der mehrere Dateien ange­ + kreuzt werden dürfen, wird durch die Tastenfolge + verlassen. Anschließend wird die eingestellte + Operation mit den angekreuzten Dateien ausgeführt. + Sind Sie versehentlich in eine solche Auswahl ge­ + langt, so können Sie den Vorgang durch die Tasten­ + kombination abbrechen. + +- An einigen Stellen werden Sie aufgefordert, eine Ein­ + gabe zu machen (z.B. einen Dateinamen einzugeben). Wird + Ihnen hier ein Vorschlag gemacht, den Sie akzeptieren, + so brauchen Sie zur Bestätigung nur die - + Taste zu tippen. Gefällt Ihnen der Vorschlag nicht + oder wird Ihnen kein Vorschlag gemacht, so machen Sie + bitte die gewünschte Eingabe. Zum Schreiben stehen + Ihnen alle aus dem Editor bekannten Funktionen zur + Verfügung. Mit der Taste können Sie Buch­ + staben löschen, mit einfügen. Die Eingabe wird + durch Tippen der -Taste abgeschlossen. Ist + der von Ihnen gewünschte Name schon in Ihrer Task + vorhanden und steht in der Fußzeile der Hinweis 'Zei­ + gen: ', dann können Sie sich auch alle vorhan­ + denen Namen zur Auswahl anbieten lassen und durch + Ankreuzen den beabsichtigten Namen auswählen. + +- Ihnen können auch mehrere Alternativen angeboten + werden, zwischen denen Sie wählen müssen. In der un­ + tersten Zeile eines solchen Kastens, in denen Ihnen die + Alternativen auf dem Bildschirm eingeblendet werden, + sind die Möglichkeiten aufgeführt, die darüber be­ + schrieben sind. Mit den Pfeiltasten können sie die + Markierung auf die gewünschte Alternative positio­ + nieren und dann durch die -Taste zur Aus­ + führung bringen. (Manchmal ist das auch durch Tippen + der den Alternativen vorangestellten Buchstaben oder + Ziffern möglich). + +- Durch die Tastenfolge kann das Menu insge­ + samt verlassen werden. Damit das nicht versehentlich + geschieht, wird jeweils die Frage gestellt, ob Sie das + Menu tatsächlich verlassen wollen. Diese Frage beant­ + worten Sie bitte je nach Wunsch mit 'ja' oder 'nein' + durch Tippen der Tasten bzw. . + +#page# +4.2 Menufunktionen zum Oberbegriff 'Info' + + Das auf dem Bildschirm sichtbare Pull-Down-Menu ist +oben abgebildet. + +#on("u")##on("b")#l Landschaftsgestaltung (a Arbeitsfeldgestaltung)#off("b")##off("u")# + Mit dieser Funktion können Sie sich alle Tasten, + die bei der Landschafts-/Arbeitsfeldgestaltung + wirksam sind, anzeigen lassen. + In der Anzeige wird die jeweilige Tastenfunktion + erläutert. Während der Landschafts-/Arbeitsfeld­ + gestaltung können Sie sich diese Informationen + durch Tippen der Fragezeichentaste () ebenfalls + einblenden lassen. + +#on("u")##on("b")#b Befehlsvorrat#off("b")##off("u")# + Mit dieser Funktion können Sie sich die Befehle, + die Ihnen vom jeweiligen Modell zur Verfügung ge­ + stellt werden, auf dem Bildschirm anzeigen lassen. + Anhand dieser Informationen können Sie auch + feststellen, ob in dem System, das Ihnen zur Verfü­ + gung steht, der "eingeschränkte" oder "erweiterte" + Befehlssatz hinsichtlich der Tests realisiert ist. + +#on("u")##on("b")#s Steuerung des Laufs#off("b")##off("u")# + Mit dieser Funktion können Sie sich die Möglich­ + keiten anzeigen lassen, wie Sie auf einen Hamster- + /Roboterlauf durch Tastendruck Einfluß nehmen + können: + + : beende den Lauf (Programmabbruch + durch Tastendruck) + : zeige diese Information (während des + Programmablaufs!) + + 0 : Einzelschritt (dazu beliebige Taste + drücken) + 1 : geringste Geschwindigkeit + 9 : höchste Geschwindigkeit + 2 ... 8 : dazwischenliegende Geschwindigkeiten + + <+> : laufe schneller + <-> : laufe langsamer + + Zu Beginn eines Laufes ist die Geschwindigkeit '5' + eingestellt. +#page# +4.3 Menufunktionen zum Oberbegriff 'Landschaft'(Ar­ + beitsfeld) + +#on("b")# +HAMSTER: Info Landschaft Programm Lauf Archiv +----------+--------------------+------------------------------------------ + | n Neu erstellen | + | a Ansehen/Ändern | + | ---------------- | + | v Verzeichnis | + | ---------------- | + | l Löschen | + | d Drucken | + | ---------------- | + | k Kopieren | + | u Umbenennen | + +--------------------+ + + + + + +-------------------------------------------------------------------------- +Info:/ Wahl: Ausführen: Verlassen: +#off("b")# + +#on("u")##on("b")#n Neu erstellen#off("b")##off("u")# + Mit dieser Funktion können Sie eine neue Land­ + schaft/ein neues Arbeitsfeld unter einem neuen + Namen anlegen und gestalten. + Sie werden zunächst nach einem Namen für die + #on("u")#neue#off("u")# Landschaft/das #on("u")#neue#off("u")# Arbeitsfeld gefragt. Ge­ + ben Sie einen beliebigen Namen (#on("u")#ohne Anführungs­ + zeichen (!)#off("u")# und #on("u")#ohne das Präfix 'Flaeche:' (!)#off("u")#) ein und + schließen Sie die Eingabe durch ab. Dar­ + aufhin wird Ihnen auf dem Bildschirm eine leere + Landschaft/ein leeres Arbeitsfeld angeboten. + Sollte schon eine Landschaft/ein Arbeitsfeld + mit diesem Namen in der Task vorhanden sein, so + werden Sie darauf aufmerksam gemacht. Sie können + sich während der Landschaftsgestaltung auch je­ + derzeit eine Aufstellung der wirksamen Tasten mit + Beschreibung der Funktionen auf den Bildschirm + ausgeben lassen. Drücken Sie dazu die Fragezeichen­ + taste (). + + Fehlerfälle: + - Eine Landschaft/ein Arbeitsfeld mit dem vorge­ + schlagenen Namen existiert schon. + +#on("u")##on("b")#a Ansehen/Ändern#off("b")##off("u")# + Mit dieser Funktion können Sie schon in Ihrer + Task existierende Landschaften/Arbeitsfelder zur + Ansicht oder zur Überarbeitung anfordern. + Sie werden zunächst gefragt, ob Sie #on("u")#die zuletzt + bearbeitete Landschaft#off("u")#/#on("u")#das zuletzt bearbeitete Ar­ + beitsfeld#off("u")# ansehen bzw. verändern möchten (sofern + Sie schon vorher mit dem Modell in der Task gear­ + beitet haben). + Bejahen Sie diese Frage, dann wird Ihnen diese + Landschaft/dieses Arbeitsfeld zur Bearbeitung + angeboten. Verneinen Sie die Frage dagegen, so ge­ + langen Sie in die 'Auswahl' (d.h es werden Ihnen alle + Landschaften/Arbeitsfelder in der Task zur Auswahl + angeboten). Nachdem Sie einen der Namen angekreuzt + haben, wird Ihnen die ausgewählte Landschaft/das + ausgewählte Arbeitsfeld zur Bearbeitung auf dem + Bildschirm angeboten. Ihnen stehen die Tastenfunk­ + tionen wie bei der Neuerstellung zur Verfügung. + + Fehlerfälle: + - In der Task existiert noch keine Landschaft/kein + Arbeitsfeld. + +#on("u")##on("b")#v Verzeichnis#off("b")##off("u")# + Mit dieser Funktion können Sie sich einen Über­ + blick über die in Ihrer Task vorhandenen Land­ + schaften/Arbeitsfelder verschaffen. + Nach Aufruf dieser Funktion wird eine Liste der + Landschaften/Arbeitsfelder auf dem Bildschirm + ausgegeben, die sich in Ihrer Task befinden. Da die + Liste selbst eine Datei ist, kann Sie mit der Tasten­ + kombination verlassen werden - hierauf + wird auch in der Kopfzeile der Datei hingewiesen. + Falls nicht alle Namen auf den Bildschirm passen, + können Sie das Fenster mit und + verschieben. + +#on("u")##on("b")#l Löschen#off("b")##off("u")# + Mit dieser Funktion können Sie Landschaften/ + Arbeitsfelder, die Sie nicht mehr benötigen, die + unnötig Platz belegen, löschen. Aber Vorsicht! Die + Landschaften/Arbeitsfelder verschwinden durch + diese Funktion unwiederbringlich! + Nach Aufruf dieser Funktion werden Ihnen alle + Landschaften/Arbeitsfelder, die sich in Ihrer Task + befinden, zur Auswahl angeboten. Hier können Sie + die gewünschten Namen ankreuzen. Die Auswahl wird + dann durch die Tastenfolge verlassen. + Für jede einzelne Landschaft/jedes einzelne Ar­ + beitsfeld wird noch einmal zur Sicherheit gefragt, + ob sie/es auch tatsächlich gelöscht werden soll. Zur + Bestätigung tippen Sie bitte die Taste ('ja') - zur + Verhinderung ('nein'). + + Fehlerfälle: + - In der Task exsitiert noch keine Landschaft/ + kein Arbeitsfeld. + +#on("u")##on("b")#d Drucken#off("b")##off("u")# + Mit dieser Funktion können Sie Landschaften/ + Arbeitsfelder über einen angeschlossenen Drucker + ausgeben lassen. + Nach Aufruf dieser Funktion werden Ihnen alle + Landschaften/Arbeitsfelder, die sich in Ihrer Task + befinden, zur Auswahl angeboten. Hier können Sie + die gewünschten Namen ankreuzen. Die Auswahl wird + dann durch die Tastenfolge verlassen. + Die angekreuzten Landschaften/Arbeitsfelder + werden anschließend zum Drucker geschickt. Der + Vorgang wird auf dem Bildschirm protokolliert. + + Fehlerfälle: + - In der Task existiert noch keine Landschaft/ + kein Arbeitsfeld. + - Der Drucker ist nicht funktionsbereit. + - Der Drucker wird nicht über die Task 'PRINTER' + betrieben. + - Auf Ihrem System werden die Druckkosten abge­ + rechnet. Sie müssen sich mit einer Codenummer + identifizieren. + +#on("u")##on("b")#k Kopieren#off("b")##off("u")# + Mit dieser Funktion können Sie sich eine Kopie + einer/eines bereits in der Task vorhandenen Land­ + schaft/Arbeitsfeldes anlegen. Das ist z.B. dann + sinnvoll, wenn Sie sich einen bestimmten 'Stand' + aufbewahren wollen oder wenn Sie eine Land­ + schaft/ein Arbeitsfeld gestalten wollen, das einem + bereits vorhandenen ähnelt. + Nach Aufruf dieser Funktion werden Ihnen alle + Landschaften/Arbeitsfelder, die sich in Ihrer Task + befinden, zur Auswahl angeboten. Nach Ankreuzen + eines Namens wird die Auswahl automatisch verlas­ + sen. + Anschließend wird der angekreuzte Name ange­ + zeigt und der Name für die Kopie erfragt. Es muß ein + Name eingetragen werden, der in dieser Task noch + nicht für eine Landschaft/ein Arbeitsfeld verge­ + ben wurde - ansonsten erfolgt ein Hinweis darauf + und es wird nicht kopiert! + Da man aber oft für die Kopie einen ähnlichen + Namen wie für das Original wählt, wird der 'alte' + Name vorgeschlagen. Aus genannten Gründen muß er + aber verändert werden. Sie können diesen Namen mit + den üblichen Editierfunktionen verändern oder mit + löschen und ganz neu eingeben. Sie + sparen aber eine Menge Tipparbeit, wenn Sie einen + langen Namen nur an einer Stelle ändern wollen. + + Fehlerfälle: + - Eine Landschaft/ein Arbeitsfeld mit dem ge­ + wünschten Namen existiert bereits in der Task. + +#on("u")##on("b")#u Umbenennen#off("b")##off("u")# + Mit dieser Funktion können Sie einer bereits + vorhandenen Landschaft/einem bereits vorhandenen + Arbeitsfeld einen neuen Namen geben. + Nach Aufruf dieser Funktion werden Ihnen alle + Landschaften/Arbeitsfelder, die sich in Ihrer Task + befinden, zur Auswahl angeboten. Nach Ankreuzen + eines Namens wird die Auswahl automatisch verlas­ + sen. + Anschließend wird dieser Name angezeigt und der + zukünftige Name für die Landschaft/das Arbeitsfeld + erfragt. Es muß ein Name eingetragen werden, der in + dieser Task noch nicht für eine Landschaft/ein Ar­ + beitsfeld vergeben wurde - ansonsten erfolgt ein + Hinweis darauf und die Landschaft/das Arbeitsfeld + wird nicht umbenannt! + Da man aber oft den 'neuen' Namen in Anlehnung + an den 'alten' Namen wählt, wird der 'alte' Name vor­ + geschlagen. Aus genannten Gründen muß er aber + verändert werden. Sie können diesen Namen mit den + üblichen Editierfunktionen verändern oder mit + löschen und ganz neu eingeben. Sie + sparen aber eine Menge Tipparbeit, wenn Sie einen + langen Namen nur an einer Stelle ändern wollen. + + Fehlerfälle: + - Eine Datei mit dem gewünschten Namen existiert + bereits in der Task. +#page# +4.4 Menufunktionen zum Oberbegriff 'Programm' + +#on("b")# +HAMSTER: Info Landschaft Programm Lauf Archiv +---------------------+--------------------+------------------------------- + | n Neu erstellen | + | a Ansehen/Ändern | + | ---------------- | + | v Verzeichnis | + | ---------------- | + | l Löschen | + | d Drucken | + | ---------------- | + | k Kopieren | + | u Umbenennen | + +--------------------+ + + + + + +-------------------------------------------------------------------------- +Info:/ Wahl: Ausführen: Verlassen: +#off("b")# + +#on("u")##on("b")#n Neu erstellen#off("b")##off("u")# + Mit dieser Funktion können Sie eine neue Pro­ + grammdatei anlegen und beschreiben. + Sie werden zunächst nach einem Namen für die + #on("u")#neue#off("u")# Programmdatei gefragt. Geben Sie einen belie­ + bigen Namen (#on("u")#ohne Anführungszeichen (!)#off("u")#) ein und + schließen Sie die Eingabe durch ab. Dar­ + aufhin wird Ihnen auf dem Bildschirm eine neue Da­ + tei zum Beschreiben angeboten. + Sollte schon eine Programmdatei mit diesem Na­ + men in der Task vorhanden sein, so werden Sie dar­ + auf aufmerksam gemacht. + Sie können sich während des Schreibens die + wichtigsten Tastenfunktionen des Editers einblen­ + den lassen. Tippen Sie dazu die Tastenfolge . + Es erscheint dann das folgende Angebot aus dem Sie + auswählen können: + + #on("b")# + +--------------------------------------------------+ + | Der EUMEL - Editor | + | | + | b ... Beschreibung des Editors | + | w ... Wichtige Tasten | + | p ... Positionieren der Schreibmarke | + | k ... Korrigieren im Text (Einfügen/Löschen) | + | m ... Markierte Textpassagen bearbeiten | + | l ... Lernen im Editor | + | a ... Anweisungen im Editor (Kommandodialog) | + | | + | z ... Zurück in den Schreibmodus | + | | + | b w p k m l a z | + +--------------------------------------------------+ +#off("b")# + + Fehlerfälle: + - Eine Datei mit dem vorgeschlagenen Namen exi­ + stiert schon. + +#on("u")##on("b")#a Ansehen/Ändern#off("b")##off("u")# + Mit dieser Funktion können Sie sich Dateien, die + schon in Ihrer Task existieren, ansehen oder auch + verändern. + Sie werden zunächst gefragt, ob Sie #on("u")#die zuletzt + bearbeitete Programmdatei#off("u")# ansehen bzw. verändern + möchten (sofern Sie schon vorher mit dem Modell in + der Task gearbeitet haben). + Bejahen Sie diese Frage, dann wird Ihnen diese + Programmdatei zur Bearbeitung angeboten. Vernei­ + nen Sie die Frage dagegen, so gelangen Sie in die + 'Auswahl' (d.h es werden Ihnen alle Programmdateien + in der Task zur Auswahl angeboten). Nachdem Sie + einen der Namen angekreuzt haben, wird Ihnen die + ausgewählte Programmdatei zur Bearbeitung auf dem + Bildschirm angeboten. + + Fehlerfälle: + - In der Task existiert noch keine Programmdatei. + +#on("u")##on("b")#v Verzeichnis#off("b")##off("u")# + Mit dieser Funktion können Sie sich einen Über­ + blick über die in Ihrer Task vorhandenen Programm­ + dateien verschaffen. + Nach Aufruf dieser Funktion wird eine Liste der + Programmdateien auf dem Bildschirm ausgegeben, die + sich in Ihrer Task befinden. Da die Liste selbst eine + Datei ist, kann Sie mit der Tastenkombination + verlassen werden - hierauf wird auch in + der Kopfzeile der Datei hingewiesen. Falls nicht + alle Namen auf den Bildschirm passen, können Sie + das Fenster mit und ver­ + schieben. + +#on("u")##on("b")#l Löschen#off("b")##off("u")# + Mit dieser Funktion können Sie Programmdateien, + die Sie nicht mehr benötigen, die unnötig Platz be­ + legen, löschen. Aber Vorsicht! Die Programmdateien + verschwinden durch diese Funktion unwieder­ + bringlich! + Nach Aufruf dieser Funktion werden Ihnen alle + Programmdateien, die sich in Ihrer Task befinden, + zur Auswahl angeboten. Hier können Sie die ge­ + wünschten Namen ankreuzen. Die Auswahl wird dann + durch die Tastenfolge verlassen. + Für jede einzelne Programmdatei wird noch ein­ + mal zur Sicherheit gefragt, ob sie auch tatsächlich + gelöscht werden soll. Zur Bestätigung tippen Sie + bitte die Taste ('ja') - zur Verhinderung + ('nein'). + + Fehlerfälle: + - In der Task exsitiert noch keine Programmdatei + +#on("u")##on("b")#d Drucken#off("b")##off("u")# + Mit dieser Funktion können Sie Programmdateien + über einen angeschlossenen Drucker ausgeben las­ + sen. + Nach Aufruf dieser Funktion werden Ihnen alle + Programmdateien, die sich in Ihrer Task befinden, + zur Auswahl angeboten. Hier können Sie die ge­ + wünschten Namen ankreuzen. Die Auswahl wird dann + durch die Tastenfolge verlassen. + Die angekreuzten Programmdateien werden an­ + schließend zum Drucker geschickt. Der Vorgang wird + auf dem Bildschirm protokolliert. + + Fehlerfälle: + - In der Task existiert noch keine Programmdatei. + - Der Drucker ist nicht funktionsbereit. + - Der Drucker wird nicht über die Task 'PRINTER' + betrieben. + - Auf Ihrem System werden die Druckkosten abge­ + rechnet. Sie müssen sich mit einer Codenummer + identifizieren. + +#on("u")##on("b")#k Kopieren#off("b")##off("u")# + Mit dieser Funktion können Sie sich eine Kopie + einer bereits in der Task vorhandenen Programmda­ + tei anlegen. Das ist z.B. dann sinnvoll, wenn Sie sich + einen bestimmten 'Stand' aufbewahren wollen oder + wenn Sie ein Programm schreiben wollen, das einem + bereits vorhandenen ähnelt. + Nach Aufruf dieser Funktion werden Ihnen alle + Programmdateien, die sich in Ihrer Task befinden, + zur Auswahl angeboten. Nach Ankreuzen eines Na­ + mens wird die Auswahl automatisch verlassen. + Anschließend wird der angekreuzte Name ange­ + zeigt und der Name für die Kopie erfragt. Es muß ein + Name eingetragen werden, der in dieser Task noch + nicht für eine Programmdatei vergeben wurde; an­ + sonsten erfolgt ein Hinweis darauf und es wird + nicht kopiert! + Da man aber oft für die Kopie einen ähnlichen + Namen wie für das Original wählt, wird der 'alte' + Name vorgeschlagen. Aus genannten Gründen muß er + aber verändert werden. Sie können diesen Namen mit + den üblichen Editierfunktionen verändern oder mit + löschen und ganz neu eingeben. Sie + sparen aber eine Menge Tipparbeit, wenn Sie einen + langen Namen nur an einer Stelle ändern wollen. + + Fehlerfälle: + - Eine Programmdatei mit dem gewünschten Namen + existiert bereits in der Task. + +#on("u")##on("b")#u Umbenennen#off("b")##off("u")# + Mit dieser Funktion können Sie einer bereits + vorhandenen Programmdatei einen neuen Namen ge­ + ben. + Nach Aufruf dieser Funktion werden Ihnen alle + Programmdateien, die sich in Ihrer Task befinden, + zur Auswahl angeboten. Nach Ankreuzen eines Na­ + mens wird die Auswahl automatisch verlassen. + Anschließend wird dieser Name angezeigt und der + zukünftige Name für die Programmdatei erfragt. Es + muß ein Name eingetragen werden, der in dieser Task + noch nicht für eine Programmdatei vergeben wurde - + ansonsten erfolgt ein Hinweis darauf und die Pro­ + grammdatei wird nicht umbenannt! + Da man aber oft den 'neuen' Namen in Anlehnung + an den 'alten' Namen wählt, wird der 'alte' Name vor­ + geschlagen. Aus genannten Gründen muß er aber + verändert werden. Sie können diesen Namen mit den + üblichen Editierfunktionen verändern oder mit + löschen und ganz neu eingeben. Sie + sparen aber eine Menge Tipparbeit, wenn Sie einen + langen Namen nur an einer Stelle ändern wollen. + + Fehlerfälle: + - Eine Programmdatei mit dem gewünschten Namen + existiert bereits in der Task. +#page# +4.5 Menufunktionen zum Oberbegriff 'Lauf' + +#on("b")# +HAMSTER: Info Landschaft Programm Lauf Archiv +---------------------------+------------------------+--------------------- + | l Lauf nach Programm | + | h Handsteuerung | + +------------------------+ + + + + + + + + + + +-------------------------------------------------------------------------- +Info:/ Wahl: Ausführen: Verlassen: +#off("b")# + +#on("u")##on("b")#l Lauf nach Programm#off("b")##off("u")# + Mit dieser Menufunktion können Sie den Ham­ + ster/Roboter nach einem Programm in einer Land­ + schaft/einem Arbeitsfeld laufen lassen. Sowohl das + Programm als auch die Landschaft/das Arbeitsfeld + müssen bereits existieren. + Sie werden zunächst gefragt, ob der Hamster/ + Roboter #on("u")#das zuletzt bearbeitete Programm#off("u")# ausführen + soll. Bejahen Sie die Frage, so wird dieses Programm + ausgeführt; verneinen Sie die Frage dagegen, so + gelangen Sie in die 'Auswahl'. Nach Ankreuzen des + gewünschten Programmnamens wird das ausgewählte + Programm ausgeführt. + Nach der Abfrage bezüglich des Programmnamens + erfolgt dann eine weitere Abfrage nach dem Namen + der Landschaft/ des Arbeitsfeldes, in der/dem der + Hamster/Roboter nach dem zuvor ausgewählten Pro­ + gramm laufen soll. Auch hier werden Sie zunächst + gefragt, ob Sie #on("u")#die zuletzt benutzte Landschaft/das + zuletzt benutzte Arbeitsfeld#off("u")# verwenden möchten. + Bejahen Sie die Frage, so wird das Programm in + dieser Landschaft/in diesem Arbeitsfeld ausge­ + führt; verneinen Sie dagegen die Frage, so werden + Ihnen alle in der Task vorhandenen Landschaften/ + Arbeitsfelder zur Auswahl angeboten. Durch An­ + kreuzen eines Landschafts-/Arbeitsfeldnamens wird + die betreffende Landschaft/das betreffende Ar­ + beitsfeld ausgewählt und das Programm in dieser + Landschaft/in diesem Arbeitsfeld ausgeführt. + Daneben haben Sie auch die Möglichkeit, im Pro­ + gramm selbst als erste Anweisung den Befehl 'lands­ + chaft ("Name");' oder 'arbeitsfeld ("Name");' anzuge­ + ben. Für 'Name' muß dann natürlich der gewünschte + Landschafts-/Arbeitsfeldname eingetragen sein. Ist + eine solche Anweisung #on("u")#am Programmanfang#off("u")# vorhan­ + den, so wird an Sie #on("u")#keine#off("u")# Abfrage bezüglich des + Landschafts-/Arbeitsfeldnamens gestellt; das Pro­ + gramm wird in der #on("u")#angegebenen#off("u")# Landschaft/im #on("u")#ange­ + gebenen#off("u")# Arbeitsfeld ausgeführt. + Sind im Programm noch Fehler enthalten, so wer­ + den das Programm und die Fehlermeldungen gleich­ + zeitig auf dem Bildschirm dargestellt (Paralleledi­ + tor) und zur Korrektur angeboten. Für die Pro­ + grammkorrektur stehen ebenfalls alle Editorfunk­ + tionen zur Verfügung. + Während des Hamster-/Roboterlaufs können Sie + durch Tastendruck Einfluß nehmen (Geschwindigkeit + verändern, Programm abbrechen etc). Sehen Sie dazu + auch die Menufunktion 's Steuerung des Laufs' unter + dem Oberbegriff 'Info'. Standardmäßig beginnt ein + solcher Lauf immer mit einer mittleren Geschwin­ + digkeit. + Ist der Hamster-/Roboterlauf ohne Fehler been­ + det worden, werden Sie gefragt, ob Sie die Land­ + schaft/das Arbeitsfeld in dem zuletzt angezeigten + Zustand aufbewahren wollen. Bejahen Sie diese Fra­ + ge, so wird die Landschaft/das Arbeitsfeld in eine + Datei geschrieben. Die neue Landschaft/das neue + Arbeitsfeld erhält den Namen der alten Land­ + schaft/des alten Arbeitsfeldes und das Zusatzkenn­ + zeichen '.x'. + Sollte Ihnen beim Programmieren ein Fehler un­ + terlaufen sein (z.B. eine Endlosschleife, so kann mit + der Taste der Hamster-/Roboterlauf abgebro­ + chen werden ("Notbremse"). + +#on("u")##on("b")#h Handsteuerung#off("b")##off("u")# + Mit dieser Funktion können Sie den Hamster/ + Roboter in einer/einem vorbereiteten Landschaft/ + Arbeitsfeld durch Tasten steuern. Alle gültigen + Tastenbefehle werden in einem Protokoll festgehal­ + ten. Da das entstehende Protokoll ein ELAN- + Programm ist, kann der Hamster/Roboter anschlie­ + ßend die gleichen Aktionen anhand des Programms + wiederholt ausführen ('Teach In'). + Sie werden zunächst gefragt, ob die Land­ + schaft/das Arbeitsfeld, in dem der Hamster/Roboter + gesteuert werden soll, schon existiert. Beantworten + Sie die Frage mit 'nein', so werden Sie aufgefordert, + zunächst die Landschaft/das Arbeitsfeld zu gestal­ + ten. Bejahen Sie die Frage, werden Ihnen alle in Ih­ + rer Task vorhandenen Landschaften/Arbeitsfelder + zur Auswahl angeboten. Sie brauchen nur die ge­ + wünschte Landschaft/das gewünschte Arbeitsfeld + anzukreuzen. Die/das angekreuzte Landschaft/Ar­ + beitsfeld erscheint dann in folgender Darstellung + auf dem Bildschirm: + +#on("b")# +#on("u")#Beispiel#off("u")#: + + or inks um imm ib

rotokoll nde +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . V . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . o\#\# o . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . .\#\# . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . o\#\# . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . .\#\# o . . . o . . . . . . . . . . . . . . . +. . . . . . . . . . . . o\#\#\#\#\#\#\#\#\#\#\#\# o . . . . . . . . . . . . . . +. . . . . . . . . . . . . . o . o .\#\# . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . o\#\# . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . .\#\# . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . o\#\#o. . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +Gib Hamster-Befehl: letzter Befehl: + +#off("b")# + Durch Tastendruck können Sie nun den Hamster/ + Roboter steuern ( - vor, - links um, - + nimm, - gib). Sofern die Aktion ausführbar ist, + wird sie auf dem Bildschirm auch ausgeführt. Wird + dagegen eine Aktion verlangt, die nicht ausgeführt + werden kann (z.B. , wenn der Hamster/Roboter + direkt vor einem Hindernis steht), so erscheint eine + entsprechende Fehlermeldung in der untersten Zeile + des Bildschirms. Nach einer kurzen Pause können + dann weitere Eingaben gemacht werden. Eine Fehlbe­ + dienung führt also #on("u")#nicht#off("u")# zu einem Programmabbruch! + In der untersten Bildschirmzeile wird auch jeweils + der letzte Befehl zur Kontrolle angezeigt. + Alle korrekten Eingaben werden protokolliert. + Durch Drücken der Taste

(- protokoll) können Sie + sich jederzeit das während der Ausführung angeleg­ + te Protokoll zeigen lassen. Es entsteht nämlich + automatisch im Hintergrund ein ablauffähiges + ELAN-Programm. Im Anschluß an eine solche Hand­ + steuerung können Sie den Hamster/Roboter dann in + der gleichen Landschaft/im gleichen Arbeitsfeld + nach diesem Protokoll (Dateiname: PROTOKOLL) vom + Programm aus gesteuert laufen lassen. +#page# +4.6 Menufunktionen zum Oberbegriff 'Archiv' + +#on("b")# +HAMSTER: Info Landschaft Programm Lauf Archiv +---------------------------------+-------------------------+-------------- + | r Reservieren | + | - Neue Diskette | + | --------------------- | + | - Schreiben | + | - Checken | + | - Kombination | + | - Holen/Lesen | + | - Löschen | + | --------------------- | + | - Verzeichnis | + | - Drucken | + | --------------------- | + | i Initialisieren | + | z Zieltask einstellen | + +---------------------+ +-------------------------+ + | Dateiaustausch mit: | + | Archiv | + | Archivname: | + | --- | + +---------------------+ +-------------------------------------------------------------------------- +Info:/ Wahl: Ausführen: Verlassen: +#off("b")# + + In diesem Kapitel werden alle die Menufunktionen be­ +schrieben, die Ihnen unter dem Oberbegriff 'Archiv' im +Menu angeboten werden. Mit den Funktionen in diesem +Menu können Sie aber nicht nur Dateien auf dem Archiv +behandeln, sondern auch in anderen Tasks im Multi- +User-System oder über das EUMEL-Netz sogar auf anderen +Rechnern! + Wenn Sie dieses Pull-Down-Menu gerade aufgeschlagen +haben, sind nicht alle Funktionen aktivierbar! Um weitere +Funktionen zu aktivieren, muß erst einer der aktivierba­ +ren Menupunkte gewählt werden. + Bei der Archivbehandlung werden Ihnen jeweils alle in +der Task vorhandenen Dateien zur Auswahl angeboten. Das +System unterscheidet nicht von sich aus - wie unter den +Oberbegriffen 'Landschaft'/'Arbeitsfeld' und 'Programm' - +zwischen Landschaften/Arbeitsfeldern und Programmda­ +teien. In den hier gezeigten Listen können Sie aber Land­ +schaften/Arbeitsfelder daran erkennen, daß ihnen das +Präfix 'Flaeche:' vorangestellt ist. + +#on("u")##on("b")#r Reservieren#off("b")##off("u")# (des Archivlaufwerks) + Im EUMEL-Multi-User-System haben normalerwei­ + se mehrere Personen das Zugriffsrecht auf das Ar­ + chivlaufwerk. Allerdings muß der Zugriff so gere­ + gelt werden, daß sich die Beteiligten dabei nicht + gegenseitig "in die Quere kommen". Ein Zugriff auf + das Archivlaufwerk erfordert zunächst eine Anmel­ + dung. Ist diese Anmeldung erfolgt, kann von den an­ + deren Beteiligten so lange nicht mehr auf das Lauf­ + werk zugegriffen werden - bis es wieder freigege­ + ben worden ist. + Diese Anmeldung des Archivlaufwerkes erfolgt + über die Menufunktion 'r Reservieren'. Greift be­ + reits eine andere Task auf das Laufwerk zu, so er­ + halten Sie darüber einen Hinweis auf dem Bild­ + schirm. Ansonsten wird an Sie die Frage gestellt, ob + die Diskette eingelegt und das Laufwerk geschlos­ + sen ist. + Erst zu diesem Zeitpunkt ist sichergestellt, daß + Sie den alleinigen Zugriff auf das Laufwerk haben. + Deshalb sollten Sie, wenn Sie mit mehreren Personen + am Computer arbeiten, erst zum Zeitpunkt der Frage­ + stellung die Diskette ins Laufwerk einlegen. + Nachdem Sie die Diskette eingelegt und die Frage + bejaht haben, ermittelt das System selbständig den + Namen der eingelegten Diskette, zeigt den Namen auf + dem Bildschirm (im kleinen Kasten links unten) an + und aktiviert die anderen Menupunkte des Pull- + Down-Menus. + Beim Verlassen des Pull-Down-Menus, wenn eine + andere Zieltask eingestellt wird oder wenn das Menu + gänzlich verlassen wird, wird die Reservierung au­ + tomatisch aufgehoben! + + Fehlerfälle: + - Das Laufwerk ist von einer anderen Task belegt. + - Die Diskette ist falsch eingelegt oder das Lauf­ + werk ist nicht richtig geschlossen. + - Die Diskette ist nicht formatiert bzw. initiali­ + siert. + - Die Diskette kann nicht gelesen werden (keine + EUMEL-Diskette, Diskette hat ein falsches For­ + mat, Diskette ist verschmutzt...). + +#on("u")##on("b")#n Neue Diskette#off("b")##off("u")# (anmelden) + Der Dateiaustausch mit einer Diskette ist nur + dann möglich, wenn der im System eingestellte Dis­ + kettenname (auf dem Bildschirm im kleinen Kasten + unten links sichtbar) mit dem tatsächlichen Namen + der Diskette übereinstimmt. Nach einem Disketten­ + wechsel ist das aber in der Regel nicht mehr der + Fall. Greift man dann auf die neu eingelegte Dis­ + kette zu, so erscheint die Fehlermeldung: 'Falscher + Archivname! Bitte neue Diskette anmelden!'. + Das Anmelden einer neuen Diskette - ohne einen + neuen Reserviervorgang - wird durch diese Menu­ + funktion ermöglicht. Nach Aktivieren dieses Menu­ + punktes wird der Name der eingelegten Diskette er­ + mittelt, im System eingestellt und auf dem Bild­ + schirm angezeigt. + Im Gegensatz zur Menufunktion 'r Reservieren' + greift das System ohne Anfrage an den Benutzer auf + das Archivlaufwerk zu (die Reservierung bleibt ja + bestehen). Ist das Archivlaufwerk reserviert, so ist + die Neuanmeldung einer Diskette über diese Menu­ + funktion weniger zeitaufwendig. + + Fehlerfälle: + - wie unter 'r Reservieren'. + +#on("u")##on("b")#s Schreiben#off("b")##off("u")# (Kopieren) + Alle Dateien der eigenen Task werden zur Aus­ + wahl angeboten. Wenn Sie die Auswahl durch die + Tastenfolge verlassen, überprüft das Sy­ + stem zunächst, ob die Dateien in der eingestellten + Zieltask schon vorhanden sind. Ist das der Fall, + wird erfragt, ob die dort vorhandenen Dateien über­ + schrieben, d.h. gelöscht werden dürfen (s.u.). An­ + schließend werden alle angekreuzten Dateien in der + Reihenfolge, in der Sie sie angekreuzt haben, in die + eingestellte Zieltask kopiert. Der Vorgang wird auf + dem Bildschirm protokolliert. Die Originaldateien + in der eigenen Task bleiben dabei erhalten. + Wenn in der Zieltask schon eine Datei existiert, + die den gleichen Namen hat wie eine Datei, die Sie + dorthin kopieren möchten, so wird angefragt, ob die + vorher schon existierende Datei überschrieben (ge­ + löscht!) werden soll. Bejahen Sie diese Frage, so wird + die bereits in der Zieltask existierende Datei (un­ + wiederbringlich) gelöscht und die gewünschte Datei + dorthin transportiert. Ein Überschreiben aus Ver­ + sehen ist nicht möglich, wenn Sie die an Sie gestell­ + te Frage sorgfältig beantworten. + Verneinen Sie die Frage, so wird die Datei auch + nicht hinübertransportiert! Sie können die Datei + aber umbenennen (Menufunktion 'u Umbenennen' un­ + ter den Oberbegriffen 'Landschaft'/Arbeitsfeld' bzw. + 'Programm') und anschließend mit anderem Namen + hinüberschreiben. + Beachten Sie, daß beim Überschreiben einer Datei + auf einer Archivdiskette der Speicherplatz der al­ + ten (überschriebenen) Version im allgemeinen nicht + wiederverwendet werden kann. In einem solchen Fall + könnte die Diskette voll geschrieben werden, obwohl + eigentlich genügend Platz vorhanden wäre. Zur Op­ + timierung wird deshalb zuerst überprüft, ob die + angekreuzten Dateien schon in der Zieltask vorhan­ + den sind und löscht diese, wenn Sie Ihr Einver­ + ständnis geben. Erst anschließend werden die Datei­ + en insgesamt kopiert. + Normalerweise ist als Zieltask das Archivlauf­ + werk der eigenen Station eingestellt. Mit der Menu­ + funktion 'z Zieltask einstellen' kann diese Einstel­ + lung aber verändert werden. + + Fehlerfälle: + - Die Diskette ist falsch eingelegt oder beschä­ + digt. + - Die Diskette kann nicht beschrieben werden + (Schreibfehler). + - Die Diskette ist voll. + - Sehen Sie auch unter 'r Reservieren' + 'z Zieltask einstellen'. + +#on("u")##on("b")#c Checken#off("b")##off("u")# + Diese Menufunktion kann nur ausgeführt werden, + wenn der Dateiaustausch mit einem Archiv(manager) + erfolgt - ansonsten ist diese Menufunktion auch + nicht aktivierbar. Die Menufunktion dient dazu, auf + Diskette geschriebene Dateien auf Lesefehler hin zu + prüfen. Es empfiehlt sich, diese Prüfroutine auf + neu auf die Diskette geschriebene Dateien anzuwen­ + den. Sehen Sie dazu auch 'k Kombination'. + Alle Dateien der eingestellten Zieltask (Archiv) + werden zur Auswahl angeboten. Wenn Sie die Auswahl + durch die Tastenfolge verlassen, werden + alle angekreuzten Dateien in der Reihenfolge, in + der Sie sie angekreuzt haben, "gecheckt", d.h. auf + Lesefehler hin überprüft. Der Vorgang wird auf dem + Bildschirm protokolliert. + + Fehlerfälle: + - Lesefehler auf dem Archiv. + - Sehen Sie auch unter 'r Reservieren'. + +#on("u")##on("b")#k Kombination#off("b")##off("u")# + Diese Menufunktion ist eine Kombination aus den + beiden Menufunktionen 's Schreiben' und 'c Checken' + (Sehen Sie weitere Informationen auch dort!). + Alle Dateien der eigenen Task werden zur Aus­ + wahl angeboten. Wenn Sie die Auswahl durch die Ta­ + stenfolge verlassen, werden alle ange­ + kreuzten Dateien in der Reihenfolge, in der Sie sie + angekreuzt haben, in die eingestellte Zieltask ko­ + piert (gegebenenfalls müssen bereits vorhandene + Dateien gleichen Namens in der Zieltask gelöscht + werden). Anschließend werden alle Dateien, die gera­ + de geschrieben wurden, gecheckt, d.h. auf Lesefehler + hin untersucht. Beide Vorgänge werden auf dem + Bildschirm protokolliert. + Da die 'Check' - Operation nur bei Archivmana­ + gern zulässig ist, ist diese Menufunktionen eben­ + falls nur bei Archivmanagern aktivierbar. Zur Er­ + läuterung sehen Sie bitte auch unter 'z Zieltask + einstellen'. + +#on("u")##on("b")#h Holen/Lesen#off("b")##off("u")# + Die Menufunktion dient dazu, Dateien, die bereits + auf einer Archivdiskette oder in einer anderen Task + existieren, in die eigene Task zu kopieren. + Alle Dateien der eingestellten Zieltask werden + zur Auswahl angeboten. Anschließend werden Kopien + der angekreuzten Dateien in der Reihenfolge des + Ankreuzens in die eigene Task geholt. Das Original + in der Zieltask bleibt dabei unverändert! Der Vor­ + gang wird auf dem Bildschirm protokolliert. + Sind in der eigenen Task schon Dateien mit glei­ + chem Namen vorhanden, so wird gefragt, ob die 'al­ + ten' Dateien überschrieben (gelöscht) werden dürfen. + Nur wenn Sie zustimmen, werden die in Ihrer Task + existierenden Dateien (unwiederbringlich!) gelöscht + und Kopien der gleichnamigen Dateien aus der Ziel­ + task angefertigt. + Stimmen Sie dem Löschvorgang nicht zu, dann + bleiben die bisherigen Dateien in Ihrer Task erhal­ + ten - die Dateien aus der Zieltask werden dann aber + auch nicht in Ihre Task kopiert! Um dennoch die Ko­ + pien zu erhalten, können Sie die namensgleichen + Dateien in Ihrer Task umbenennen und dann erst die + Dateien aus der anderen Task anfordern. + Normalerweise werden die Dateien vom Archiv der + eigenen Station geholt. Mit dem Menupunkt 'z Ziel­ + task einstellen' kann diese Einstellung verändert + werden. + + Fehlerfälle: + - Lesefehler auf dem Archiv. + - Sehen Sie auch unter 'r Reservieren' + 's Schreiben' + 'z Zieltask einstellen'. + +#on("u")##on("b")#l Löschen#off("b")##off("u")# + Die Menufunktion dient dazu, Dateien in der + Zieltask (unwiederbringlich!) zu löschen. Dazu wer­ + den alle Dateien der eingestellten Zieltask zur Aus­ + wahl angeboten. Anschließend werden die angekreuz­ + ten Dateien in der Reihenfolge ihres Ankreuzens + gelöscht. Zur Sicherheit muß noch einmal für jede + einzelne Datei bestätigt werden, daß sie auch tat­ + sächlich gelöscht werden soll. + Beachten Sie, daß beim Löschen einer Datei auf + einer Archivdiskette der Speicherplatz im allgemei­ + nen nicht wieder verwendet werden kann. In einem + solchen Fall könnte die Diskette voll geschrieben + werden, obwohl eigentlich genügend Platz vorhan­ + den wäre. Diese Probleme treten bei anderen Tasks, + die keine Archivmanager sind, nicht auf, da deren + Speicherplatz intelligenter verwaltet wird. + Normalerweise ist als Zieltask das Archiv der + eigenen Station eingestellt. Mit dem Menupunkt 'z + Zieltask einstellen' kann diese Einstellung verän­ + dert werden. + + Fehlerfälle: + - Sehen Sie auch unter 'r Reservieren' + 's Schreiben' + 'z Zieltask einstellen'. + +#on("u")##on("b")#v Verzeichnis#off("b")##off("u")# + Mit dieser Menufunktion können Sie sich einen + Überblick über die in der Zieltask (z.B. auf dem Ar­ + chiv) vorhandenen Dateien verschaffen. + Nach Aufruf der Funktion wird eine Liste der + Dateien auf dem Bildschirm ausgegeben, die sich in + der Zieltask (z.B. auf dem Archiv) befinden. Ist die + Zieltask ein Archiv(manager), so wird auch ange­ + zeigt, wieviel Platz auf der Diskette belegt ist. Da + die Liste selbst eine Datei ist, kann sie mit der Ta­ + stenkombination verlassen werden. Falls + nicht alle Dateinamen auf den Bildschirm passen, + können Sie das Fenster mit und + verschieben. + + Fehlerfälle: + - Sehen Sie unter 'z Zieltask einstellen'. + +#on("u")##on("b")#d Drucken#off("b")##off("u")# + Das Verzeichnis der Dateien in der Zieltask, das + man mit der Menufunktion 'v Verzeichnis' auf dem + Bildschirm angezeigt bekommt, kann mit dieser Me­ + nufunktion ausgedruckt werden. + Zur Sicherheit wird angefragt, ob wirklich ein + solches Dateiverzeichnis der Zieltask gedruckt wer­ + den soll. Bejaht man die Frage, so wird ein Dateiver­ + zeichnis erstellt und zum Drucker geschickt. + + Fehlerfälle: + - Der Drucker ist nicht funktionsbereit. + - Der Drucker wird nicht über die Task 'PRINTER' + betrieben. + - Auf Ihrem System werden die Druckkosten abge­ + rechnet. Sie müssen sich mit einer Codenummer + identifizieren. + +#on("u")##on("b")#i Initialisieren#off("b")##off("u")# + Diese Menufunktion gestattet es, frische Disket­ + ten zu formatieren, zu initialisieren bzw. be­ + schriebene Disketten vollständig zu löschen und + ggf. dabei umzubenennen. Bei Aufruf dieser Menu­ + funktion wird - sofern noch nicht geschehen - das + Archivlaufwerk automatisch reserviert. + Wenn Sie eine fabrikneue Diskette aus der Ver­ + packung nehmen, müssen Sie diese zunächst #on("u")#forma­ + tieren#off("u")#. Dabei wird die Diskette auf ein festgelegtes + physikalisches Format eingestellt. Ohne daß diese + Operation vorausgegangen ist, kann eine Diskette + weder beschrieben noch gelesen werden. + Prinzipiell braucht eine Diskette nur ein einzi­ + ges Mal formatiert zu werden. Sie können Sie jedoch + jederzeit wieder formatieren - z.B. wenn Sie Disket­ + ten haben, von denen Sie nicht genau wissen, für + welche Zwecke sie zuvor verwendet wurden. + Wenn Sie diese Menufunktion aktivieren, werden + Sie so zunächst gefragt, ob Sie die Diskette auch + formatieren wollen. Bejahen Sie die Frage, so werden + Ihnen mehrere Formate zur Auswahl angeboten: + +#on ("b")# + +------------------------------------+ + | Formatieren einer Diskette | + | | + | Dies sind die möglichen Formate: | + | | + | 1 ..... 40 Spur - 360 KB | + | 2 ..... 80 Spur - 720 KB | + | 3 ..... 5 1/4" - 1,2 MB | + | 4 ..... 3 1/2" - 1,4 MB | + | s ..... Standard - Format | + | | + | 1 2 3 4 s | + +------------------------------------+ +#off("b")# + + Erkundigen Sie sich bei Ihrem Händler, welches + Format Sie bei Ihrem Rechner und den von Ihnen + verwendeten Disketten einstellen müssen. Manche + Rechner unterstützen diese Operation innerhalb des + EUMEL-Systems auch gar nicht, das Formatieren muß + dann irgendwie anders außerhalb des EUMEL-Systems + geschehen. + Wenn Sie die Formatierung abgeschlossen oder + auch übersprungen haben, beginnt die eigentliche + Initialisierung der Diskette. Dabei wird als erstes + der Archivname auf die Diskette geschrieben. Alle + alten Daten, die sich ggf. auf der Diskette befinden, + werden bei diesem Vorgang unwiederbringlich (!) + gelöscht. + Zur Sicherheit überprüft das System in jedem + Falle, ob es sich um eine EUMEL - Diskette handelt, + und erfragt Ihr Einverständnis, ob die Diskette + wirklich initialisiert werden soll. Geben Sie hierzu + Ihr Einverständnis, dann wird noch der (neue) Ar­ + chivname erfragt. Hatte die Diskette schon einen + Namen, dann wird dieser zum Überschreiben angebo­ + ten. Wollen Sie den alten Archivnamen beibehalten, + so brauchen Sie nur die -Taste zu tippen, + ansonsten können Sie den Namen auch zuvor verän­ + dern oder einen ganz neuen Namen hinschreiben. + Anhand des ausgegebenen Namens können Sie auch + überprüfen, ob Sie die richtige Diskette eingelegt + haben. + Das Initialisieren funktioniert natürlich nur, + wenn Sie als Zieltask einen Archivmanager einge­ + stellt haben - ansonsten ist diese Menufunktion + gesperrt (nicht aktivierbar!). + + Fehlerfälle: + - Formatieren ist nicht auf dem System möglich. + - Sehen Sie auch unter 'r Reservieren' + 'z Zieltask einstellen'. + +#on("u")##on("b")#z Zieltask einstellen#off("b")##off("u")# + Mit dieser Menufunktion können Sie festlegen, + mit welcher Zieltask Sie kommunizieren, d.h. z.B. Da­ + teien austauschen möchten. Normalerweise ist hier + das Archiv am eigenen Rechner eingestellt. Das wird + auch nach Aufklappen des Pull-Down-Menus im Ka­ + sten links unten angezeigt. + Diese Menufunktion kann im Unterricht z.B. dazu + genutzt werden, um fertiggestellte Hausaufgaben in + eine bestimmte Task zu schicken (Vatertask) oder um + von dort z.B. vorgefertigte Landschaften oder/und + Programme abzuholen. + Sie können aber auch eine andere Task einstellen + (z.B. die Vatertask oder die Task 'PUBLIC'), um mit die­ + sen Dateien auszutauschen oder um sich auch nur ei­ + nen Überblick über die dort vorhandenen Dateien zu + verschaffen. Wenn Sie mit Ihrem Rechner in ein + EUMEL-Netz integriert sind, können Sie auch auf + Tasks anderer Rechner zugreifen oder auch Disketten + von Laufwerken anderer Rechner einlesen (z.B. wenn + Sie Disketten anderer Formate haben, die von Ihrem + Rechner nicht gelesen werden können). + Dabei werden zwei Anforderungen an die Zieltask + gestellt: Sie muß existieren und bereit für den Da­ + teiaustausch sein, d.h es muß eine Managertask sein, + auf die Sie Zugriff haben. Versuchen Sie auf andere + Tasks zuzugreifen, so erhalten Sie entsprechende + (Fehler-)Meldungen. + Zu beachten ist noch, daß es im EUMEL-System ver­ + schiedene Arten von Managertasks gibt - Archivma­ + nager und normale Dateimanager. Der Unterschied + besteht darin, daß ein Archivmanager vom Benutzer + vor dem Zugriff reserviert werden muß - anschlie­ + ßend hat nur dieser Benutzer (bis zur Aufgabe der + Reservierung) ein Zugriffsrecht auf den Manager. + Normale Dateimanager können dagegen von mehreren + Benutzern in beliebiger Reihenfolge angesprochen + werden. + Ein Archivmanager kann auch auf bestimmte Dis­ + kettenformate spezialisert sein (z.B. auf das Lesen + von DOS-Disketten). Manche Rechner haben auch meh­ + rere Archivmanager für verschiedene Laufwerke etc. + Durch Einstellen unterschiedlicher Archivmanager + können Sie dann auf verschiedenen Laufwerken ar­ + chivieren. + Nach Aktivieren dieses Menupunktes werden Ihnen + die folgenden Alternativen angeboten: + +#on ("b")# + +-------------------------------------------+ + | Dateiaustausch gewünscht mit: | + | | + | a ... Archiv (Eigene Station) | + | | + | v ... Vatertask | + | | + | p ... 'PUBLIC' (Eigene Station) | + | | + | s ... Sonstige Task | + | | + | | + | Archiv Vatertask PUBLIC Sonstige | + +-------------------------------------------+ + + Da der Dateiaustausch mit dem Standardarchiv + der eigenen Station (Task: 'ARCHIVE'), mit der Vater­ + task und der Task 'PUBLIC' recht häufig in Anspruch + genommen wird, sind diese drei Optionen unter den + Alternativen direkt angegeben. Entscheiden Sie sich + für eine dieser drei Tasks, so nimmt das System alle + notwendigen Einstellungen vor. Möchten Sie dage­ + gen in Kontakt mit einer anderen Task treten, so + wählen Sie die Alternative 's ... Sonstige Task'. + In diesem Falle haben Sie noch 3 Angaben zu machen: + + - Zunächst werden Sie nach dem Namen der Zieltask + gefragt. Geben Sie den Namen der Zieltask - ohne + Anführungsstriche (!) - ein und schließen Sie die + Eingabe mit der -Taste ab. (Den ausge­ + gebenen Namen der z.Z. eingestellten Task können + Sie dabei verändern bzw. überschreiben.) + + - Dann wird die Nummer der Station im EUMEL-Netz + erfragt, auf der sich die Zieltask befindet. Die + Nummer Ihrer Station wird als Vorschlag ausge­ + geben. Wollen Sie mit einer Task auf Ihrem Rech­ + ner kommunizieren, so brauchen Sie diesen Vor­ + schlag nur durch Drücken der -Taste + bestätigen - ansonsten tragen Sie zuvor die ent­ + sprechende Stationsnummer ein. Ist Ihr Rechner + nicht in ein EUMEL-Netz integriert, so wird die + Stationsnummer 0 (Null) ausgegeben. Bitte bestä­ + tigen Sie diese Stationsnummer durch Tippen der + -Taste. + + - Zum Abschluß müssen Sie noch angeben, ob die + eingestellte Zieltask ein Archivmanager ist oder + nicht. + + Das System versucht dann den Kontakt herzu­ + stellen. Je nachdem, welche Einstellung Sie vorge­ + nommen haben, sind bestimmte Funktionen innerhalb + des Menus nicht aktivierbar. Das System läßt nur + die Funktionen zu, die aufgrund Ihrer Einstellun­ + gen zulässig sind. + Im Kasten links unten auf dem Bildschirm wird + jeweils angezeigt, welche Zieltask eingestellt ist. + Erscheint in diesem Kasten auch ein Hinweis auf den + Archivnamen, so haben Sie einen Archivmanager ein­ + gestellt. Ist dagegen vor dem Namen der Zieltask + noch eine Zahl und ein Schrägstrich angegeben, so + haben Sie eine Zieltask auf einem anderen Rechner + eingestellt. + Bedenken Sie, daß Operationen mit Tasks auf an­ + deren Stationen länger andauern können - werden + Sie nicht ungeduldig! + Sie können die Einstellung der Zieltask jeder­ + zeit wieder verändern! + + Fehlerfälle: + - Die eingestellte Zieltask existiert nicht. + - Die eingestellte Zieltask existiert zwar, ist aber + nicht empfangsbereit, d.h. ein Zugriff von Ihrer + Task aus ist nicht möglich! + - Das Netz ist nicht funktionsbereit (Collector- + Task fehlt). + - Die Kommunikation war nicht erfolgreich. + - Die gewünschte Operation kann mit der einge­ + stellten Zieltask nicht ausgeführt werden (Ziel­ + task ist z.B. gar kein Archivmanager - Sie aber + versuchen, das Laufwerk zu reservieren). + diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 5 b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 5 new file mode 100644 index 0000000..bb4a67b --- /dev/null +++ b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 5 @@ -0,0 +1,167 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (61)# +#headodd# +#center#gs-Herbert und Robbi#right#% + +#end# +#headeven# +%#center#gs-Herbert und Robbi + +#end# +#center#5 + +#center#Detailbeschreibung +#center#der +#center#Basisbefehle + + +#on("u")#'vor' bewirkt:#off("u")# + - ein Eingabezeichen wird von der Tastatur gelesen + und ausgewertet. + - es wird je nach Verzögerungsfaktor (eine vorgege­ + bene Wartezeit, die auch während des Programmlaufs + verändert werden kann) gewartet. + - falls die Kachel vor dem Hamster/Roboter noch frei + ist und zur Landschaft/zum Arbeitsfeld gehört, + geht der Hamster/ Roboter um eine Kachel in der + augenblicklichen Richtung vorwärts. + - falls vor dem Hamster/Roboter ein Hindernis liegt, + oder wenn er im Begriff ist, aus der Landschaft/aus + dem Arbeitsfeld herauszulaufen, wird das Programm + mit entsprechender Fehlermeldung abgebrochen. + +#on("u")#'links um' bewirkt:#off("u")# + - wie bei 'vor': Annahme eines Tastendruckes und + Warten. + - eine Drehung des Hamsters/Roboters um 90 Grad ge­ + gen den Uhrzeigersinn. + +#on("u")#'nimm' bewirkt:#off("u")# + - wie bei 'vor': Annahme eines Tastendruckes und + Warten. + - falls auf der Kachel, auf der der Hamster/Roboter + steht, kein Korn/Werkstück liegt, wird das Programm + mit entsprechender Fehlermeldung abgebrochen. + - falls dort genau ein Korn/ein Werkstück liegt, wird + dieses auf dem Bildschirm entfernt. Es wird zu denen + in den Backentaschen/im Behälter addiert. Auf dem + Bildschirm erscheint an der Stelle (" ."). + - falls mehrere Körner/Werkstücke dort liegen, wird + eines zu denen in den Backentaschen/im Behälter + addiert und von denen auf der Kachel subtrahiert. + Auf dem Bildschirm erscheint weiterhin an der Stel­ + le (" o"). + +#on("u")#'gib' bewirkt:#off("u")# + - wie bei 'vor': Annahme eines Tastendruckes und + Warten. + - falls die Backentaschen/der Behälter leer sind/ist, + wird das Programm mit entsprechender Fehlermel­ + dung abgebrochen. + - falls auf der Kachel schon ein Korn/Werkstück oder + mehrere Körner/Werkstücke liegen, wird zu ihnen + eines addiert und von denen in den Backentaschen/ + im Behälter subtrahiert. Der Bildschirm ändert sich + nicht. + - falls noch kein Korn/Werkstück auf dieser Kachel + liegt, wird auf dem Bildschirm ein (" o") ausgegeben + und von den Körnern/Werkstücken in den Backenta­ + schen/im Behälter ein Korn/Werkstück subtrahiert. + +#on("u")#'vorn frei'#off("u")# + - liefert den Wahrheitswert TRUE, wenn vor dem Ham­ + ster/ Roboter keine Hinderniskachel liegt, #on("u")#also + auch dann, wenn der Hamster/Roboter im Begriff ist, + über die Landschafts-/Arbeitsfeldgrenze (den + Bildschirmrand) hinauszulaufen!#off("u")# Wenn vor dem Ham­ + ster/Roboter eine Hinderniskachel liegt, wird der + Wahrheitswert FALSE geliefert. + +#on("u")#'links frei'#off("u")# + - liefert den Wahrheitswert TRUE, wenn in Laufrich­ + tung links vom Hamster/ Roboter keine Hindernis­ + kachel liegt, #on("u")#also auch dann, wenn links vom Ham­ + ster/Roboter die Landschafts-/Arbeitsfeldgrenze + (der Bildschirmrand) ist!#off("u")# Wenn links vom Hamster/ + Roboter eine Hinderniskachel liegt, wird der Wahr­ + heitswert FALSE geliefert. + +#on("u")#'rechts frei'#off("u")# + - liefert den Wahrheitswert TRUE, wenn in Laufrich­ + tung rechts vom Hamster/Roboter keine Hindernis­ + kachel liegt, #on("u")#also auch dann, wenn rechts vom Ham­ + ster/Roboter die Landschafts-/Arbeitsfeldgrenze + (der Bildschirmrand) ist!#off("u")# Wenn rechts vom Hamster/ + Roboter eine Hinderniskachel liegt, wird der Wahr­ + heitswert FALSE geliefert. + +#on("u")#'hinten frei'#off("u")# + - liefert den Wahrheitswert TRUE, wenn in Laufrich­ + tung hinter dem Hamster/Roboter keine Hindernis­ + kachel liegt, #on("u")#also auch dann, wenn hinter dem Ham­ + ster/Roboter die Landschafts-/Arbeitsfeldgrenze + (der Bildschirmrand) ist!#off("u")# Wenn hinter dem Hamster/ + Roboter eine Hinderniskachel liegt, wird der Wahr­ + heitswert FALSE geliefert. + +#on("u")#'korn da' und 'werkstueck da'#off("u")# + - liefern den Wahrheitswert TRUE, wenn auf der + Kachel, auf der der Hamster/Roboter steht, minde­ + stens ein Korn/Werkstück liegt. Ansonsten wird der + Wahrheitswert FALSE geliefert. + +#on("u")#'korn vorn' und 'werkstueck vorn'#off("u")# + - liefern den Wahrheitswert TRUE, wenn auf der + Kachel, die in Laufrichtung vor dem Hamster/Robo­ + ter liegt, mindestens ein Korn/Werkstück liegt. An­ + sonsten wird der Wahrheitswert FALSE geliefert. + - Zur "Untersuchung" wird die vor ihm liegende + Kachel - sofern dort kein Hindernis ist - von ihm + betreten. Wenn er im Begriff ist, aus der Land­ + schaft/dem Arbeitsfeld herauszulaufen, wird das + Programm mit entsprechender Fehlermeldung abge­ + brochen. + +#on("u")#'korn links' und 'werkstueck links'#off("u")# + - liefern den Wahrheitswert TRUE, wenn auf der + Kachel, die in Laufrichtung links vom Hamster/ + Roboter liegt, mindestens ein Korn/Werkstück liegt. + Ansonsten wird der Wahrheitswert FALSE geliefert. + - Zur "Untersuchung" wird die links neben ihm lie­ + gende Kachel - sofern dort kein Hindernis ist - von + ihm betreten. Wenn er im Begriff ist, aus der Land­ + schaft/dem Arbeitsfeld herauszulaufen, wird das + Programm mit entsprechender Fehlermeldung abge­ + brochen. + +#on("u")#'korn rechts' und 'werkstueck rechts'#off("u")# + - liefern den Wahrheitswert TRUE, wenn auf der + Kachel, die in Laufrichtung rechts vom Hamster/ + Roboter liegt, mindestens ein Korn/Werkstück liegt. + Ansonsten wird der Wahrheitswert FALSE geliefert. + - Zur "Untersuchung" wird die rechts neben ihm lie­ + gende Kachel - sofern dort kein Hindernis ist - von + ihm betreten. Wenn er im Begriff ist, aus der Land­ + schaft/dem Arbeitsfeld herauszulaufen, wird das + Programm mit entsprechender Fehlermeldung abge­ + brochen. + +#on("u")#'korn hinten' und 'werkstueck hinten'#off("u")# + - liefern den Wahrheitswert TRUE, wenn auf der + Kachel, die in Laufrichtung hinter dem Hamster/ + Roboter liegt, mindestens ein Korn/Werkstück liegt. + Ansonsten wird der Wahrheitswert FALSE geliefert. + - Zur "Untersuchung" wird die hinter ihm liegende + Kachel - sofern dort kein Hindernis ist - von ihm + betreten. Wenn er im Begriff ist, aus der Land­ + schaft/dem Arbeitsfeld herauszulaufen, wird das + Programm mit entsprechender Fehlermeldung abge­ + brochen. + +#on("u")#'backen leer' und 'behaelter leer'#off("u")# + - liefern den Wahrheitswert TRUE, wenn kein Korn/ + kein Werkstück in den Backentaschen/im Behälter + notiert ist. Ansonsten wird der Wahrheitswert FALSE + geliefert. + diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 6 b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 6 new file mode 100644 index 0000000..0aeeff0 --- /dev/null +++ b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 6 @@ -0,0 +1,73 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (66)# +#headodd# +#center#gs-Herbert und Robbi#right#% + +#end# +#headeven# +%#center#gs-Herbert und Robbi + +#end# +#center#6 + +#center#Zusätzliche Kommandos + + +PROC landschaft (TEXT CONST landschaftsname) +PROC arbeitsfeld (TEXT CONST arbeitsfeldname) + Steht einer dieser Prozeduraufrufe innerhalb eines + Hamster-/ Roboterprogramms vor dem ersten Befehl (am + Anfang der Datei), so wird die Anfrage nach einem Land­ + schafts-/Arbeitsfeldnamen zu Beginn des Laufs über­ + gangen. Außerdem ist es möglich, den Hamster/Roboter + in einem Programm durch meherere Landschaften/Ar­ + beitsfelder laufen zu lassen. Beachten Sie bitte, daß + der Landschaftsname / Arbeitsfeldname hier in Anfüh­ + rungszeichen, aber #on("u")#ohne#off("u")# das Präfix 'Flaeche:' angegeben + werden muß! + +PROC geschwindigkeit (INT CONST wert) + Möchte man von einem Programm aus eine bestimmte + Geschwindigkeit des Hamsters/Roboters bei der Pro­ + grammausführung festlegen oder die Geschwindigkeit + vom Programm aus verändern, so kann man diese Proze­ + dur verwenden. Zulässig sind für 'wert' nur Werte zwi­ + schen 0 und 9. Dabei bedeuten: + 0: Einzelschrittmodus - Ausführung des nächsten + Schritts auf Tastendruck + 1: geringste Geschwindigkeit (Wartezeit : ca. + 50 Zehntelsekunden ) + 9: höchste Geschwindigkeit (Wartezeit : + keine) + 2 - 8 sind dazwischenliegende Geschwindigkeiten + +TEXT PROC taste + Diese Prozedur liefert jeweils ein eingetipptes + Zeichen. Die Taste , welche zum Programmabbruch + dient, wirkt sich schon aus, bevor hier ein Zeichen ge­ + liefert werden könnte. + +PROC druckereinstellung fuer flaechenausdruck + Für den Landschafts-/Arbeitsfeldausdruck ist der + Standardschrifttyp des Druckers voreingestellt. Dabei + müssen 80 Druckpositionen in einer Zeile Platz haben. + Außerdem sind voreingestellt : \#limit (20.5)\#, \#on("b")\# + (Fettdruck) und \#start (0.0,0.0)\#. Zur Darstellung der + Hinderniskacheln wird das Zeichen '\#\#' (Code 222) ver­ + wendet. Kann Ihr Drucker dieses Zeichen nicht darstel­ + len (z.B. Typenraddrucker mit deutschem Zeichenzatz), so + können Sie hier ein #on("u")#anderes Zeichen#off("u")# auswählen. Weiter­ + hin können Sie mit dieser Prozedur einen #on("u")#anderen + Schrifttyp#off("u")# und eine #on("u")#andere Startposition#off("u")# (linker obe­ + rer Eckpunkt des Druckfeldes) einstellen. Nachdem Sie + das Kommando gegeben haben, wird zunächst der ge­ + wünschte Schrifttyp erfragt. Geben Sie hier einen in + Ihrer Installation vorhandenen Schrifttyp an (nur den + Namen - ohne Anführungszeichen!). Anschließend werden + Sie nacheinander nach den beiden Startwerten (erst die + x-Richtung und dann die y-Richtung) gefragt. Geben + Sie hier jeweils einen Wert (als REAL) ein. Bedenken Sie + dabei, daß die 80 Druckpositionen nebeneinander Platz + haben müssen! + diff --git a/doc/hamster/gs-Herbert und Robbi handbuch.impressum b/doc/hamster/gs-Herbert und Robbi handbuch.impressum new file mode 100644 index 0000000..4c8e79d --- /dev/null +++ b/doc/hamster/gs-Herbert und Robbi handbuch.impressum @@ -0,0 +1,87 @@ +____________________________________________________________________________ + + +#on("b")##on ("u")# +#center#Betriebssystem E U M E L +#off ("u")# + + +#center#gs-Herbert und Robbi + + + + +#off("b")# +#center#Lizenzfreie Software der +#on ("b")# + +#center#Gesellschaft für Mathematik und Datenverarbeitung mbH, +#center#5205 Sankt Augustin + + +#off("b")# +#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für +#center#nichtkommerzielle Zwecke gestattet. + +#center#Gewährleistung und Haftung werden ausgeschlossen + + +____________________________________________________________________________ +#page# + +#free (4.0)##on("b")# +#center#gs-Herbert und Robbi + + +#center#Benutzerhandbuch + + +#center#Version 1.0 + + +#off("b")##center#copyright +#center#Eva Latta-Weber +#center#Software- und Hardware-Systeme, 1988 +#center#ERGOS GmbH, 1990 +#page# +#block# +#center#____________________________________________________________________________ + + +Copyright:  ERGOS GmbH   März 1990 + + Alle Rechte vorbehalten. Insbesondere ist die Überführung in + maschinenlesbare Form sowie das Speichern in Informations­ + systemen, auch auszugsweise, nur mit schriftlicher Einwilliging + Einwilligung der ERGOS GmbH gestattet. + +#center#____________________________________________________________________________ + +Es kann keine Gewähr übernommen werden, daß das Programm für eine +bestimmte Anwendung geeignet ist. Die Verantwortung dafür liegt beim +Anwender. + +Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrektheit und +Vollständigkeit der Angaben kann keine Gewähr übernommen werden. Das +Handbuch kann jederzeit ohne Ankündigung geändert werden. + +Texterstellung :  Dieser Text wurde mit der ERGOS-L3 Textverarbeitung + erstellt und aufbereitet und auf einem Kyocera Laser­ + drucker gedruckt. + + + + +#center#___________________________________________________________________________ + + + +Ergonomic Office Software GmbH + +Bergstr. 7 Telefon: (02241) 63075 +5200 Siegburg Teletex: 2627-2241413=ERGOS + Telefax: (02241) 63078 + + +#center#____________________________________________________________________________ + diff --git a/doc/lisp/lisp handbuch b/doc/lisp/lisp handbuch new file mode 100644 index 0000000..022c561 --- /dev/null +++ b/doc/lisp/lisp handbuch @@ -0,0 +1,2260 @@ +____________________________________________________________________________ + + +#on("b")##on ("u")# +#center#Betriebssystem E U M E L +#off ("u")# + + +#center#Lisp + + + + +#off("b")# +#center#Lizenzfreie Software der +#on ("b")# + +#center#Gesellschaft für Mathematik und Datenverarbeitung mbH, +#center#5205 Sankt Augustin + + +#off("b")# +#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für +#center#nichtkommerzielle Zwecke gestattet. + +#center#Gewährleistung und Haftung werden ausgeschlossen + + +____________________________________________________________________________ +#page# +#free(7.0)# +#center#LISP - Handbuch +#free(2.0)# +Stand: 08.08.86 + +Installation von LISP + +begin ("LISP") +reserve ("sprachen",archive) +fetch all(archive) +insert ("lisp.1") +insert ("lisp.2") +insert ("lisp.3") +insert ("lisp.4") +global manager +begin ("lisp","LISP") +fetch ("lisp.bootstrap") +lisp +#page# +#start(2.5,1.5)# +#block# +#pageblock# +#head# +#center#LISP-Handbuch +#center#% + + +#end# + + +#center#L I S P H a n d b u c h + + +#center#Autor: John Mc.Carthy (M.I.T.1962) +#center#übersetzt und angepaßt von J.Durchholz, P.Heyderhoff +#center#Gesellschaft für Mathematik und Datenverarbeitung Sankt Augustin + + + +Inhaltsverzeichnis + + + +1. Die Sprache LISP #right##topage("p1")# + +1.1 Symbolische Ausdrücke #right##topage("p1.1")# +1.2 Elementare Funktionen #right##topage("p1.2")# +1.3 Listen Notation #right##topage("p1.3")# +1.4 Syntax und Semantik der Sprache #right##topage("p1.4")# + +2. Das LISP-Interpreter-System #right##topage("p2")# + +2.1 Die universelle LISP-Funktion "evalquote" #right##topage("p2.1")# +2.2 Anwendungsregeln und Beispiele #right##topage("p2.2")# +2.3 Variablen #right##topage("p2.3")# +2.4 Konstanten #right##topage("p2.4")# +2.5 Funktionen #right##topage("p2.5")# + +3. Erweitertes LISP #right##topage("p3")# + +3.1 Gequotete Parameter #right##topage("p3.1")# +3.2 Funktionen mit beliebig vielen Parametern #right##topage("p3.2")# +3.3 Funktionale Parameter #right##topage("p3.3")# +3.4 Prädikate und boolesche Konstanten #right##topage("p3.4")# +3.5 Unbenannte Atome #right##topage("p3.5")# +3.6 Aufruf von EUMEL aus #right##topage("p3.6")# + +4. Detailbeschreibungen #right##topage("p4")# + +4.1 Grundfunktionen #right##topage("p4.1")# +4.2 Weitere Funktionen sowie Eingabe und Ausgabe #right##topage("p4.2")# +4.3 Interpreter #right##topage("p4.3")# +4.4 Kommandoprozeduren #right##topage("p4.4")# +#page# + +1. Die Sprache LISP#goalpage("p1")# + + + +Die Sprache LISP ist primär für die Symbolmanipulation entworfen. Sie wurde für +symbolische Berechnungen in verschiedenen Gebieten der künstlichen Intelligenz +eingesetzt, u.a. für Differential- und Integralrechnung, Schaltkreistheorie, Mathemati­ +sche Logik, Spiele, etc.. + +LISP ist eine formale mathematische Sprache. Daher ist es möglich, eine genaue und +vollständige Beschreibung zu geben. Das ist der Sinn des ersten Abschnitts dieses +Handbuchs. Andere Abschnitte werden Möglichkeiten zum vorteilhaften Einsatz von +LISP und die Erweiterungen, die die Benutzung erleichtern, beschreiben. + +LISP unterscheidet sich von den meisten Programmiersprachen in drei Punkten. + +Der erste Punkt liegt in der Natur der Daten. In der Sprache LISP haben alle Daten +die Form symbolischer Ausdrücke, die wir verkürzend LISP-Ausdrücke nennen wer­ +den. LISP-Ausdrücke haben keine Längenbegrenzung und eine verzweigte Baum­ +struktur, so daß Unterausdrücke leicht isoliert werden können. In LISP wird der meiste +Speicherplatz für das Abspeichern der LISP-Ausdrücke in Form von Listenstruktu­ +ren gebraucht. + +Der zweite wichtige Teil der Sprache LISP ist die Quellsprache, die festlegt, wie die +LISP-Ausdrücke verarbeitet werden sollen. + +Drittens kann LISP als LISP-Ausdrücke geschriebene Programme interpretieren und +ausführen. Deshalb kann man die Sprache analog zu Assemblersprachen und im +Gegensatz zu den meisten anderen höheren Programmiersprachen einsetzen, um +Programme zu generieren, die gleich ausgeführt werden sollen. + + +#page# + +1.1 Symbolische Ausdrücke #goalpage("p1.1")# + + + +Ein elementarer Ausdruck ist ein Atom. + +Definition: Ein Atom ist eine Zeichenkette bestehend aus Großbuchstaben und + Ziffern. + + +Beispiele: A + APFEL + TEIL2 + EXTRALANGEZEICHENKETTEAUSBUCHSTABEN + A4B66XYZ2 + + +Diese Symbole werden atomar genannt, weil sie als Ganzes aufgefaßt werden, das +durch die LISP-Funktionen nicht weiter geteilt werden kann. A, B, und AB haben +keinerlei Beziehung zueinander, außer der, daß sie alle verschiedene Atome sind. + +Alle LISP-Ausdrücke werden aus Atomen und den Satzzeichen "(", ")" und "." +aufgebaut. Die grundlegende Operation zum Aufbau von LISP-Ausdrücken ist die, +zwei LISP-Ausdrücke zusammenzufassen, um einen größeren herzustellen. Aus den +zwei Atomen A und B kann man so den LISP-Ausdruck (A.B) bilden. + +Definition: Ein LISP-Ausdruck ist entweder ein Atom, oder aus folgenden Elemen­ + ten in dieser Reihenfolge aufgebaut: Eine öffnende Klammer, ein + LISP-Ausdruck, ein Punkt, ein LISP-Ausdruck, eine schließende + Klammer. Zwischen den Bestandteilen eines nichtatomaren LISP-Aus­ + druck können beliebig viele Leerzeichen eingestreut sein. + +Diese Definition ist rekursiv. + + +Beispiele: ATOM + (A . B) + (A . (B . C)) + ((A1 . A2) . B) + ((U . V) . (X . Y)) + ((U . V) . (X . (Y . Z))) + + +Um die Struktur solcher Ausdrücke zu verdeutlichen, wird in diesem Handbuch oft +eine graphische Darstellung gewählt. In dieser Darstellung sind die Atome weiterhin +Zeichenketten, statt der Paare steht jetzt aber ein Kasten + + + +-----+-----+ + | o | o | + +-----+-----+ + + +von dem zwei Zeiger ausgehen, die auf die graphische Darstellung des ersten bzw. +zweiten Elements des Paars zeigen. + + + +Beispiele: (A . B) +-----+-----+ + | o | o | + +--+--+--+--+ + | | + V V + A B + + (A . (B . C)) +-----+-----+ + | o | o | + +--+--+--+--+ + | | + V V + A +-----+-----+ + | o | o | + +--+--+--+--+ + | | + V V + B C + + ((U . V) . (X . (Y . Z))) +-----+-----+ + | o | o | + +--+--+--+--+ + | | + V V + +-----+-----+ +-----+-----+ + | o | o | | o | o | + +--+--+--+--+ +--+--+--+--+ + | | | | + V V V V + U V X +-----+-----+ + | o | o | + +--+--+--+--+ + | | + V V + Y Z + + + + + + +#page# + +1.2 Elementare Funktionen #goalpage("p1.2")# + + +Wir werden einige elementare Funktionen auf LISP-Ausdrücken einführen. Um die +Funktionen von den LISP-Ausdrücken zu unterscheiden, werden wir Funktionsnamen +mit Klein- statt Großbuchstaben schreiben. Außerdem steht der Funktionsname +gefolgt von den Argumenten, auf die die Funktion angewendet werden soll, in Klam­ +mern eingeschlossen in einer Liste. Dabei sind die Argumente durch Blanks vonein­ +ander getrennt. + +Die erste Funktion, die wir einführen, heißt "cons". Sie hat zwei Argumente und wird +dafür benutzt, LISP-Ausdrücke aus kleineren LISP-Ausdrücken aufzubauen. + + + Funktionsaufruf: Ergebnis: + +Beispiele: (cons A B) = (A . B) + (cons (A . B) C) = ((A . B) . C) + (cons (cons A B) C) = ((A . B) . C) + + +Die Beispiele zeigen Funktionsaufrufe. Ein Funktionsaufruf ist eine Liste beginnend +mit einem Funktionsnamen, gefolgt von Argumenten. Alle Funktionsaufrufe haben ein +Ergebnis, das im Fall von LISP-Funktionen immer ein LISP-Ausdruck ist. + +In diesen Beispielen kommt nur die Funktion "cons" vor. Das letzte Beispiel ist ein +Fall von Funktionsverkettung, das heißt, als Argument steht ein Funktionsaufruf. Um +das Ergebnis eines Funktionsaufrufs zu berechnen, das Funktionsaufrufe als Argu­ +mente enthält, muß man statt dieser Argumente die Ergebnisse dieser Funktionsaufru­ +fe einsetzen, so daß man den äußeren Funktionsaufruf in einen Aufruf ohne Funk­ +tionsaufrufe als Argumente umwandelt. + + +Beispiel: (cons (cons A B) C) = (cons (A . B) C) = ((A . B) . C) + + +Es ist möglich, durch Verkettung der Funktion "cons" jeden LISP-Ausdruck aus +seinen atomaren Komponenten aufzubauen. + +Die folgenden beiden Funktionen tun das genaue Gegenteil von "cons": sie liefern +die Unterausdrücke eines gegebenen LISP-Ausdrucks. + +Die Funktion "head" hat ein Argument. Ihr Wert ist der erste Unterausdruck des +zusammengesetzen Arguments. Der "head" eines Atoms ist nicht definiert. + + +Beispiele: (head (A . B)) = A + (head (A . (B1 . B2))) = A + (head ((A1 . A2) . B)) = (A1 . A2) + (head A) ist nicht definiert + + +Die Funktion "tail" hat ebenfalls ein Argument, und sie liefert das Argument bis auf +dessen "head". + + +Beispiele: (tail (A . B)) = B + (tail (A . (B1 . B2))) = (B1 . B2) + (tail ((A1 . A2) . B)) = B + (tail A) ist nicht definiert + (head (tail (A . (B1 . B2)))) = B1 + (head (tail (A . B))) ist nicht definiert + (head (cons A B)) = A + + +Es ist bei jedem LISP-Ausdruck möglich, durch eine geeignete Verkettung von +"head" und "tail" zu jedem Atom im Ausdruck zu gelangen. + +Wenn "x" und "y" irgendwelche LISP-Ausdrücke repräsentieren, gelten die folgen­ +den Gleichungen immer: + + + (head (cons x y)) = x + (tail (cons x y)) = y + + +Außerdem gilt die folgende Gleichung für jeden nichtatomaren LISP-Ausdruck "z": + + + (cons (head z) (tail z)) = z +9 + +Die Symbole "x", "y" und "z", die wir in diesen Gleichungen benutzt haben, nennt +man Variablen. In LISP werden Variable benutzt, um LISP-Ausdrücke zu repräsentie­ +ren, und zwar repräsentiert eine Variable in einer Gleichung immer denselben +LISP-Ausdruck. Variablennamen werden wie Funktionsnamen gebildet, d.h. sie +können Kleinbuchstaben und Ziffern enthalten. + +Eine Funktion, deren Wert "wahr" oder "falsch" sein kann, wird Prädikat genannt. In +LISP werden die Werte "wahr" und "falsch" durch die Atome "T" (true) und "F" +(false) vertreten. Ein LISP-Prädikat ist also eine Funktion, deren Wert entweder "T" +oder "F" ist. + +Das Prädikat "eq" ist ein Gleichheitstest für Atome. Es ist bei nicht atomaren Argu­ +menten nicht definiert. + + +Beispiele: (eq A A) = T + (eq A B) = F + (eq A (A . B)) ist nicht definiert + (eq (A . B) B) ist nicht definiert + (eq (A . B) (A . B)) ist nicht definiert + + +Das Prädikat "atom" hat das Ergebnis ("liefert") "T", wenn sein Argument atomar ist, +und "F", wenn sein Argument zusammengesetzt ist. + + +Beispiele: (atom EXTRALANGEZEICHENKETTE) = T + (atom (U . V)) = F + (atom (head (U . V))) = T + +#page# + +1.3 Listen-Notation #goalpage("p1.3")# + + + +Alle LISP-Ausdrücke, die wir bisher gesehen haben, waren in Punkt-Notation +geschrieben. Normalerweise ist es allerdings einfacher, statt der vielen Punkte und +Klammern Listen von LISP-Ausdrücken zu schreiben, etwa in der Art (A B C XYZ). + +LISP bietet eine solche Alternative zur Punkt-Notation an: + +Definition: Die Liste (a1 a2 ... an) ist äquivalent zum LISP-Ausdruck + (a1 . (a2 . (... . (an . NIL) ... ))). + +Graphisch ausgedrückt heißt das: + + + +-----+-----+ + | o | o | + +--+--+--+--+ + | | + V V + a1 +-----+-----+ + | o | o | + +--+--+--+--+ + | | + V V + a2 + . + . + . + + +-----+-----+ + | o | o | + +--+--+--+--+ + | | + V V + an NIL + + + +Oft werden wir für Listen auch die graphische Form + + + +-----+-----+ +-----+-----+ +-----+-----+ + | o | o--+-->| o | o--+--> . . . | o | o--+--> NIL + +--+--+-----+ +--+--+-----+ +--+--+-----+ + | | | + V V V + a1 a2 an + + +benutzen. + +Aus der Graphik wird deutlich, daß NIL als eine Art Abschlußmarkierung für Listen +dient. + +Eine leere Liste wird durch das Atom NIL dargestellt. Das Prädikat "null" liefert "T", +wenn sein Argument eine leere Liste ist, sonst "F". + + +Beispiele: (null NIL) = T + (null () ) = T + (null (A B)) = F + + +Die Listenelemente können selbst wieder Listen oder Paare in Punkt-Notation sein, +so daß Listen- und Punkt-Notation beliebig kombinierbar sind. + + + Beispiele: (A B C) = (A . (B . (C . NIL))) + + +-----+-----+ +-----+-----+ +-----+-----+ + | o | o--+-->| o | o--+-->| o | o--+--> NIL + +--+--+-----+ +--+--+-----+ +--+--+-----+ + | | | + V V V + A B C + + ((A . B) C) = ((A . B) . (C . NIL)) + + +-----+-----+ +-----+-----+ + | o | o--+-->| o | o--+--> NIL + +--+--+-----+ +--+--+-----+ + | | + V V + +-----+-----+ C + | o | o | + +--+--+--+--+ + | | + V V + A B + + ((A B) C) = ((A . (B . NIL)) . (C . NIL)) + + +-----+-----+ +-----+-----+ + | o | o--+--------------->| o | o--+--> NIL + +--+--+-----+ +--+--+-----+ + | | + | V + V C + +-----+-----+ +-----+-----+ + | o | o--+-->| o | o--+--> NIL + +--+--+-----+ +--+--+-----+ + | | + V V + A B + + (A) = (A . NIL) + + +-----+-----+ + | o | o--+--> NIL + +--+--+-----+ + | + V + A + + ((A)) = ((A . NIL) . NIL) + + +-----+-----+ + | o | o--+--> NIL + +--+--+-----+ + | + V + +-----+-----+ + | o | o--+--> NIL + +--+--+-----+ + | + V + A + + + + + +Es ist sehr hilfreich, mit den Ergebnissen der elementaren Funktionen vertraut zu +sein, wenn diese Listen als Argumente erhalten. Zwar können die Ergebnisse notfalls +immer durch Übersetzung in Punkt-Notation bestimmt werden, aber ein direktes +Verständnis ist einfacher. + + +Beispiele: (head (A B C)) = A + (tail (A B C)) = (B C) + + + (Daher auch die Namen "head" und "tail"! Frei übersetzt heißen die + beiden Funktionen "anfang" und "rest".) + + + (cons A (B C)) = (A B C) + +#page# + +1.4 Syntax und Semantik der Sprache #goalpage("p1.4")# + + + +Wir haben bisher einen Datentyp (LISP-Ausdrücke) und fünf elementare Funktionen +eingeführt. Außerdem haben wir die folgenden Eigenschaften der Sprache beschrie­ +ben: + +1. Funktions- und Variablennamen werden wie die Namen von Atomen geschrie­ + ben, außer, daß dafür Klein- statt Großbuchstaben verwendet werden. +2. Die Argumente einer Funktion folgen dieser in der Liste. Eine solche Liste von + Funktion und folgenden Argumenten heißt Funktionsaufruf und hat einen LISP- + Ausdruck als Ergebnis. +3. Funktionen können dadurch verkettet werden, daß ein Argument aus einem Funk­ + tionsaufruf selbst wieder ein Funktionsaufruf ist, dessen Argumente selbst wieder + Funktionsaufrufe sein können, usw. + +Diese Regeln erlauben es, Funktionsdefinitionen wie + + + (third x) = (head (tail (tail x))) + + +zu schreiben. "third" holt das dritte Element aus einer Liste. + +Die Klasse der Funktionen, die man auf diese Weise bilden kann, ist ziemlich be­ +schränkt und nicht sehr interessant. Eine viel größere Funktionenklasse kann man mit +Hilfe des bedingten Ausdrucks schreiben; es handelt sich dabei um eine Möglichkeit, +Verzweigungen in Funktionsdefinitionen einzubauen. + +Ein bedingter Ausdruck hat die Form + + + (cond (p1 a1) (p2 a2) ... (pn an) ) + + +Jedes pi ist ein Ausdruck, dessen Wert "T" oder "F" ist, also ein Prädikat. Die ai +sind beliebige LISP-Ausdrücke. + +Die Bedeutung eines bedingten Ausdrucks ist folgende: Wenn p1 wahr ist, ist a1 der +Wert des ganzen Ausdrucks. Wenn p1 falsch ist, wird getestet, ob p2 wahr ist; wenn +das der Fall ist, ist a2 der Wert des Ausdrucks. Die pi werden also von links nach +rechts durchgegangen, bis ein wahrer Ausdruck gefunden ist; das zugehörige ai ist +dann der Wert des bedingten Ausdrucks. Wenn kein wahres pi gefunden ist, ist der +bedingte Ausdruck nicht definiert. +Jedes pi oder ai kann selbst wieder ein LISP-Ausdruck, ein Funktionsaufruf oder ein +bedingter Ausdruck sein. + + +Beispiel: (cond ((eq (head x) A) (cons B (tail x))) (T x) ) + + +Das Prädikat "T" ist immer wahr. Man liest es am besten als "SONST". Den Wert +dieses Ausdruck erhält man, wenn man "head" von x durch B ersetzt, wenn der +gerade gleich mit A ist, und sonst erhält man x. + +Der Hauptzweck von bedingten Ausdrücken ist die rekursive Definition von Funktio­ +nen. + + +Beispiel: (firstatom x) = (cond ((atom x) x) + ( T (firstatom (head x))) + ) + + +Dies Beispiel definiert die Funktion "firstatom", die das erste Atom jedes LISP-Aus­ +drucks bestimmt. Diesen Ausdruck kann man so lesen: wenn "x" ein Atom ist, ist "x" +selbst die Antwort; sonst muß "firstatom" auf "head" von "x" angewandt werden. + +Wenn also "x" ein Atom ist, wird der erste Zweig gewählt, der "x" liefert; sonst wird +der zweite Zweig "firstatom (head x)" gewählt, weil "T" immer wahr ist. + +Die Definition von "firstatom" ist rekursiv, d.h. "firstatom" ist mit durch sich selbst +definiert. Allerdings, wenn man immerzu den "head" von irgendeinem LISP-Aus­ +druck nimmt, errreicht man irgendwann ein Atom, so daß der Prozeß immer wohlde­ +finiert ist. + +Es gibt rekursive Funktionen, die nur für bestimmte Argumente wohldefiniert sind, für +bestimmte andere dagegen unendlich rekursiv. Wenn das EUMEL-LISP-System +einen Funktionsionsaufruf mit einer solchen Funktion und "kritischen" Argumenten +interpretiert, gerät es in unendliche Rekursion, bis entweder der zur Verfügung ste­ +hende Platz im LISP-Heap ausgeschöpft ist (im Heap werden die LISP-Ausdrücke +gespeichert) oder bis der Laufzeitstack überläuft (der Laufzeitstack ist ein normaler­ +weise unsichtbarer Bestandteil des ELAN-Systems). +Wir werden jetzt die Berechnung von "(firstatom ((A . B) . C))" durchführen. Zunächst +ersetzen wir die Variable x in der Funktionsdefinition durch ((A . B) . C) und erhalten + + + (firstatom ((A . B) . C)) = + (cond ( (atom ((A . B) . C)) ((A . B) . C) ) + ( T (firstatom (head ((A . B) . C))) ) + ) + +((A . B) . C) ist kein Atom, deshalb wird daraus + + = (cond ( T (firstatom (head ((A . B) . C)))) ) + = (firstatom (head ((A . B) . C)) ) + = (firstatom (A . B)) + + + +An diesem Punkt müssen wir wieder die Definition von "firstatom" benutzen, diesmal +aber für "x" überall "(A . B)" einsetzen. + + + (firstatom (A . B)) = (cond ( (atom (A . B)) (A . B) ) + (T (firstatom (head (A . B))) ) + ) + = (cond (T (firstatom (head (A . B))) ) ) + = (firstatom (head (A . B)) ) + = (firstatom A) + = (cond ((atom A) A) + (T (firstatom (head A)) ) + ) + = A + + +Wenn in den bedingten Ausdrücken statt der LISP-Ausdrücke arithmetische Aus­ +drücke verwendet würden, könnte man damit auch numerische Rechenvorschriften +definieren, wie z.B. den Betrag einer Zahl durch + + + (abs x) = (cond ((x < 0) -x) (T x) ) + + +oder die Fakultät durch + + + (fak n) = (cond ((n = 0) 1) + (T (x * (fak (n - 1)))) + ) + + +Die Fakultät terminiert bei negativen Argumenten nicht. + +Es ist bei den meisten Mathematikern (außer den Logikern) üblich, das Wort "Funk­ +tion" nicht präzise zu verwenden und auf Ausdrücke wie "2x+y" anzuwenden. Da wir +Ausdrücke benutzen werden, die Funktionen repräsentieren, benötigen wir eine +Notation, die Funktionen und Ausdrücke unterscheidet. Dafür ist die Lambda-Nota­ +tion von Alonzo Church geeignet. +"f" soll ein Ausdruck sein, der für eine Funktion zweier ganzzahliger Variablen steht. + +Dann sollte es sinnvoll sein, den Funktionsaufruf + + + (f 3 4) + + +zu schreiben, so daß man dadurch den Wert dieses Funktionsaufrufs berechnen kann; +z.B. könnte "(summe 3 4) = 7" gelten. + +Wenn man "2x + y" als Funktion ansieht, kann man den Funktionsaufruf + + + ((2x + y) 3 4) + + +schreiben. Der Wert dieses Ausdrucks ist aber nicht eindeutig bestimmt, denn es ist +überhaupt nicht klar, ob nun "2*3+4" oder 2*4+3" gemeint ist. Eine Zeichenfolge +wie "2x + y" werden wir deshalb Ausdruck und nicht Funktion nennen. Ein Ausdruck +kann in eine Funktion umgewandelt werden, indem man die Zuordnung von Argumen­ +ten und Variablen festlegt. Bei "2x + y" könnte man beispielsweise festlegen, daß +"x" immer das erste und "y" immer das zweite Argument sein soll. +Wenn "a" ein Ausdruck in den Variablen x1, ... xn ist, dann ist + + + (lambda (x1 ... xn) a) + + +eine Funktion mit n Argumenten. Den Wert der Funktionsaufrufe mit dieser Funktion +(also der Ausdrücke der Form + + + ((lambda (x1 ... xn) a) (b1 ... bn)) + erhält man, indem man die Variablen x1 ... xn durch die n Argumente des Aufrufs +ersetzt. Beispielsweise ist + + + ((lambda (x y) (2*x + y)) (3 4)) = 2*3 + 4 = 10 , + + +während + + + ((lambda (y x) (2*x + y)) (3 4)) = 2*4 + 3 = 11 + + +ist. + +Die Variablen in einem Lambdaausdruck sind sogenannte Parameter (oder gebundene +Variable). Interessant ist, daß eine Funktion sich nicht ändert, wenn man eine Variable +systematisch durch eine andere Variable ersetzt, die nicht bereits im Lambdaausdruck +vorkommt. + + + (lambda (x y) (2*y + x)) + + +ist also dasselbe wie + + + (lambda (u v) (2*v + u)) . + + +Manchmal werden wir Ausdrücke benutzen, in denen eine Variable nicht durch das +Lambda gebunden ist. Beispielsweise ist das n in + + + (lambda (x y) (x*n + y*n)) + + +nicht gebunden. Eine solche nicht gebundene Variable nennt man frei. +Wenn für eine freie Variable vor der Benutzung kein Wert vereinbart wurde, ist der +Wert des Funktionsaufrufs nicht definiert, falls der Wert der Variablen auf das Ergeb­ +nis einen Einfluß hat. + +Die Lambdanotation reicht allein für die Definition rekursiver Funktionen nicht aus. +Neben den Variablen muß auch der Name der Funktion gebunden werden, weil er +innerhalb der Funktion für eine Zeichenfolge steht. + +Wir hatten die Funktion "firstatom" durch die Gleichung + + + (firstatom x) = (cond ((atom x) x) + (T (firstatom (head x))) + ) + + +definiert. Mit der Lambda-Notation können wir schreiben: + + + firstatom = (lambda (x) (cond ((atom x) x) + (T (firstatom (head x))) + ) ) + + + +Das Gleichheitszeichen ist in Wirklichkeit nicht Teil der LISP-Sprache, sondern eine +Krücke, die wir nicht mehr brauchen, wenn wir die richtige Schreibweise eingeführt +haben. + +Die rechte Seite der obigen Gleichung ist als Funktion nicht vollständig, da dort nichts +darauf hinweist, daß das "firstatom" im einem bedingten Ausdruck für eben die rechte +Seite steht. Deshalb ist die rechte Seite als Definition für die linke Seite ("firstatom") +noch nicht geeignet. + +Damit wir Definitionen schreiben können, in denen der Name der gerade definierten +Funktion auftaucht, führen wir die Label-Notation ein (engl. label = Marke, (Preis-) +Schildchen). Wenn "a" eine Funktion ist, und "n" ihr Name, schreiben wir "(label n +a)". + +Nun können wir die Funktion "firstatom" ohne Gleichheitszeichen schreiben: + + + (label firstatom (lambda (x) (cond ((atom x) x) + (T (firstatom (head x))) + ) ) ) + + +In dieser Definition ist "x" eine gebundene Variable und "firstatom" ein gebundener +Funktionsname. +#page# + +2. Das LISP-Interpreter-System#goalpage("p2")# + + + +2.1 Die universelle LISP-Funktion + "evalquote" #goalpage("p2.1")# + + + +Ein Interpreter oder eine allgemeine Funktion ist eine Funktion, die den Wert jedes +gegebenen Ausdrucks berechnen kann, wenn der Ausdruck in einer geeigneten Form +vorliegt. (Wenn der zu interpretierende Ausdruck einen Aufruf einer unendlich rekur­ +siven Funktion enthält, wird der Interpreter natürlich ebenfalls unendlich rekursiv.) +Wir sind jetzt in der Lage, eine allgemeine LISP-Funktion + + + (evalquote function arguments) + + +zu definieren. "evalquote" muß als erstes Argument ein LISP-Ausdruck übergeben +werden. Dieser wird als Funktion aufgefasst und auf die folgenden Argumente ange­ +wendet. + +Im Folgenden sind einige nützliche Funktionen zur Manipulation von LISP-Aus­ +drücken angegeben. Einige von ihnen werden als Hilfsfunktionen für die Definition von +"evalquote" gebraucht, die wir uns vorgenommen haben. + + + (equal x y) + + +ist ein Prädikat, das wahr ist, wenn seine Argumente gleiche LISP-Ausdrücke sind. +(Das elementare Prädikat "eq" ist ja nur für Atome definiert.) + +Die Definition von "equal" ist ein Beispiel für einen bedingten Ausdruck innerhalb +eines bedingten Ausdrucks. + + +(label equal + (lambda (x y) + (cond + ((atom x) (cond + ((atom y) (eq x y)) + (T F) + ) + ) + ((equal (head x) (head y)) (equal (tail x) (tail y))) + (T F) + ) + ) +) + + + +Folgende Funktion liefert einen LISP-Ausdruck, der gleich mit "destination" ist, +außer daß darin überall statt "old" "new" steht. + + +(changeall (destination old new)) + += (cond ((equal destination old) new) + ((atom destination) destination) + (T (cons (changeall (head destination) old new) + (changeall (tail destination) old new) + ) + ) + ) + + +Beispielsweise gilt + + +(changeall ((A . B) . C) B (X . A)) = ((A . (X . A)) . C) + + +Die folgenden Funktionen sind nützlich, wenn Listen verarbeitet werden sollen. + +1. (append x y) + hängt an die Liste "x" den LISP-Ausdruck "y". + + + (append x y) = + (cond ((null x) y) + (T (cons (head x) (append (tail x) y) )) + ) + + +2. (member list pattern) + Dies Prädikat testet, ob der LISP-Ausdruck "pattern" in der Liste "list" vor­ + kommt. + + + (member list pattern) = + (cond ((null list) F) + ((equal (head list) pattern) T) + (T (member (tail list) pattern)) + ) + + +3. (pairlist list1 list2 oldpairlist) + Diese Funktion liefert eine Liste von Paaren, die die sich entsprechenden Elemen­ + te der Listen "list1" und "list2" enthalten, und an der noch die Liste "oldpairlist" + hängt. + + + + (pairlist list1 list2 oldpairlist) = + (cond ((null list1) oldpairlist) + (T (cons (cons (head list1) (head list2)) + (pairlist (tail list1) (tail list2) oldpairlist) + ) + ) + ) + + +Beispiel: + (pairlist (A B C) (U V W) ((D . X) (E . Y)) ) = + ((A . U) (B . V) (C . W) (D . X) (E . Y)) + + +Eine solche Liste von Paaren wird auch Assoziationsliste genannt, wenn das erste +Element jedes Paars ein Atom ist, das über diese Liste mit dem zweiten Element +assoziiert ist. + +5. (association pattern associationlist) + Wenn "association list" eine Assoziationsliste wie oben beschrieben ist, liefert + "association" das Paar der Liste, dessen erstes Element "pattern" ist. Es ist also + eine Funktion zum Durchsuchen von Tabellen. + + + (association pattern alist) = + (cond ((eq (head (head alist)) pattern) (head alist)) + (T (association pattern (tail alist))) + ) + +Beispiel: + +(association B ( (A . (M N)) + (B . (HEAD X)) + (C . (QUOTE M)) + (B . (TAIL X)) + ) ) = (B . (HEAD X)) + + +(replace expr alist) + "alist" muß eine Assoziationsliste sein. "replace" produziert einen Ausdruck, der + "expr" sehr ähnlich ist, nur sind alle Atome darin durch den LISP-Ausdruck + ersetzt, mit dem sie in "alist" assoziiert sind. + + + (replace expr alist) = + (cond ((atom expr) (association expr alist)) + (T (cons (replace (head expr) alist) + (replace (tail expr) alist) + ) + ) + ) + +Beispiel: + + (replace (X SCHRIEB Y) + ((Y . (GOETZ VON BERLICHINGEN)) (X . GOETHE)) + ) + + = (GOETHE SCHRIEB (GOETZ VON BERLICHINGEN)) + + + +Die allgemeine Funktion "evalquote", die wir jetzt definieren wollen, gehorcht der +folgendem Beispiel zugrundeliegenden Regel: + + +Beispiel: + (evalquote +Funktion: (LAMBDA (X Y) (CONS (HEAD X) Y) ) +Argumente: (A B) (C D) + ) += + (apply +Funktion: (LAMBDA (X Y) (CONS (HEAD X) Y)) +Argumentliste: ((QUOTE (A B)) (QUOTE (C D))) +Bindung: NIL + ) + + +Die Argumente von "evalquote" werden also zu einer gequoteten Argumentliste von +"apply". Die QUOTE-Funktion bewirkt, daß das Argument der QUOTE-Funktion +wörtlich genommen, also nicht weiter evaluiert wird. Das dritte Argument von "apply", +das NIL ist eine leere Bindeliste zur Bindung von Parametern und Argumenten im +nächsten Schritt: + + += + (eval +Argumente: (CONS (HEAD X) Y) +Bindung: ((X.(A B)) (Y . (C D))) + ) += + (cons (head (A B)) (C D)) += + (A C D) = Ergebnis von "evalquote" . + + +"evalquote" wird hauptsächlich durch die Hilfsfunktion "apply" definiert. "apply" +berechnet Funktionsaufrufe, indem es die Argumente und die Parameter der Funktion +bindet und den Funktionsrumpf berechnet. Die Bindungen werden in einer Assozia­ +tionsliste, der Bindeliste, gespeichert. Da bedingte Ausdrücke und Konstanten formal +wie Funktionsaufrufe von Funktionen "cond" und "quote" aussehen, werden sie auch +so behandelt. + +Wir definieren also: + + + (evalquote fkt expr) = (apply fkt (quote expr) NIL) . + + +sowie : + + + (eval expr binding) = + (cond ((atom expr) (tail (association expr binding))) + (T (apply (head expr) (tail expr) binding)) + ) + + +"eval" stellt also erst fest, ob es sich um ein Atom oder um einen Funktionsaufruf +handelt. Da es nur diese beiden Möglichkeiten gibt, ist diese Einteilung vollständig. + +Atome sind immer Übersetzungen von Variablen, für die eine Bindung existieren muß, +so daß ihr Wert aus der Bindeliste geholt wird. + +Funktionsaufrufe sind immer Listen; im zweiten Zweig werden die Funktion und die +Parameterliste getrennt und an "apply" übergeben. + +Um sich die Aktionen in diesem zweiten Zweig von "eval" genauer vorstellen zu +können, ist vielleicht die in Abschnitt 1.1 beschriebene graphische Darstellungsmetho­ +de hilfreich; beispielsweise würde sich ein Lambda-Ausdruck so ausnehmen: + + + +-----+-----+ +-----+-----+ +-----+-----+ + | o | o--+-->| o | o--+-->| o | o--+-->NIL + +--+--+-----+ +--+--+-----+ +--+--+-----+ + | | | + V V V + LAMBDA Parameterliste Ausdruck + + +"apply" bekommt nun von "eval" eine Funktion und eine Parameterliste sowie die +Bindeliste übergeben. Mit diesen beiden macht es folgendes: + + + (apply fn args binding) = +(cond + ((atom fn) + (cond ((eq fn HEAD) (head (eval (head args) binding))) + ((eq fn TAIL) (tail (eval (head args) binding))) + ((eq fn CONS) (cons (eval (head args) binding) + (eval (head (tail args)) binding) + ) ) + ((eq fn ATOM) (atom (eval (head args) binding))) + ((eq fn EQ) (eq (eval (head args) binding) + (eval (head (tail args)) binding) + ) ) + ((eq fn QUOTE) (head args)) + ((eq fn COND) (evalcond args binding)) + (T (apply (tail (association fn binding)) args binding)) + ) + ((eq (head fn) LABEL) + (apply (head (tail (tail fn))) + args (cons (cons (head (tail fn)) + (head (tail (tail fn))) + ) + binding) + ) ) + ((eq (head fn) LAMBDA) (eval (head (tail (tail fn))) + (pairlist (head (tail fn)) + args binding) + ) ) +) + + + + + + +Das erste Argument von "apply" ist eine Funktion (unter der Voraussetzung, daß +"quote" und "cond" als Funktionen anerkannt werden). + +Wenn es eine der elementaren Funktionen "head", "tail", "cons", "atom" oder "eq" +ist, wird die jweilige Funktion auf die Argumente angewandt, die vorher berechnet +werden. Diese Berechnung erfolgt mit "eval", das ja für Variablen Werte aus der +Bindeliste liefert und für Funktionsaufrufe das, was "apply" mit ihnen machen kann. + +Wenn es sich um "quote" handelt, wird das erste Argument unverändert geliefert +"quote" heißt ja "dies ist eine Konstante, die so, wie sie da steht, übernommen wer­ +den soll". + +Wenn es sich um "cond" handelt, wird die Funktion "eval cond" aufgerufen, doch +auch ihre Argumente werden nicht berechnet, außerdem gehört die Assoziationsliste +zu den Argumenten: + + + eval (cond condlist, binding) = + (cond ((eval (head (head condlist)) binding) + (eval (head (tail (head condlist))) binding) + ) + (T (cond (tail condlist) binding)) + ) + + + +Hier empfiehlt es sich, einen bedingten Ausdruck in graphischer Form hinzuschreiben +und die Auswertung anhand der Zeichnung nachzuvollziehen. + +Wenn die Funktion nichts von alledem ist, wird in der Bindeliste nachgesehen, ob +dies Atom nicht an eine Funktion gebunden ist; falls ja, wird eine Auswertung dieser +Funktion mit den gleichen Argumenten versucht. + +Wenn das erste Argument von "apply" kein Atom ist, muß es ein LABEL- oder ein +LAMBDA-Ausdruck sein. + +Ein LABEL-Ausdruck hat die Form + + + +-----+-----+ +-----+-----+ +-----+-----+ + | o | o--+-->| o | o--+-->| o | o--+--> NIL + +--+--+-----+ +--+--+-----+ +--+--+-----+ + | | | + V V V + LABEL Name Funktion + + +Funktionsname und Definition werden in einem funktionalen Eintrag in die Bindeliste +eingefügt, so daß der Name an die Funktion gebunden ist. + +Ein LAMBDA-Ausdruck hat die Form + + + +-----+-----+ +-----+-----+ +-----+-----+ + | o | o--+-->| o | o--+-->| o | o--+--> NIL + +--+--+-----+ +--+--+-----+ +--+--+-----+ + | | | + V V V + LAMBDA Parameterliste Ausdruck + + +Dabei ist die Parameterliste eine Liste von Atomen, den Parametern. Die Auswertung +läuft so ab, daß die Parameter durch "pairlist" an die Argumente gebunden werden +und mit dieser neuen Bindeliste der Ausdruck berechnet wird. + +Das EUMEL-LISP bietet eine Reihe weiterer Möglichkeiten, die erst später beschrie­ +ben werden. Hier können wir allerdings schon die folgenden Punkte abhandeln: + +1. Jede LISP-Eingabe ist ein LISP-Ausdruck. Der "head" dieses Ausdrucks wird + als Funktion aufgefaßt und auf den gequoteten "tail" des Ausdrucks, nämlich die + nicht zu evaluierenden Argumente angewandt. Die Übersetzung von Kleinbuchsta­ + ben in Großbuchstaben wird vom LISP-System übernommen. + +2. In der Theorie des reinen LISP müssen alle Funktionen außer den fünf Basisfunk­ + tionen an allen Stellen wieder definiert werden, an denen sie aufgerufen werden. + Das ist eine für die Praxis äußerst unhandliche Regelung; das EUMEL-LISP- + System kennt weitere vordefinierte Funktionen und bietet die Möglichkeit, beliebig + viele weitere Standardfunktionen einzuführen, auch solche Funktionen, deren + Argumente nicht berechnet werden (wie "quote") oder solche, die beliebig viele + Argumente haben dürfen (wie "cond"). + +3. Die Basisfunktion "eq" hat immer einen wohldefinierten Wert, dessen Bedeutung + im Fall, daß Nicht-Atome verglichen werden, im Kapitel über Listenstrukturen + erklärt wird. + +4. Außer in sehr seltenen Fällen schreibt man nicht (quote T), (quote F) oder (quote + NIL), sondern T, F und NIL. + +5. Es besteht die Möglichkeit, mit Ganzzahlen zu rechen, die als weiterer Typ von + Atomen gelten. Außerdem können TEXTe und Einzelzeichen (CHARACTERs) + gespeichert werden. + +6. Es besteht die Möglichkeit der Ein- und Ausgabe von LISP-Ausdrücken, Ganz­ + zahlen, TEXTen und CHARACTERs. + +WARNUNG: Die oben angegebenen Definitionen von "eval" und "apply" dienen nur + pädagogischen Zwecken und sind nicht das, was wirklich im Interpreter + abläuft. + Um zu entscheiden, was wirklich vor sich geht, wenn der Interpreter + aufgerufen wird, sollte man sich an die ELAN-Quellprogramme halten. +#page# + +2.2 Anwendungsregeln und Beispiele #goalpage("p2.2")# + + + +Die Funktionsweise des LISP-Interpreteres kann bequem unter Verwendung der +Funktion "trace" verfolgt werden. Der Aufruf: + + + (trace) + + +schaltet den Trace-Protokollmodus des Interpreters ein bzw. aus. + +Das folgende Beispiel ist ein LISP-Programm, das die drei Funktionen "union", +"intersection" und "member" als Standardfunktionen einführt Die Funktionen lauten +folgendermaßen: + + + (member pattern list) = (cond ((null list) F) + ((eq (head list) pattern) T) + (T (member pattern (tail list))) + ) + + (union x y) = (cond ((null x) y) + ((member (head x) y) (union (tail x) y)) + (T (cons (head x) (union (tail x) y))) + ) + + (intersection x y) = (cond ((null x) NIL) + ((member (head x) y) + (cons (head x) (intersection + (tail x) y)) + ) + (T (intersection (tail x) y)) + ) + + +Um die Funktionen als neue Standardfunktionen einzuführen, benutzen wir die Pseu­ +dofunktion "define": + + + (DEFINE + (MEMBER . (LAMBDA (PATTERN LIST) + (COND ((NULL LIST) F) + ((EQ (HEAD LIST) PATTERN) T) + (T (MEMBER PATTERN (TAIL LIST))) + ) ) ) + (UNION . (LAMBDA (X Y) + (COND ((NULL X) Y) + ((MEMBER (HEAD X) Y) (UNION (TAIL X) Y)) + (T (CONS (HEAD X) (UNION (TAIL X) Y))) + ) ) ) + (INTERSECTION . (LAMBDA (X Y) + (COND ((NULL X) NIL) + ((MEMBER (HEAD X) Y) + (CONS (HEAD X) (INTERSECTION (TAIL + X) Y)) + ) + (T (INTERSECTION (TAIL X) Y)) + ) ) ) + ) + + +Die Funktion DEFINE, liefert als Pseudofunktion nicht nur einen LISP-Ausdruck als +Ergebnis, sondern hat auch einen bleibenden Effekt, nämlich eine Veränderung im +LISP-Heap. + +DEFINE hat beliebig viele Parameter der Form (Name . Funktion) und bewirkt, daß die +Funktionen unter dem jeweiligen Namen im System verfügbar werden, also für die +weitere Programmausführung definiert werden. Das Ergebnis von DEFINE ist eine +Liste der neuen Funktionsnamen, also hier + + + (MEMBER UNION INTERSECTION) + + +Der Wert den der LISP-Interpreter bei Eingabe von + + + (intersection (a1 a2 a3) (a1 a3 a5)) + + +liefert ist (A1 A3) , + + +Die Funktion + + + (union (x y z) (u v w x)) + + +liefert (Y Z U V W X) . + + + +Es folgen einige elementare Regeln für LISP-Programme: + +1. Ein LISP-Programm besteht aus einem Funktionsaufruf. Im Beispiel ist das die + Funktion DEFINE, die ihre Parameter (beliebig viele) berechnet und ausgibt. Die + Berechnung der Parameter erfolgt dabei in der Reihenfolge der Parameter (norma­ + le LISP-Funktionen mit mehreren Parametern berechnen standardmäßig alle + Parameter, allerdings in irgendeiner Reihenfolge). + +2. LISP ist formatfrei, d.h. jedes Symbol kann in jeder Spalte stehen. Für die Bedeu­ + tung des Programms ist nur die Reihenfolge der Symbole maßgeblich. Zeilen­ + wechsel wird als Leerzeichen aufgefaßt. + +3. Atome müssen mit einem Buchstaben anfangen, damit sie nicht mit Zahlen ver­ + wechselt werden. + +4. Ein LISP-Ausdruck der Form (A B C . D) ist eine Abkürzung für (A.(B.(C.D))). + Jede andere Plazierung des Punkts ist ein Fehler (falsch wäre z.B. (A . B C) ). + +5. Eine Anzahl von Basisfuntionen existiert von Anfang an, ohne daß sie durch + DEFINE eingeführt wurden. Der Programmierer kann weitere Funktionen bleibend + oder für die Dauer eines Programmlaufs einführen; dabei ist die Reihenfolge der + neuen Funktionen gleichgültig. +#page# + +2.3 Variablen#goalpage("p2.3")# + + + +Eine Variable ist ein Symbol, das ein Argument einer Funktion repräsentiert. Man +kann also schreiben: "a + b, wobei a = 3 und b = 4". In dieser Situation ist keine +Verwechslung möglich, so daß klar ist, daß das Ergebnis 7 ist. Um zu diesem Ergeb­ +nis zu kommen, muß man die Zahlen anstelle der Variablen einsetzen und die Opera­ +tion ausführen, d.h. die Zahlen addieren. + +Ein Grund, weshalb das eindeutig ist, liegt darin, daß "a" und "b" nicht "direkt" +addiert werden können, so daß etwa "ab" entsteht. In LISP kann die Situation viel +komplizierter sein. Ein Atom kann eine Variable oder ein Atom sein. + +Sollte der zukünftige LISP-Benutzer an dieser Stelle entmutigt sein, sei ihm gesagt, +daß hier nichts Neues eingeführt wird. Dieser Abschnitt ist nur eine Wiederholung der +Überlegungen aus Abschnitt 1.4. Alles, was wir in diesem Abschnitt sagen, kann man +aus den Regeln für LISP-Ausdrücke oder aus der allgemeinen Funktion "evalquote" +ableiten. + +Der Formalismus, der in LISP die Variablen kennzeichnet, ist die Lambdanotation von +Church. Der Teil des Interpreters, der die Variablen an Werte bindet, heißt "apply". +Wenn "apply" auf eine Funktion stößt, die mit LAMBDA anfängt, wird die Variablenli­ +ste (Argumentliste) mit der Parameterliste gepaart und am Anfang der Bindeliste +eingefügt. + +Während der Berechnung des Funktionsrumpfs müssen manchmal Variablen durch +ihre Werte ersetzt werden. Das geschieht dadurch, daß ihr Wert in der Bindeliste +nachgesehen wird. Wenn eine Variable mehrmals gebunden wurde, wird die zuletzt +etablierte Bindung verwendet. Der Teil des Interpreters, der diese "Berechnungen" +und die Berechnung von Funktionsaufrufen durchführt, heißt "eval". + + + +#page# + +2.4 Konstanten#goalpage("p2.4")# + + + +Manchmal heißt es, eine Konstante stehe für sich selbst, im Gegensatz zu einer +Variablen, die für etwas anderes, nämlich ihren Wert, steht. +Dies Konzept funktioniert in LISP nicht so ohne weiteres; es ist hier sinnvoller, zu +sagen, eine Variable ist konstanter als die andere, wenn sie in einer höheren Ebene +gebunden ist und ihren Wert seltener ändert. +In LISP bleibt eine Variable im Bereich des LAMBDA konstant, von dem sie gebunden +ist. Wenn eine Variable einen festen Wert hat, unabhängig davon, was in der Bindeli­ +ste steht, wird sie (echte) Konstante genannt. Dies wird mit Hilfe der Eigenschaftsliste +(E-Liste) des Atoms erreicht. +Jedes Atom hat eine E-Liste, in der Paare von Atomen und beliebigen Strukturen +gespeichert sind. Ein Atom hat die Eigenschaft A, wenn in seiner E-Liste ein Paar +mit dem Atom A enthält; die dazugehörige "beliebige Struktur" heißt Wert dieser +Eigenschaft. +Wenn ein Atom die Eigenschaft APVAL besitzt, ist es eine Konstante, deren Wert der +Wert der Eigenschaft ist. +Konstanten können durch die Pseudofunktion + + + (set atom wert) + + +gesetzt werden; nach der Auswertung eines solchen Aufrufs hat das Atom "atom" +immer den Wert "wert" - bis zum nächsten "set". Eine interessante Klasse von +Konstanten sind solche Konstanten, die sich selbst als Wert haben. Ein Beispiel dafür +ist NIL. Der Wert dieser Konstanten ist wieder NIL. Daher kann NIL nicht als Variable +benutzt werden, da es ja eine Konstante ist. (T und F gehören ebenfalls zu dieser +Klasse). + +#page# + +2.5 Funktionen#goalpage("p2.5")# + + + +Wenn ein LISP-Ausdruck für eine Funktion steht, ist die Situation ähnlich der, in der +ein Atom für einen Wert steht. Wenn die Funktion rekursiv ist, muß sie einen Namen +bekommen. Das geht mit einem LABEL-Ausdruck, der den Namen mit der Funk­ +tionsdefinition in der Bindeliste paart. Dadurch wird der Name an die Funktionsdefini­ +tion gebunden, so wie eine Variable an ihren Wert gebunden wird. In der Praxis setzt +man LABEL selten ein. Normalerweise ist es einfacher, Name und Definition wie bei +den Konstanten zu verknüpfen. Dies geschieht mit der Pseudofunktion DEFINE, die +wir am Anfang des Kapitels benutzt haben. +Diese Funktion kann beliebig viele Parameter der Form + + + (atom . funktion) + + +haben, wobei "atom" der Name der zu definierenden Funktion "funktion" werden soll. +Sie bewirkt, daß die Definition unter der Eigenschaft FUNCTION in der E-Liste des +Atoms abgelegt wird. +#page# + +3. Erweitertes LISP#goalpage("p3")# + + +In diesem Kapitel werden wir einige Erweiterungen zum reinen LISP einführen. Zu +diesen Erweiterungen gehören Möglichkeiten für Arithmetik, Zeichenkettenverarbei­ +tung, Funktionen, die spezielle Argumente erwarten, und Ein- und Ausgabe. + +In allen Fällen handelt es sich bei den Erweiterungen um zusätzliche Funktionen. So +heißt das Kommando für die Ausgabe eines LISP-Ausdrucks PUT. Syntaktisch ist +PUT nichts anderes als eine Funktion mit einem Argument. Sie kann mit anderen +Funktionen verkettet werden, und diese Verkettung wird ganz auf die übliche Art +behandelt, zuerst Berechnung der innern, dann der äußeren Funktionsaufrufe. Ein +Ergebnis ist nur in dem trivialen Sinn vorhanden, daß PUT sein Argument wieder +liefert, also die Identität ist. + +Funktionen, die eine Aktion wie Ein- oder Ausgabe bewirken, oder die Langzeitwir­ +kung (gesehen auf die Ausführungsdauer des Programms) haben, wie DEFINE und +SET, heißen Pseudofunktionen. Es ist eine Besonderheit von LISP, daß alle Funktio­ +nen einschließlich den Pseudofunktionen ein Ergebnis haben müssen. In einigen +Fällen ist das Ergebnis trivial und kann ignoriert werden. + +In diesem Kapitel beschreiben wir verschiedene Erweiterungen der Sprache LISP, die +im System fest enthalten sind. + + +#page# + +3.1 Gequotete Parameter #goalpage("p3.1")# + + + +Bevor ein Argument an eine Funktion übergeben wird, wird erst sein Wert in der +Bindeliste nachgesehen, d.h. es wird nicht der Name der Variablen übergeben, son­ +dern ihr Wert. Wenn das Argument als Konstante behandelt werden soll, muß es +ge"quotet" werden, d.h. statt "argument" steht (quote argument). Wenn ein Argument +einer Funktion immer als Konstante behandelt werden soll, ist es bequemer, das +Argument nicht jedesmal zu quoten. Das EUMEL-LISP-System erlaubt, in diesem +Fall den formalen Parameter in der Funktionsdefinition bereits zu quoten. + +Dieser Mechanismus wurde auch benutzt, um QUOTE zu implementieren; die Funk­ +tion lautet + + + quote = (lambda ((QUOTE x)) x) + + + + +#page# + +3.2 Funktionen mit beliebig vielen + Argumenten #goalpage("p3.2")# + + + +Ein Beispiel ist "list", das beliebig viele Argumente haben kann, die zu einer Liste +zusammengefaßt werden. Da eine Funktion nur eine feste Anzahl von Parametern +haben kann, eine Funktion mit beliebig vielen Argumenten aber gewiß keine feste +Anzahl von Argumenten hat, werden die beliebig vielen Argumente zu einer Liste +zusammengefaßt und ein einziger Parameter wird an diese Liste gebunden. Da "list" +genau diese Liste liefern soll, wird diese Funktion ebenfalls zu einer "Identität": + + + list = (lambda ((INDEFINITE x)) x) + + +Solche Parameter werden durch INDEFINITE gekennzeichnet. Sie können auch ge­ +quotet werden, indem man (INDEFINITE QUOTE parameter) schreibt; das wirkt so, als +wären alle Argumente, die diesem Parameter zugeordnet werden, einzeln gequotet +worden. + + + evalquote = (lambda (fkt (INDEFINITE QUOTE expr)) + (apply fkt expr NIL) ) + + + +#page# + +3.3 Funktionale Parameter #goalpage("p3.3")# + + + +In der Mathematik gibt es Funktionen, die andere Funktionen als Argument haben. In +der Algebra könnte man die Funktion "(operation operator a b)" definieren, wobei +"operator" ein funktionales Argument ist, das die Operation festlegt, die auf "a" und +"b" ausgeführt werden soll. Beispielsweise gilt + + + operation (+ 3 4) = 7 + operation (* 3 4) = 12 + + +In LISP sind funktionale Argumente sehr nützlich. Eine wichtige Funktion mit einem +Argument ist MAPLIST. Ihre Definition ist + + + (LAMBDA (LIST (FUNCTION FN)) + (COND ((NULL LIST) NIL) + (T (CONS (FN (HEAD LIST)) (MAPLIST (TAIL LIST) FN))) + ) ) + + +Diese Funktion nimmt eine Liste und eine Funktion als Argument und wendet die +Funktion auf die Listenelemente an. + + +#page# + +3.4 Prädikate und boolesche Konstanten #goalpage("p3.4")# + + + +Die booleschen Werte sind, wie in Kapitel 1 gesagt, T und F. Bei LISP-Ausdrücken +müßte daraus (quote T) und (quote F) werden, aber da die APVALs dieser Atome +wieder den Wert T und F haben, ist das quoten nicht nötig. + +Prädikate sind Funktionen, die T oder F als Ergebnis haben; es gibt also keine forma­ +len Unterschiede zwischen anderen Funktionen und Prädikaten. + +Daher ist es durchaus möglich, daß eine Funktion einen Wert liefert, der weder T +noch F ist, daß aber durch einen bedingten Ausdruck an dieser Stelle ein boolescher +Ausdruck verlangt wird. In diesem Fall ist die Wirkung des Ausdrucks nicht definiert. + +Das Prädikat EQ hat folgendes Verhalten: +1. Wenn seine Argumente verschieden sind, ist das Ergebnis F. +2. Wenn die Argumente dasselbe Atom sind, ist das Ergebnis T. +3. Wenn die Argumente gleich, aber nicht atomar sind, ist das Ergebnis T oder F, je + nachdem, ob sie ein und dasselbe Objekt im Heap sind oder nicht. + +#page# + +3.5 Unbenannte Atome #goalpage("p3.5")# + + + +Die meisten Atome im EUMEL-LISP haben einen Namen, der sie bei Ein- und +Ausgabeoperationen identifiziert. +Es gibt aber auch Atome, die keinen Namen haben und stattdessen durch ihre Werte +repräsentiert werden. Momentan sind das Ganzzahlen und Zeichenketten (TEXTe); +auch die booleschen Werte kann man in einem weiteren Sinn dazurechnen. + + + + +3.5.1 Ganzzahlen + + + +Im EUMEL-LISP gibt es Funktionen, die Basisoperationen und Tests durchführen. + +Ganzzahlen haben folgende Eigenschaften: + +1. Eine Ganzzahl besteht aus einem optionalen Vorzeichen und einer Folge von + Ziffern; zwischen Vorzeichen und Ziffern können Leerzeichen stehen. +2. Der Wert einer Ganzzahl liegt zwischen -32768 und 32767 (minint und maxint). +3. Eine Ganzzahl kann überall dort stehen, wo ein Atom stehen kann, außer als + Parameter. +4. Ganzzahlen sind Konstanten; sie brauchen also nicht gequotet werden. +#page# + +3.5.2 Arithmetische Funktionen und Prädikate + + + +Es folgt eine Liste aller arithmetischen Funktionen. +Wenn ein Argument einer dieser Zahlen keine Ganzzahl ist, erfolgt eine Fehlermel­ +dung. + + (sum x1 ... xn) liefert die Summe der xi; wenn keine Argumente gege­ + ben werden, wird 0 geliefert. + (difference x y) liefert die Differenz von x und y. + (product x1 ... xn) liefert das Produkt seiner Argumente; wenn + keine Argumente gegeben werden, wird 1 + geliefert. + (quotient x y) liefert den Quotienten von x und y, ohne den + Rest zu berücksichtigen. + (remainder x y) liefert den Rest der Division von x und y. + (getint) liest eine Zahl vom Bildschirm ein und + liefert sie. + (putint x) gibt x auf den Bildschirm aus. Identitäts funktion. + + + + + +3.5.3 Zeichenkettenverarbeitung + + + +Im Moment ist nur Zeichenketten-Ein- und Ausgabe implementiert. +Die Ausgabe löst bei Argumenten, die keine Zeichenketten sind, eine Fehlermeldung +aus. + + (gettext) liest eine Zeichenkette ein und liefert sie. + (puttext x) gibt eine Zeichenkette aus. + + + + +3.5.4 Test auf Gleichheit + + + + (equal x y) testet, ob x und y vom gleichen Typ sind, und wenn ja, ob sie gleich + sind. +#page# + +3.6 Aufruf von EUMEL aus #goalpage("p3.6")# + + +Bevor man den LISP-Interpreter benutzen kann, muß er folgendermaßen implemen­ +tiert werden: + +archive ("lisp") +fetch all (archive) +release (archive) +check off +insert ("lisp.1") +insert ("lisp.2") +insert ("lisp.3") +insert ("lisp.4") +check on + + +Das LISP-System verfügt über einen Heap, in dem alle LISP-Ausdrücke gespei­ +chert sind. Standardmäßig enthält der Heap eine Reihe von Funktionen, die nicht in +den LISP-Programmen definiert werden müssen (Übersichten über die Standardfunk­ +tionen siehe Kapitel 3.5). + +Mit + lisp + +wird das LISP-System im EUMEL-Dialog gestartet. In einem Eingabefenster wird +mit Hilfe des Paralleleditors eine LISP-EINGABE-Möglichkeit angeboten. Die Aus­ +gabe erfolgt in dem LISP-AUSGABE-Fenster. +Das LISP-System kann folgendermaßen verlassen werden: + break lisp . + +Statt dieser direkten Art der Benutzung der LISP-Maschine ist auch eine an ELAN +angelehnte Art mit den Prozeduren "run lisp", insert lisp" usw. vorgesehen: + +Mit + + run lisp (TEXT CONST dateiname) + +wird eine Kopie des Heaps angelegt, das Programm aus der Datei "dateiname" in die +Kopie eingelesen und gestartet. Durch diesen Kopiermechanismus wird der Original­ +heap vor Zusammenbrüchen des LISP-Systems geschützt. + + insert lisp (TEXT CONST dateiname) + +bewirkt dasselbe wie "run lisp"; allerdings wird jetzt direkt auf dem Originalheap +gearbeitet. Dadurch sind alle Änderungen im Heap, die das Programm verursacht +(meist Definition von Funktionen durch DEFINE) bleibend, aber auch ein Zusammen­ +bruch ist insoweit endgültig, als das LISP-System jetzt neu gestartet werden muß. +Das geschieht mit + + start lisp system (DATASPACE CONST dsname) + +"dsname" gibt dabei den Datenraum an, der die zum Hochfahren notwendigen Daten +enthält. Solche Daten im richtigen Format enthält der Datenraum "lisp.bootstrap". +Wenn der zuletzt benutzte Heap mit nicht mehr durch LISP-Programme erreich­ +bare Strukturen vollgestopft ist, schafft die Prozedur + + collect lisp heap garbage + +Abhilfe; mit + + lisp storage info + +kann man den Erfolg kontrollieren. +#page# + +4. Detailbeschreibungen#goalpage("p4")# + + + + + +4.1 Grundfunktionen #goalpage("p4.1")# + + + +Die Datei "lisp.1" enthält ein Paket, das die Grundlage des LISP-Systems bildet. Es +implementiert + + - die primitiven LISP-Funktionen wie "cons", "null", etc., + - die Verwaltung des Heaps, in dem die LISP-Strukturen und die Objektliste + (Oblist) gespeichert sind, + - einen Datentyp SYM, dessen Wertevorrat aus Zeigern auf die im Heap gespei­ + cherten Strukturen besteht, + - Funktionen zur Konversion allgemeiner Daten in LISP-Strukturen (bisher reali­ + siert: TEXT <--> SYM und INT <--> SYM). + +Durch die Implementation der Basisoperationen als exportierte und damit allgemein +verfügbare ELAN-Prozeduren ist es möglich, LISP-Strukturen durch ELAN-Prog­ +ramme zu manipulieren; insbesonders können ELAN- und LISP-Programme über +diese Strukturen miteinander kommunizieren. + +Anmerkung: +Wenn Eigenschaften von "SYM"-Objekten beschrieben werden, sind immer die +Eigenschaften der Strukturen gemeint, auf die die Objekte zeigen, wenn nichts ande­ +res angegeben wird. + + +Es werden folgende Prozeduren exportiert: + + PROC initialize lisp system (DATASPACE CONST new heap): + "new heap" ist der neue Datenraum, in dem der LISP-Heap ab sofort geführt + wird. + Vorsicht: Beim Wechsel zu einem neuen Datenraum sind die Werte der + SYM-Variablen, die auf Strukturen im alten Heap zeigen, natürlich wertlos! + + PROC dump lisp heap (FILE VAR f): + In "f" wird ein Dump des Heaps erstellt. Dieser Dump ist nur mit Kenntnis des + Programmtextes aus "lisp 1" verständlich; er wird hier nicht beschrieben. + + PROC lisp storage (INT VAR size, used): + Nach dem Aufruf gibt "size" die maximal verfügbare Anzahl von Knoten an, + während "used" die Anzahl der tatsächlich von LISP-Strukturen belegten + Knoten enthält. Zu diesen Strukturen können auch solche zählen, die nicht mehr + durch "head" oder "tail" etc. erreichbar sind. + + PROC collect lisp heap garbage: + Löscht die im LISP-Heap nicht mehr durch "atom (TEXT CONST)", "proper­ + ty", "head" und "tail" erreichbaren Strukturen. Es werden auch alle nur von + ELAN-Programmen aus über SYM-Variable erreichbare Strukturen gelöscht, so + daß die Werte dieser Variablen undefiniert werden. + Die Müllabfuhr wird von keiner Prozedur dieses Pakets aufgerufen, d.h. der + Benutzer, der ELAN-Programme einsetzt, braucht nicht alle Strukturen in den + Eigenschaftslisten von Atomen aufzubauen, um sie vor einer versehentlichen + Löschung durch die Müllabfuhr zu schützen, vorausgesetzt, er ruft sie nicht + selbst auf. Er muß allerdings darauf achten, daß im Heap noch genug Platz + bleibt. + + OP := (SYM VAR left, SYM CONST right): + Nach der Zuweisung zeigt "left" auf die gleiche Struktur wie vorher "right". + + SYM CONST nil, pname; + Zwei Konstanten, die dem LISP-System ständig zur Verfügung stehen müs­ + sen. Ihre Drucknamen sind "NIL" bzw. "PNAME" (vgl. Schlußbemerkungen) + + SYM PROC head (SYM CONST sym): + Entspricht der im Handbuch beschriebenen Funktion "head". + + SYM PROC tail (SYM CONST sym): + Entspricht der im Handbuch beschriebenen Funktion "tail". + + SYM PROC cons (SYM CONST head, tail): + Liefert einen SYM-Wert "zeiger" auf eine neue Struktur. Es gilt: + head ("zeiger") = "head" und tail ("zeiger") = "tail". + + BOOL PROC eq (SYM CONST sym 1, sym 2): + Prüft, ob "sym 1" und "sym 2" auf dieselbe Struktur zeigen. Das ist genau dann + der Fall, wenn sie durch Zuweisung auseinander hervorgegangen sind oder wenn + sie auf das gleiche benannte Atom zeigen. + + BOOL PROC equal (SYM CONST sym 1, sym 2): + Prüft, ob "sym 1" und "sym 2" dieselbe Struktur haben; "dieselbe Struktur" + braucht aber nicht "Identität" zu bedeuten, wie "eq" das verlangt. + Umgewandelte TEXTe und INTs werden richtig verglichen (siehe "sym (INT + CONST)" und "sym (TEXT CONST)"). + + BOOL PROC null (SYM CONST sym): + Prüft, ob "sym" gleich der Konstanten "NIL" ist (entspricht + eq ("sym", "NIL"), ist aber schneller). + + BOOL PROC atom (SYM CONST sym): + Prüft, ob "sym" ein ( benanntes oder unbenanntes) Atom ist. + + BOOL PROC is named atom (SYM CONST sym): + Prüft, ob "sym" ein benanntes Atom ist. + + PROC begin oblist dump: + Vorbereitung für "next atom". + + SYM PROC next atom: + Liefert das nächste Atom aus der Objektliste. In der Objektliste sind alle benann­ + ten Atome, die der Heap enthält, aufgeführt (bis auf Ausnahmen; s."delete + atom"). "NIL" wird immer als letzte Atom geliefert. + + SYM PROC atom (TEXT CONST name): + Liefert einen Zeiger auf das Atom mit dem Namen "name". Wenn kein solches + Atom in der Objektliste vorhanden ist, wird "NIL" geliefert. + + SYM PROC new atom (TEXT CONST name): + Liefert einen Zeiger auf das Atom mit dem Namen "name". Wenn kein solches + Atom in der Objektliste vorhanden ist, wird ein neues mit diesem Namen in sie + eingefügt. + + PROC create atom (TEXT CONST name): + Fügt ein Atom mit dem Namen "name" in die Objektliste ein. Wenn ein solches + Atom bereits existiert, wird stattdessen eine Fehlermeldung ausgegeben. + + PROC delete atom (SYM CONST atom): + Streicht das Atom "atom" aus der Objektliste. + + PROC begin property list dump (SYM CONST atom): + Vorbereitung für "next property". + + PROC next property (SYM VAR property id, property): + Liefert die nächste Eigenschaft aus der Eigenschaftsliste des zuletzt durch + "begin property list dump" vorbereiteten Atoms. Wenn es sich bei der Eigen­ + schaft um eine Flagge handelt, wird "property" auf "NIL" gesetzt; wenn es keine + nächste Eigenschaft mehr gibt, werden "property" und "property id" auf "NIL" + gesetzt. + Der Dump der Eigenschaftsliste beeinträchtigt die "Verwendbarkeit" des Atoms in + keiner Weise; es ist während des Dumps sogar möglich, Eigenschaften und + Flaggen zu lesen. Wenn während des Dumps Eigenschaften oder Flaggen geän­ + dert oder geschrieben werden, ist mit fehlerhaften Dumpergebnissen zu rechnen. + + PROC add property (SYM CONST atom, property id, property): + "property id" muß ein benanntes Atom sein. Führt eine neue Eigenschaft mit der + Bezeichnung "property id" und dem Wert "property" ein. Wenn bereits eine + Eigenschaft mit der gleichen Bezeichnung existiert, wird die alte Version über­ + deckt, ist aber weiter vorhanden. + + PROC alter property (SYM CONST atom, property id, property): + Bringt die Eigenschaft mit der Bezeichnung "property id" auf den neuen Wert + "property". Wenn eine Eigenschaft mit dieser Bezeichnung noch nicht existiert, + wird eine Fehlermeldung ausgegeben. + + BOOL PROC property exists (SYM CONST atom, property id): + Prüft, ob das Atom eine Eigenschaft mit der Bezeichnung "property id" besitzt. + + SYM PROC property (SYM CONST atom, property id): + Liefert den Wert der gerade sichtbaren Eigenschaft des Atoms, die die Bezeich­ + nung "property id" hat. Falls die Eigenschaft nicht existiert, wird "NIL" geliefert. + + PROC delete property (SYM CONST atom, property id): + Löscht den gerade sichtbaren Wert der Eigenschaft des Atoms, die die Bezeich­ + nung "property id" hat. Wenn eine ältere Version dieser Eigenschaft durch "add + property" überdeckt wurde, wird diese jetzt wieder sichtbar. Jede Eigenschaft + bildet also für jedes Atom einen Stapel (Stack). + + PROC add flag (SYM CONST atom, flag id): + Das Atom "atom" erhält die Flagge "flag id". Ein Atom kann dieselbe Flagge + durchaus mehrmals haben. + + BOOL PROC flag (SYM CONST atom, flag id): + Prüft, ob "atom" mindestens eine Flagge "flag id" hat. + + PROC delete flag (SYM CONST atom, flag id): + Löscht eine Flagge "flag id" von "atom". Wenn keine Flagge existiert, wird + nichts getan. + + SYM PROC sym (TEXT CONST text): + Konvertiert "text" in ein unbenanntes Atom und liefert einen Zeiger auf dies + Atom. + + TEXT PROC text (SYM CONST sym): + Konvertiert "sym" in einen TEXT zurück, wenn es sich um einen konvertierten + TEXT handelt; wenn nicht, wird eine Fehlermeldung ausgegeben. + + BOOL PROC is text (SYM CONST sym): + Prüft, ob "sym" ein konvertierter TEXT ist. + + SYM PROC sym character (TEXT CONST text): + "text" muß genau ein Zeichen enthalten. Das Zeichen wird in ein + CHARACTER-Objekt im Heap konvertiert und ein Zeiger auf dies Objekt gelie­ + fert. + + INT PROC character (SYM CONST sym): + "sym" muß auf ein CHARACTER-Objekt zeigen. Geliefert wird der Code des + dort gespeicherten Zeichens. + + SYM PROC sym (INT CONST i 1, i 2): + Konvertiert "i 1" und "i 2" in ein unbenanntes Atom und liefert einen Zeiger + darauf. + + INT PROC int 1 (SYM CONST sym): + INT PROC int 2 (SYM CONST sym): + Holt die Werte der ersten bzw. zweiten Ganzzahl aus "sym", wenn es sich um + ein konvertiertes INT-Paar handelt; wenn nicht, wird eine Fehlermeldung ausge­ + geben. + + BOOL PROC is int pair (SYM CONST sym): + Prüft, ob "sym" ein konvertiertes INT-Paar ist. + + +Prozedurübergreifende Aussagen über das Paket "lisp.1": + + - Es gibt benannte und unbenannte Atome. + + - Die unbenannten Atome sind Konversionsprodukte. + + - Vor dem ersten Aufruf von "delete atom" sind alle benannten Atome in der Ob­ + jektliste enthalten; d.h. sie können alle durch "begin oblist dump" und wiederhol­ + ten Aufruf von "next atom" erreicht werden. + + - Jedes benannte Atom hat genau einen Namen, der immer gleich bleibt. Der + Name ist als Eigenschaft mit der Bezeichnung "pname" in der Eigenschaftsliste + gespeichert. "add property", "alter property" und "delete property" geben des­ + halb eine Fehlermeldung aus, statt ihre normalen Aktionen durchzuführen, wenn + ihnen als Eigenschaftsbezeichnung "pname" übergeben wird. + + - Es gibt keine zwei Atome, die denselben Namen haben; dadurch reduziert sich + die bei "eq" angegebene Fallunterscheidung auf einen Fall. + + - Es kann durchaus zwei unbenannte Atome mit gleichen Werten geben, die von + "eq" nicht als gleich anerkannt werden, weil sie in verschiedenen Strukturen + gespeichert sind. "equal" achtet nicht auf die Position, sondern auf die Werte + der zu vergleichenden Strukturen. + + - Mehrfache Zugriffe auf die gleiche Eigenschaft desselben Atoms werden so opti­ + miert, daß die Eigenschaftsliste nur beim ersten Zugriff (meist durch "property + exists") durchsucht werden muß. + + + +#page# + +4.2 Weitere Funktionen sowie Eingabe und + Ausgabe #goalpage("p4.2")# + + + +Die Datei "lisp.2" enthält diverse Pakete, die die Verbindung vom LISP-System zur +normalen EUMEL-Umgebung bilden. Momentan sind das Ein- und Ausgabe und +(exemplarisch) die fünf Grundrechenarten für Ganzzahlen. + +Die Ein- und Ausgabe von LISP-Strukturen wird durch das Paket namens "lisp io" +mit den folgenden Prozeduren ermöglicht: + + PROC get (FILE VAR f, SYM VAR sym): + Nach dem Aufruf zeigt "sym" auf eine neue aus "f" eingelesene Struktur. + In der ersten und hinter der letzten Zeile des S-Ausdrucks dürfen keine weiteren + Daten stehen. + + PROC get all (FILE VAR f, SYM VAR sym): + Wie "get (FILE V, SYM V)", nur daß die Datei nichts als den S-Ausdruck ent­ + halten darf. + + PROC get (SYM VAR sym): + Es wird mit "get all" ein S-Audruck von einer Scratch-Datei eingelesen, die + dem Benutzer vorher zum Editieren angeboten wird. Bei Einlesefehlern wird die + Datei zu Korrigieren angeboten, bis keine Fehler mehr auftreten. + + PROC put (FILE VAR f, SYM CONST sym): + Wenn "sym" ein Ganzzahlpaar ist, wird die erste Zahl ausgegeben; wenn es ein + konvertierter TEXT ist, wird der ursprüngliche TEXT wieder ausgegeben; bei + einem benannten Atom oder einer allgemeinen LISP-Struktur wird ein S-Aus­ + druck ausgegeben. + + PROC put (SYM CONST sym): + Wie "put (FILE V, SYM CONST), außer daß die Augabe direkt auf den Bildschirm + erfolgt. + + +Das Paket "lisp int" enthält die Prozeduren + + SYM PROC sum (SYM CONST summandenliste); + Erwartet eine Liste von "int pair"-Summanden und liefert deren Summe. + + SYM PROC difference (SYM CONST minuend, subtrahend): + Liefert die Differenz der Parameter. + + SYM PROC product (SYM CONST faktorenliste): + Liefert das Produkt der Listenelemente. + + SYM PROC quotient (SYM CONST dividend, divisor): + Liefert den Quotienten der Parameter. + + SYM PROC remainder (SYM CONST dividend, divisor): + Liefert den Rest. + +#page# + +4.3 Interpreter #goalpage("p4.3")# + + +Die Datei "lisp.3" enthält das Paket "lisp interpreter", das die Prozedur + + SYM PROC evalquote (SYM CONST expression) + +exportiert. Es handelt sich dabei um den im EUMEL-LISP-Handbuch beschriebe­ +nen Interpreter. + +Wenn "expression" ein LISP-Ausdruck ist, liefert die Prozedur den Wert des Aus­ +drucks (vorausgesetzt, der LISP-Heap ist vorbereitet, siehe lisp.1). + +Wirkungsweise: +"evalquote" ruft im Wesentlichen die Prozedur "eval" auf. +"eval" erwartet als Argumente einen solchen LISP-Ausdruck wie "evalquote", benö­ +tigt aber zusätzlich eine sog. Bindeliste. In einer Bindeliste sind durch LAMBDA- und +LABEL-Ausdrücke bereits gebundene Variable und ihre Werte gespeichert. Die +Manipulation der Bindeliste ist durch eine Reihe von Refinements, die am Schluß des +Pakets stehen, realisiert. + +Da bisher noch keine LAMBDA- oder LABEL-Ausdrücke verarbeitet wurden, über­ +gibt "evalquote" die leere Bindeliste. + +Wirkungsweise von + + SYM PROC eval (SYM CONST expression, association list): + +"eval" kann als erstes Argument ein Atom oder eine zusammengesetzte Struktur +erhalten. + +Atome werden als Variable aufgefaßt, deren Wert in der Bindeliste aufzusuchen ist. +Vor der Konsultation der Bindeliste wird allerdings noch nach der Eigenschaft APVAL +des Atoms gesehen; wenn sie vorhanden ist, handelt es sich um eine Konstante wie +NIL, T oder F, die einen festen Wert hat, nämlich den Wert dieser Eigenschaft. Da +diese Konstanten sich selbst als Wert haben, gilt "eval (NIL, Bindeliste) = NIL" +(entsprechend für "T" und "F"). + +Wenn das erste Arugment von "eval" zusammengesetzt ist, wird angenommen, daß +es sich um einen Funktionsaufruf der Form + + + +-----+-----+ + | o | o--+--> Argumentliste + +--+--+-----+ + | + V + Funktion + + +handelt. Die Bestandteile "Funktion" und "Argumentliste" werden mit der Bindeliste +übergeben an: + + SYM PROC apply (SYM CONST function, arguments, association list): + +"apply" hat die Aufgabe, die Argumente durch "eval" berechnen zu lassen (das +unterbleibt allerdings unter bestimmten Umständen) und die Berechnungergebnisse an +die Parameter der Funktion zu binden; zum Schluß muß der Wert des Funktions­ +rumpfs in Abhängigkeit von diesen neuen Bindungen als Ergebnis der gesamten +Prozedur "apply" berechnet werden; diese Berechnung geschieht wieder durch +"eval". + +Nur in einem LAMBDA-Ausdruck ist direkt bekannt, wo die Parameterliste steht.So­ +lange das nicht der Fall ist, muß entweder ein LABEL-Ausdruck oder ein Atom +vorliegen. +Ein LABEL-Ausdruck hat die Form + + + +-----+-----+ +-----+-----+ +-----+-----+ + | o | o--+--->| o | o--+--->| o | NIL | + +--+--+-----+ +--+--+-----+ +--+--+-----+ + | | | + V V V + LABEL Name Funktion + + +Da der Name für die Dauer der Auswertung des Funktionsrumpfs an die Funktion +gebunden sein muß, wird dis Paar als funktionaler Bindelisteneintrag gespeichert. +Funktionale und nichtfunktionale Bindelisteneinträge sind eindeutig unterschieden. + +Nach dem Abspeichern wird wieder getestet, ob die Funktion diesmal ein +LAMBDA-Ausdruck ist; wenn nicht, wird ein weiterer Schritt zum "Ablättern" von +LABELs und Atomen versucht, usw. + +Wenn die Funktion ein Atom ist, werden analog zu den Vorgängen in "eval" erst die +Eigenschaftsliste und dann die Bindeliste durchsucht. + +Ist die Eigenschaft FUNCTION in der Eigenschaftsliste vorhanden, ist der Wert der +Eigenschaft die (evtl. weiter "abzublätternde") Funktion; ist die Eigenschaft nicht +vorhanden, muß das Atom an eine Funktion gebunden sein, die dann aus der Binde­ +liste geholt werden kann. + +Da alle Funktionen (auch die Standardfunktionen) letztendlich als LAMBDA-Aus­ +drücke definiert sind, kommt "apply" auf diese Weise zuletzt zu einem LAMBDA- +Ausdruck. + +Ein LAMBDA-Ausdruck hat die Form + + + +-----+-----+ +-----+-----+ +-----+-----+ + | o | o--+--->| o | o--+--->| | | + +--+--+-----+ +--+--+-----+ +-----+-----+ + | | + V V + LAMBDA Parameterliste + + +Als nächster Schritt werden die Argumente für die zu berechnende Funktion an die +Parameter der Parameterliste gebunden, d.h. es werden Parameter-Argument-Paare +in die Bindeliste eingetragen. + +Die Methode des Eintrags ist je nach Art des Parameters unterschiedlich. Es gibt die +folgenden Arten von Parametern: + + + 1. | + | + V + Name + + + "Name" ist hier - wie bei den restlichen Fällen - der Name des Parame­ + ters. Diese Art von Parametern ist der Normalfall; die Argumente, die einem + solchen Parameter entsprechen, werden durch "eval" berechnet und zusammen + mit dem Parameter in einem Bindelisteneintrag gespeichert. + + + 2. | + | + V + +-----+-----+ +-----+-----+ + | o | o--+--->| o | NIL + + +--+--+-----+ +--+--+-----+ + | | + V V + QUOTE Name + + + In diesem Fall wird das Argument ohne weitere Verarbeitung in die Bindeliste + übernommen. Die Wirkung ist die gleiche, als wäre das Argument durch + "(QUOTE ... )" eingeschlossen. + + + 3. | + | + V + +-----+-----+ +-----+-----+ + | o | o--+--->| o | NIL | + +--+--+-----+ +--+--+-----+ + | | + V V + FUNCTION Name + + + Hier wird ein funktionaler Bindelisteneintrag erzeugt, so daß "Name" im Funk­ + tionsrumpf als Name einer Funktion auftreten kann. + + + 4. | + | + V + +-----+-----+ +-----+-----+ + | o | o--+--->| o | NIL | + +--+--+-----+ +--+--+-----+ + | | + V V + INDEFINITE Name + + + Dies ist ein Parameter, der beliebig viele berechnete Argumente aufnehmen + kann. Der Einfachheit halber werden die Ergebnisse zu einer Liste zusammen­ + gefaßt und mit "Name" in einen Bindelisteneintrag gesteckt. + + + 5. | + | + V + +-----+-----+ +-----+-----+ +-----+-----+ + | o | o--+--->| o | o--+--->| o | NIL | + +--+--+-----+ +--+--+-----+ +--+--+-----+ + | | | + V V V + INDEFINITE QUOTE Name + + + Dieser Parameter kann wie der in Fall 4. aufgeführte beliebig viele Argumente + aufnehmen, die zu einer Liste zusammengefaßt werden. Im Gegensatz zu 4. + wird aber wie bei 2. nichts durch "eval" berechnet, sondern die Argumente so + wie sie vorkommen übernommen. + +Auf einen Parameter der Form 4. oder 5. darf kein weiterer Parameter folgen, weil +solch ein Parameter alle restlichen Argumente verbraucht. Solchen Parametern darf - +als Ausnahme - auch kein Argument entsprechen; dann werden sie an die leere +Liste (d.h. NIL) gebunden. + +Der letzte Kasten in der Beschreibung des LAMBDA-Ausdrucks ist mit Absicht leer +geblieben; er kann eine der Formen + + + +-----+-----+ +----------+----------+ + | o | NIL | oder | Ganzzahl | XXXXXXXX | + +--+--+-----+ +----------+----------+ + | + V + Funktionsrumpf + + +annehmen. + +Die erste Form heißt, daß die Funktion durch Berechnung des Funktionsrumpfs mittels +"eval" berechnet werden soll; die zweite Form bewirkt den Aufruf einer der Standard­ +funktionen, je nachdem, welche Funktionsnummer bei "Ganzzahl" steht. In diesem +zweiten Fall werden die Argumente aber nicht durch den Namen des Parameters +identifiziert, sondern durch die Position des Eintrags in der Bindeliste. Dieser Pro­ +grammteil hängt also wesentlich von der Reihenfolge ab, in der die Bindelisteneinträ­ +ge, die bei der Parameter-Argument-Zuordnung entstehen, in die Bindeliste einge­ +fügt werden. Zur Zeit ist das die Umkehrung der Reihenfolge der Parameter. + +Die Namen der Refinements "arg 1", "arg 2", "arg 3" beziehen sich auch nicht auf +die Position des Arguments in der Argumentsliste, sondern auf die Position des +Eintrags in der Bindeliste. + +#page# + +4.4 Kommandoprozeduren #goalpage("p4.4")# + + + +Die Datei "lisp.4" enthält eine Reihe von Prozeduren, mit denen der LISP-Interpre­ +ter ähnlich wie der ELAN-Compiler aufgerufen werden kann. + +Die Prozedur + + start lisp system + +ermöglicht das erneute Starten des LISP-Systems, oder wenn "übersetzte" Pro­ +gramme, die in einem Heap einer anderen Task liegen, in dieser Task verarbeitet +werden sollen. + +Die Prozedur + + lisp + +stellt die LISP-Maschine in einem Doppelfenster im Bildschirmdialog zur Verfügung. +Bei der erstmaligen Benutzung muß die Datei "lisp.bootstrap" vorhanden sein. + +Die Prozedur + + break lisp + +koppelt die LISP-Task vom Benutzer-Terminal ab und baut das Doppelfenster für +den Bildschirmdialog neu auf. + + +Die Prozedur + + run lisp + +bewirkt, daß ein LISP-Programm eingelesen und ausgeführt wird; nach der Ausfüh­ +rung wird das Ergebnis der Berechnung ausgegeben. Diese Operationen werden auf +einer Kopie des Heaps ausgeführt, so daß Änderungen keine Dauerwirkung haben. +Mit + + run lisp again + +wird das zuletzt eingelesene Programm noch einmal gestartet; da dafür die gleiche +Kopie des Heaps wie bei "run" benutzt wird, kann das Ergebnis diesmal anders sein. + + insert lisp + +wirkt wie "run lisp", außer daß diesmal alle Änderungen, die durch das Einlesen und +Ausführen im Heap entstehen, dauerhaft sind. + + + PROC start lisp system (DATASPACE CONST heap): + Eine Kopie von "heap" wird der neue LISP-Heap. Wenn es sich um "nilspa­ + ce" handelt, werden einige organisatorische Strukturen im Heap aufgebaut und + die Atome "NIL" und "PNAME" erzeugt. + + PROC start lisp system (DATASPACE CONST heap, FILE VAR f): + Zunächst wird "start lisp system (heap)" gegeben. + Danach werden die Eigenschaftsbeschreibungen aus "f" in Strukturen im Heap + umgesetzt. + + Jede Beschreibung in "f" muß mit dem Zeilenanfang beginnen und kann sich + über mehrere Zeilen erstrecken. Jede Beschreibung besteht aus den Elementen + + wobei der Name einer Eigenschaft (i.a. APVAL oder FUNCTION) + und ein beliebiger S-Ausdruck sein müssen. Die drei Elemente müs­ + sen jeweils durch mindestens ein Leerzeichen getrennt sein. + + Wenn das Atom nicht existiert, wird es erzeugt; danach wird + unter in der Eigenschaftsliste eingetragen. + + Wenn NIL ist, muß wegfallen; dann wird nichts in die + Eigenschaftsliste eingetragen. + + DATASPACE PROC lisp heap: + Liefert den LISP-Heap. Das ist manchmal für Sicherheitskopien etc. nützlich. + Die durch "run lisp" erzeugten Kopien sind nicht zugänglich. + + PROC run lisp: + Ruft "run lisp (last param)" auf. + + PROC run lisp (TEXT CONST file name): + Das in der Datei "file name" stehende LISP-Programm (d.h. der dort stehende + in einen S-Ausdruck übersetzte M-Ausdruck) wird in eine neue Kopie des + LISP-Heaps eingelesen und ausgeführt. Evtl. vorher durch "run lisp" erzeugte + Kopien des Heaps werden vorher gelöscht. + + Wenn das Programm syntaktisch nicht korrekt ist, wird es im Paralleleditor zur + Korrektur angeboten. + + PROC run lisp again: + Führt das zuletzt eingelesene Programm noch einmal im gleichen Heap aus. + + PROC insert lisp: + Ruft "insert lisp (last param)" auf. + + PROC insert lisp (TEXT CONST file name): + Wirkt wie "run lisp (file name)", nur daß alle Operationen auf dem Originalheap + ausgeführt werden. Auch "run lisp again" wirkt nun nicht mehr auf der Kopie. + diff --git a/doc/menugenerator/menu-generator handbuch.1 b/doc/menugenerator/menu-generator handbuch.1 new file mode 100644 index 0000000..c190c0a --- /dev/null +++ b/doc/menugenerator/menu-generator handbuch.1 @@ -0,0 +1,100 @@ +#type ("prop.lq")##limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (3)# +#headodd# +#center#ls-Menu-Generator#right#% + +#end# +#headeven# +%#center#ls-Menu-Generator + +#end# +#type ("prop.breit.lq")# +#center#1 + +#center#Was +#center#kann +#center#ls-Menu-Generator +#type ("prop.lq")# + + + In diesem Kapitel wollen wir Ihnen erläutern, was Sie +mit #on("b")#ls-Menu-Generator#off("b")# anfangen können. Wir gehen davon +aus, daß Ihnen die Benutzerschnittstelle #on("b")#ls-DIALOG#off("b")# be­ +kannt ist und daß Sie bereits mit einigen Anwendungen +unter #on("b")#ls-DIALOG#off("b")# gearbeitet haben. Weiterhin setzen wir +voraus, daß Sie Programmierkenntnisse (EUMEL/ELAN) be­ +sitzen. + Bisher war es Ihnen nur möglich, von uns fertigge­ +stellte Programme unter der komfortablen Benutzer­ +schnittstelle #on("b")#ls-DIALOG#off("b")# laufen zu lassen. Sie haben aber +sicher erkannt, welche Vorteile es bietet, Programme un­ +ter einer einheitlichen Benutzeroberfläche zu realisie­ +ren: + Zunächst profitiert natürlich der Anwender von der +einfachen und immer einheitlichen Bedienung solcher +Programme. Der Aufwand, sich in neue Programmsysteme +einzuarbeiten, wird erheblich reduziert. #on("b")#ls-DIALOG#off("b")# wurde +ja auch speziell für den Unterricht konzipiert und ent­ +wickelt: Ziel war es, Computerlaien einen Zugang zum +Computer zu verschaffen und den Umgang mit dem Compu­ +ter zu vereinfachen. + + #on("b")#ls-Menu-Generator#off("b")#ist nun aber kein weiteres Anwen­ +dungsprogramm! #on("b")#ls-Menu-Generator#off("b")# ist stattdessen für +den Programmierer gedacht, der selbst unter #on("b")#ls-DIALOG#off("b")# +Anwendungssysteme entwickeln möchte. #on("u")#Wir erhoffen uns +durch die Bereitstellung dieses Werkzeuges, daß sich auch +andere engagierte Personen daran beteiligen, qualitativ +hochwertige Software insbesondere für den Schulbereich +unter #on("b")#ls-DIALOG#off("b")# zu entwickeln.#off("u")# + + Mit #on("b")#ls-Menu-Generator#off("b")# haben Sie zwei Komponenten +erworben: Das Generator-Programm zur Erzeugung von +Menukarten und eine umfangreichen Dokumentation. Dabei +enthält die Dokumentation nicht nur Informationen dar­ +über, wie Sie mit dem Generator-Programm arbeiten kön­ +nen - das natürlich auch. Darüberhinaus werden Ihnen +alle Möglichkeiten, die #on("b")#ls-DIALOG#off("b")# zur Programmgestal­ +tung bietet, ausführlich erläutert - das macht den we­ +sentlichen Teil der Dokumentation aus! + + #on("b")#ls-DIALOG#off("b")# ist eigentlich ein "Baukastensystem", auf +das andere Programme zugreifen können. Sie wissen si­ +cherlich, wieviel Arbeit bei jedem Programm aufzuwen­ +den ist, um die Benutzerschnittstelle zu realisieren. Die +Gestaltung und Pflege der Benutzerschnittstelle kann +bis zu 50% der Gesamtarbeit an einem Programm ausmachen. +#on("b")#ls-Menu-Generator#off("b")# soll Ihnen helfen, diese Arbeit zu +verringern. + + Alle Informationen, die ein Menu betreffen, sind in +der sogenannten 'Menukarte' abgelegt. Wird nun ein Pro­ +gramm unter #on("b")#ls-DIALOG#off("b")# aufgerufen, so wird die entspre­ +chende Menukarte aus der "Menukarten - Sammeltask" ('ls- +MENUKARTEN') geholt und an das System angekoppelt. An­ +schließend wird dem Anwender das Menu auf dem Bildschirm +angeboten. + Das Erstellen solcher Menukarten ist mit dem Genera­ +torprogramm sehr einfach - es wird in Kapitel 4 beschrie­ +ben. Allerdings sollten Sie nicht die Arbeit unterschät­ +zen, die Sie für eine sorgfältig erstellte, mit allen In­ +formationtexten gefüllte Menukarte aufwenden müssen! + + Bei den meisten Programmmen reicht aber ein einfaches +Menu nicht aus. Bei vielen Verarbeitungsfunktionen ist +es notwendig, mit dem Anwender einen Dialog zu führen: +z.B. muß ein Dateiname erfragt, eine Information ausgege­ +ben und bestätigt, eine Auswahl oder eine Entscheidung +getroffen werden. Alle Möglichkeiten, die #on("b")#ls-DIALOG#off("b")# dazu +bereitstellt, sind in Kapitel 5 dokumentiert. + + Einige Reihe von Verarbeitungsfunktionen treten in +nahezu jeder Anwendung auf (Datei- und Archivhandling). +Hier stellt #on("b")#ls-DIALOG#off("b")# schon vorgefertigte Module zur +Verfügung. In Kapitel 6 zeigen wir Ihnen, wie Sie auf die­ +se Module zugreifen und sie in Ihr Programmsystem ein­ +binden können. In Kapitel 7 zeigen wir Ihnen außerdem, +wie Sie eigene Fenster definieren können und welche Ope­ +rationen auf diesen Fenstern zur Verfügung stehen. + diff --git a/doc/menugenerator/menu-generator handbuch.2 b/doc/menugenerator/menu-generator handbuch.2 new file mode 100644 index 0000000..696ed28 --- /dev/null +++ b/doc/menugenerator/menu-generator handbuch.2 @@ -0,0 +1,87 @@ +#type ("prop.lq")##limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (6)# +#headodd# +#center#ls-Menu-Generator#right#% + +#end# +#headeven# +%#center#ls-Menu-Generator + +#end# +#type ("prop.breit.lq")# +#center#2 + +#center#Installation +#center#von +#center#ls-Menu-Generator +#type ("prop.lq")# + + + Bevor Sie #on("b")#ls-Menu-Generator#off("b")# auf Ihrem System benut­ +zen können, müssen Sie das Programm zunächst installie­ +ren. Wenn #on("b")#ls-Menu-Generator#off("b")# auf Ihrem System schon zur +Verfügung steht, können Sie dieses Kapitel ruhig über­ +springen. + + +2.1 Voraussetzungen + + Um #on("b")#ls-Menu-Generator#off("b")# auf Ihrem Computer betreiben +zu können, muß das EUMEL-Betriebssystem (Multi-User- +Version) installiert und das Programmpaket #on("b")#ls-DIALOG#off("b")# +(Version 1.1) bereits insertiert sein. + + +2.2 Lieferumfang + + #on("b")#ls-Menu-Generator#off("b")# wird auf einer Diskette geliefert, +die alle notwendigen Programme enthält. Folgende Dateien +sollten sich auf der Diskette befinden: + + "fonttab.ls-Menu-Generator" + "ls-MENUBASISTEXTE" + "Generatordatei: Archivmenu" + "ls-Menu-Generator 1" + "ls-Menu-Generator 2" + "ls-Menu-Generator/gen" + + Eventuell können noch weitere Namen auf der Diskette +vorhanden sein. + + +2.3 Installation + +Die Installation erfolgt in #on("u")#zwei Schritten#off("u")#: + + #on("u")#Zunächst#off("u")# muß die mitgelieferte Fonttabelle +('fonttab.ls-Menu-Generator') in die Task 'configurator' +geholt werden. Da Sie aus dem 'UR-Zweig' des EUMEL- +Systems keinen schreibenden Zugriff auf die Task +'configurator' haben, müssen Sie die Task 'configurator' +an Ihr Terminal koppeln und die Datei 'fonttab.ls-Menu- +Generator' von der Diskette in die Task kopieren. + #on("u")#Anschließend#off("u")# kann #on("b")#ls-Menu-Generator#off("b")# in einer Task +installiert werden, in der bereits das Programm #on("b")#ls-DIALOG#off("b")# +zur Verfügung steht. Richten Sie also eine Task als Sohn +der Task ein, in der auf Ihrem Computer bereits #on("b")#ls-DIALOG#off("b")# +installiert ist. Legen Sie dann die Archivdiskette ein, +auf der sich #on("b")#ls-Menu-Generator#off("b")# befindet und geben Sie +die folgenden Kommandos: + + archive("ls-Menu-Generator") + + fetch("ls-Menu-Generator/gen",archive) + + run + + Sie haben damit das Generatorprogramm gestartet; die +Installation wird automatisch durchgeführt. Lassen Sie +während des gesamten Vorgangs die Archivdiskette einge­ +legt. Die Generierung ist beendet, wenn der EUMEL-Ein­ +gangsbildschirm erscheint. Die Task, in der die Generie­ +rung stattfindet, wird automatisch zur Managertask, das +heißt, daß Söhne von ihr eingerichtet werden können. + + + diff --git a/doc/menugenerator/menu-generator handbuch.3 b/doc/menugenerator/menu-generator handbuch.3 new file mode 100644 index 0000000..e982988 --- /dev/null +++ b/doc/menugenerator/menu-generator handbuch.3 @@ -0,0 +1,155 @@ +#block##pageblock# +#pagenr("%",1)##setcount(1)##count per page# +#headeven# +gs-Menu-Generator +#center#____________________________________________________________ + +#end# +#headodd# +#right#gs-Menu-Generator +#center#____________________________________________________________ + +#end# +#bottomeven# +#center#____________________________________________________________ +3 - % #right#ERGOS +#end# +#bottomodd# +#center#____________________________________________________________ +ERGOS #right# 3 - % +#end# +#ib#3 Die Arbeitsweise von gs-DIALOG#ie# + + +In diesem Kapitel soll die grundsätzliche Arbeitsweise von gs-DIALOG erläutert +werden. Sie erfahren, wie das Menusystem aufgebaut ist, wie man Menukarten an­ +koppelt und Menus zur Ausführung bringt. Ebenso wird erläutert, wie eine Menukarte +aufgebaut ist. +Wenn Sie die hier beschriebenen Vorgänge auf ihrem System nachvollziehen wollen, +so muß in Ihrer Task das Programm 'gs-DIALOG' zur Verfügung stehen! + + +#ib#3.1 Ankoppeln einer Menukarte - Ausführen eines Menus#ie# + +Vereinfacht gesagt ist eine Menukarte ein Datenraum, in dem alle Informationen, die +zum Menu (zu den Menus) gehören, abgelegt sind. Der genaue Aufbau einer solchen +Menukarte wird in Kapitel 3.2 beschrieben. +Alle Menukarten, die auf einem System zur Verfügung stehen, werden in einer zentra­ +len Task ('gs-MENUKARTEN') bereitgehalten. Die Menukarten können von hier +angefordert werden. +Lassen Sie sich in Ihrem System eine Übersicht der vorhandenen Menukarten geben +(list (/"gs-MENUKARTEN") ). Darauf wird Ihnen gegebenenfalls folgen­ +de Übersicht angeboten: + + 01.09.87 "gs-MENUKARTE:Archiv" + 01.09.87 "gs-MENUKARTE:Herbert und Robbi" + 01.09.87 "gs-MENUKARTE:MP-BAP" + ... + +Zumindest die erste Menukarte müßte - sofern die gs-DIALOG-Basissoftware instal­ +liert ist - auf Ihrem System vorhanden sein. Die beiden anderen Menukarten sind +natürlich nur dann vorhanden, wenn Sie die Programme 'gs-Herbert und Robbi' +und 'gs-MP BAP' installiert haben. + +In einer weiteren Task (z.B. 'DIALOG') sind die Programme installiert, die es ermög­ +lichen, diese Menukarten zu handhaben. Alle Sohntasks dieser Task "erben" natür­ +lich diese Fähigkeiten. Von einer solchen Task aus kann nun eine Menukarte ange­ +fordert und ein darin enthaltenes Menu zur Ausführung gebracht werden. Das haben +Sie sicher schon oft gemacht, z.B. wenn Sie den Befehl 'archiv' gegeben haben. Was +hinter diesem Befehl steckt, sollen Sie sich jetzt klar machen: + +Wenn Sie den Befehl 'archiv' geben, wird zunächst die Menukarte +'gs-MENUKARTE:Archiv' aus der Task 'gs-MENUKARTEN' angefordert und in Ihre +Task kopiert. Davon merken Sie normalerweise nichts, denn nachdem die Ankopp­ +lung des Datenraumes (als unbenannter Datenraum) erfolgt ist, wird die Daten­ +raumkopie gelöscht; daher taucht der Name auch nie in Ihrer Dateiliste auf. Intern +vermerkt das System, welche Menukarte aktuell angekoppelt ist. Soll wiederholt +dieselbe Menukarte angekoppelt werden, so erübrigt sich das Kopieren aus der zen­ +tralen Bereitstellungstask. + +Nach dem Ankoppeln der Menukarte können Sie auf die in der Menukarte enthalte­ +nen Informationen zugreifen. Da in einer Menukarte mehrere Menus enthalten sein +können, müssen Sie dem System noch mitteilen, welches Menu aktiviert werden soll. +In der Menukarte 'gs-MENUKARTE:Archiv' ist nur ein Menu enthalten, das den +Namen 'ARCHIV' hat (der Name des Menus erscheint übrigens bei der Präsentation +immer oben links in der Kopfzeile). + +Sie sollen jetzt, ohne den Befehl 'archiv' zu verwenden, das Menu zur Ausführung +bringen. Geben Sie dazu die folgenden Kommandos in der 'gib kommando:'- Ebene: + + #ib#install menu#ie# ("gs-MENUKARTE:Archiv"); + #ib#handle menu#ie# ("ARCHIV") + +Mit dem ersten Befehl koppeln Sie die genannte Menukarte an, mit dem zweiten +Befehl bringen Sie das darin enthaltene Menu 'ARCHIV' zur Ausführung. +Allerdings stellen Sie sicher auch einen Unterschied zur Ausführung des Befehls +'archiv' fest, denn dort erscheint nicht erst unser "Software - Emblem" auf dem +Bildschirm, sondern direkt das Menu. + +Wenn Ihnen eines der Programme 'gs-Herbert und Robbi' oder 'gs-MP BAP' +bekannt ist, haben Sie unser Emblem aber sicher schon gesehen - wir verwenden es +immer, um unsere Softwareprodukte kenntlich zu machen. Da man aber das Archiv­ +programm sehr häufig benötigt und es dann nur störend wirkt kann die Ausgabe +unterdrückt werden. Daher gibt es den Befehl 'install menu' in zwei Versionen. +Versuchen Sie es gleich einmal: + + install menu ("gs-MENUKARTE:Archiv", FALSE); + handle menu ("ARCHIV") + +Die Präsentation des Menus erfolgt gleich aus zwei Gründen schneller als beim ersten +Mal: einerseits wurde auf die Ausgabe unseres Software - Emblems verzichtet, ande­ +rerseits brauchte die Menukarte nicht erneut aus der Task 'gs-MENUKARTEN' kopiert +zu werden, da sie ja schon angekoppelt war. +Damit sind Sie nun in der Lage, Menukarten anzukoppeln und Menus zur Ausfüh­ +rung zu bringen. + + +#ib#3.2 Aufbau/Inhalt einer Menukarte#ie# + +Eine Menukarte ist eine komplexe Datenstruktur, die bis zu 6 vollständige Menus +aufnehmen kann. Weiterhin sind eine Reihe von Texten in jeder Menukarte abgelegt, +auf die gs-DIALOG zurückgreift. Darüberhinaus kann der Anwendungsprogram­ +mierer bis zu 2000 Texte in die Menukarte auslagern, um so beim Insertieren seiner +Programme den Umfang an Paketdaten geringer zu halten. +Auf den ersten Blick scheint es wenig Sinn zu machen, mehrere Menus in einer +Menukarte zu verwalten. Nehmen wir aber als Beispiel das Programmsystem +gs-Herbert und Robbi. Hier ist ein Programm in zwei unterschiedlichen Ausprä­ +gungen zu behandeln. Sowohl das Hamster- als auch das Robotermenu befinden sich +in einer Menukarte. Bei einem Wechsel zwischen den Modellen braucht also keine +neue Menukarte angefordert, sondern nur ein neues Menu aus der aktuellen Menu­ +karte aktiviert zu werden. +Zum anderen ist gs-DIALOG schon auf umfangreichere Programmsysteme vorberei­ +tet: Es ist nämlich möglich, von einem Menu aus ein weiteres Menu aus der aktuellen +Menukarte zu aktivieren. Auf dem Bildschirm werden die beiden Menus dann ge­ +schachtelt (das zuletzt aktivierte vor dem aufrufenden Menu) angezeigt. Nach Verlas­ +sen der zweiten Menuebene gelangt der Benutzer automatisch in das Ausgangsmenu +zurück. +Zwar ist es nicht möglich, mehr als zwei Menus gleichzeitig zu aktivieren (geschach­ +telt auf dem Bildschirm darzustellen), doch können an verschiedenen Stellen des +Ausgangsmenus ja unterschiedliche Menus aus der aktuellen Menukarte aktiviert +werden. + +Jedes Menu in der Menukarte wird durch einen Namen gekennzeichnet. Dieser Name +erscheint in der Kopfzeile oben links. Über diesen Namen kann das Menu aktiviert +werden. +Ein Menu besteht aus den sogenannten 'Oberbegriffen', die in der Kopfzeile angezeigt +werden. In einer Kopfzeile können bis zu 10 Oberbegriffe verwaltet werden. Da zu +jedem Oberbegriff bis zu 15 Verarbeitungsfunktionen (in den Pull-Down-Menus) +verwaltet werden können, ist es möglich, in einem Menu bis zu 150 Verarbeitungs­ +funktionen abzulegen. Nutzt man alle 6 Menus einer Menukarte, so können maximal +bis zu 900 Verarbeitungsfunktionen in einer Menukarte verwaltet werden. + +Eine Verarbeitungsfunktion besteht aus der/dem + + - 'Ein-Zeichen-Kennung' - die angibt, durch welche Taste die Verarbei­ + tungsfunktion ggf. aktiviert werden kann; + - 'Menupunktbezeichnung' - die im Pull-Down-Menu als Name für die + Verarbeitungsfunktion erscheint; + - 'Funktionsaufruf' - dem Namen der Prozedur, die bei der Aktivie­ + rung des Menupunktes zur Ausführung ge­ + bracht wird; + - 'Informationstext' - der zur aktuellen Verarbeitungsfunktion durch + Tippen der -Taste abgerufen werden + kann. + + diff --git a/doc/menugenerator/menu-generator handbuch.4 b/doc/menugenerator/menu-generator handbuch.4 new file mode 100644 index 0000000..97e7491 --- /dev/null +++ b/doc/menugenerator/menu-generator handbuch.4 @@ -0,0 +1,424 @@ +#block##pageblock# +#pagenr("%",1)##setcount(1)##count per page# +#headeven# +gs-Menu-Generator +#center#____________________________________________________________ + +#end# +#headodd# +#right#gs-Menu-Generator +#center#____________________________________________________________ + +#end# +#bottomeven# +#center#____________________________________________________________ +4 - % #right#ERGOS +#end# +#bottomodd# +#center#____________________________________________________________ +ERGOS #right# 4 - % +#end# +#ib#4 Erstellen einer neuen Menukarte#ie# + + +Aus Kapitel 3 wissen Sie, wie man eine fertige Menukarte ankoppelt und wie man ein +darin enthaltenes Menu zur Ausführung bringen kann. Außerdem wissen Sie bereits, +welche Informationen in einer Menukarte untergebracht werden können. In diesem +Kapitel nun wollen wir Ihnen zeigen, wie Sie eine eigene Menukarte entwickeln +können. +Damit Sie sich die Abläufe besser vorstellen können, werden wir die Vorgänge an +einem Beispiel aufzeigen: Wir wollen eine 'kleine Textverarbeitung' schaffen, deren +Verarbeitungsfunktionen über ein Menu angeboten werden. +Es sei aber darauf hingewiesen, daß es nicht darum geht, eine voll funktionsfähige +Textverarbeitung auszuarbeiten - vielmehr sollen die Erstellung der Menukarte und +das Nutzen der durch gs-DIALOG bereitgestellten Werkzeuge exemplarisch auf +gezeigt werden. + + +#ib#4.1  Eintragen der Menupunkte#ie# + +Unsere Menukarte soll den Namen 'Kleine Textverarbeitung' erhalten, das darin +enthaltene Menu den Namen 'SCRIPT'. Unter dem Oberbegriff 'Bearbeiten' sollen 5 +Verarbeitungsfunktionen angeboten werden. Insgesamt soll unser neues Menu fol +genden Aufbau haben: + +SCRIPT: Bearbeiten + + n Neu erstellen + a Ansehen/Ändern + ---------------- + v Verzeichnis + ---------------- + z Zeilenformtierung + s Seitenformatierung + + + +Zur Erzeugung der zugehörigen Menukarte schreiben Sie folgendes Pro­ +gramm in eine Datei: + + +oeffne menukarte ("Kleine Textverarbeitung"); +oeffne menu ("SCRIPT"); + +oberbegriff ("Bearbeiten"); + +menufunktion ("n", "Neu erstellen", "neue datei editieren",""); +menufunktion ("a", "Ansehen/Ändern", "alte datei editieren",""); +trennlinie; +menufunktion ("v", "Verzeichnis", "verzeichnis ausgeben",""); +trennlinie; +menufunktion ("z", "Zeilenformatierung", "zeilen formatieren",""); +menufunktion ("s", "Seitenformatierung", "seiten formatieren",""); + +schliesse menu; +schliesse menukarte; + + +Bevor wir Ihnen die Einzelheiten erklären, sollten Sie zuerst einmal Ihr neu erstelltes +Menu ausprobieren. Verlassen Sie dazu die Datei und geben Sie das Kommando 'run'. +Nachdem das von Ihnen geschriebene Programm übersetzt worden ist, meldet sich +der Menu-Generator. +Die an Sie gestellte Frage 'Sollen auch Anwendungs texte in die Menukarte aufge­ +nommen werden (j/n)?' beantworten Sie einfach mit n(ein). Auf dem Bildschirm +wird angezeigt, wie die Menukarte erstellt wird. Auf das Ende der Menukartengenerie­ +rung wird hingewiesen. Wenn Sie sich jetzt die Dateiliste Ihrer Task anzeigen lassen, +taucht dort eine Datei mit Namen 'gs-MENUKARTE:Kleine Textverarbeitung' auf - das +ist die neue Menukarte. +Sie möchten sicher gleich ausprobieren, ob das Menu Ihren Vorstellungen entspricht. +Geben Sie dazu das Kommando 'testinstallation ("gs-MENUKARTE:Kleine Textver­ +arbeitung")'. Bitte geben Sie den Text genauso ein wie hier angegeben! +Nach kurzer Zeit erscheint der Hinweis 'Installation abgeschlossen!'. Geben Sie nun +den Befehl 'handle menu ("SCRIPT")'; hierdurch aktivieren Sie das von Ihnen neu +erstellte Menu - es erscheint auf dem Bildschirm. + +Über den Befehl '#ib#testinstallation#ie#' haben Sie sich sicher gewundert. Ihnen ist ja +schon der Befehl '#ib#install menu#ie#' bekannt. Dieser Befehl aber kann hier nicht ein­ +fach angewendet werden - er ist für den (späteren) "regulären Betrieb" vorgesehen. +Bedenken Sie bitte zweierlei: Die Menukarte befindet sich nur in Ihrer Task, 'install +menu' fordert die Menukarte aber aus der Task 'gs-MENU KARTEN' an. Ist eine +Menukarte schon angekoppelt gewesen, so wird nicht erneut angekoppelt, sondern +auf die angekoppelte Menukarte zurückgegriffen. Dies alles können wir bei der +Menukartenerstellung nicht gebrauchen! +Der Befehl 'testinstallation' sendet automatisch die Menukarte zur Task +'gs-MENUKARTEN' und kennzeichnet Sie noch durch den eigenen Tasknamen (da +durch können sich beim Multiuserbetrieb unterschiedliche Anwender mit gleichem +Menukartennamen nicht gegenseitig stören). Die Menukarte wird anschließend in +jedem Falle 'frisch' angekoppelt, so daß Sie nach dem Befehl immer die aktuelle +Menukarte angekoppelt haben. Außerdem bleibt die Menukarte in Ihrer Task erhal­ +ten! + +Doch nun zur Erläuterung des oben notierten Programms: + +Ein Programm zur Erstellung einer Menukarte muß immer mit dem Befehl '#ib#oeffne +menukarte#ie#' beginnen und mit dem Befehl '#ib#schliesse menukarte#ie#' abgeschlos­ +sen werden. Der Befehl 'oeffne menukarte' hat einen Parameter (TEXT CONST) - +hierdurch wird festgelegt, welchen Namen die Menukarte haben soll. Durch das +Kommando 'oeffne menu karte ("Menu 1")' entsteht also die Menukarte 'gs-MENU +KARTE:Menu 1". +In die Menukarte können jetzt bis zu 6 Menus eingetragen werden. Jeder Eintrag +eines Menus beginnt mit dem Befehl '#ib#oeffne menu#ie#' und endet mit dem Befehl +'#ib#schliesse menu#ie#'. Der Befehl 'oeffne menu' hat hier einen Parameter (TEXT +CONST) - hierdurch wird festgelegt, welchen Namen das Menu erhalten soll. Unter +diesem Namen kann später das Menu angesprochen werden (z.B. 'handle menu +("SCRIPT")'. + +Den Befehl 'oeffne menu' gibt es noch in zwei weiteren Ausführungen: +Mit drei Textparametern - neben dem Namen des Menus können hier noch zwei +Prozedurnamen angegeben werden. Diese Prozeduren werden beim Einstieg in das +Menu bzw. beim Verlassen des Menus aufgerufen. Hiervon wird z.B. Gebrauch ge­ +macht, wenn das Archiv-Menu in eine Menukarte integriert ist: Wenn das Menu +verlassen wird, soll sichergestellt sein, daß das Archiv automatisch freigege ben wird. +Mehr hierüber erfahren Sie im Kapitel 6.1, in dem aufgezeigt wird, wie das Archiv- +Menu in andere Menus eingebunden wird. +Mit sechs Textparametern - neben den eben genannten drei Parametern können noch +drei Texte übergeben werden. Diese Texte werden beim Aufruf des Menus unten +rechts auf dem Bildschirm ausgegeben. Bei unseren Software-Produkten (z.B. +'gs-Herbert und Robbi') machen wir davon Gebrauch, um Hinweise auf das +Produkt, die Versionsnummer etc. zu geben. Die Hinweise bleiben nur kurz auf dem +Bildschirm und verschwinden nach kurzer Zeit automatisch, oder wenn Sie irgen +deine Taste tippen. Bei der Notation der Texte müssen Sie sich allerdings an einige +Regeln halten (sehen Sie dazu Kapitel 5.12). + +Zwischen den Befehlen 'oeffne menu' und 'schliesse menu' werden nun die Oberbe­ +griffe (Kopfzeile) und die zugehörigen Verarbeitungsfunktionen eingetragen. Dabei +müssen Sie sich genau an folgende Abfolge halten: +Zuerst wird jeweils der Oberbegriff genannt, der in der Kopfzeile auftauchen soll. +Direkt unter dem jeweiligen Oberbegriff werden die Menufunktionen eingetragen, die +im zugehörigen 'Pull-Down-Menu' als Verarbeitungsfunktionen angeboten werden +sollen. Die einzelnen Oberbegriffe mit Ihren zugehörigen Verarbeitungsfunktionen +werden blockweise hintereinander notiert. Dadurch ergibt sich die folgende Struktur: + + +oeffne menu ("Menuname"); + +oberbegriff ("Oberbegriff 1"); + +menufunktion ("1", "Verarbeitungsfunktion 1", "", ""); +menufunktion ("2", "Verarbeitungsfunktion 2", "", ""); +... + +oberbegriff ("Oberbegriff 2"); + +menufunktion ("1", "Verarbeitungsfunktion 1", "", ""); +menufunktion ("2", "Verarbeitungsfunktion 2", "", ""); +... + +oberbegriff ("Oberbegriff 3"); + +menufunktion ("1", "Verarbeitungsfunktion 1", "", ""); +menufunktion ("2", "Verarbeitungsfunktion 2", "", ""); +... + +... schliesse menu; + + +Die Oberbegriffe werden in die Kopfzeile von links nach rechts eingetragen. Maximal +können 10 Oberbegriffe eingetragen werden. Wählen Sie die Bezeichnungen nicht zu +lang, denn sie müssen alle neben dem Namen des Menus in der Kopfzeile Platz +finden (Ansonsten erhalten Sie hierauf bei der Menukartengenerierung einen Hin­ +weis, die Generierung wird abgebrochen!)! + +Den Befehl '#ib#oberbegriff#ie#' gibt es in zwei Versionen: +In der hier aufgezeigten Version mit einem (TEXT-) Parameter: Hierdurch wird der +Oberbegriff in der Kopfzeile festgelegt. In der zweiten Version hat der Befehl drei +(TEXT-)Parameter: Durch den ersten wird - wie eben - die Kopfzeilenbezeichnung +festgelegt. Daneben können noch zwei Prozedurnamen angegeben werden. Die +Prozedur mit dem erstgenannten Namen wird beim Einstieg (vor dem "Ausklappen" +des Pull-Down-Menus) ausgeführt, die Prozedur mit dem zweitgenannten Namen vor +dem Ausstieg ("Einklappen"). Beim 'Archiv-Pull-Down-Menu' machen wir hiervon +Gebrauch. Beim Einstieg wird dafür gesorgt, daß nur bestimmte Verarbeitungsfunk­ +tionen aktivierbar sind; beim Ausstieg wird sichergestellt, daß das Archivlaufwerk +automatisch freigegeben wird. + +Unter einem Oberbegriff können Sie bis zu 15 Verarbeitungsfunktionen in ein Pull- +Down-Menu eintragen. Die Verarbeitungsfunktionen können Sie optisch vonein ander +trennen. Dafür steht der Befehl '#ib#trennlinie#ie#' zur Verfügung. Aber beachten Sie, er +belegt den gleichen Platz wie eine Verarbeitungsfunktion. + +Zum Eintragen einer Verarbeitungsfunktion steht der Befehl '#ib#menufunktion#ie#' zur +Verfügung. Der Befehl besitzt vier (TEXT-)Parameter. Die ersten beiden Parameter +werden auch auf dem Bildschirm ausgegeben. +Der erste Parameter legt fest, über welche Taste diese Verarbeitungsfunktion direkt +zur Ausführung gebracht werden kann. Wenn eine Eintragung erfolgt, muß diese aus +genau einem Zeichen bestehen. Innerhalb eines Pull-Down-Menus muß dieses +Zeichen eindeutig sein, d.h. es darf nur einmal verwendet werden. Ansonsten er­ +scheint bei der Menugenerierung eine Fehlermeldung. +Der zweite Parameter ist die Bezeichnung der Verarbeitungsfunktion, die dem Be­ +nutzer im Pull-Down-Menu angeboten wird. Wählen Sie die Bezeichnung bitte immer +prägnant und möglichst mit dem Buchstaben beginnend, den Sie auch als ersten +Parameter angegeben haben! Der Länge dieser Bezeichnung ist nur durch die Bild­ +schirmbreite (nicht mehr als 60 Zeichen) begrenzt, allerdings wählt gs-DIALOG die +Breite des Pull-Down-Menus nach der längsten Bezeichnung, die im jeweiligen Pull- +Down-Menu auftritt. Wenn die Bezeichnungen ganz unterschiedlich lang sind, sieht +das nicht sonderlich gut aus, aber probieren Sie es ruhig einmal aus und entscheiden +Sie selbst. + +Der dritte Parameter ist der Name der Prozedur, die bei der Aktivierung der Verarbei­ +tungsfunktion ausgewählt werden soll. Zum Zeitpunkt der Erstellung und des Testens +des Menusystems braucht diese Prozedur noch nicht zu existieren. Damit ist es +möglich, die Menuentwicklung völlig unabhängig von der Entwicklung der Verarbei­ +tungsfunktionen zu betreiben; Sie brauchen nur die späteren Namen der aufzurufen­ +den Prozeduren festzulegen! Aktivieren Sie eine solche Verarbeitungsfunktion im +Pull-Down-Menu, die noch nicht fertiggestellt ist, so erscheint der Hinweis 'unbe­ +kanntes Kommando' - das kann aber auch geschehen, wenn die Verarbeitungsfunk­ +tion schon existiert, Sie aber bei der Eintragung einen (Schreib-)Fehler gemacht +haben! + +Der vierte Parameter ist der Text, der als sogenannter Infotext ausgegeben wird wenn +Sie auf die entsprechende Verarbeitungsfunktion positioniert haben und hier die +-Taste tippen. In unserem Beispiel haben wir keinen Infotext eingetragen. +Versuchen Sie im Menu jetzt die -Taste zu tippen, so erscheint der Hinweis +'Leider ist zu diesem Menupunkt kein Info-Text eingetragen!'. Für die Handhabung +des Menus sind diese Informationstexte nicht wichtig, sie dienen ausschließlich der +Information des Benutzers. +Die Arbeit zur Formulierung/Abfassung dieser Texte sollten Sie nicht unterschätzen. +Sie sollten sich bei einer ernsthaften Anwendung aber diese Arbeit machen. Gerade +der Anfänger, der mit Ihrem Menusystem arbeitet, wird Ihnen diese Arbeit danken. +Wie Sie diese Texte komfortabel erstellen und in die Menutafel einbinden können, +erklären wir Ihnen im nächsten Kapitel. + + +#ib#4.2 Erstellung und Einbinden von Informationstexten#ie# + +Bisher haben wir noch keine Informationstexte zu den Menupunkten in die Menu­ +karte eingetragen. Diese Eintragung erfolgt über den vierten Parameter des Befehls +'menufunktion'. Möchten Sie dort nur einige wenige Worte eintragen, so kann das +direkt geschehen. Meist aber sind die Informationen zu einem Menupunkt doch +länger, sie erstrecken sich über mehrere Zeilen. +Zur Übergabe des Informationstextes steht aber nur ein Textparameter zur Verfügung. +Würde man längere Texte direkt eintragen, wäre das bei der Menukartenerstellung +sicher sehr unübersichtlich. Zum anderen benötigt gs-DIALOG den Text schon in +aufbereiteter Form, d.h. es müssen z.B. Zeilenenden etc. kenntlich gemacht wer den. +Damit Sie sich nun nicht alle Regeln der Texterstellung für gs-DIALOG merken +müssen, bietet Ihnen gs-Menu-Generator eine komfortable Möglichkeit, diese +Informationstexte zu entwickeln. Wir wollen das an einem Beispiel verdeutlichen: + +Erzeugen Sie sich eine Datei mit dem Namen 'Textprobe' und schreiben Sie z.B. +folgenden Text, der ein Informationstext zum Menupunkt 'Neu erstellen' sein könnte, +hinein: + +Text neu erstellen + +Das System erfragt zunächst den Namen für die Datei, in die +der neue Text geschrieben werden soll. Anschließend wird eine +leere Datei mit dem gewünschten Namen zum Beschreiben +angeboten. +Das Schreiben in eine solche Datei wird durch viele Hilfen +erleichtert. Deshalb ist es ratsam, sich nach und nach mit +den Möglichkeiten, die der Editor bietet, vertraut zu machen. +Die Möglichkeiten sind im EUMEL-Benutzerhandbuch ausführlich +beschrieben. + +Verlassen Sie nun die Datei und geben Sie in der 'gib kommando:'-Ebene folgendes +Kommando: + + #ib#textprozedur#ie# ("Textprobe", "mein erster infotext") + +Auf dem Bildschirm erscheint zunächst der Hinweis 'Bitte warten ...', anschließend +werden Sie - wie aus der Textverarbeitung (lineform) bekannt - aufgefordert, entspre­ +chende Trennungen vorzunehmen. +Das eben eingegebene Kommando bewirkt nämlich, daß der in der Datei 'Textprobe' +enthaltene Text für gs-DIALOG so aufbereitet wird, daß er in einer Box innerhalb des +Menus eingeblendet werden kann. Die Zeilen werden auf die entsprechende Länge +zugeschnitten und der Text in den Zeilen wird geblockt, soweit Sie keine Absatzmarke +() gesetzt haben. +Der so den Regeln von gs-DIALOG entsprechend aufbereitete Text wird automatisch +in eine Textprozedur "verpackt", die den von Ihnen als zweiten Parameter übergebe­ +nen Namen erhält. Beachten Sie deshalb bei der Festlegung des Namens, daß er mit +einem Kleinbuchstaben beginnt und weiterhin nur Kleinbuchstaben, Ziffern und +Leerzeichen enthält! +Diese Textprozedur finden Sie anschließend in der Datei 'Textprobe.a'. An der En­ +dung '.a' können Sie erkennen, daß in dieser Datei ein "aufbereiteter" Text enthalten +ist. +Wenn Sie sich, nachdem auf dem Bildschirm der Hinweis 'Textprozedur ist erstellt!' +erschienen ist, die Datei 'Textprobe.a' ansehen, so hat diese folgenden Inhalt: + + +TEXT PROC mein erster infotext: +" Text neu erstellen "13"" + +" "13"" + +" Das System erfragt zunächst den Namen für die Datei, in die der "13""+ +" neue Text geschrieben werden soll. Anschließend wird eine leere "13""+ +" Datei mit dem gewünschten Namen zum Beschreiben angeboten. "13""+ +" Das Schreiben in eine solche Datei wird durch viele Hilfen er-"13""+ +" leichtert. Deshalb ist es ratsam, sich nach und nach mit den Mög-"13""+ +" lichkeiten, die der Editor bietet, vertraut zu machen. "13"" + +" Die Möglichkeiten sind im EUMEL-Benutzerhandbuch ausführlich be-"13""+ +" schrieben. " +END PROC mein erster infotext; + + +Kopieren Sie nun den Inhalt der Datei 'Textprobe.a' in die Datei, in die Sie das Pro­ +gramm zur Generierung Ihrer Menukarte geschrieben haben und ergänzen Sie die +Ein tragung beim ersten Menupunkt in folgender Weise: + + +TEXT PROC mein erster infotext: +" Text neu erstellen "13"" + +" "13"" + +" Das System erfragt zunächst den Namen für die Datei, in die der"13""+ +" neue Text geschrieben werden soll. Anschließend wird eine leere"13""+ +" Datei mit dem gewünschten Namen zum Beschreiben angeboten. "13""+ +" Das Schreiben in eine solche Datei wird durch viele Hilfen er-"13""+ +" leichtert. Deshalb ist es ratsam, sich nach und nach mit den Mög-"13""+ +" lichkeiten, die der Editor bietet, vertraut zu machen. "13""+ +" Die Möglichkeiten sind im EUMEL-Benutzerhandbuch ausführlich be-"13""+ +" schrieben. " +END PROC mein erster infotext; + +oeffne menukarte ("Kleine Textverarbeitung"); +oeffne menu ("SCRIPT"); + +oberbegriff ("Bearbeiten"); + +menufunktion ("n", "Neu erstellen", "neue datei editieren", + mein erster infotext); +menufunktion ("a", "Ansehen/Ändern","alte datei editieren", ""); +trennlinie; +menufunktion ("v", "Verzeichnis", "verzeichnis ausgeben", ""); +trennlinie; +menufunktion ("z", "Zeilenformatierung", "zeilen formatieren", ""); +menufunktion ("s", "Seitenformatierung", "seiten formatieren", ""); + +schliesse menu; +schliesse menukarte; + + +Starten Sie erneut das Programm mit 'run' und erstellen Sie dadurch eine neue +Menukarte. Installieren Sie anschließend die neue Menukarte mit dem Kommando +'test installation ("gs-MENUKARTE:Kleine Textverarbeitung")' und bringen Sie das +Menu mit dem Kommando 'handle menu ("SCRIPT")' zur Ausführung. Wenn Sie jetzt +auf dem Menu punkt 'n Neu erstellen' die -Taste tippen, erscheint der von +Ihnen eingegebene Infotext in einer Box innerhalb des Menus. Die Größe der Box +wird automatisch durch den Text bestimmt. Die Box ist maximal 65 Zeichen breit +und 14 Zeilen hoch. + +Nachdem Sie nun in der Lage sind, solche Informationstexte zu erstellen und sie in +die Menukarte einzubinden, möchten wir Ihnen noch einige Möglichkeiten der +"Kosmetik solcher Informationstexte" aufzeigen. +Häufig möchte man die Überschrift eines solchen Informationstextes zentriert über +dem Text dargestellt haben. Das läßt sich auch hier einfach bewerkstelligen: Schrei­ +ben Sie dazu als erstes Zeichen der Zeile, die zentriert werden soll, das Zeichen '%' +und schließen Sie die Zeile mit einer Absatzmarke () ab. +Möchten Sie innerhalb des Textes eine Textpassage invers dargestellt haben, so kenn­ +zeichnen Sie den Anfang der Inversdarstellung durch das Zeichen '$' und das Ende +der Inversdarstellung durch das Zeichen '&'. Der Text wird anschließend entspre­ +chend aufbereitet. Allerdings sollte die Textpassage nicht über Zeilengrenzen hinaus­ +gehen! +Möchten Sie in unserem Beispiel die Überschrift zentriert und invers dargestellt +haben, so ersetzen Sie die erste Zeile der Datei 'Textprobe' durch die Zeile: %$Text +neu erstellen&. Wenn Sie anschließend den gesamten oben beschriebenen Vorgang +wiederholen, erscheint die Überschift zentriert und invers dargestellt innerhalb der +Box im Menu. + + +#ib#4.3 Auslagerung von anwendungsbezogenen Texten in die +Menukarte#ie# + +Wie schon in Kapitel 3.2 erwähnt, kann der Anwendungsprogrammierer bis zu 2000 +Texte aus seinen Programmen in die Menukarte auslagern, um so den Umfang an +Paketdaten geringer zu halten, allerdings darf die Gesamtkapazität einer Menukarte +(eines Datenraumes) dabei nicht überschritten werden. + +Die Texte müssen in einer Datei zeilenweise notiert sein. Sie müssen (wie TEXT-Deno­ +ter) in Anführungsstriche eingefaßt sein, allerdings dürfen die Texte länger als +(normale) TEXT-Denoter (255 Zeichen) sein. Innerhalb der Textzeile dürfen auch die +Ausgabecodes "4", "5", "7", "10", "13", "14", und "15" verwendet werden. Innerhalb +der Textzeile darzustellende Anführungszeichen unterliegen den gleichen Besonder­ +heiten wie sonst auch bei TEXT-Denotern. +Machen wir ein Beispiel! Schreiben Sie in eine Datei mit Namen 'Neue Texte' die +folgenden Zeilen: + +"Dieses ist der erste eingetragene Text!" +"Hier ist eine "15"Markierung"14" im Text!" +"Dieses ist die letzte Zeile!" + +Um diese Texte in die Menukarte einzubinden, starten Sie jetzt noch einmal Ihr +Generierungprogramm für die Menukarte. Auf die Frage 'Sollen auch Anwendungstex­ +te in die Menukarte aufgenommen werden (j/n) ?' antworten Sie jetzt allerdings mit +j(a). Daraufhin werden Ihnen die in Ihrer Task vorhandenen Dateien zur Auswahl +angeboten. Kreuzen Sie die Datei 'Neue Texte' an, in der ja die eben genannten Texte +eingetragen sind. +Bei der Menukartengenerierung werden die Texte aus der Datei in die Menukarte +eingebunden. Sollten Sie bei Notierung der Texte in der Datei formale Fehler gemacht +haben, so werden Sie darauf hingewiesen. +Um nun auf die eingelagerten Texte zurückgreifen zu können, muß erst einmal die +neue Menukarte angekoppelt werden. Wie das geht, wissen Sie ja schon ('testin stalla­ +tion'). +Mit dem Befehl '#ib#anwendungstext#ie# (INT CONST zeilennummer)' (1 <= zeilen­ +nummer <= 2000) wird Ihnen nun der Text, der in der angegebenen Zeile steht, +geliefert. Probieren Sie es doch gleich an Ihrer Menukarte aus: 'put (anwendungs­ +text (1))', 'put (anwendungstext (2))' usw.. Die eingelagerten Texte müßten jetzt auf +dem Bildschirm erscheinen. Geben Sie eine Zeilennummer an, die nicht belegt ist, so +wird der Text 'Kein Text vorhanden!' geliefert. + +Es können natürlich auch Texte abgelegt werden, die von gs-DIALOG aus aufgegrif­ +fen werden. Zur Konvertierung von Informationstexten steht die Prozedur '#ib#text zeile#ie# +(TEXT CONST dateiname)' zur Verfügung. Diese Prozedur arbeitet genauso wie die +Prozedur 'textprozedur', nur wird in der Ausgabedatei ('dateiname.a') der formatierte +Text nicht als Textprozedur, sondern als einzeiliger Text geliefert. Sie können aber +auch für gs-DIALOG Texte "von Hand" gestalten. Dazu müssen Sie sich an die +Regeln für die Texte für gs-DIALOG halten, die in Kapitel 5.12 erläutert sind. + + diff --git a/doc/menugenerator/menu-generator handbuch.5 b/doc/menugenerator/menu-generator handbuch.5 new file mode 100644 index 0000000..c002f1a --- /dev/null +++ b/doc/menugenerator/menu-generator handbuch.5 @@ -0,0 +1,975 @@ +#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). + + diff --git a/doc/menugenerator/menu-generator handbuch.6 b/doc/menugenerator/menu-generator handbuch.6 new file mode 100644 index 0000000..a0dd3b5 --- /dev/null +++ b/doc/menugenerator/menu-generator handbuch.6 @@ -0,0 +1,235 @@ +#block##pageblock# +#pagenr("%",1)##setcount(1)##count per page# +#headeven# +gs-Menu-Generator +#center#____________________________________________________________ + +#end# +#headodd# +#right#gs-Menu-Generator +#center#____________________________________________________________ + +#end# +#bottomeven# +#center#____________________________________________________________ +6 - % #right#ERGOS +#end# +#bottomodd# +#center#____________________________________________________________ +ERGOS #right# 6 - % +#end# +#ib#6  Einbinden der Datei- und Archivoperationen#ie# + + +Sie haben bereits erfahren, wie Sie eine Menukarte generieren und ankoppeln kön­ +nen. Im letzten Kapitel haben wir Ihnen die Möglichkeiten aufgezeigt, innerhalb des +Menus einen Dialog mit dem Benutzer zu führen. Sie sind somit in der Lage, Ihre +eigenen Anwendungen unter der Benutzeroberfläche gs-DIALOG zu erstellen. +Wie sich gezeigt hat, treten eine Reihe von Verarbeitungsfunktionen in nahezu jeder +Anwendung auf. Im EUMEL-System benötigt man bei fast allen Anwendungspro­ +grammen auch die Möglichkeiten, Dateien auf dem Archiv zu sichern oder von dort +zu holen; auch Umbenennen, Kopieren, Drucken, Reorganisieren ... von Dateien +zählen sicher zu den häufig benötigten Verarbeitungsfunktionen. Wünschenswert ist +es natürlich, daß in allen Programmen unter einer Benutzeroberfläche die "Stan­ +dard-Verarbeitungsfunktionen" in immer gleicher Weise zur Verfügung stehen! + +Dieser Vorteil liegt sogar nicht nur auf der Seite des Anwenders - auch der Anwen­ +dungsprogrammierer profitiert davon: Dann nämlich, wenn er diese Standard-Verar­ +beitungsfunktionen nicht immer neu schreiben muß, sondern auf vorgefertigte +Prozeduren und natürlich auch auf die zugehörigen Informationstexte zurückgreift. + +Wir haben uns deshalb entschlossen, diese Standard-Verarbeitungsfunktionen zum +Datei- und Archivhandling bereits in das Basissystem gs-DIALOG zu integrieren und +Ihnen mit gs-Menu-Generator Dateien zur Verfügung zu stellen, in denen die +Programme zur Einbindung dieser Prozeduren in Ihre eigenen Programmsysteme +ebenso enthalten sind wie alle dazugehörigen Informationstexte. +In diesem Kapitel soll nun beschrieben werden, wie Sie diese vorgefertigten Module in +Ihre Menukarten/Programme einbinden können und was Sie dabei beachten müs­ +sen. + + +#ib#6.1 Einbinden der Archivoperationen#ie# + +Auf der von uns gelieferten Diskette 'gs-Menu-Generator', befindet sich auch die +Datei 'Generatordatei: Archivmenu'. Darin ist das vollständige Menukarten-Generie­ +rungs-Programm zur Generierung der Menukarte 'gs-MENUKARTE: Archiv' inclusive +aller Informationstexte enthalten. U.a. befindet sich darin eben das folgende Pro­ +gramm: + + +oeffne menukarte ("Archiv"); +oeffne menu ("ARCHIV", "", "menu archiv reservierung aufgeben"); + + +oberbegriff ("Dateien"); + +menufunktion ("v", "Verzeichnis", "menu dateien verzeichnis", + dateiverzeichnistext); +trennlinie; +menufunktion ("l", "Löschen", "menu dateien loeschen", + dateiloeschentext); +menufunktion ("d", "Drucken", "menu dateien drucken", + dateidruckentext); +trennlinie; +menufunktion ("k", "Kopieren", "menu dateien kopieren", + dateikopierentext); +menufunktion ("u", "Umbenennen", "menu dateien umbenen­ + nen", + dateiumbenennentext); +trennlinie; +menufunktion ("s", "Speicherplatz", "menu dateien speicherplatz", + dateispeicherplatztext); +menufunktion ("a", "Aufräumen", "menu dateien aufraeumen", + dateiaufraeumtext); + + +oberbegriff ("Archiv", "menu archiv grundeinstellung (4)", + "menu archiv reservierung aufgeben"); + +menufunktion ("r", "Reservieren", "menu archiv reservieren", + archivreserviertext); +menufunktion ("n", "Neue Diskette", "menu archiv neue diskette", + neuediskettetext); +trennlinie; +menufunktion ("s", "Schreiben", "menu archiv schreiben", + archivschreibtext); +menufunktion ("c", "Checken", "menu archiv checken", + archivchecktext); +menufunktion ("k", "Kombination", "menu archiv schreibcheck", + archivkombinationstext); +menufunktion ("h", "Holen/Lesen", "menu archiv holen", + archivholtext); +menufunktion ("l", "Löschen", "menu archiv loeschen", + archivloeschtext); +trennlinie; +menufunktion ("v", "Verzeichnis", "menu archiv verzeichnis", + archivverzeichnistext); +menufunktion ("d", "Drucken", "menu archiv verzeichnis + drucken", + archivdruckentext); +trennlinie; +menufunktion ("i", "Initialisieren", "menu archivinitialisieren", + archivinitialisiertext); +menufunktion ("z", "Zieltask einstellen", "menu archiv zieltask + einstellen", + archivzieltasktext); +schliesse menu; +schliesse menukarte; + + +Wie schon oben erwähnt, sind auch alle Informationstexte in der Datei enthalten, die +jeweils über den 4. Parameter der Prozeduren 'menufunktion' in die Menukarte +eingebunden werden. Wir haben Sie hier nicht extra abgedruckt; Sie können ja die +entsprechende Datei auf der Diskette einsehen! + +Zu dem Programm möchten wir jedoch noch einige wichtige Anmerkungen machen, +damit Sie die entsprechenden Verarbeitungsfunktionen in Ihre Menukarte einbinden +können. + +Wenden wir uns zunächst den Archivoperationen zu. gs-DIALOG stellt die folgenden +Verarbeitungsfunktionen bereit: + + + PROC #ib#menu archiv reservieren#ie#, + PROC #ib#menu archiv neue diskette#ie#, + PROC #ib#menu archiv schreiben#ie#, + PROC #ib#menu archiv checken#ie#, + PROC #ib#menu archiv schreibcheck#ie#, + PROC #ib#menu archiv holen#ie#, + PROC #ib#menu archiv loeschen#ie#, + PROC #ib#menu archiv verzeichnis#ie#, + PROC #ib#menu archiv verzeichnis drucken#ie#, + PROC #ib#menu archiv initialisieren#ie#, + PROC #ib#menu archiv zieltask einstellen#ie#, + + +Durch diese elf Prozeduren werden die entsprechenden Menufunktionen ausgeführt. + +Außerdem werden noch folgende Prozeduren bereitgestellt: + + + PROC #ib#menu archiv grundeinstellung#ie# (INT CONST ort) + PROC #ib#menu archiv reservierung aufgeben#ie# + + +Diesen beiden Prozeduren sollten Sie bei der Einbindung der Archivfunktionen in +Ihre Menukarten besondere Beachtung schenken. Wie Sie im Programm auf der Seite +zuvor sehen, taucht die Prozedur 'menu archiv reservierung aufgeben' gleich zweimal +auf: einmal als 3.Parameter der Prozedur 'oberbegriff' und einmal als 3.Parameter +der Prozedur 'oeffne menu' - und das aus folgendem Grund: + +Wenn der Benutzer die Archivoperationen verläßt, dann sollte automatisch das Archiv +freigegeben werden, um so - auch bei Multi-User-Betrieb - ein einwandfreies Archiv­ +handling zu gewährleisten. Nun kann der Benutzer das Pull-Down-Menu 'Archiv' aber +eben auf zweierlei Weise verlassen: Einmal durch den Wechsel in ein anderes Pull- +Down-Menu der gleichen Menukarte - oder aber er verläßt insgesamt das Menu. Im +ersten Falle wird das Archiv abgemeldet, weil ja die als 3.Parameter bei 'oberbegriff' +eingetragene Prozedur ausgeführt wird - im zweiten Falle, weil die als 3.Parameter +bei 'oeffne menu' eingetragene Prozedur ausgeführt wird. Diese Eintragungen sollten +Sie auf keinen Fall bei der Einbindung der Archivoperationen vergessen. + +Die Prozedur 'menu archiv grundeinstellung (INT CONST ort)' sollte bei den Archiv­ +operationen immer als 2. Parameter in der Prozedur 'oberbegriff' übergeben wer­ +den. Nur wenn diese Prozedur beim Entfallten des Archiv-Pull-Down-Menus ausge­ +führt wird, ist die einwandfreie Funktion des Archivsystems sichergestellt. Dadurch +geschieht nämlich folgendes: + + 1) Als Zieltask wird das Archiv der eigenen Station eingestellt - unabhängig + davon, mit welcher Einstellung das Menu zuvor verlassen wurde. + + 2) Es wird die Zieltask auf dem Bildschirm angezeigt. + + 3) Die entsprechenden Menupunkte werden aktiviert bzw. deaktiviert. + + 4) Es wird festgelegt, an welcher Stelle innerhalb des Menus die Menunotiz zur + Anzeige der Zieltask (und ggf. des Archivnamens) ausgegeben wird. + +Im Programm oben ist hierfür die Position 4 (rechts unten in der Ecke) gewählt. Wir +haben diese Festlegung deswegen so getroffen, weil das Archiv-Pull-Down-Menu +ziemlich weit links auf dem Bildschirm erscheint (es sind nur zwei Oberbegriffe +eingetragen!). So stören sich Archiv-Pull-Down-Menu und die Menunotiz nicht gegen­ +seitig. In unseren Anwendungssystemen 'gs-Herbert und Robbi' und +'gs-MP-BAP' haben wir dagegen die Position '3' eingetragen, damit die Menunotiz +unten links in der Ecke erscheint, weil das Archiv-Pull-Down-Menu ganz rechts auf +dem Bildschirm entfaltet wird. + +Achtung! Uns ist es sehr, sehr wichtig, daß zumindest die Archivfunktionen in allen +Anwendungen unter gs-DIALOG in gleicher Weise zur Verfügung gestellt werden. Um +das sicherzustellen, sind die Funktionen so in gs-DIALOG integriert, daß das System +nur dann reibungslos funktioniert, wenn Sie sich an die eben aufgezeigten Regeln für +die Einbindung in Ihr Anwendungssystem halten! Für die korrekte Funktionsweise +muß im Archiv-Pull-Down-Menu auch immer exakt die Reihenfolge (der Aufbau) der +Verarbeitungsfunktionen eingehalten werden. Auch die Namen sollten immer gleich +gewählt werden! + +Wir hoffen, daß Sie als Programmierer für diese doch etwas rigorose Maßnahme +Verständnis haben - dafür versichern wir Ihnen, daß wir sehr viel Gedanken und +Arbeit in die Konstruktion des Archivsystems investiert haben! + +Auf eine Einschränkung muß allerdings noch hingewiesen werden:Das Archiv- +Pull-Down-Menu kann aus technischen Gründen nicht das erste, ganz links in einem +Menu stehende sein; es kann frühestens unter dem zweiten Oberbegriff in das Menu +aufgenommen werden! Es ist z.Z. nicht möglich, im ganz links stehenden Pull- +Down-Menu deaktivierte Menupunkte zu behandeln. + + +#ib#6.2 Einbinden der Dateiopertionen#ie# + +gs-DIALOG stellt neben den Archivoperationen standardmäßig auch einige Dateiope­ +rationen bereit. Folgende Prozeduren stehen zur Verfügung: + + + PROC #ib#menu dateien verzeichnis#ie#, + PROC #ib#menu dateien loeschen#ie#, + PROC #ib#menu dateien drucken#ie#, + PROC #ib#menu dateien kopieren#ie#, + PROC #ib#menu dateien umbenennen#ie#, + PROC #ib#menu dateien speicherplatz#ie#, + PROC #ib#menu dateien aufraeumen#ie#. + + +Die Prozeduren bedürfen in Ihrer Wirkung sicher kaum einer Erklärung. Die Wir­ +kungsweise können Sie einfach ausprobieren, indem Sie die entsprechenden Ver­ +arbeitungsfunktionen im Archiv-Menu einfach einmal aktivieren. + + diff --git a/doc/menugenerator/menu-generator handbuch.7 b/doc/menugenerator/menu-generator handbuch.7 new file mode 100644 index 0000000..2e6f0ba --- /dev/null +++ b/doc/menugenerator/menu-generator handbuch.7 @@ -0,0 +1,367 @@ +#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. + + diff --git a/doc/menugenerator/menu-generator handbuch.8 b/doc/menugenerator/menu-generator handbuch.8 new file mode 100644 index 0000000..66eb6cf --- /dev/null +++ b/doc/menugenerator/menu-generator handbuch.8 @@ -0,0 +1,1676 @@ +#block##pageblock# +#pagenr("%",1)##setcount(1)##count per page# +#headeven# +gs-Menu-Generator +#center#____________________________________________________________ + +#end# +#headodd# +#right#gs-Menu-Generator +#center#____________________________________________________________ + +#end# +#bottomeven# +#center#____________________________________________________________ +8 - % #right#ERGOS +#end# +#bottomodd# +#center#____________________________________________________________ +ERGOS #right# 8 - % +#end# +#ib#8  Kurzbeschreibung der Befehle #ie# + + +Durch #u#(*)#e# gekennzeichnete Prozeduren stehen (zumindest in der hier dokumentier­ +ten Form) erst ab gs-DIALOG Version 1.1 zur Verfügung! + + +#ib#activate#ie# +PROC activate (TEXT CONST punktname): + +Zweck: Mit der Prozedur kann ein (deaktivierter) Menupunkt im aktuellen + Pull-Down-Menu aktiviert, d.h. zur Ausführung freigegeben werden. Das + '-'-Zeichen vor der Punktbezeichnung verschwindet auf dem Bildschirm, + statt dessen erscheint das Zeichen, über den die Menufunktion direkt + aktivierbar ist. 'punktname' muß eine Punktbezeichnung sein, die genau + in der angegebenen Schreibweise im aktuellen Pull-Down-Menu vorhan­ + den ist (über den 2. Parameter der Prozedur 'menufunktion' in die + Menukarte eingetragen wurde) - ansonsten wird diese Anweisung igno­ + riert. Die Prozedur "zeigt nur dann Wirkung", wenn sie aus einer Verar­ + beitungsfunktion des aktuell entfalteten Pull-Down-Menus heraus oder + durch die "Startprozedur"/"Leaveprozedur" des aktuellen Pull-Down- + Menus (sehen Sie auch 'oberbegriff') aufgerufen wird. + Die Veränderung wird nicht sofort auf dem Bildschirm angezeigt, sondern + erst, wenn das Pull-Down-Menu das nächste Mal vom System regeneriert + wird; ansonsten muß das Kommando 'refresh submenu' gegeben werden. + + +PROC activate (INT CONST punktposition):#u#(*)#e# +Zweck: arbeitet wie obiges 'activate', allerdings werden die Menupunkte nicht + über ihre Bezeichnung, sondern über ihre Position im (aktuellen) Pull- + Down-Menu identifiziert. Die Positionen sind von oben nach unten durch­ + numeriert. Beachten Sie, daß Trennlinien eine Position belegen und + mitgezählt werden. Die Prozedur arbeitet schneller als obige! + + +#ib#anwendungstext#ie# +TEXT PROC anwendungstext (INT CONST zeilennummer): + +Zweck: Mit diesem Befehl können Texte angesprochen (geholt) werden, die in die + Menukarte ausgelagert wurden. Es wird der Text aus der angekoppelten + Menukarte geliefert, der bei der "Einlagerung" in der Zeile 'zeilen­ + nummer' stand. +Fehler: Kein Text vorhanden! (In der angekoppelten Menukarte ist unter der + 'zeilennummer' kein Anwendungstext eingetragen.) + Bitte achten Sie auf folgendes: Wenn Sie eine neue Menukarte generiert + haben, muß diese erst an die aktuelle Task gekoppelt werden, bevor Sie + auf die dort eingetragenen (Anwendungs-)Texte zugreifen können (z.B. + mit 'testinstallation'). + + +#ib#areax#ie# +INT PROC areax (WINDOW VAR w) +Zweck: Liefert den Wert 'x' des Fensters w. + + +#ib#areaxsize#ie# +INT PROC areaxsize (WINDOW VAR w) +Zweck: Liefert den den Wert 'xsize' des Fensters w. + + +#ib#areay#ie# +INT PROC areay (WINDOW VAR w) +Zweck: Liefert den den Wert 'y' des Fensters w. + + +#ib#areaysize#ie# +INT PROC areaysize (WINDOW VAR w) +Zweck: Liefert den den Wert 'ysize' des Fensters w. + + +#ib#balken links#ie# +TEXT PROC balken links: + +Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als "linker + Balken" (̄) ausgegeben wird. + + +PROC balken links (TEXT CONST zeichen): + +Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­ + stellung der "Kästen" als "linker Balken" ausgegeben werden soll. + + +#ib#balken oben#ie# +TEXT PROC balken oben: + +Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als "oberer + Balken" (�) ausgegeben wird. + + +PROC balken oben (TEXT CONST zeichen): + +Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­ + stellung der "Kästen" als "oberer Balken" ausgegeben werden soll. + + +#ib#balken rechts#ie# +TEXT PROC balken rechts: + +Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als "rechter + Balken" (̃) ausgegeben wird. + + +PROC balken rechts (TEXT CONST zeichen): + +Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­ + stellung der "Kästen" als "rechter Balken" ausgegeben werden soll. + + +#ib#balken unten#ie# +TEXT PROC balken unten: + +Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als "unterer + Balken" (̂) ausgegeben wird. + + +PROC balken unten (TEXT CONST zeichen): + +Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­ + stellung der "Kästen" als "unterer Balken" ausgegeben werden soll. + + +#ib#boxalternative#ie# +INT PROC boxalternative (WINDOW VAR w, + TEXT CONST infotext, + auswahlliste, + zusatztasten, + INT CONST position, + BOOL CONST mit abbruch): + +Zweck: Vergl. 'menualternative'. Hier wird nur zusätzlich das Fenster festgelegt, + das bei 'menualternative' automatisch gesetzt wird. Der 'infotext' muß + den gs-DIALOG-Syntax-Regel gehorchen! Die 'auswahlliste' muß nach + festen Regeln erstellt werden (sehen Sie Kap. 5.7) + + +#ib#boxanswer#ie# +TEXT PROC boxanswer (WINDOW VAR w, + TEXT CONST infotext, + vorgabe, + INT CONST  position): + +Zweck: Vergl. 'menuanswer'. Hier wird nur zusätzlich das Fenster festgelegt, das + bei 'menuanswer' automatisch gesetzt wird. Der 'infotext' muß den + gs-DIALOG-Syntax-Regel gehorchen! + + +#ib#boxanswerone#ie# +TEXT PROC boxanswerone (WINDOW VAR w, + TEXT CONST infotext, + vorgabe, + THESAURUS CONST thes, + TEXT CONST ueberschrift, + hinweis, + BOOL CONST mit reinigung): + +Zweck: Vergl. 'menuanswerone'. Hier wird nur zusätzlich das Fenster festgelegt, + das bei 'menuanswerone' automatisch gesetzt wird. +Fehler: Fenster für Auswahl zu klein (x < 56, y < 15) + + +#ib#boxanswersome#ie# +THESAURUS PROC boxanswersome (WINDOW VAR w, + TEXT CONST infotext, + vorgabe, + THESAURUS CONST thes, + TEXT CONST ueberschrift, + hinweis, + BOOL CONST mit reinigung): + +Zweck: Vergl. 'menuanswersome'. Hier wird nur zusätzlich das Fenster festgelegt, + das bei 'menuanswersome' automatisch gesetzt wird. +Fehler: Fenster für Auswahl zu klein (x < 56, y < 15) + + +#ib#boxinfo#ie# +PROC boxinfo (WINDOW VAR w, TEXT CONST infotext, + INT CONST position, timelimit): + +Zweck: Vergl. 'menuinfo'. Hier wird nur zusätzlich das Fenster festgelegt, das bei + 'menuinfo' automatisch gesetzt wird. Der 'infotext' muß den gs-DIALOG- + Syntax-Regel gehorchen! + + +PROC boxinfo (WINDOW VAR w, TEXT CONST infotext): + + wirkt wie: boxinfo (w, infotext, 5, maxint) + + +#ib#boxno#ie# +BOOL PROC boxno (WINDOW VAR w, + TEXT CONST frage, + INT CONST  position): + + wirkt wie: NOT boxyes (w, frage, position) + + +#ib#boxnotice#ie# +PROC boxnotice (WINDOW VAR w, + TEXT CONST infotext, + INT CONST  position + INT VAR x, y, xsize, ysize): + +Zweck: Mit 'w' wird das aktuelle Fenster festgelegt. In 'infotext' wird der Text + übergeben, der als Notiz ausgegeben werden soll, der Text muß den + gs-DIALOG-Syntax-Regeln entsprechen. Mit 'position' wird die relative + Lage innerhalb des Fensters 'w' bestimmt. Über die letzten vier Parameter + werden die Position/Maße der Box geliefert. Weder Text noch Position + werden vermerkt. + + +#ib#boxone#ie# +TEXT PROC boxone (WINDOW VAR w, + THESAURUS CONST thes, + TEXT CONST ueberschrift, + hinweis, + BOOL CONST mit reinigung): + +Zweck: Vergl. 'menuone'. Hier wird nur zusätzlich das Fenster festgelegt, das bei + 'menuone' automatisch gesetzt wird. +Fehler: Fenster für Auswahl zu klein (x < 56, y < 15) + + +#ib#boxsome#ie# +THESAURUS PROC boxsome (WINDOW VAR w, + THESAURUS CONST thes, + TEXT CONST ueberschrift, + hinweis, + BOOL CONST mit reinigung): + +Zweck: Vergl. 'menusome'. Hier wird nur zusätzlich das Fenster festgelegt, das + bei 'menusome' automatisch gesetzt wird. +Fehler: Fenster für Auswahl zu klein (x < 56, y < 15) + + +#ib#boxyes#ie# +BOOL PROC boxyes (WINDOW VAR w, + TEXT CONST frage, + INT CONST  position): + +Zweck: Vergl. 'menuyes'. Hier wird nur zusätzlich das Fenster festgelegt, das bei + 'menuyes' automatisch gesetzt wird. Die 'frage' muß den gs-DIALOG- + Syntax-Regel gehorchen! + + +#ib#center#ie# +TEXT PROC center (WINDOW VAR w, TEXT CONST text): + +Zweck: Vergl. 'menuwindowcenter'. Hier wird nur zusätzlich das Fenster festge­ + legt, das bei 'menuwindowcenter' automatisch gesetzt wird. + + +TEXT PROC center (INT CONST laenge, + TEXT CONST text): + +Zweck: "Ummantelt" 'text' mit Leerzeichen, so daß 'text' etwa in der Mitte zu + stehen kommt. Der gelieferte Text hat die Länge 'laenge'. + + +TEXT PROC center (TEXT CONST text): + + wirkt wie: center (79, text) + + +#ib#clear buffer#ie# +PROC clear buffer + +Zweck: Leert den Zeichenpuffer + + +#ib#clear buffer and count#ie# +INT PROC clear buffer and count (TEXT CONST + zeichen): + +Zweck: Leert den Zeichenpuffer und liefert die Häufigkeit des Vorkommens von + 'zeichen' im Zeichenpuffer. + + +#ib#current menuwindow#ie# +WINDOW PROC current menuwindow: + +Zweck: liefert das aktuelle Menufenster (die Einzelwerte können dann mit + 'areax', 'areay', 'areaxsize' und 'areaysize' erfragt werden). + + +#ib#cursor#ie# +PROC cursor (WINDOW VAR w, INT CONST spalte, + zeile): + +Zweck: Vergl. 'menuwindowcursor'. Hier wird nur zusätzlich das Fenster festge­ + legt, das bei 'menuwindowcursor' automatisch gesetzt wird. + + +#ib#cursor off#ie# +PROC cursor off: + +Zweck: Sofern die EUMEL-Installation die Möglichkeit bietet, wird der Cursor aus + dem Bildschirm ausgeblendet. + Wenn neue Verarbeitungsfunktionen entwickelt werden, sollte zu Beginn + der Cursor eingeschaltet und nach Abschluß der Cursor wieder ausge­ + schaltet werden (sehen Sie auch Kap. 5.1). + + +PROC cursor off (TEXT CONST zeichenkette): + +Zweck: Neufestlegung der 'zeichenkette', die ausgegeben werden soll, um bei der + aktuellen EUMEL-Installation den Cursor auf den Befehl 'cursor off' hin + auszuschalten. + + +#ib#cursor on#ie# +PROC cursor on: + +Zweck: Sofern die EUMEL-Installation die Möglichkeit bietet, wird der Cursor auf + dem Bildschirm angezeigt. Wenn neue Verarbeitungsfunktionen entwik­ + kelt werden, sollte zu Beginn der Cursor eingeschaltet und nach Abschluß + der Cursor wieder ausgeschaltet werden (sehen Sie auch Kap. 5.1). + + +PROC cursor on (TEXT CONST zeichenkette): + +Zweck: Neufestlegung der 'zeichenkette', die ausgegeben werden soll, um bei der + aktuellen EUMEL-Installation den Cursor auf den Befehl 'cursor on' hin + anzuschalten. + + +#ib#deactivate#ie# +PROC deactivate (TEXT CONST punktname): + +Zweck: Vergl. 'activate (TEXT CONST punktname)'. + Im Gegensatz zu der Prozedur wird hier 'punktname' deaktiviert und + beim (nächsten) Erscheinen der Menupunktbezeichnung ein '-'Zeichen + vorangestellt. Es gelten die gleichen Einschränkungen wie bei 'activate'! + + +PROC deactivate (INT CONST punktposition):#u#(*)#e# +Zweck: arbeitet wie obiges 'deactivate', allerdings werden die Menupunkte nicht + über ihre Bezeichnung, sondern über ihre Position im (aktuellen) Pull- + Down-Menu identifiziert. Die Positionen sind von oben nach unten durch­ + numeriert. Beachten Sie, daß Trennlinien eine Position belegen und + mitgezählt werden. Die Prozedur arbeitet schneller als obige! + + +#ib#direktstart#ie# +PROC direktstart (TEXT CONST prozedurname, + BOOL CONST mit loeschen):#u#(*)#e# +Zweck: Macht aus der aktuellen Task eine Manager-Task ('global manager'). + Werden neue Sohntasks eingerichtet, so melden sich diese nicht - wie + gewohnt - mit der 'gib kommando:'-Ebene. Statt dessen wird die Prozedur + 'prozedurname' ausgeführt. Das Kommando ist dann sinnvoll, wenn sich + die Sohntask gleich mit einem Menu melden soll. In der Prozedur + 'prozedurname' muß dann die entsprechende Menukarte angekoppelt + und das gewünschte Menu zur Ausführung gebracht werden. Hat 'mit + loeschen den Wert 'TRUE', so wird nach Verlassen der Menuebene die + Task automatisch gelöscht; bei 'FALSE' wird noch angefragt, ob die Task + gelöscht werden soll. Wird die Frage bejaht, wird gelöscht; sonst wird die + Task abgekoppelt (break) und kann durch 'continue' wieder angekoppelt + werden. + In der Task, in der das Kommando 'direktbefehl' gegeben wurde, sollte + nicht das Kommando 'monitor' gegeben werden, da dadurch auch die­ + se Task zu einer Task gemacht würde, die sich direkt mit dem Menu + meldet und ggf. bei Verlassen des Menus automatisch gelöscht wird! Die + 'gib kommando:'-Ebene ist dadurch unzugänglich! + + +#ib#ecke oben links#ie# +TEXT PROC ecke oben links: + +Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" links oben in der + Ecke (ω) ausgegeben wird. + + +PROC ecke oben links (TEXT CONST zeichen): + +Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­ + stellung der "Kästen" links oben in der Ecke ausgegeben werden soll. + + +#ib#ecke oben rechts#ie# +TEXT PROC ecke oben rechts: + +Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" rechts oben in + der Ecke (�) ausgegeben wird. + + +PROC ecke oben rechts (TEXT CONST zeichen): + +Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­ + stellung der "Kästen" rechts oben in der Ecke ausgegeben werden soll. + + +#ib#ecke unten links#ie# +TEXT PROC ecke unten links: + +Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" links unten in + der Ecke (�) ausgegeben wird. + + +PROC ecke unten links (TEXT CONST zeichen): + +Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­ + stellung der "Kästen" links unten in der Ecke ausgegeben werden soll. + + +#ib#ecke unten rechts#ie# +TEXT PROC ecke unten rechts: + +Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" rechts unten in + der Ecke (�) ausgegeben wird. + + +PROC ecke unten rechts (TEXT CONST zeichen): + +Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­ + stellung der "Kästen" rechts unten in der Ecke ausgegeben werden soll. + + +#ib#edit#ie# +PROC edit (WINDOW VAR w, TEXT CONST dateiname): + +Zweck: Vergl. 'menuwindowedit'. Hier wird nur zusätzlich das Fenster festgelegt, + das bei 'menuwindowedit' automatisch gesetzt wird. + + +PROC edit (WINDOW VAR w, FILE VAR f): + +Zweck: Vergl. 'menuwindowedit'. Hier wird nur zusätzlich das Fenster festgelegt, + das bei 'menuwindowedit' automatisch gesetzt wird. + + +#ib#editget#ie# +PROC editget (WINDOW VAR w, TEXT VAR text):#u#(*)#e# +Zweck: Eingabe mit Editiermöglichkeit von 'text'. 'text' wird ausgegeben. Die + Eingabe wird mit RETURN beendet. 'text' darf höchstens 79 Zeichen + lang sein! Fehler: Text nicht initialisiert. + + +PROC editget (WINDOW VAR w, TEXT VAR text, + INT CONST max laenge, scroll, + TEXT CONST sep, res, + TEXT VAR exit char):#u#(*)#e# +Zweck: Wie oben. Über 'max laenge' kann festgelegt werden , wie lang der einzu­ + gebende Text ('text') maximal sein darf. Über 'scroll' wird die Breite des + Zeilenfensters festgelegt, bevor gerollt wird (jedoch nicht über die rech­ + te Fenstergrenze hinaus). Über 'sep' können Zeichen bestimmt werden, + bei denen die Eingabe (zusätzlich zu RETURN) beendet werden soll. Über + 'res' können reservierte Tasten angegeben werden. Wird eine dieser + Tasten mit ESC betätigt, wird die Eingabe beendet. In 'exit char' steht + dann ESC und das Zeichen, mit dem der Editor verlassen wurde. +Fehler: Text nicht initialisiert. + + +#ib#erase#ie# +PROC erase (WINDOW VAR fenster): + +Zweck: Der durch 'fenster' beschrieben Bildschirmbereich wird gelöscht - ein­ + schließlich des Rahmens, der den Fensterbereich umgibt (vergl. Sie auch + 'page')! + + +#ib#erase footnote#ie# +PROC erase footnote (WINDOW VAR fenster): + +Zweck: Die letzten beiden Zeilen in 'fenster' (in der die Fußnote nebst Trennlinie + eingetragen sind) werden gelöscht (vergl. Sie auch 'out footnote')! + + +#ib#erase menunotice#ie# +PROC erase menunotice: + +Zweck: Sofern zuvor mit 'write menunotice' (sehen Sie auch dort) eine Menunotiz + gesetzt wurde, wird diese gelöscht, ansonsten hat die Prozedur keine + Wirkung. + + +#ib#get#ie# +PROC get (WINDOW VAR w, TEXT CONST eingabe): + +Zweck: Vergl. 'menuwindowget'. Hier wird nur zusätzlich das Fenster festgelegt, + das bei 'menuwindowget' automatisch gesetzt wird. + + +PROC get (WINDOW VAR w, INT CONST wert): + +Zweck: Vergl. 'get (WINDOW VAR w, TEXT CONST eingabe)'. Der eingelesene Wert + wird anschließend entsprechend konvertiert. + + + +PROC get (WINDOW VAR w, REAL CONST wert): + +Zweck: Vergl. 'get (WINDOW VAR w, TEXT CONST eingabe)'. Der eingelesene Wert + wird anschließend entsprechend konvertiert. + + +PROC get (WINDOW VAR w, TEXT CONST eingabe, + INT CONST laenge): + +Zweck: Vergl. 'get (WINDOW VAR w, TEXT CONST eingabe)'. Zusätzlich wird die + Eingabe beendet, wenn der eingegebene Text die Länge 'laenge' erreicht + hat. + + +PROC get (WINDOW VAR w, TEXT CONST eingabe, + TEXT CONST separator): + +Zweck: Vergl. 'get (WINDOW VAR w, TEXT CONST eingabe)'. Zusätzlich werden + über 'separtor' die Zeichen festgelegt, die zusätzlich zu den Positionie­ + rungszeichen die Eingabe beenden. + + +#ib#get cursor#ie# +PROC get cursor (WINDOW VAR w, INT VAR spalte, + zeile): + +Zweck: Vergl. 'get menuwindowcursor'. Hier wird nur zusätzlich das Fenster + festgelegt, das bei 'get menuwindowcursor' automatisch gesetzt wird. + + +#ib#getline#ie# +PROC getline (WINDOW VAR w, TEXT CONST eingabe): + +Zweck: Vergl. 'get (WINDOW VAR w, TEXT CONST eingabe). Nur wird hier die + Eingabe ausschließlich über die Positionierungstasten - nicht aber über + das Leerzeichen beendet. + + +#ib#get menuwindowcursor#ie# +PROC get menuwindowcursor (INT VAR spalte, zeile): + +Zweck: Mit der Prozedur wird die aktuelle Cursorposition innerhalb des Menu­ + fensters erfragt. + + +#ib#handle menu#ie# +PROC handle menu (TEXT CONST menuname): + +Zweck: Bringt das in der angekoppelten Menukarte enthaltene Menu mit dem + Namen 'menuname' zur Ausführung, d.h. das entsprechende Menu wird + auf dem Bildschirm präsentiert und kann mit den üblichen Tastenfunk­ + tionen gehandhabt werden. + (Anmerkung: Die Menufunktionen können natürlich nur dann ausge­ + führt werden, wenn die zugehörigen Programme in der aktuellen Task + zuvor insertiert wurden - ansonsten erscheint auf dem Bildschirm jeweils + der Hinweis 'unbekanntes Kommando'!) +Fehler: Das Menu 'menuname' ist nicht in der angekoppelten Menukarte! + + +#ib#infix namen#ie# +THESAURUS PROC infix namen (THESAURUS CONST thes, + TEXT CONST infix): + +Zweck: Die Prozedur liefert einen Thesaurus, in dem alle Namen enthalten sind, + die in 'thes' übergeben wurden und die den Wortbestandteil 'infix' enthal­ + ten (gleichgültig an welcher Position). + + +THESAURUS PROC infix namen (THESAURUS CONST thes, + INT CONST dateityp): + +Zweck: Die Prozedur liefert einen Thesaurus, in dem alle Dateinamen enthalten + sind, die in 'thes' übergeben wurden und die den Dateityp 'dateityp' + haben. + + +THESAURUS PROC infix namen (THESAURUS CONST thes, + TEXT CONST infix, + INT CONST dateityp): + + wirkt wie: infix namen (infix namen (thes, infix), dateityp) + + +#ib#install menu#ie# +PROC install menu (TEXT CONST menukartenname, + BOOL CONST mit emblem): + +Zweck: Mit diesem Befehl wird die Menukarte mit dem Namen 'menukarten­ + name' aus der Task 'gs-MENUKARTEN' in die aktuelle Task kopiert. Die + Menukarte wird als unbenannter Datenraum an die Task gekoppelt. Der + benannte Datenraum wird gelöscht. Der Name der angekoppelten Menu­ + karte wird vermerkt. + Stimmt der Name der angekoppelten Menukarte mit dem Namen der + angeforderten Menukarte überein, dann wird nicht erneut eine Kopie + angefordert, sondern auf der bereits angekoppelten Menukarte gearbeitet. + Hat 'mit emblem' den Wert 'TRUE', dann wird unser 'Software-Emblem' + während des Ankoppelvorgangs auf dem Bildschirm ausgegeben, bei + 'FALSE' nicht. +Fehler: Die Menukarte 'menukartenname' existiert nicht in der Task + 'gs-MENUKARTEN'. + + +PROC install menu (TEXT CONST menukartenname): + + wirkt wie: install menu (TEXT CONST menukartenname, TRUE) + + +#ib#invers#ie# +TEXT PROC invers (TEXT CONST text): + +Zweck: Liefert den Text 'text' invers dargestellt. An den Text wird zuvor ein Leer­ + zeichen angehängt. + + +#ib#kreuz#ie# +TEXT PROC kreuz: + +Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als "Kreuz" (̗) + ausgegeben wird. + + +PROC kreuz (TEXT CONST zeichen): + +Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­ + stellung der "Kästen" als "Kreuz" ausgegeben werden soll. + + +#ib#line#ie# +PROC line (WINDOW VAR w, INT CONST anzahl): + +Zweck: Vergl. 'menuwindowline'. Hier wird nur zusätzlich das Fenster festgelegt, + das bei 'menuwindowline' automatisch gesetzt wird. + + +PROC line (WINDOW VAR w): + + wirkt wie: line (w, 1) + + +#ib#menualternative#ie# +INT PROC menualternative (TEXT CONST infotext, + auswahlliste, + zusatztasten, + INT CONST position, + BOOL CONST mit abbruch): + +Zweck: Mit der Prozedur können dem Benutzer innerhalb des Menubildschirms + mehrere Alternativen zur Entscheidung angeboten werden, von denen er + sich für eine entscheiden kann. + Auf dem Bildschirm wird innerhalb des Menus eine Box ausgegeben. + Boxbreite und -höhe werden vom System automatisch anhand des über­ + gebenen 'infotext'es (bzw. der 'auswahlliste') festgelegt. Der in 'infotext' + übergebene Text wird innerhalb der Box angezeigt. Der Text muß den + gs-DIALOG-Syntax-Regeln (sehen Sie Kap. 5.13) entsprechen - er dient + ausschließlich der Information des Benutzers. + In der letzten Zeile der Box wird die 'auswahlliste' angeboten. Zwischen + jeder notierten Alternative muß in 'auswahlliste' der code "13" eingetra­ + gen sein. In der Box werden zwischen den Alternativen je drei Leerzei­ + chen eingefügt. Es können maximal 10 Alternativen angegeben werden, + die aber incl. der eingefügten Leerzeichen eine Gesamtbreite von 64 + Zeichen nicht überschreiten dürfen. Über diese Liste erfolgt durch Posi­ + tionierung und anschließendem die Entscheidung für eine + Alternative. Die Prozedur liefert dann als Zahlenwert die Position der + gewählten Alternative in der übergebenen Auswahlliste. + Über 'mit abbruch' wird festgelegt, ob die Alternativentscheidung durch + die Tastenfolge abgebrochen werden kann oder nicht. Ist + das zulässig und geschehen, dann wird der Wert 0 geliefert. + Über 'zusatztasten' kann noch festgelegt werden, ob die Entscheidung + auch durch Tippen bestimmter Tasten angegeben werden kann. Sind hier + Zeichen angegeben und erfolgt die Entscheidung über das Tippen einer + zugelassenen Taste, dann wird die Position der getippten Taste in der + unter 'zusatztasten' übergebenen Zeichenkette ermittelt und der Wert 100 + hinzuaddiert (sehen Sie dazu auch Kap. 5.7). + Nach der Entscheidung wird der Menubildschirm automatisch in den + Ausgangszustand versetzt. + + +#ib#menuanswer#ie# +TEXT PROC menuanswer (TEXT CONST infotext, + vorgabe, + INT CONST position): + +Zweck: Die Prozedur ermöglicht den Dialog mit dem Benutzer innerhalb des + Menus. Sie liefert einen vom Benutzer eingegebenen (bzw. modifizierten) + Text/Namen. + Auf dem Bildschirm wird innerhalb des Menus eine Box ausgegeben. + Boxbreite und -höhe werden vom System automatisch anhand des über­ + gebenen 'infotext'es festgelegt. Der in 'infotext' übergebene Text wird + innerhalb der Box angezeigt. Der Text muß den gs-DIALOG-Syntax-Regeln + (sehen Sie Kap. 5.13) entsprechen. + In der letzten Zeile der ausgegebenen Box erscheint der Text "Eingabe:". + Über 'vorgabe' kann dem Benutzer ein Text zum Editieren angeboten + werden. Mit 'position' wird die relative Lage der Box innerhalb des Menu­ + bildschirms festgelegt (1, 2, 3, 4, 5: sehen Sie dazu Kap. 5.12). + Die Eingabe kann durch abgeschlossen oder durch + abgebrochen werden, in letzterem Falle wird niltext ("") + geliefert. + Der gelieferte Wert ist von führenden und folgenden Leerzeichen befreit + (compress). Es ist nicht möglich, den Namen 'break' einzugeben (sehen + Sie dazu Kap.5.1). + + +#ib#menuanswerone#ie# +TEXT PROC menuanswerone (TEXT CONST infotext, + vorgabe, THESAURUS CONST thesaurus, + TEXT CONST ueberschrift, hinweis, + BOOL CONST mit reinigung): + +Zweck: Die Prozedur ist aus den zwei Prozeduren 'menuanswer' und 'menuone' + zusammengesetzt (sehen Sie auch dort). In einer Box innerhalb des + Menus wird der 'infotext' ausgegeben und eine Eingabe erwartet; ggf. + kann ein Text in 'vorgabe' zum Editieren ausgegeben werden. Wird die + Eingabe mit abgeschlossen, wird der eingegebene Text + geliefert. Statt der Eingabe kann der Benutzer sich durch die Tastenfolge + auch die in 'thesaurus' übergebenen Namen zur Auswahl + anbieten lassen. Wird ein Name angekreuzt, wird dieser geliefert; wird die + Auswahl durch abgebrochen, wird niltext ("") geliefert. +Fehler: Fenster für Auswahl zu klein (x < 56, y < 15) + + +#ib#menuanswersome#ie# +THESAURUS PROC menuanswersome (TEXT CONST + infotext, vorgabe, + THESAURUS CONST thesaurus, + TEXT CONST ueberschrift, hinweis, + BOOL CONST mit reinigung): + +Zweck: Die Prozedur ist aus den zwei Prozeduren 'menuanswer' und 'menusome' + zusammengesetzt (sehen Sie auch dort). In einer Box innerhalb des + Menus wird der 'infotext' ausgegeben und eine Eingabe erwartet; ggf. + kann ein Text in 'vorgabe' zum Editieren ausgegeben werden. Wird die + Eingabe mit abgeschlossen, wird der eingegebene Text in + einem Thesaurus geliefert. Statt der Eingabe kann der Benutzer sich + durch die Tastenfolge auch die in 'thesaurus' übergebenen + Namen zur Auswahl anbieten lassen. Werden Namen angekreuzt, werden + diese in einem Thesaurus geliefert; wird die Auswahl durch + abgebrochen, wird ein leerer Thesaurus geliefert. +Fehler: Fenster für Auswahl zu klein (x < 56, y < 15) + + +#ib#menu archiv checken#ie# +PROC menu archiv checken: + +Zweck: Über diese Prozedur kann das "Checken" von Dateien auf dem Archiv in + das Archiv-Pull-Down-Menu eingebunden werden. Sehen Sie dazu unbe­ + dingt Kap. 6.1! + + +#ib#menu archiv grundeinstellung#ie# +PROC menu archiv grundeinstellung (INT CONST ort): + +Zweck: Hierüber wird die Grundeinstellung des Archivpakets vorgenommen: Dazu + wird als Zieltask das Archiv der eigenen Station eingestellt. Dieses wird + auch über eine Menunotiz im Menu angezeigt. Die entsprechenden Menu­ + punkte werden aktiviert bzw. deaktiviert. Sehen Sie dazu unbedingt Kap. + 6.1! + Über 'ort' wird festgelegt, an welcher Stelle innerhalb des Menus die + Menunotiz zur Anzeige der Zieltask (und ggf. des Archivnamens) ausge­ + geben wird (sehen Sie dazu Kap. 5.12). + + +#ib#menu archiv holen#ie# +PROC menu archiv holen: + +Zweck: Über diese Prozedur kann das Holen von Dateien vom Archiv in das + Archiv-Pull-Down-Menu eingebunden werden. Sehen Sie dazu unbedingt + Kap. 6.1! + + +#ib#menu archiv initialisieren#ie# +PROC menu archiv initialisieren: + +Zweck: Über diese Prozedur kann das Formatieren/ Initialisieren eines Archivs in + das Archiv-Pull-Down-Menu eingebunden werden. Sehen Sie dazu unbe­ + dingt Kap. 6.1! + + +#ib#menu archiv loeschen#ie# +PROC menu archiv loeschen: + +Zweck: Über diese Prozedur kann das Löschen von Dateien auf dem Archiv in das + Archiv-Pull-Down-Menu eingebunden werden. Sehen Sie dazu unbedingt + Kap. 6.1! + + +#ib#menu archiv neue diskette#ie# +PROC menu archiv neue diskette: + +Zweck: Über diese Prozedur kann das Anmelden einer neuen Diskette bei schon + reserviertem Archiv in das Archiv-Pull-Down-Menu eingebunden werden. + Sehen Sie dazu unbedingt Kap. 6.1! + + +#ib#menu archiv reservieren#ie# +PROC menu archiv reservieren: + +Zweck: Über diese Prozedur kann die Archivreservierung in das Archiv-Pull- + Down-Menu eingebunden werden. Sehen Sie dazu unbedingt Kap. 6.1! + + +#ib#menu archiv reservierung aufgeben#ie# +PROC menu archiv reservierung aufgeben: + +Zweck: Über diese Prozedur kann eine bestehende Archivreservierung aus dem + Menu heraus aufgegeben werden. Sehen Sie dazu unbedingt Kap. 6.1! + + +#ib#menu archiv schreibcheck#ie# +PROC menu archiv schreibcheck: + +Zweck: Über diese Prozedur kann das Schreiben von Dateien auf das Archiv und + das sich automatisch daran anschließende "Checken" der zuvor geschrie­ + benen Dateien in das Archiv-Pull-Down-Menu eingebunden werden. + Sehen Sie dazu unbedingt Kap. 6.1! + + +#ib#menu archiv schreiben#ie# +PROC menu archiv schreiben: + +Zweck: Über diese Prozedur kann das Schreiben von Dateien auf das Archiv in + das Archiv-Pull-Down-Menu eingebunden werden. Sehen Sie dazu unbe­ + dingt Kap. 6.1! + + +#ib#menu archiv verzeichnis#ie# +PROC menu archiv verzeichnis: + +Zweck: Über diese Prozedur kann die Ausgabe eines Inhaltsverzeichnisses des + Archivs auf dem Bildschirm in das Archiv-Pull-Down-Menu eingebunden + werden. Sehen Sie dazu unbedingt Kap. 6.1! + + +#ib#menu archiv verzeichnis drucken#ie# +PROC menu archiv verzeichnis drucken: + +Zweck: Über diese Prozedur kann die Ausgabe eines Inhaltsverzeichnisses des + Archivs über den Drucker in das Archiv-Pull-Down-Menu eingebunden + werden. Sehen Sie dazu unbedingt Kap. 6.1! + + +#ib#menu archiv zieltask einstellen#ie# +PROC menu archiv zieltask einstellen: + +Zweck: Über diese Prozedur kann die Festlegung der Zieltask, mit der die Inter­ + taskkommunikation abgewickelt werden soll, in das Archiv-Pull-Down- + Menu eingebunden werden. Sehen Sie dazu unbedingt Kap. 6.1! + + +#ib#menu dateien aufraeumen#ie# +PROC menu dateien aufraeumen: + +Zweck: Durch diese Prozedur wird innerhalb des aktuellen Menus der Name der + Datei erfragt, die aufgeräumt, d.h. reorganisiert werden soll. Existiert + keine Datei mit dem angegebenen Namen, so erfolgt ein Hinweis darauf. + Statt der Eingabe des Dateinamens kann auch die Tastenfolge + getippt werden. Daraufhin werden alle Dateinamen der + Task zur Auswahl angeboten. Hier können die gewünschten Dateinamen + angekreuzt werden. Anschließend werden die angekreuzten Dateien + reorganisiert. Der Vorgang wird auf dem Bildschirm protokolliert. Am + Ende des Vorgangs wird der Menubildschirm automatisch regeneriert. Es + können natürlich nur Dateien des Typs 1003 (Textfiles) reorganisiert + werden; sofern andere Dateien ausgewählt werden, erfolgt ein Hinweis + darauf. + + +#ib#menu dateien drucken#ie# +PROC menu dateien drucken: + +Zweck: Durch diese Prozedur wird innerhalb des aktuellen Menus (auch bei + geschachtelten(!)) der Name der Datei erfragt, die gedruckt werden soll. + Anschließend wird die Datei mit dem angegebenen Namen gedruckt. + Existiert keine Datei mit dem angegebenen Namen, so erfolgt ein Hinweis + darauf. + Statt der Eingabe des Dateinamens kann auch die Tastenfolge + getippt werden. Daraufhin werden alle Dateinamen der + Task zur Auswahl angeboten. Alle angekreuzten Dateien werden an­ + schließend gedruckt. Der Vorgang wird auf dem Bildschirm protokolliert. + Am Ende wird der Menubildschirm automatisch regeneriert. + + +#ib#menu dateien kopieren#ie# +PROC menu dateien kopieren: + +Zweck: Durch diese Prozedur wird innerhalb des aktuellen Menus der Name der + Datei erfragt, die kopiert werden soll. Existiert keine Datei mit dem + angegebenen Namen, so erfolgt ein Hinweis darauf. Statt der Eingabe des + Dateinamens kann auch die Tastenfolge getippt werden. + Daraufhin werden alle Dateinamen der Task zur Auswahl angeboten. Hier + kann ein Dateiname angekreuzt werden. Nun wird der Name erfragt, den + die Kopie erhalten soll. Existiert der Name bereits, erfolgt ein Hinweis + darauf, sonst wird die Datei kopiert. Der Menubildschirm wird automa­ + tisch regeneriert. + + +#ib#menu dateien loeschen#ie# +PROC menu dateien loeschen: + +Zweck: Durch diese Prozedur wird innerhalb des aktuellen Menus der Name der + Datei erfragt, die gelöscht werden soll. Anschließend wird die Datei mit + dem angegebenen Namen gelöscht, sofern die Sicherheitsabfrage zum + Löschen mit 'Ja' beantwortet wurde. Existiert keine Datei mit dem ange­ + gebenen Namen, so erfolgt ein Hinweis darauf. Statt der Eingabe des + Dateinamens kann auch die Tastenfolge getippt werden. + Daraufhin werden alle Dateinamen der Task zur Auswahl angeboten. Alle + angekreuzten Dateien werden anschließend (nach jeweiliger Sicherheits­ + anfrage) gelöscht. Der Vorgang wird auf dem Bildschirm protokolliert. Am + Ende wird der Menubildschirm automatisch regeneriert. + + +#ib#menu dateien speicherplatz#ie# +PROC menu dateien speicherplatz: + +Zweck: Durch diese Prozedur wird innerhalb des aktuellen Menus der Name der + Datei erfragt, deren Speicherplatz ermittelt werden soll. Existiert keine + Datei mit dem angegebenen Namen, so erfolgt ein Hinweis darauf. Statt + der Eingabe des Dateinamens kann auch die Tastenfolge + getippt werden. Daraufhin werden alle Dateinamen der Task zur Aus­ + wahl angeboten. Hier können die gewünschten Dateinamen angekreuzt + werden. Anschließend wird der Speicherplatz der angekreuzten Datei(en) + ermittelt und im Menufenster ausgegeben. Im Anschluß an die Anzeige + wird der Menubildschirm automatisch regeneriert. + + +#ib#menu dateien umbenennen#ie# +PROC menu dateien umbenennen: + +Zweck: Durch diese Prozedur wird innerhalb des aktuellen Menus der Name der + Datei erfragt, die umbenannt werden soll. Existiert keine Datei mit dem + angegebenen Namen, so erfolgt ein Hinweis darauf. Statt der Eingabe des + Dateinamens kann auch die Tastenfolge getippt werden. + Daraufhin werden alle Dateinamen der Task zur Auswahl angeboten. Hier + kann ein Dateiname angekreuzt werden. Nun wird der Name erfragt, den + die Datei anschließend erhalten soll. Existiert der Name bereits, erfolgt ein + Hinweis darauf, sonst wird die Datei umbenannt. Der Menubildschirm + wird automatisch regeneriert. + + +#ib#menu dateien verzeichnis#ie# +PROC menu dateien verzeichnis + +Zweck: Mit der Prozedur kann innerhalb des aktuellen Menus ein Verzeichnis der + Dateien der eigenen Task ausgegeben werden. Nach Verlassen des Ver­ + zeichnisses durch wird der Menubildschirm automatisch + regeneriert. + + +#ib#menufootnote#ie# +PROC menufootnote (TEXT CONST fussnotentext): + +Zweck: Mit der Prozedur kann der Text in der "Fußzeile" des aktuellen Menubild­ + schirms (zumeist Hinweise an den Benutzer) ersetzt werden. Der vorhan­ + dene Text wird gelöscht und stattdessen 'fussnotentext' notiert. Der Text + bleibt so lange erhalten, bis er durch eine andere selbstgesetzte Fußnote + ('menufootnote') oder durch die alte vom System gesetzte Fußnote ('old + menufootnote'; sehen Sie auch dort) überschrieben wird. Sofern + gs-DIALOG-Prozeduren aufgerufen werden, die selbst Ausgaben in der + Fußzeile machen, wird die durch 'menufootnote' gesetzte Fußnote eben­ + falls überschrieben. Wenn der Text länger als die aktuelle Menubild­ + schirmbreite ist,wird der Text abgeschnitten. Damit der Text auch in + geschachtelten Menus vollständig ausgegeben werden kann, sollte er nicht + länger als 69 Zeichen sein. + + +#ib#menufunktion#ie# +PROC menufunktion (TEXT CONST kuerzel, + punktbezeichnung, + prozedurname, + infotext): + +Zweck: Der Befehl wird für die Generierung von Menukarten benötigt. Mit diesem + Befehl wird in das aktuell geöffnete Menu unter dem aktuellen Oberbe­ + griff eine Verarbeitungsfunktion eingetragen. Mit 'kuerzel' wird die Taste + bestimmt, über die die Verarbeitungsfunktion direkt aktiviert werden + kann. 'kuerzel' muß innerhalb eines Pull-Down-Menus eindeutig gewählt + sein! Unter 'punktbezeichnung' wird der Text eingetragen, der im Pull- + Down-Menu ausgegeben werden soll. In 'prozedurname' steht der Name + der Prozedur (als Text(!)), die bei Aktivierung des Menupunktes ausge­ + führt werden soll. In 'infotext' steht der Text, der als Information zu + diesem Menupunkt bei Tippen der -Taste angezeigt werden soll. +Fehler: Menupunkt-Kürzel ist länger als ein Zeichen. + Menupunktkürzel kommt mehrfach vor. + Menupunktbezeichnung ist zu lang (> 60 Zeichen). + Zu viele Menupunkte in einem Pull-Down-Menu (> 15). + + +#ib#menuinfo#ie# +PROC menuinfo (TEXT CONST infotext, INT CONST + position, timelimit): + +Zweck: Die Prozedur ermöglicht es, innerhalb des Menus einen Hinweis (Infor­ + mationstext) auszugeben. Im Menubildschirm erscheint der 'infotext' in + einer Box. Boxbreite und -höhe werden vom System automatisch anhand + des übergebenen 'infotext'es festgelegt. 'infotext' muß den gs-DIALOG- + Syntax-Regeln (sehen Sie Kap. 5.13) entsprechen. Mit 'position' wird die + relative Lage der Box innerhalb des Menubildschirms festgelegt (1, 2, 3, + 4, 5: sehen Sie dazu Kap. 5.12). Mit 'timelimit' kann die Zeitdauer (in + Zehntelsekunden) festgelegt werden, für die der Hinweis höchstens er­ + scheint. Die Anzeige kann vom Benutzer durch Tippen einer beliebigen + Taste abgebrochen werden. + + +PROC menuinfo (TEXT CONST infotext, + INT CONST position): + + wirkt wie: menuinfo (infotext, position, maxint) + + +PROC menuinfo (TEXT CONST infotext): + + wirkt wie: menuinfo (infotext, 5) + + +#ib#menukartenname#ie# +TEXT PROC menukartenname:#u#(*)#e# +Zweck: Liefert den Namen der zur zeit angekoppelten Menukarte. Ist keine + Menukarte angekoppelt, wird niltext ("") geliefert. + + +#ib#menuno#ie# +BOOL PROC menuno (TEXT CONST frage, + INT CONST position): + + wirkt wie: NOT menuyes (frage, position) + + +#ib#menuone#ie# +TEXT PROC menuone (THESAURUS CONST thesaurus, + TEXT CONST ueberschrift, + hinweis, + BOOL CONST mit reinigung): + +Zweck: Durch die Prozedur werden dem Benutzer innerhalb des Menubild­ + schirms Namen zur Auswahl angeboten. Nach Ankreuzen eines Namens + wird die Auswahl automatisch verlassen. Der angekreuzte Name wird + geliefert. Wird die Auswahl durch abgebrochen, so wird + niltext ("") geliefert. In 'thesaurus' wird ein THESAURUS mit den Namen + übergeben, die zur Auswahl angeboten werden sollen (sehen Sie dazu + auch Kap. 5.14). Die beiden Texte 'ueberschrift' und 'hinweis' erscheinen + zur Kennzeichnung im Kopf der Auswahlliste: 'ueberschrift' zentriert und + invers dargestellt, 'hinweis' nur zentriert. Hat 'mit reinigung' den Wert + TRUE, so wird nach der Auswahl der Menubildschirm automatisch wie­ + deraufgebaut, bei FALSE wird darauf verzichtet. +Fehler: Fenster für Auswahl zu klein (x < 56, y < 15) + + +#ib#menusome#ie# +THESAURUS PROC menusome (THESAURUS CONST + thesaurus, + TEXT CONST ueberschrift, + hinweis, + BOOL CONST mit reinigung): + +Zweck: Durch die Prozedur werden dem Benutzer innerhalb des Menubild­ + schirms Namen zur Auswahl angeboten. Die Auswahl kann durch die + Tastenfolge verlassen werden. Der/ die angekreuzte(n) + Name(n) wird/werden in einem Thesaurus geliefert. Wird die Auswahl + durch die Tastenfolge abgebrochen oder wurde kein Name + angekreuzt, dann wird ein leerer Thesaurus geliefert. In 'thesaurus' wird + ein Thesaurus mit den Namen übergeben, die zur Auswahl angeboten + werden sollen (sehen Sie dazu auch Kap. 5.14). Die beiden Texte + 'ueberschrift' und 'hinweis' erscheinen zur Kennzeichnung im Kopf der + Auswahlliste: 'ueberschrift' zentriert und invers dargestellt, 'hinweis' nur + zentriert. Hat 'mit reinigung' den Wert TRUE, so wird nach der Auswahl + der Menubildschirm automatisch wiederaufgebaut, bei FALSE wird darauf + verzichtet. +Fehler: Fenster für Auswahl zu klein (x < 56, y < 15) + + +#ib#menuwindowcenter#ie# +TEXT PROC menuwindowcenter (TEXT CONST text): + +Zweck: Die Prozedur liefert einen Text, der so lang ist, wie das aktuelle Menufen­ + ster breit ist. Dazu wird 'text' so mit Leerzeichen "ummantelt" daß 'text' + etwa in der Mitte zu stehen kommt. Steht der Cursor bei Ausgabe dieses + Textes am Anfang der Zeile, erscheint der Text zentriert in der Zeile + (vorhandene Zeileninhalte werden dadurch überschrieben (der Cursor + steht dann auf dem rechten Fensterrand!). + + +#ib#menuwindowcursor#ie# +PROC menuwindowcursor (INT CONST spalte, zeile): + +Zweck: Mit diesem Befehl kann der Cursor innerhalb des aktuellen Menufensters + positioniert werden. Ein "normales" Menufenster ist 77 Zeichen breit und + 20 Zeichen hoch; ein Menufenster in einem geschachtelten Menu ist 71 + Zeichen breit und 16 Zeichen hoch). (Sehen Sie auch die Informations­ + prozeduren 'get menuwindowcursor' und 'remaining menuwindowlines'). +Fehler: Wird außerhalb des aktuellen Menufensters positioniert, wird der Fenster­ + inhalt gelöscht und die Fensterposition (1,1) angenommen. + + +#ib#menuwindowedit#ie# +PROC menuwindowedit (TEXT CONST dateiname): + +Zweck: Durch den Befehl wird innerhalb des Menus ein umrandetes Fenster + geöffnet und die Datei mit dem Namen 'dateiname' zum Editieren ausge­ + geben. Auf die Größe des Menufensters kann kein Einfluß genommen + werden - sie wird selbständig vom System gesetzt ("normales" Menu: 77 + Zeichen breit und 20 Zeichen hoch; geschachteltes Menu 71 Zeichen + breit und 16 Zeichen hoch). +Fehler: Die Datei mit dem Namen 'dateiname' existiert nicht. + + +PROC menuwindowedit (FILE VAR f): + +Zweck: Vergl. obige 'menuwindowedit'-Prozedur. Die Datei 'f' muß mit der Verar­ + beitungsart 'modify' assoziiert worden sein. + + +#ib#menuwindoweditget#ie# +PROC menuwindoweditget (TEXT VAR text):#u#(*)#e# +Zweck: Vergl. 'menuwindowget (TEXT VAR text)' Zusätzlich kann hier in 'text' ein + Text zum Editieren vorgegeben werden. +Fehler: Text nicht initialisiert. + + +#ib#menuwindowget#ie# +PROC menuwindowget (TEXT VAR text): + +Zweck: Mit der Prozedur können Texte innerhalb des Menufensters eingelesen + werden (INTEGER- und REAL-Werte müssen ggf. "von Hand" konvertiert + werden). 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 + Zeichenpositionen für die Eingabe vorhanden, so wird automatisch für die + Eingabe an den Anfang der nächsten Zeile positioniert. + + +#ib#menuwindowline#ie# +PROC menuwindowline (INT CONST anzahl): + +Zweck: Die Prozedur 'menuwindowline' hat innerhalb des Menubildschirms eine + ähnliche Wirkung wie die Prozedur 'line' auf dem Gesamtbildschirm. Es + werden 'anzahl' Zeilenwechsel vorgenommen. Wird allerdings die untere + Grenze des Menubildschirms überschritten, dann rollt (scrollt) der Bild­ + schirm nicht die entsprechende Anzahl Zeilen nach oben, statt dessen + wird der Fensterinhalt gelöscht und die Operation oben im Fenster fort­ + gesetzt. + + +PROC menuwindowline: + + wirkt wie: menuwindowline (1) + + +#ib#menuwindowout#ie# +PROC menuwindowout (TEXT CONST text): + +Zweck: Mit der Prozedur können innerhalb des aktuellen Menufensters Texte + ausgegeben werden. Sollen INTEGER- oder REAL-Werte ausgegeben wer­ + den, müssen diese zunächst in Texte konvertiert werden. Ist der Text + länger als die verbleibende Restzeile innerhalb des aktuellen Menufen­ + sters, so wird der Text bis zum Fensterende (rechts) ausgegeben und die + Ausgabe am Anfang der nächsten Zeile fortgesetzt. Sobald die letzte Posi­ + tion des aktuellen Menufensters (unten rechts in der Fensterecke) be­ + schrieben wurde, wird der Fensterinhalt gelöscht und die Ausgabe an der + Position (1,1) des Fensters fortgesetzt. + + +#ib#menuwindowpage#ie# +PROC menuwindowpage: + +Zweck: Durch den Befehl 'menuwindowpage' wird der Inhalt des Fensters inner­ + halb des aktuellen Menus gelöscht (das "Menufenster") (vergleichen Sie + auch 'show menuwindow'). Der Rahmen des Fensters (der bei 'show + menuwindow' ausgegeben wurde), bleibt bestehen, da er nicht mit zum + eigentlichen Fenster gehört. Durch den Befehl wird der Menubildschirm + nicht rekonstruiert! Soll das Fenster geschlossen werden, ist der Befehl + 'regenerate menuscreen' zu geben. + + +#ib#menuwindowshow#ie# +PROC menuwindowshow (TEXT CONST dateiname): + +Zweck: Vergl. 'menuwindowedit'-Prozedur. Die Datei 'dateiname' kann nicht + schreibend verändert werden. + + +PROC menuwindowshow (FILE VAR f): + +Zweck: Vergl. obige 'menuwindowshow'-Prozedur. Die Datei 'f' muß mit der + Verarbeitungsart 'modify' assoziiert worden sein. + + +#ib#menuwindowstop#ie# +PROC menuwindowstop (INT CONST zeilenzahl): + +Zweck: Innerhalb des Menufensters werden 'zeilenzahl' Zeilenwechsel vorge­ + nommen und der Text " Zum Weitermachen bitte irgendeine Taste tip­ + pen!" ausgegeben. Danach wird so lange gewartet, bis eine Taste getippt + wird. + + +PROC menuwindowstop: + + wirkt wie: menuwindowstop (2) + + +#ib#menuyes#ie# +BOOL PROC menuyes (TEXT CONST frage, + INT CONST position): + +Zweck: Die Prozedur dient dazu, innerhalb des Menus eine Ja/Nein-Entscheidung + des Benutzers einzuholen. Im Gegensatz zur Standardprozedur 'yes' + arbeitet diese Prozedur unabhängig davon, ob der Kommandodialog ein- + oder ausgeschaltet ist. Auf dem Bildschirm wird innerhalb des Menus eine + Box ausgegeben. Boxbreite und -höhe werden vom System automatisch + anhand der übergebenen 'frage' festgelegt. Der in 'frage' übergebene Text + wird um ein Fragezeichen (?) ergänzt und innerhalb der Box angezeigt. + Der Text muß den gs-DIALOG-Syntax-Regeln (sehen Sie Kap. 5.13) + entsprechen. In der letzten Zeile der ausgegebenen Box erscheint der Text + "Ja    Nein". Die Prozedur 'menuyes' liefert TRUE, wenn mit 'Ja' geantwor­ + tet wurde und FALSE, wenn mit 'Nein' geantwortet wurde (durch Tippen + der Anfangsbuchstaben oder Positionierung auf die Antwort und ab­ + schließendes ). Der Menubildschirm wird automatisch + regeneriert. Mit 'position' wird die relative Lage der Box innerhalb des + Menubildschirms festgelegt (1, 2, 3, 4, 5: sehen Sie dazu Kap. 5.12). + + +#ib#no#ie# +BOOL PROC no (WINDOW VAR w, TEXT CONST frage): + + wirkt wie: NOT yes (w, frage). + + +#ib#not empty#ie# +BOOL PROC not empty (THESAURUS CONST thes): + +Zweck: Dient der Prüfung, ob ein Thesaurus Namen enthält oder nicht. Die + Prozedur liefert TRUE, wenn Namen in 'thes' enthalten sind, sonst FALSE. + + +#ib#oberbegriff#ie# +PROC oberbegriff (TEXT CONST punktname, + startprocname, + leaveprocname): + +Zweck: Der Befehl wird bei der Generierung von Menukarten benötigt. Mit diesem + Befehl wird die Bezeichnung 'punktname' in die Kopfzeile des aktuell + geöffneten Menus eingetragen. Die in 'startprocname' übergebene Proze­ + dur wird ausgeführt, bevor das zugehörige Pull-Down-Menu auf dem + Bildschirm "ausgeklappt" wird; die in 'leaveprocname' übergebene Pro­ + zedur, wenn in ein anderes Pull-Down-Menu gewechselt wird (beachten + Sie, daß die Prozedurnamen als Texte(!) übergeben werden). +Fehler: Menukarte noch nicht geöffnet ('oeffne menukarte' fehlt). + Menu noch nicht geöffnet ('oeffne menu' fehlt). + Zu viele Oberbegriffe im Menu (> 10). + Die Kopfzeile ist zu lang (> 70 Zeichen). + + +PROC oberbegriff (TEXT CONST punktname): + + wirkt wie: oberbegriff (punktname, "", "") + + +#ib#oeffne menu#ie# +PROC oeffne menu (TEXT CONST menuname, + einstiegsproc, + ausstiegsproc, infotext1, + infotext2, infotext3): + +Zweck: Der Befehl wird für die Generierung von Menukarten benötigt. Durch den + Befehl wird innerhalb der Menukarte ein Menu mit dem Namen + 'menuname' angelegt. Über diesen Namen kann das Menu auch später + angesprochen werden (mit 'handle menu'). Die unter 'einstiegsproc' + übergebene Prozedur wird bei der Aktivierung des Menus ausgeführt, die + unter 'ausstiegsproc' übergebene Prozedur, wenn das Menu (mit + ) verlassen wird (beachten Sie, daß die Prozedurnamen als + Texte(!) übergeben werden!). In 'infotext1', 'infotext2' und 'infotext3' + können Hinweise eingetragen werden, die bei Erscheinen des Menus auf + dem Bildschirm für kurze Zeit in einer Box rechts unten angezeigt wer­ + den. Die Erstellung der Boxtexte ist an genaue Regeln gebunden (sehen + Sie dazu Kap. 5.13). Sehen Sie auch bei 'schliesse menu'. + + +PROC oeffne menu (TEXT CONST menuname, + einstiegsproc, + ausstiegsproc): + + wirkt wie: oeffne menu (menuname, einstiegsproc, + ausstiegsproc, "", "", "") + + +PROC oeffne menu (TEXT CONST menuname): + + wirkt wie: oeffne menu (menuname, "", "") + + +#ib#oeffne menukarte#ie# +PROC oeffne menukarte (TEXT CONST menukartenname): + +Zweck: Der Befehl wird bei der Generierung von Menukarten benötigt. Ein Pro­ + gramm zur Erstellung einer Menukarte muß immer mit diesem Befehl + beginnen. Durch den Befehl wird ein Datenraum mit dem Namen + 'gs-MENUKARTE:menukartenname' eingerichtet; der Wortbestandteil + 'gs-MENUKARTE:' wird dabei automatisch vor den angegebenen Namen + gesetzt (sehen Sie auch 'schliesse menukarte'). +Fehler: Eine Menukarte mit dem angegebenen Namen existiert bereits in der + Task. Bei der Generierung wird dann angefragt, ob die alte Menukarte + gelöscht werden darf. + + +#ib#ohne praefix#ie# +THESAURUS PROC ohne praefix (THESAURUS CONST thes, + TEXT CONST praefix): + +Zweck: Liefert in einem Thesaurus alle Namen aus dem übergebenen Thesaurus + 'thes', die mit dem Wortbestandteil 'praefix' beginnen. Bei den gelie­ + ferten Namen ist dieser führende Wortbestandteil entfernt. + + +#ib#old menufootnote#ie# +PROC old menufootnote: + +Zweck: Der aktuelle Text in der Fußzeile des aktuellen Menubildschirms wird + durch den hier zuletzt vom System gesetzten Text überschrieben. Die + Prozedur wird benutzt, um eine selbstgesetzte Fußnote (sehen Sie auch + 'write menunotice') zu löschen. + + +#ib#out#ie# +PROC out (WINDOW VAR w, TEXT CONST text): + +Zweck: Vergl. 'menuwindowout'. Hier wird nur zusätzlich das Fenster festgelegt, + das bei 'menuwindowout' automatisch gesetzt wird. + + +#ib#out frame#ie# +PROC out frame (WINDOW VAR fenster): + +Zweck: Um den durch 'fenster' angegebenen Bildschirmbereich wird ein Rahmen + gezogen. + + +#ib#out footnote#ie# +PROC out footnote (WINDOW VAR fenster, + TEXT CONST textzeile): + +Zweck: In der untersten Zeile des Fensters 'fenster' wird 'textzeile' ausgegeben, in + der vorletzten Zeile eine Trennzeile. Sehen Sie auch 'erase footnote'. + + +#ib#page#ie# +PROC page (WINDOW VAR fenster, + BOOL CONST mit rahmen): + +Zweck: Der durch 'fenster' beschriebene Fensterbereich wird gelöscht. Hat 'mit + rahmen' den Wert TRUE, wird der Rahmenbereich ebenfalls gelöscht. + + +PROC page (WINDOW VAR fenster): + + wirkt wie: page (fenster, FALSE). + + +#ib#put#ie# +PROC put (WINDOW VAR w, TEXT CONST text): + + wirkt wie: out (w, text + " ") + + +PROC put (WINDOW VAR w, INT CONST zahl): + + wirkt wie: put (w, text (zahl)) + + +PROC put (WINDOW VAR w, REAL CONST zahl): + + wirkt wie: put (w, text (zahl)) + + +#ib#putline#ie# +PROC putline (WINDOW VAR w, TEXT CONST text): + + wirkt wie: put (w, text); line (w) + + +#ib#regenerate menuscreen#ie# +PROC regenerate menuscreen: + +Zweck: Der Befehl wird verwendet, um den Menubildschirm (z.B. nach der + Nutzung für anwendungsbezogene Ausgaben) in seinem letzten Zustand + zu reproduzieren. Der Bildschirm wird gelöscht. Anschließend wird der + aktuelle Menubildschirm vollständig neu aufgebaut - auch bei geschach­ + telten Menus. (sehen Sie auch 'refresh submenu') + + +#ib#refresh submenu#ie# +PROC refresh submenu: + +Zweck: Der Befehl dient dazu, das aktuelle Pull-Down-Menu (z.B. nach Über­ + schreiben) und ggf. eine gesetzte Menunotiz erneut auf den Bildschirm zu + schreiben. Betroffen ist nur der Bereich zwischen den Trennlinien der + Kopf- und Fußzeile. Für das vorausgehende Löschen verwendeter Bild­ + schirmbereich ist der Programmierer verantwortlich. Im Gegensatz zu + 'regenerate menuscreen' findet hier kein kompletter Bildschirmaufbau + statt. Wenn möglich, dann ist dieser Befehl dem Befehl 'regenerate + menuscreen' wegen des geringeren Zeitaufwandes vorzuziehen. + + +#ib#remaining lines#ie# +INT PROC remaining lines (WINDOW VAR w): + +Zweck: Die Prozedur liefert die Anzahl der Zeilen im Fenster 'w', die noch + zwischen Cursor und unterer Fenstergrenze vorhanden sind. + + +#ib#remaining menuwindowlines#ie# +INT PROC remaining menuwindowlines + +Zweck: Die Prozedur liefert die Anzahl der Zeilen im aktuellen Menufenster, die + noch zwischen Cursor und unterer Fenstergrenze vorhanden sind. + + +#ib#reset dialog#ie# +PROC reset dialog: + +Zweck: Das Menusystem wird in den Anfangszustand versetzt. (Keine Menukarte + angekoppelt; Anzahl der geöffneten Menus: 0) + + +#ib#schliesse menu#ie# +PROC schliesse menu: + +Zweck: Der Befehl wird bei der Generierung von Menukarten benötigt. Durch den + Befehl wird ein Menu in einer Menukarte abgeschlossen (sehen Sie auch + 'oeffne menu') + + +#ib#schliesse menukarte#ie# +PROC schliesse menukarte + +Zweck: Der Befehl wird bei der Generierung von Menukarten benötigt. Durch den + Befehl wird eine Menukarte abgeschlossen (sehen Sie auch 'oeffne + menukarte') + + +#ib#senkrecht#ie# +TEXT PROC senkrecht: + + Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als senkrechter + Strich (�) ausgegeben wird. + + +PROC senkrecht (TEXT CONST zeichen): + +Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­ + stellung der "Kästen" als senkrechter Strich ausgegeben werden soll. + + +#ib#show#ie# +PROC show (WINDOW VAR fenster): + +Zweck: Das Fenster 'fenster' wird auf dem Bildschirm angezeigt (das Fenster + muß zuvor durch 'window' initialisiert worden sein). Um den angegebe­ + nen Fensterbereich wird automatisch ein Rahmen gezogen. Der Rahmen + gehört nicht zum Fenster dazu! (Soll das Fenster ohne Rahmen ausgege­ + ben werden, dann muß der Befehl 'page' verwendet werden.) Der Bereich + innerhalb des Rahmens (Fensterbereich) wird gelöscht. + + +#ib#show#ie# +PROC show (WINDOW VAR w, TEXT CONST dateiname): + +Zweck: Vergl. 'menuwindowshow'. Hier wird nur zusätzlich das Fenster festgelegt, + das bei 'menuwindowshow' automatisch gesetzt wird. + + +PROC show (WINDOW VAR w, FILE VAR f): + +Zweck: Vergl. 'menuwindowshow'. Hier wird nur zusätzlich das Fenster festgelegt, + das bei 'menuwindowshow' automatisch gesetzt wird. + + +#ib#show menuwindow#ie# +PROC show menuwindow: + +Zweck: Durch den Befehl 'show menuwindow' wird ein entsprechender Rahmen + innerhalb des Menubildschirms ausgegeben und der Bereich innerhalb + dieses Rahmens (das Fenster) gelöscht (sehen Sie auch 'menuwindow­ + page'). Innerhalb des Fensters können anschließend verschiedene Opera­ + tionen ausgeführt werden. Auf die Größe des Menufensters kann kein + Einfluß genommen werden - sie wird selbständig vom System gesetzt + ("normales" Menu: 77 Zeichen breit und 20 Zeichen hoch; geschachteltes + Menu 71 Zeichen breit und 16 Zeichen hoch). + + +#ib#stdinfoedit#ie# +PROC stdinfoedit (TEXT CONST dateiname):#u#(*)#e# +Zweck: Löscht den Bildschirm und bietet die Datei 'dateiname' in einem festge­ + legten zum Editieren an. In der Fußzeile wird die Information "Info: +   Verlassen: " angezeigt. Nach Tippen von + werden Editorinformationen in den Bildschirm einge­ + blendet. + + +PROC stdinfoedit (FILE VAR f):#u#(*)#e# +Zweck: Wie obige 'stdinfoedit'-Prozedur'. Die Datei 'f' muß mit der Verarbei­ + tungsart 'modify' assoziiert worden sein. + + +PROC stdinfoedit (TEXT CONST dateiname, + INT CONST oberste zeile):#u#(*)#e# +Zweck: Wie obige Prozedur (die wie 'stdwinfoedit (w, 1)' wirkt). Allerdings kön­ + nen bis zu zwei Zeilen oben auf dem Bildschirm unbenutzt bleiben (z.B. + um die Kopfzeile des Menus weiterhin anzuzeigen). 'oberste zeile' gibt an, + welche Bildschirmzeile die erste von dieser Prozedur benutzte ist + (1<= oberste zeile<=3). + + +PROC stdinfoedit (FILE VAR f, + INT CONST oberste zeile):#u#(*)#e# +Zweck: Wie obige 'stdinfoedit'-Prozedur'. Die Datei 'f' muß mit der Verarbei­ + tungsart 'modify' assoziiert worden sein. + + +#ib#stop#ie# +PROC stop (WINDOW VAR w, INT CONST zeilenzahl): + +Zweck: Vergl. 'menuwindowstop'. Hier wird nur zusätzlich das Fenster festgelegt, + das bei 'menuwindowstop' automatisch gesetzt wird. + + +PROC stop (WINDOW VAR w): + + wirkt wie: stop (w, 1). + + +#ib#testinstallation#ie# +PROC testinstallation (TEXT CONST menutafelname): + +Zweck: Die Menutafel mit dem Namen 'menutafelname' (muß mit dem + 'gs-MENUKARTE:' beginnen!) wird als aktuelle Menutafel an gs-DIALOG + gekoppelt. Durch den Befehl wird die angegebene Menutafel zur Task + 'gs-MENUAKRTEN' geschickt. Dem Namen wird zur Kennzeichnung noch + der Taskname der Sendertask angehängt (dadurch können sich bei + Multi-User-Betrieb verschiedene Anwender mit gleichen Menukarten­ + namen nicht stören). Die Menukarte wird anschließend in jedem Fall + "frisch" angekoppelt. Außerdem bleibt die Menukarte (als benannter + Datenraum) in der Task erhalten! + (Mit dem Befehl 'handle menu' kann nun ein Menu aus der Menukarte + zur Ausführung gebracht werden oder mit 'anwendungstext' auf in die + Menukarte ausgelagerte Texte zugegriffen werden.) + Hinweis: Von Zeit zu Zeit muß der Systembetreuer die überflüssigen + Menukarten aus der Task 'gs-MENUKARTEN' entfernen, da die Anwender + aus Ihrer Task die Karten nicht löschen können! +Fehler: 'menutafelname' gibt es nicht! + 'menutafelname' hat falsche(n) Typ/Bezeichnung (keine + gs-MENUKARTE)! + + +#ib#trennlinie#ie# +PROC trennlinie: + +Zweck: Der Befehl wird bei der Generierung von Menukarten benötigt. Durch den + Befehl wird unter dem aktuellen Oberbegriff eine Trennlinie zur opti­ + schen Trennung einzelner Menupunkte eingetragen. Die Trennlinie belegt + den gleichen Platz wie eine Verarbeitungsfunktion. +Fehler: Zu viele Menupunkte in einem Pull-Down-Menu (maximal 15 incl. der + Trennlinien!). + + +#ib#textprozedur#ie# +PROC textprozedur (TEXT CONST dateiname, + prozedurname): + +Zweck: Der Befehl wird benötigt, um Texte entsprechend der gs-DIALOG-Syntax + aufzuarbeiten. Der in die Datei 'dateiname' geschrieben Text wird bear­ + beitet. Die Prozedur eignet sich insbesondere dafür, Informationstexte + aufzuarbeiten, die zu den einzelnen Menufunktionen ausgegeben werden, + wenn der Benutzer die Tastenfolge tippt (sehen Sie auch + 'textzeile'). Der aufbereitete Text steht anschließend in der Datei 'datei­ + name.a'. Der Text ist in eine Textprozedur "verpackt", die den Namen hat, + der als zweiter Parameter übergeben wird. + Die Zeilen werden dabei so zugeschnitten, daß Sie in einer Box in das + aktuelle Menu eingeblendet werden können. Boxbreite und -höhe werden + automatisch gesetzt (max. 65 Zeichen breit und 14 Zeichen hoch)); die + Zeilen werden geblockt, sofern in der Datei keine Absatzmarkierung + () am Ende der Zeile vorhanden ist. Soll eine Zeile zentriert + werden, so muß als erstes Zeichen der Zeile das Zeichen '%' notiert sein - + die Zeile muß durch eine Absatzmarke abgeschlossen sein. Textpassagen, + die invers (markiert) dargestellt werden sollen, müssen duch das Zeichen + '$' eingeleitet und durch das Zeichen '&' abgeschlossen werden. Markier­ + te Textpassagen dürfen (nach dem Zuschnitt!) nicht über Zeilengrenzen + hinausgehen! +Fehler: Datei 'dateiname' existiert nicht! + Fonttabelle 'fonttab.gs-Menu-Generator' existiert nicht! (Fonttabelle von + gs-Menu-Generator-Diskette in die Task 'configurator' laden!) + Text ist zu lang - bitte kürzen! (Text darf in aufbereiteter Form maximal + 14 Zeilen umfassen!) + Zeilenformatierung mit abgebrochen! + + + +#ib#textzeile#ie# +PROC textzeile (TEXT CONST dateiname): + +Zweck: Der Befehl wird benötigt, um Texte entsprechend der gs-DIALOG-Syntax + aufzuarbeiten. Der in die Datei 'dateiname' geschrieben Text wird bear­ + beitet. Die Prozedur eignet sich insbesondere dafür, anwendungsbezogene + Texte aufzuarbeiten, die in die Menukarte ausgelagert werden sollen + (sehen Sie auch 'textprozedur'). Der aufbereitete Text steht anschließend + in der Datei 'dateiname.a' in einer Zeile notiert. + + +#ib#waagerecht#ie# +TEXT PROC waagerecht: + +Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als waagerechter + Strich (̇) ausgegeben wird. + + +PROC waagerecht (TEXT CONST zeichen): + +Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­ + stellung der "Kästen" als waagerechter Strich ausgegeben werden soll. + + +#ib#window#ie# +WINDOW PROC window (INT CONST x, y, xsize, ysize): + +Zweck: Einer Fenstervariablen (WINDOW VAR name) wird die Lage und Größe + zugeordnet (über den Zuweisungsoperator ':='). Gleichzeitig wird das + Fenster initialisiert. + Mit den ersten beiden Parametern wird die Lage der linken oberen Ecke + des Fensters bestimmt (x: Spalte; y: Zeile). Mit 'xsize' wird die Fenster­ + breite, mit 'ysize' die Fensterhöhe festgelegt. + Das Fenster wird noch nicht(!) angezeigt (sehen Sie dazu 'show' und + 'page'). Ein Rahmen wird nicht zum Fenster gezählt; er kann aber mit + der Prozedur 'show' ausgegeben werden. Ein Fenster darf nicht breiter als + 80 und höher als 24 Zeichen sein. Umrahmte Fenster unterliegen weite­ + ren Einschränkungen (sehen Sie auch 'show'). Ein Fenster muß min­ + destens 6 Zeichen breit und 3 Zeichen hoch sein. +Fehler: 'Window' ungültig + + +#ib#write menunotice#ie# +PROC write menunotice (TEXT CONST notiztext, + INT CONST position): + +Zweck: Die Prozedur dient dazu, innerhalb des Menus in einer Box einen "dauer­ + haften Informationstext" auszugeben. Die Box bleibt nämlich so lange + bestehen, bis sie explizit gelöscht (sehen Sie auch 'erase menunotice') + oder durch einen neuen Notiztext überschrieben wird. Wenn der Bild­ + schirm durch gs-DIALOG-Prozeduren überschrieben wird, wird die + Menunotiz ebenfalls ständig mitaufgefrischt und auch, wenn der Befehl + 'regenerate menuscreen' oder 'refresh submenu' gegeben wird (Sehen Sie + im Gegensatz dazu auch 'menuinfo' ("kurzzeitiger Informationstext"). + Im Menubildschirm erscheint der 'infotext' in einer Box. Boxbreite und + -höhe werden vom System automatisch anhand des übergebenen 'notiz­ + text'es festgelegt. 'notiztext' muß den gs-DIALOG-Syntax-Regeln (sehen Sie + Kap. 5.13) entsprechen. Mit 'position' wird die relative Lage der Box + innerhalb des Menubildschirms festgelegt (1, 2, 3, 4, 5: sehen Sie dazu + Kap. 5.12). In einem Menu kann zu einem Zeitpunkt nur eine Menunotiz + abgelegt werden. Durch ein erneutes 'write menunotice' wir eine beste­ + hende Menunotiz überschrieben. + + +#ib#yes#ie# +BOOL PROC yes (WINDOW VAR w, TEXT CONST frage): + +Zweck: Vergl. 'menuwindowyes'. Hier wird nur zusätzlich das Fenster festgelegt, + das bei 'menuwindowyes' automatisch gesetzt wird. + + diff --git a/doc/menugenerator/menu-generator handbuch.impressum b/doc/menugenerator/menu-generator handbuch.impressum new file mode 100644 index 0000000..404826d --- /dev/null +++ b/doc/menugenerator/menu-generator handbuch.impressum @@ -0,0 +1,88 @@ +____________________________________________________________________________ + + +#on("b")##on ("u")# +#center#Betriebssystem E U M E L +#off ("u")# + + +#center#ls Menü-Generator + + + + +#off("b")# +#center#Lizenzfreie Software der +#on ("b")# + +#center#Gesellschaft für Mathematik und Datenverarbeitung mbH, +#center#5205 Sankt Augustin + + +#off("b")# +#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für +#center#nichtkommerzielle Zwecke gestattet. + +#center#Gewährleistung und Haftung werden ausgeschlossen + + +____________________________________________________________________________ +#page# + +#free (4.0)##on("b")# +#center#gs-Menu-Generator + + +#center#Benutzerhandbuch + + +#center#Version 1.0 + + +#off("b")##center#copyright +#center#Eva Latta-Weber +#center#Software- und Hardware-Systeme, 1988 +#center#ERGOS GmbH, 1990 +#page# +#block# +#center#____________________________________________________________________________ + + +Copyright:  ERGOS GmbH   März 1990 + + Alle Rechte vorbehalten. Insbesondere ist die Überführung in + maschinenlesbare Form sowie das Speichern in Informations­ + systemen, auch auszugsweise, nur mit schriftlicher Einwilligung + der ERGOS GmbH gestattet. + + +#center#____________________________________________________________________________ + +Es kann keine Gewähr übernommen werden, daß das Programm für eine +bestimmte Anwendung geeignet ist. Die Verantwortung dafür liegt beim +Anwender. + +Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrektheit und +Vollständigkeit der Angaben kann keine Gewähr übernommen werden. Das +Handbuch kann jederzeit ohne Ankündigung geändert werden. + +Texterstellung :  Dieser Text wurde mit der ERGOS-L3 Textverarbeitung + erstellt und aufbereitet und auf einem Kyocera Laser­ + drucker gedruckt. + + + + +#center#___________________________________________________________________________ + + + +Ergonomic Office Software GmbH + +Bergstr. 7 Telefon: (02241) 63075 +5200 Siegburg Teletex: 2627-2241413=ERGOS + Telefax: (02241) 63078 + + +#center#____________________________________________________________________________ + diff --git a/doc/menugenerator/menu-generator handbuch.index b/doc/menugenerator/menu-generator handbuch.index new file mode 100644 index 0000000..0aacd97 --- /dev/null +++ b/doc/menugenerator/menu-generator handbuch.index @@ -0,0 +1,258 @@ +#block##pageblock# +#pagenr("%",1)##setcount(1)##count per page# +#headeven# +gs-Menu-Generator +#center#____________________________________________________________ + +#end# +#headodd# +#right#gs-Menu-Generator +#center#____________________________________________________________ + +#end# +#bottomeven# +#center#____________________________________________________________ +I - % #right#ERGOS +#end# +#bottomodd# +#center#____________________________________________________________ +ERGOS #right# I - % +#end# +Index + + +activate 5 - 28 +activate 8 - 1 +anwendungstext 4 - 13 +anwendungstext 8 - 2 +areax 8 - 2 +areaxsize 8 - 2 +areay 8 - 2 +areaysize 8 - 2 +balken links 8 - 2 +balken oben 8 - 3 +balken rechts 8 - 3 +balken unten 8 - 3 +boxalternative 8 - 4 +boxalternative 7 - 10 +boxanswer 8 - 4 +boxanswer 7 - 9 +boxanswerone 8 - 4 +boxanswerone 7 - 10 +boxanswersome 8 - 5 +boxanswersome 7 - 10 +boxinfo 8 - 5 +boxinfo 7 - 9 +boxno 8 - 5 +boxno 7 - 10 +boxnotice 8 - 6 +boxnotice 7 - 10 +boxone 8 - 6 +boxone 7 - 10 +boxsome 8 - 6 +boxsome 7 - 10 +boxyes 8 - 7 +boxyes 7 - 10 +center 8 - 7 +center 7 - 8 +clear buffer 8 - 7 +clear buffer and count 8 - 7 +current menuwindow 8 - 8 +cursor 8 - 8 +cursor 7 - 6 +cursor off 8 - 8 +cursor off 5 - 6 +cursor off 5 - 2 +cursor on 8 - 8 +cursor on 5 - 6 +cursor on 5 - 2 +deactivate 8 - 9 +deactivate 5 - 28 +direktstart 8 - 9 +ecke oben links 8 - 10 +ecke oben rechts 8 - 10 +ecke unten links 8 - 10 +ecke unten rechts 8 - 10 +edit 8 - 11 +edit 7 - 6 +editget 8 - 11 +erase 7 - 5 +erase 8 - 11 +erase footnote 8 - 12 +erase footnote 7 - 11 +erase menunotice 8 - 12 +erasemenunotice 5 - 15 +get 8 - 12 +get 7 - 7 +get cursor 8 - 13 +get cursor 7 - 6 +getline 7 - 7 +getline 8 - 13 +get menuwindowcursor 5 - 21 +get menuwindowcursor 8 - 13 +handle menu 3 - 2 +handle menu 8 - 13 +infix namen 8 - 14 +infix namen 5 - 26 +install menu 3 - 2 +install menu 4 - 3 +install menu 8 - 14 +invers 8 - 15 +kreuz 8 - 15 +line 8 - 15 +line 7 - 6 +menualternative 8 - 15 +menualternative 5 - 12 +menuanswer 8 - 17 +menuanswer 5 - 2 +menuanswerone 8 - 17 +menuanswerone 5 - 8 +menuanswersome 5 - 8 +menuanswersome 8 - 18 +menu archiv checken 8 - 18 +menu archiv checken 6 - 4 +menu archiv grundeinstellung 6 - 4 +menu archiv grundeinstellung 8 - 18 +menu archiv holen 8 - 19 +menu archiv holen 6 - 4 +menu archiv initialisieren 8 - 19 +menu archiv initialisieren 6 - 4 +menu archiv loeschen 8 - 19 +menu archiv loeschen 6 - 4 +menu archiv neue diskette 8 - 19 +menu archiv neue diskette 6 - 4 +menu archiv reservieren 6 - 4 +menu archiv reservieren 8 - 19 +menu archiv reservierung aufgeben 6 - 4 +menu archiv reservierung aufgeben 8 - 19 +menu archiv schreibcheck 8 - 20 +menu archiv schreibcheck 6 - 4 +menu archiv schreiben 6 - 4 +menu archiv schreiben 8 - 20 +menu archiv verzeichnis 8 - 20 +menu archiv verzeichnis 6 - 4 +menu archiv verzeichnis drucken 6 - 4 +menu archiv verzeichnis drucken 8 - 20 +menu archiv zieltask einstellen 6 - 4 +menu archiv zieltask einstellen 8 - 20 +menu dateien aufraeumen 8 - 21 +menu dateien aufraeumen 6 - 6 +menu dateien drucken 6 - 6 +menu dateien drucken 8 - 21 +menu dateien kopieren 6 - 6 +menu dateien kopieren 8 - 22 +menu dateien loeschen 8 - 22 +menu dateien loeschen 6 - 6 +menu dateien speicherplatz 6 - 6 +menu dateien speicherplatz 8 - 22 +menu dateien umbenennen 8 - 23 +menu dateien umbenennen 6 - 6 +menu dateien verzeichnis 6 - 6 +menu dateien verzeichnis 8 - 23 +menufootnote 5 - 17 +menufootnote 8 - 23 +menufunktion 4 - 6 +menufunktion 8 - 24 +menuinfo 5 - 4 +menuinfo 8 - 24 +menukartenname 8 - 25 +menuno 8 - 25 +menuno 5 - 10 +menuone 5 - 6 +menuone 8 - 25 +menusome 5 - 7 +menusome 8 - 26 +menuwindowcenter 8 - 26 +menuwindowcenter 5 - 23 +menuwindowcursor 5 - 21 +menuwindowcursor 8 - 27 +menuwindowedit 8 - 27 +menuwindowedit 5 - 19 +menuwindoweditget 8 - 27 +menuwindoweditget 5 - 22 +menuwindowget 8 - 28 +menuwindowget 5 - 22 +menuwindowline 8 - 28 +menuwindowline 5 - 21 +menuwindowno 5 - 22 +menuwindowout 5 - 22 +menuwindowout 8 - 28 +menuwindowpage 8 - 29 +menuwindowpage 5 - 20 +menuwindowshow 5 - 19 +menuwindowshow 8 - 29 +menuwindowstop 5 - 23 +menuwindowstop 8 - 29 +menuwindowyes 5 - 22 +menuyes 5 - 10 +menuyes 8 - 30 +no 8 - 30 +no 7 - 7 +not empty 5 - 27 +not empty 8 - 30 +oberbegriff 8 - 31 +oberbegriff 4 - 5 +oeffne menu 8 - 31 +oeffne menu 4 - 3 +oeffne menukarte 8 - 32 +oeffne menukarte 4 - 3 +ohne praefix 5 - 26 +ohne praefix 8 - 32 +oldmenufootnote 5 - 17 +old menufootnote 8 - 32 +out 7 - 7 +out 8 - 33 +out footnote 7 - 11 +out footnote 8 - 33 +out frame 8 - 33 +out frame 7 - 5 +page 8 - 33 +page 7 - 11 +page 7 - 5 +page up 7 - 11 +put 8 - 33 +put 7 - 7 +putline 8 - 34 +putline 7 - 7 +refresh submenu 5 - 18 +refresh submenu 8 - 34 +regenerate menuscreen 8 - 34 +regenerate menuscreen 5 - 18 +regenerate menuscreen 5 - 4 +remaining lines 8 - 34 +remaining lines 7 - 6 +remaining menuwindowlines 5 - 21 +remaining menuwindowlines 8 - 34 +reset dialog 8 - 35 +schliesse menu 4 - 3 +schliesse menu 8 - 35 +schliesse menukarte 8 - 35 +schliesse menukarte 4 - 3 +senkrecht 8 - 35 +show 8 - 35 +show 7 - 5 +show 8 - 36 +show 7 - 6 +show menuwindow 8 - 36 +show menuwindow 5 - 20 +stdinfoedit 8 - 36 +stop 7 - 8 +stop 8 - 37 +testinstallation 8 - 37 +testinstallation 4 - 3 +textprozedur 4 - 8 +textprozedur 8 - 38 +text zeile 4 - 13 +textzeile 8 - 39 +trennlinie 4 - 6 +trennlinie 8 - 38 +waagerecht 8 - 39 +WINDOW 7 - 2 +window 7 - 4 +window 8 - 40 +write menunotice 8 - 40 +write menunotice 5 - 15 +yes 7 - 7 +yes 8 - 41 + + diff --git a/doc/menugenerator/menu-generator handbuch.inhalt b/doc/menugenerator/menu-generator handbuch.inhalt new file mode 100644 index 0000000..8b1aef4 --- /dev/null +++ b/doc/menugenerator/menu-generator handbuch.inhalt @@ -0,0 +1,72 @@ +#type ("elite.lq")##limit (11.5)##pagelength (16.5)##pageblock# +#start (1.8,0.0)# +#type ("prop.breit.lq")# +Inhaltsverzeichnis +#type ("elite.lq")# + + +1 Was kann ls-Menu-Generator 3 + +2 Installation von ls-Menu-Generator 6 +2. 1 Voraussetzungen 6 +2. 2 Lieferumfang 6 +2. 3 Installation 7 + +3 Die Arbeitsweise von ls-DIALOG 8 +3. 1 Ankoppeln einer Menukarte/ 8 + Ausführen eines Menus +3. 2 Aufbau/Inhalt einer Menukarte 11 + +4. Erstellen einer neuen Menukarte 13 +4. 1 Eintragen der Menupunkte 13 +4. 2 Erstellung und Einbinden von 20 + Informationstexten +4. 3 Auslagerung von anwendungsbezogenen 24 + Texten in die Menukarte + +5. Dialoge innerhalb des Menus 27 +5. 1 Eingabe eines Textes/Namens 28 +5. 2 Ausgabe einer Information 31 +5. 3 Auswahl eines Namen durch Ankreuzen 32 +5. 4 Auswahl mehrerer Namen durch Ankreuzen 34 +5. 5 Eingabe eines Textes/Namens - alternativ: 35 + Auswahl durch Ankreuzen +5. 6 Die Ja/Nein - Entscheidung 37 +5. 7 Die Alternativentscheidung 39 +5. 8 Die Menunotiz 43 +5. 9 Fußzeilen im Menu 44 +5.10 Wiederherstellung des Menubildschirms 46 +5.11 Arbeiten im Menufenster 47 +5.11.1 Datei anzeigen/editieren 48 +5.11.2 Menufenster öffnen/anzeigen 48 +5.11.3 Menufenster löschen(putzen) 49 +5.11.4 Positionierungen im Menufenster 49 +5.11.5 Informationen über die aktuelle 50 + Menu-Fensterposition +5.11.6 Aus-/Eingabe innerhalb des Menufensters 51 +5.11.7 Weitere Prozeduren 52 +5.12 Festlegung der Boxpositionen innerhalb 53 + des Menus +5.13 ls-DIALOG-Syntax 54 + (Regeln zur Erstellung von Texten) +5.14 Thesaurushandling 55 +5.15 Aktivieren/Deaktivieren von Menupunkten 57 + +6. Einbinden der Datei- und Archivoperationen 59 +6. 1 Einbinden der Archivoperationen 60 +6. 2 Einbinden der Dateioperationen 65 + +7. Eigene Fenster und Fensteroperationen 66 +7. 1 Definition von Fenstern 67 +7. 2 Anzeigen/Löschen von Fenstern 70 +7. 3 Operationen innerhalb des Fensters 71 +7. 3.1 Datei anzeigen/editieren 71 +7. 3.2 Positionierungen im Fenster 72 +7. 3.3 Ein- und Ausgaben innerhalb des Fensters 73 +7. 3.4 Weitere Prozeduren 74 +7. 4 Boxoperationen 75 + +8. Kurzbeschreibung der Befehle 78 + +9. Register 125 + diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Inhaltsverzeichnis b/doc/mp-bap/A5 - Doku: gs-MP BAP - Inhaltsverzeichnis new file mode 100644 index 0000000..9507802 --- /dev/null +++ b/doc/mp-bap/A5 - Doku: gs-MP BAP - Inhaltsverzeichnis @@ -0,0 +1,50 @@ +#limit (11.5)##pagelength (16.5)##pageblock# +#start (1.8,0.0)# +Inhaltsverzeichnis + + +1 Was kann gs-MP BAP 3 + +2 Allgemeines zum Simulationsprogramm 6 +2.1 Entstehung 6 +2.2 Beschreibung des Programmkerns 7 + - ein Simulationslauf +2.3 Das Teilprogramm 'Materialprüfung' 9 +2.4 Das Teilprogramm 'Bildschirmarbeitsplatz' 10 +2.5 Hinweise zum Einsatz des Programmsystems 12 +2.6 Erfahrungen mit dem Programmsystem 13 +2.7 Hinweise auf Arbeitsmaterial 14 + +3 Installation von gs-MP BAP 16 +3.1 Voraussetzungen 16 +3.2 Lieferumfang 16 +3.3 Installation 17 +3.4 Organisation des Task - Systems 19 +3.5 Direktstart des Systems 20 + +4 Eine kleine Beispielsitzung 22 +4.1 Aufruf von 'Bildschirmarbeitsplatz' (BAP) 22 +4.2 Einstellung von Simulationsparametern 23 +4.3 Ein Simulationslauf 26 +4.4 Die Simulationsauswertung/das Protokoll 28 +4.5 Hinweise zur Protokollauswertung 36 +4.5.1 Der Bewertungsfaktor 36 +4.5 2 Fehlerzeichenhäufigkeit in den Werkstücken 38 +4.5 3 Fehlerhafte Auswertungen 38 + +5 Beschreibung der Menufunktionen 40 +5.1 Kurzhinweise zur Bedienung der Menus 40 +5.2 Menufunktionen z. Oberbegriff 'Simulation' 44 +5.3 Menufunktionen z. Oberbegriff 'Parameter' 48 +5.4 Menufunktionen z. Oberbegriff 'Konfiguration' 56 +5.5 Menufunktionen z. Oberbegriff 'Dateien' 58 +5.6 Menufunktionen z. Oberbegriff 'Archiv' 60 + +6 Hinweise für den Systembetreuer 61 + + + + + + + diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 1 b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 1 new file mode 100644 index 0000000..e418764 --- /dev/null +++ b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 1 @@ -0,0 +1,119 @@ +#type ("12.lq")##limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (3)# +#headodd# +#center#gs-MP BAP#right#% + +#end# +#headeven# +%#center#gs-MP BAP + +#end# +#center#1 + +#center#Was +#center#kann +#center#gs-MP BAP + + + #on("b")#gs-MP BAP#off("b")# ist ein Programm, mit dem die Arbeit +an einem Bildschirmarbeitsplatz unter ganz unter­ +schiedlichen Aspekten simuliert werden kann. Vom +Benutzer wird dabei verlangt, eine Art "Kontrolltä­ +tigkeit am Bildschirm" auszuüben. Während dieser +Arbeit werden Daten über den Arbeitsverlauf erfaßt, +die (später) ausgewertet werden können. + #on("b")#gs-MP BAP#off("b")# ist so gestaltet, daß es für ganz un­ +terschiedliche Zwecke eingesetzt werden kann. Es +ist möglich, sämtliche Simulationsparameter den +eigenen Wünschen und der jeweiligen Situation an­ +zupassen. Daneben besteht die Möglichkeit, die Si­ +mulationsprotokolle offensichtlich oder "heimlich" +zu erfassen. + #on("b")#gs-MP BAP#off("b")# kann dazu benutzt werden, um Anwendern +lediglich die Belastungen eines Bildschirmarbeits­ +platzes an einem Beispiel darzulegen; es ist aber +genauso möglich, ihm eindrucksvoll aufzuzeigen, wie +eine Kontrolle am Bildschirmarbeitsplatz - ohne +sein Wissen - erfolgen kann. Auf der Basis dieser +Erfahrungen lassen sich dann ganz neue Fragestel­ +lungen thematisieren (Möglichkeiten/Befugnis der/ +zur Kontrolle am (Bildschirm-) Arbeitsplatz; Daten­ +schutz; Betriebsvereinbarungen zu Computerarbeits­ +plätzen und vieles mehr). + Durch die Möglichkeit, die Simulationsparameter +vielfältig zu variieren, können verschiedenste Un­ +tersuchungen mit dem Programm durchgeführt werden: +Angefangen von Untersuchungen zur Konzentrations­ +fähigkeit bei unterschiedlichen Umgebungsbedingun­ +gen (z.B. Lichtverhältnisse, Musik am Arbeitsplatz, +etc.), über Untersuchungen zum optimalen Arbeits­ +phasen - Pausen - Rhythmus (z.B. zur Fragestellung, +ob lange Arbeitsphasen mit langen Pausen günstiger +sind als kurze Arbeitsphasen mit immer wieder ein­ +gestreuten kleineren Pausen oder umgekehrt - wenn +die Gesamtzeit konstant ist), bis hin zu Untersu­ +chungen zur Ergonomie von Computerarbeitsplätzen +(z.B. hinsichtlich der Tastaturbelegung, Nützlich­ +keit eines eigenen Cursorblockes, etc.). + Anhand der aufgezeigten Möglichkeiten wird +sicher deutlich, daß der Einsatz des Programms +nicht auf den Informatikunterricht beschränkt ist. +Ebensogut ist, bei entsprechender Fragestellung, +ein Einsatz im gesellschafts- / sozialwissenschaft­ +lichen Unterricht, im Biologieunterricht, in den +kaufmännischen Lernbereichen oder im Technikunter­ +richt denkbar. Das Programm ist auch für die Aufar­ +beitung verschiedener Fragestellungen bei der Vor- +und Nachbereitung von Betriebspraktika geeignet. + Um all diese Möglichkeiten auch den Ausbildern +offenzuhalten, die keinerlei Vorerfahrungen mit +Computern haben, aber dieses Programm einsetzen +möchten, ist die Simulationsumgebung so komforta­ +bel, daß jeder Benutzer innerhalb weniger Minuten +das gesamte Programmsystem überblicken und bedienen +kann. + +- Durch die Einbettung in die komfortable Benut­ + zerschnittstelle #on("b")#gs-DIALOG#off("b")#, sind nur noch wenige + Betriebssystemkommandos zur Bedienung des Sy­ + stems notwendig. + +- Der Benutzer kann jederzeit Informationen über + die Bedienung des Menusystems und die Wirkung + der einzelnen Menufunktionen anfordern, die ihm + daraufhin in den aktuellen Bildschirm eingeblen­ + det werden. + +- Dem Benutzer wird ständig angezeigt, welche Mög­ + lichkeiten der Bedienung bestehen, welche Tasten + wirksam sind und welche Wirkung deren Betätigung + hat. Menufunktionen, deren Wirkungen zu bestimm­ + ten Zeitpunkten sinnlos oder fehlerhaft wären, + werden "inaktiviert", d.h. sind dem Benutzer gar + nicht erst zugänglich. + +- Die Auswertung der Simulationsprotokolle erfolgt + vom Menu aus durch einfaches Ankreuzen der ge­ + wünschten Protokolldateien. Es besteht sowohl + die Möglichkeit, die Auswertungen auf dem Bild­ + schirm anzeigen als auch über den Drucker ausge­ + ben zu lassen. + +- Die Festlegung der Simulationsparameter ist kin­ + derleicht. Die aktuell eingestellten Werte kön­ + nen jederzeit eingesehen werden. Zur Einstellung + werden umfangreiche Informationen und Hilfen + ausgegeben. Eine Fehlbedienung ist ausgeschlos­ + sen. + +- In das System ist eine komfortable Archivbehand­ + lung integriert, so daß auch für den Computer­ + laien die Konservierung der Simulationsergebnis­ + se auf einfachste Weise möglich ist. + +- Bei auftretenden Fehlern erhält der Benutzer + konkrete, verständliche Fehlermeldungen, die + zumeist mit einem Zusatz versehen sind, wie die + "Situation bereinigt werden kann". + diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 2 b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 2 new file mode 100644 index 0000000..b063ea3 --- /dev/null +++ b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 2 @@ -0,0 +1,302 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (6)# +#headodd# +#center#gs-MP BAP#right#% + +#end# +#headeven# +%#center#gs-MP BAP + +#end# +#center#2 + +#center#Allgemeines +#center#zum +#center#Simulationsprogramm + + +2.1 Entstehung + + Das Simulationsprogramm #on("b")#gs-MP BAP#off("b")# basiert auf +einer Idee von Hartmut Spenn und Mene Wolf, die +eine Unterrichtsreihe mit dem Titel "Der gläserne +Arbeiter" im Rahmen der Materialien zur Lehrerfort­ +bildung in Nordrhein Westfalen (Neue Technologien, +informations- und kommunikationstechnologische In­ +halte im Wahlpflichtunterricht der Klassen 9/10) +beschrieben und dazu ein Grundprogramm für den C64 +in COMAL geschrieben haben. + Dieses Grundprogramm diente einmal als Ausgangs­ +punkt für #on("b")#gs-MP BAP#off("b")#. Allerdings wuchsen die An­ +sprüche an das System immer mehr, so daß eine Reihe +weiterer Funktionen hinzugefügt wurden. Ein wesent­ +liches Ziel war es, ein Simulationsprogramm zur +Verfügung zu stellen, daß umfangreiche Variations­ +möglichkeiten - ohne jegliche Programmierkenntnisse +- bietet; ein Programm, das selbst von einem völli­ +gen Computerlaien innerhalb weniger Minuten über­ +blickt und sicher bedient werden kann. + + Erst als die komfortable Benutzerschnittstelle +#on("b")#gs-DIALOG#off("b")# zur Verfügung stand, konnte dieses Ziel +erreicht werden. Heute präsentiert sich Ihnen ein +Programmsystem, in dem Sie jede Programmfunktion +von einem Menu aus wählen können. Durch Informa­ +tionstexte, die Sie jederzeit abrufen können, und +durch die Bedienungshinweise werden Sie sicher +durch das Programmsystem geführt. Sie haben komfor­ +table Möglichkeiten, die Simulationsparameter zu +variieren. Das Programmsystem ist gegen Fehlbedie­ +nungen mehrfach abgesichert. + + +2.2 Beschreibung des Programmkerns + - ein Simulationslauf + + Mit #on("b")#gs-MP BAP#off("b")# kann die Arbeit an einem Bild­ +schirmarbeitsplatz simuliert werden. Der Benutzer +übt am Bildschirm eine Art "Kontrolltätigkeit" aus. +Die Interpretation dieser Tätigkeit ist offen: So +kann man sich vorstellen, daß "Werkstücke" auf dem +Bildschirm angezeigt werden, die auf Fehler hin +untersucht werden sollen; dabei muß jeder gefundene +Fehler markiert werden. Der Benutzer kann sich auch +vorstellen, er sei bei einer Tageszeitung beschäf­ +tigt und habe die aus der Redaktion eingehenden +Artikel auf Tippfehler hin zu untersuchen - natür­ +lich müssen die Tippfehler "verbessert" werden. +Andere Interpretationen sind denkbar. + Das Grundprinzip des Simulationslaufes ist recht +einfach - ein typischer Bildschirm könnte so ausse­ +hen: +#free (9.5)# + Im oberen Bereich des Bildschirms werden alle +Daten angezeigt, die der Benutzer während des Simu­ +lationslaufes benötigt. Links oben sind alle Tasten +angegeben, die für die Handhabung des Programms +notwendig sind. Rechts oben wird der Benutzer über +die Simulationszeiten und das festgelegte 'Fehler­ +zeichen' informiert. + Im unteren Bereich des Bildschirms wird ein +rechteckiger Block ausgegeben, der sich aus ver­ +schiedenen Zeichen (z.B. Buchstaben, Ziffern, Son­ +derzeichen) zusammensetzt. Der Benutzer hat jetzt +die Aufgabe, die Blöcke daraufhin zu untersuchen, +ob in ihnen das angegebene Fehlerzeichen auftaucht. + Entdeckt er solche Zeichen im Block auf dem +Bildschirm, so ist es seine Aufgabe, den Cursor +(Lichtfleck) auf dem Bildschirm mit Hilfe festge­ +legter Tasten an die entsprechende Position zu +steuern und eine 'Ausbesserung' (Kennzeichnung/ +Korrektur) vorzunehmen. Ist der Benutzer der Mei­ +nung, alle Fehlerzeichen bearbeitet zu haben, so +kann er den nächsten Block (das nächste Werkstück/ +den nächsten Artikel) durch Tippen einer festgeleg­ +ten Taste anfordern. + Die Arbeit ist dabei streng in 'Arbeitsphasen' +und 'Pausen' eingeteilt - der Rhythmus wird aber +vom Programm und nicht vom Benutzer bestimmt. Wäh­ +rend des Simulationslaufes werden alle wesentlichen +Kenndaten protokolliert. Diese können später ausge­ +wertet werden. + In unserem konkreten Beispiel hat der Benutzer +nach dem Fehlerzeichen 'F' zu suchen. Er hat insge­ +samt 34 Minuten zu arbeiten; dabei ist seine Ar­ +beitszeit eingeteilt in 3 Arbeitsphasen zu je 10 +Minuten mit zwei dazwischenliegenden Pausen von je +2 Minuten. + Zur Bedienung des Systems kann er die (Cursor-) +Pfeiltasten , , und +benutzen; damit kann er den Lichtfleck innerhalb +des Zeichen-Blocks bewegen. Zur Ausbesserung dient +die -Taste. Mit der -Taste kann er je­ +weils die neuen Werkstücke (Artikel) zur Bearbei­ +tung anfordern. + + +2.3 Das Teilprogramm 'Materialprüfung' (MP) + + Gemeinsamer Bestandteil beider Programmteile ist +der sogenannte "Simulationslauf" - ein eben ge­ +schilderter Arbeitsprozeß am Bildschirm. Diesem +Simulationslauf gehen im Teilprogramm 'Materialprü­ +fung' (MP) jedoch noch umfangreiche Informationen +voraus, die dem Benutzer die anschließend zu ver­ +richtende Tätigkeit detailliert erläutern. Gleich +nach Aufruf des Programmteils wird der Benutzer +noch nach einer "Identifikation" gefragt und aufge­ +fordert, z.B. den Vor- und Nachnamen einzugeben. +Die hier eingegebene Kennung ist auch Bestandteil +des Namens des Protokolls, das über den dann fol­ +genden Simulationslauf angelegt wird. + Am Ende des Simulationslaufes wird dem Benutzer, +sofern das System entsprechend konfiguriert ist, +eine 'Kurzauswertung' seiner Arbeit auf dem Bild­ +schirm präsentiert. Zusätzlich wird - ohne daß der +Benutzer es merkt - das angelegte Protokoll in die +Vatertask geschickt und in der eigenen Task ge­ +löscht. + + +2.4 Das Teilprogramm 'Bildschirmarbeitsplatz' + (BAP) + + Nach Aufruf des Teilprogramms erscheint auf dem +Bildschirm ein Menu, von dem aus eine Vielzahl von +Funktionen gewählt werden kann. Natürlich ist es +auch von hier aus möglich, einen oben beschriebenen +Simulationslauf zu starten. Im Gegensatz zum Pro­ +grammteil 'Materialprüfung' wird hier aber auf die +umfangreichen Informationen zur Handhabung des +Systems verzichtet und zum Abschluß auch keine Pro­ +tokolldatei zur Vatertask geschickt - die Proto­ +kolldatei verbleibt in der eigenen Task. + Daneben können vom Menu aus auch Protokolldatei­ +en ausgewertet werden. Sie können dabei noch ent­ +scheiden, ob Sie die Auswertungen auf dem Bild­ +schirm angezeigt oder aber auf dem angeschlossenen +Drucker ausgegeben haben möchten. + Weiterhin können Sie sämtliche Simulationspara­ +meter vom Menu aus Ihren Wünschen gemäß einstellen. +So ist es möglich, die Breite und Höhe des Werk­ +stücks zu variieren und zu entscheiden, ob die +Werkstücke "normal" oder "invers" dargestellt wer­ +den sollen. Sie können das 'Fehlerzeichen' festle­ +gen und überhaupt die Zeichen bestimmen, aus denen +die Werkstücke aufgebaut werden. Daneben haben Sie +noch die Möglichkeit, zu bestimmen, welche Tasten +auf der Tastatur welche Funktion beim Simulations­ +lauf haben sollen. + Sie legen von hier aus auch fest, in wie viele +Arbeitsphasen die Arbeitszeit unterteilt wird und +wie lange eine einzelne Arbeitsphase und die zwi­ +schen den Arbeitsphasen liegende Pause dauern sol­ +len. Auch hinsichtlich der Bewertung können Sie +Festlegungen treffen - nach dem von Ihnen hier ein­ +gestellten Wertungsschlüssel werden nämlich die +Protokolldateien ausgewertet. + Ihnen obliegt es auch, zu bestimmen, ob mit je­ +der Protokollauswertung die umfangreichen Erläute­ +rungen ausgegeben werden sollen und ob der Benutzer +am Ende eines Simulationslaufes eine 'Kurzauswer­ +tung' über seine Arbeit auf dem Bildschirm erhalten +soll oder nicht. + Zusätzlich werden Ihnen noch eine Reihe von Mög­ +lichkeiten zur Datei- und Archivbehandlung angebo­ +ten. So können Sie komfortabel Dateien löschen, +kopieren, umbenennen, etc., Dateien auf Diskette +konservieren oder gespeicherte Dateien von dort +holen und vieles mehr. + + +2.5 Hinweise zum Einsatz des Programmsystems + + Aus den Beschreibungen in 2.3 und 2.4 ist Ihnen +sicher schon die unterschiedliche Absicht, die hin­ +ter den beiden Programmteilen steckt, klar gewor­ +den. Die beiden Programmteile richten sich nämlich +auch an ganz unterschiedliche Nutzergruppen. + Das Teilprogramm 'Materialprüfung' (MP) ist vor­ +nehmlich für den 'unerfahrenen'/'unbefangenen' Be­ +nutzer gedacht. Ihm werden nämlich umfangreiche +Informationen ausgegeben. Mit diesem Programmteil +ist eben auch die "heimliche" Erfassung der Simula­ +tionsdaten möglich. Dieser Teil des Programms wird +sicherlich dann Anwendung finden, wenn die Fragen +um die Möglichkeiten und Gefahren der Kontrolle am +(Bildschirm-) Arbeitsplatz im Vordergrund der Be­ +trachtungen stehen. + Das Teilprogramm 'Bildschirmarbeitsplatz' (BAP) +hat zumindest zwei ganz unterschiedliche Einsatz­ +aspekte: + + Einerseits dient es dem Lehrer/Ausbilder dazu, +die gewünschten Simulationsparameter für das Teil­ +programm 'Materialprüfung' einzustellen. Die aktu­ +elle Einstellung, die mit dem Teilprogramm 'Bild­ +schirmarbeitsplatz' getroffen wurde, ist in der +jeweilgen Task gültig, in der die Einstellung vor­ +genommen wurde. Die Einstellung wird aber auch von +allen Sohntasks übernommen, die sich nach der je­ +weiligen Einstellung neu anmelden. Darüber hinaus +dient dieses Teilprogramm dem Lehrer/Ausbilder +dazu, die (ihm zugestellten) Simulationsprotokolle +auszuwerten. + Andererseits hat das Teilprogramm 'Bildschirm­ +arbeitsplatz' auch einen "eigenen Charakter": +Gerade bei den schon oben angesprochenen Untersu­ +chungen (zur Konzentrationsfähigkeit in Abhängikeit +von verschiedenen Faktoren, zur Bedeutung der Ar­ +beitsphasen-Pausen-Rhythmen, zur 'Ergonomie am Ar­ +beitsplatz', etc.) bietet sich hier ein schneller, +komfortabler Wechsel zwischen Parametereinstellung +und Simulationsläufen - ohne unnötigen Zeitverlust; +erst recht, wenn mehrere Simulationsläufe aufeinan­ +der folgen. + + +2.6 Erfahrungen mit dem Programmsystem + + Das Programmsystem wurde bereits in verschiede­ +nen Klassen/ Kursen ab der Jahrgangsstufe 8 einge­ +setzt, und zwar in verschiedenen Fachbereichen und +Schulformen. Die Akzeptanz ist sehr hoch; die Hand­ +habung des Programmsystems bereitete selbst Kolle­ +gen, die noch nie zuvor an einem Computer gesessen +hatten, keinerlei Schwierigkeiten. Von der Hand­ +habung des Programms her ist deshalb sicher auch +keine Alteruntergrenze hinsichtlich der "Eignung" +anzugeben. + Jedoch scheint eine Bearbeitung mit den oben +angegebenen Zielsetzungen erst auf dem Erfahrungs­ +horizont der Jahrgangsstufe 8 sinnvoll zu sein. +Eine Bearbeitung der Fragestellungen in der von +Hartmut Spenn und Mene Wolf (siehe Kapitel 2.7) +vorgeschlagenen Tiefe scheint allerdings erst am +Ende der Jahrgangsstufe 9 bzw. in der Jahrgangsstu­ +fe 10 erreichbar. + Besonders interessant scheint der Einsatz bei +der Vor- bzw. Nachbereitung von Betriebspraktika zu +sein. Durch die unmittelbare Berührung mit den +"neuen Technologien am Arbeitsplatz" ist das Inter­ +esse an der Bearbeitung entsprechender Fragestel­ +lungen sehr hoch und eine Sensibilisierung für die +angesprochenen Problematiken zu erreichen. + Die angegebenen Fragestellungen im Zusammenhang +mit diesem Programmsystem können auch Thema einer +Projektwoche/von Projekttagen sein. Besonders be­ +währt hat sich hier die Zusammenarbeit mit Kollegen +aus dem gesellschafts-/sozialwissenschaftlichen +Bereich. Ein Unterrichtsgang, z.B. in einen Super­ +markt mit modernen Scannerkassen, bei einer Tages­ +zeitung (Kleinanzeigenaufnahme am Freitag-Vormit­ +tag) o.ä., bei dem die "im Hintergrund (möglicher­ +weise) ablaufenden Prozesse" bewußt gemacht werden, +kann das Vorhaben noch abrunden. + Zum Einsatz in der Sekundarstufe II liegen erst +wenige Erfahrungen vor. Mit Sicherheit bietet das +Programm einen "anderen", interessanten Einstieg in +den Informatikunterricht der Jahrgangsstufe 11 und +kann auch bei der Aufarbeitung entsprechender Fra­ +gestellungen zu späteren Zeitpunkten herangezogen +werden. Erfahrungen aus anderen Fachbereichen lie­ +gen (noch) nicht vor. + + +2.7 Hinweise auf Arbeitsmaterial + + Ausdrücklich sei an dieser Stelle auf die Ausar­ +beitung von Hartmut Spenn und Mene Wolf hingewie­ +sen: + +Spenn, Hartmut; Wolf, Mene; Der gläserne Arbeiter, + Elektronische Leistungs- und Verhaltenskon­ + trolle am Arbeitsplatz + in: Landesinstitut für Schule und Weiterbildung + (Hrsg.), Materialien zur Lehrerfortbildung + in Nordrhein-Westfalen, Heft 4, Neue Tech­ + nologien - Informations- und Kommunuika­ + tionstechnologische Inhalte im Wahlpflicht­ + unterricht der Klassen 9/10, Soest, 1986. + diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 3 b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 3 new file mode 100644 index 0000000..f589a93 --- /dev/null +++ b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 3 @@ -0,0 +1,237 @@ +#limit (11.0)##pagelength (16.5)##block##pageblock# +#start (2.0,0.0)# +#page (16)# +#headodd# +#center#gs-MP BAP#right#% + +#end# +#headeven# +%#center#gs-MP BAP + +#end# +#center#3 + +#center#Installation +#center#von +#center#gs-MP BAP + + + Bevor Sie #on("b")#gs-MP BAP#off("b")# auf Ihrem Computer benutzen +können, müssen Sie das Programm zunächst installie­ +ren. Wenn #on("b")#gs-MP BAP#off("b")# auf Ihrem System schon zur Ver­ +fügung steht, können Sie dieses Kapitel ruhig über­ +springen. + + +3.1 Voraussetzungen + + Um #on("b")#gs-MP BAP#off("b")# auf Ihrem Computer betreiben zu +können, muß das EUMEL-Betriebssystem installiert +sein. #on("b")#gs-MP BAP#off("b")# setzt die Multi-User-Version voraus +und ist lauffähig ab Version 1.7.5. #on("b")#gs-MP BAP#off("b")# setzt +weiterhin voraus, daß auf Ihrem Computer bereits +das Programm #on("b")#gs-DIALOG#off("b")# installiert ist. + + +3.2 Lieferumfang + + #on("b")#gs-MP BAP#off("b")# wird auf einer Diskette geliefert, die +alle notwendigen Programme enthält (die Installa­ +tion von #on("b")#gs-DIALOG#off("b")# wird dabei vorausgesetzt!). Um +den Inhalt der Diskette feststellen zu können, +starten Sie Ihr System und bringen es dazu, daß +'gib kommando:' erscheint. Dann legen Sie die Dis­ +kette ein und geben das Kommando: + + archive("gs-MP BAP");list(archive); + release(archive) + + Anschließend erscheint eine Übersicht der auf +dem Archiv vorhandenen Programme. Folgende Program­ +me sollten sich in der Übersicht befinden: + + "gs-MP BAP 1" + "gs-MP BAP 2" + "gs-MENUKARTE:MP-BAP" + "gs-MP BAP/gen" + + Eventuell können noch weitere Namen auf der Dis­ +kette vorhanden sein. Wenn Sie den Inhalt der Dis­ +kette kontrolliert haben und diese Programme auf +der Diskette vorhanden sind, können Sie #on("b")#gs-MP BAP#off("b")# +installieren. + Sollten Sie statt der Übersicht eine Fehlermel­ +dung erhalten, überprüfen Sie bitte, ob die Disket­ +te das richtige Format besitzt oder ob Ihr Disket­ +tenlaufwerk Probleme macht. Sollten dagegen Pro­ +gramme fehlen, so reklamieren Sie die Diskette. + + +3.3 Installation + + #on("b")#gs-MP BAP#off("b")# muß in einer Task installiert werden, +in der bereits das Programm #on("b")#gs-DIALOG#off("b")# zur Verfügung +steht. Alle Söhne und Enkel der neuen Task können +anschließend auf die Programme (Materialprüfung / +Bildschirmarbeitsplatz) zugreifen. Richten Sie also +eine Task als Sohn der Task ein, in der auf Ihrem +Computer bereits #on("b")#gs-DIALOG#off("b")# installiert ist. Wir +nehmen hier an, daß #on("b")#gs-DIALOG#off("b")# in der Task 'MENU' +installiert ist und die neue Task den Namen 'MP +BAP' erhalten soll. (Sie können für die Task auch +einen beliebigen anderen Namen wählen): + +#on("b")# + (Supervisor - Taste) +#off("b")# + + --> gib supervisor kommando: +#on("b")# + begin ("MP BAP","MENU") +#off("b")# + + --> gib kommando: + + (Arbeiten mehrere Personen mit dem Computer, +dann ist es sinnvoll, diese Task vor unbefugtem +Zugriff durch ein Passwort zu schützen. Wie das +gemacht wird, können Sie in Ihrem EUMEL-Benutzer­ +handbuch erfahren.) + + Legen Sie dann die Archivdiskette ein, auf der +sich #on("b")#gs-MP BAP#off("b")# befindet, und geben Sie das folgende +Kommando: + +#on("b")# + archive("gs-MP BAP") + + fetch("gs-MP BAP/gen",archive) + + run +#off("b")# + + Sie haben damit das Generatorprogramm gestartet. +Beantworten Sie die Frage, ob Sie das Archiv ange­ +meldet und die Diskette eingelegt haben, mit 'ja' +durch Tippen der Taste . + Daraufhin wird die Installation automatisch +durchgeführt. Lassen Sie während des gesamten Vor­ +gangs die Archivdiskette eingelegt. Sie erhalten +einen Hinweis, wenn die Diskette entnommen werden +kann! Die Generierung ist beendet, wenn der EUMEL- +Eingangsbildschirm erscheint. Die Task, in der die +Generierung stattfindet, wird automatisch zur Mana­ +gertask, das heißt, daß Söhne von ihr eingerichtet +werden können. + Richten Sie sich gleich eine Sohntask (z.B mit +dem Namen 'mp bap') ein, dann können Sie das System +sofort ausprobieren. Gehen Sie dazu folgendermaßen +vor: + +#on("b")# + (Supervisor - Taste) +#off("b")# + + --> gib supervisor kommando: +#on("b")# + begin ("mp bap","MP BAP") +#off("b")# + + --> gib kommando: + +Mit dem Kommando + +#center##on("b")#mp bzw. bap #off("b")# + +können Sie nun das Programm + +#center#'Materialprüfung' bzw. 'Bildschirmarbeitsplatz' + +aufrufen. + + +3.4 Organisation des Task - Systems + + Wollen Sie unter anderem das Teilprogramm 'Ma­ +terialprüfung' (MP) nutzen, so sollten Sie beden­ +ken, daß die dabei entstehenden Simulationsproto­ +kolle in die Vatertask geschickt werden. Die Vater­ +task sollte sich daher ständig im Wartezustand be­ +finden, um die Protokolle auch aufnehmen zu können. +So kann es sinnvoll sein, eine 'Zwischentask' ein­ +zurichten, damit auch andere ungestört mit dem Si­ +mulationsprogramm arbeiten können. Gehen Sie dazu +etwa folgendermaßen vor: + In der Task 'mp bap', in der Sie bisher gearbei­ +tet haben, geben Sie bei 'gib kommando:' den Be­ +fehl: + + #on("b")#global manager #off("b")# + + Sie gestatten dadurch, daß Söhne dieser Task +eingerichtet werden können. Auf dem Bildschirm er­ +scheint der EUMEL-Eingangsbildschirm. + Alle Anwender (Schüler) melden sich dann als +Sohn der Task 'mp bap' an: + + #on("b")#begin ("Anwender1", "mp bap") #off("b")# + #on("b")#begin ("Anwender2", "mp bap") #off("b")# + #on("b")#begin ("Anwender3", "mp bap") #off("b")# + ... + + Die Simulationsprotokolle finden Sie dann an­ +schließend in der Task 'mp bap'. + + +3.5 Direktstart des Systems + (Steht erst ab gs-DIALOG Version 1.1 zur Ver­ + fügung) + + In den Kapitel 3.3/3.4 haben wir Ihnen gezeigt, +wie sie Sohntasks einrichten und hier durch das +Kommando 'mp' bzw. 'bap' das System aufrufen kön­ +nen. Wenn Sie immer nur mit einer Modellvariante +arbeiten oder vor dem Benutzer die 'gib komman­ +do:'-Ebene verbergen wollen, können Sie das System +auch so einrichten, daß sich sofort nach Einrichten +des Arbeitsbereichs das Menusystem meldet. Für den +Anfänger kann das die Arbeit durchaus erleichtern. + Gehen Sie dazu in die Task, unterhalb der die +Sohntasks eingerichtet werden sollen: + +#on("b")# + (Supervisor - Taste) + +#off("b")# + --> gib supervisor kommando: +#on("b")# + continue ("mp bap") +#off("b")# + + --> gib kommando: +#on("b")# + direktstart ("mp", TRUE) +#off("b")# + + Durch das Kommando haben Sie festgelegt, daß +sich alle Sohntasks direkt mit dem Programm 'Mate­ +rialprüfung' melden. Möchten Sie lieber mit 'Bild­ +schirmarbeitsplatz' arbeiten, ist nur 'mp' durch +'bap' zu ersetzen. In diesem Falle meldet sich das +System gleich mit dem BAP-Menu. + Durch den zweiten Parameter 'TRUE' legen Sie +fest, daß in den Sohntasks nach Verlassen des Menus +die jeweilige Task automatisch gelöscht wird. Statt +'TRUE' können Sie hier auch den Wert 'FALSE' ein­ +tragen. Dann wird nach Verlassen des Menus ange­ +fragt, ob die Task gelöscht werden soll. Wird die +Frage bejaht, wird gelöscht - sonst wird die Task +abgekoppelt (break) und kann durch 'continue' wie­ +der angekoppelt werden. + Anmerkung: In der Task, in der Sie das Kommando +'direktbefehl' gegeben haben, sollte nicht das Kom­ +mando 'monitor' gegeben werden, da Sie durch dieses +Kommando auch diese Task zu einer Task machen, die +sich direkt mit dem Menu meldet und ggf. bei Ver­ +lassen des Menus automatisch gelöscht wird! + diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 4 b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 4 new file mode 100644 index 0000000..6236d91 --- /dev/null +++ b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 4 @@ -0,0 +1,638 @@ +#limit (11.0)##pagelength (16.5)##block##pageblock# +#start (2.0,0.0)# +#page (22)# +#headodd# +#center#gs-MP BAP#right#% + +#end# +#headeven# +%#center#gs-MP BAP + +#end# +#center#4 + +#center#Eine +#center#kleine +#center#Beispielsitzung + + +4.1 Aufruf von 'Bildschirmarbeitsplatz' (BAP) + + Wenn Sie, wie in Kapitel 3 beschrieben, eine +Sohntask der Task eingerichtet haben, in der #on("b")#gs-MP +BAP#off("b")# installiert ist, und dort bei 'gib kommando:' +den Befehl: + + #on("b")#bap #off("b")# + +geben, erscheint - nach dem #on("b")#gs-DIALOG#off("b")#-Eingangsbild­ +schirm - das folgende Menu: + +#on("b")# +BAP: Simulation Parameter Konfiguration Dateien Archiv ++-------------------------------+----------------------------------------- +| s Simulation ausführen | +| --------------------------- | +| a Auswertung auf Bildschirm | +| d Drucken von Auswertungen | ++-------------------------------+ + + + + + + + + + +-------------------------------------------------------------------------- +Info:/ Wahl: Ausführen: Verlassen: +#off("b")# + +4.2 Einstellung von Simulationsparametern + + Bevor Sie eine Neueinstellung von Simulations­ +parametern vornehmen, sollten Sie sich einen Über­ +blick über die zur Zeit eingestellten Werte ver­ +schaffen. Zwar wäre es möglich, gleich einen Simu­ +lationslauf zu starten, doch müßten Sie dann gleich +34 Minuten arbeiten - denn standardmäßig ist das +Simulationssystem auf 3 Arbeitsphasen von je 10 +Minuten Dauer und zwei dazwischenliegende Pausen +von je 2 Minuten eingestellt. + Wenn Sie sich die Einstellung anzeigen lassen +wollen, müssen Sie das Pull-Down-Menu wechseln. +Gehen Sie als durch Tippen der Pfeiltaste +zum Oberbegriff 'Parameter'. Dadurch wird das fol­ +gende Pull-Down-Menu aufgeschlagen: + +#on("b")# +BAP: Simulation Parameter Konfiguration Dateien Archiv +-------+---------------------------+-------------------------------------- + | e Einstellung anzeigen | + | s Standardwerte | + | ----------------------- | + | b Breite des Werkstücks | + | h Höhe des Werkstücks | + | i Invers-/Normal | + | z Zeichensatz | + | f Fehlerzeichen | + | t Tastenbelegung | + | ----------------------- | + | a Anzahl Arbeitsphasen | + | d Dauer Arbeitsphase | + | p Pausendauer | + | ----------------------- | + | w Wertungsschlüssel | + +---------------------------+ + +-------------------------------------------------------------------------- +Info:/ Wahl: Ausführen: Verlassen: +#off("b")# + +Nach Tippen der Taste (für 'Einstellung anzei­ +gen') erscheint der folgende Bildschirm: + +#on("b")# ++-----------------------------------++-----------------------------------+ +| || Wertungsschlüssel | +| Breite : 15 Zeichen || Bewertungs- | +| Höhe : 12 Zeichen || faktor | +| Darstellung : normal || | +| Zeichensatz : A...Z (26 Zeichen)||1.0| + | +| Fehlerzeichen: F || | + | +| || | + | +| Nach rechts : || | + | +| Nach links : || | + | +| Nach oben : ||0.5| + | +| Nach unten : || | + | +| Ausbesserung : || | + | +| Nächstes : || | + | +| || | + | +| Anzahl der Arbeitsphasen: 3 ||0.0+--|--|--|--|--|--|--|--|--|--| | +| Dauer einer Arbeitsphase: 10 min || 0.0 0.5 1.0| +| Dauer einer Pause : 2 min || | +| || Ausbesserungsrate| +| Simulationsgesamtdauer : 34 min || | ++-----------------------------------++-----------------------------------+ +-------------------------------------------------------------------------- +Zum Weitermachen irgendeine Taste tippen! +#off("b")# + + Oben links wird das "Aussehen" der Werkstücke +auf dem Bildschirm beschrieben. Nach diesen Angaben +sind die Werkstücke 15 Zeichen breit und 12 Zeichen +hoch. Sie werden auf dem Bildschirm normal (nicht +invers) dargestellt. Die Werkstücke werden aus den +Großbuchstaben 'A ... Z' zusammengesetzt, wobei 'F' +das Fehlerzeichen ist, nach dem gesucht werden +soll. + Der Cursor kann mit den Pfeiltasten (, +, und ) innerhalb des Werk­ +stücks bewegt werden. Steht der Cursor auf einem +Fehlerzeichen, so verschwindet es, wenn die - +Taste getippt wird. Nach Tippen der -Taste +erscheint das nächste Werkstück auf dem Bildschirm. + Darunter sind die Informationen angegeben, die +uns eigentlich interessieren: Die Anzahl/Zeiten für +Arbeitsphasen und Pausen. Sie sollen die Simula­ +tionszeiten jetzt so verändern, daß die Gesamtsimu­ +lationszeit 3 Minuten beträgt. Wählen Sie dazu zu­ +erst die Menufunktion 'Anzahl Arbeitsphasen' durch +Tippen der Taste . Dann erscheint auf dem Bild­ +schirm folgendes Bild: + +#on("b")# ++-------------------------++-------------------------------------------+ +| Informationen || Anzahl Arbeitsphasen festlegen: | +| || | +| Kleinster Wert: 2 || Anzahl Arbeitsphasen neu festlegen (j/n)? | +| Größter Wert: 20 || | +| || | +| Eingestellter Wert: 3 || | ++-------------------------++-------------------------------------------+ + + + + +-------------------------------------+ + | Simulationszeiten: | + | | + | Anzahl der Arbeitsphasen: 3 | + | Dauer einer Arbeitsphase: 10 min | + | Dauer einer Pause : 2 min | + | | + | Simulationsgesamtdauer : 34 min | + +-------------------------------------+ + + + Wenn Sie die im Fenster oben rechts gestellte +Frage bejahen (Taste tippen), ändert sich der +Fensterinhalt: + +#on("b")# ++-------------------------++---------------------------------------------+ +| Informationen || Anzahl Arbeitsphasen festlegen: | +| || | +| Kleinster Wert: 2 ||Mit den Pfeilen und den Wert| +| Größter Wert: 20 ||einstellen. Eingabe mit abschließen.| +| || | +| Eingestellter Wert: 3 ||Bitte die Anzahl der Arbeitsphasen: 3 | ++-------------------------++---------------------------------------------+ + + Bestimmt ist Ihnen schon klar, was zu tun ist: +Mit der Pfeiltaste stellen Sie den +kleinstmöglichen Wert (2) ein - anschließend tippen +Sie die -Taste. Schauen Sie auf das Fenster +ganz unten - jetzt hätten Sie nur noch 24 Minuten +zu arbeiten. Bevor Sie die anderen Parameter ein­ +stellen, bestätigen Sie bitte, daß Sie mit der An­ +zahl der Arbeitsphasen einverstanden sind. + Gehen Sie jetzt ebenso vor, um die 'Dauer (ei­ +ner) Arbeitsphase' und die 'Pausendauer' einzustel­ +len - eine Beschreibung dazu ist sicher überflüs­ +sig. + Rechts im Fenster ist noch der 'Wertungsschlüs­ +sel' angegeben - seine Bedeutung erläutern wir aber +erst in Zusammenhang mit der Auswertung der Simula­ +tionsprotokolle. + + +4.3 Ein Simulationslauf + + So, jetzt können Sie zum Ausprobieren einen kur­ +zen Simulationslauf starten. Gehen Sie dazu zurück +zum Pull-Down-Menu ganz links und wählen Sie hier +die Menufunktion 'Simulation ausführen'. Zunächst +werden Sie nach einer "Identifikation" gefragt. +Geben Sie z.B. Ihren Namen ein und tippen Sie an­ +schließend die -Taste. Auf dem Bildschirm +erscheinen oben alle Informationen, die Sie während +der Simulation benötigen; darunter erscheint der +Hinweis, daß mit dem nächsten Tastendruck die erste +Arbeitsphase beginnt. Wenn das erste Werkstück auf +dem Bildschirm erscheint, sieht das z.B. so aus: + +#on("b")# ++-------------------------------+ +-------------------------------------+ +| Nach rechts : | | Anzahl der Arbeitsphasen: 3 | +| Nach links : | | Dauer einer Arbeitsphase: 10 min | +| Nach oben : | | Dauer einer Pause : 2 min | +| Nach unten : | | Simulationsgesamtdauer : 34 min | +| Ausbesserung : | | | +| Nächstes : | | Fehlerzeichen : F | ++-------------------------------+ +-------------------------------------+ + + GFMKLPDRFGTZQAL + RTWOJLMNVWQHTRS + PZBFVDDSWWAFGBD + EWWQAKGHHJINMPA + WSSDEKLJNHHGTFD + GGTEWLVCXFFRPTR + TREKGLMNTREFGTW + TRWFGLMBVCCDSAQ + HGFRWZTCXYAASWW + MNNBHGTREWQKJLO + CCXSDRFGHKLPOZR + RWPPKHJUUZTFDSE + + + Nun dürfen Sie einmal zeigen, was Sie können. +Bitte achten Sie darauf, daß Sie in jeder Arbeits­ +phase mindestens ein Werkstück bearbeiten - sonst +könnte es später zu Fehlern bei der Auswertung kom­ +men. Sie sollen sich ja auch nicht ausruhen, son­ +dern arbeiten! + Pausen werden Ihnen auf dem Bildschirm ange­ +zeigt. Auch wenn Sie weiterarbeiten wollen - um die +Pausen kommen Sie nicht herum! Am Ende einer Pause +wird ein Hinweis auf das Pausenende ausgegeben. + Nach der letzten Arbeitsphase erhalten Sie eine +Kurzauswertung des aktuellen Simualtionslaufes auf +den Bildschirm (wenn Ihnen das nicht gefällt, kön­ +nen Sie das später auch abschalten). Zur Erläute­ +rung der angegebenen Daten in der 'Kurzauswertung' +sehen Sie bitte das folgende Kapitel. + + +4.4 Die Simulationsauswertung/das Simulations­ + protokoll + + Wenn Sie wollen, können Sie das Protokoll, das +über Ihre Arbeit angefertigt wurde, gleich auswer­ +ten lassen. Wählen Sie dazu die Menufunktion 'Aus­ +wertung auf Bildschirm' (im gleichen Pull-Down- +Menu). Ihnen werden jetzt alle Protokolle, die sich +in Ihrer Task befinden, zur Auswahl angeboten. +Wahrscheinlich ist es zur Zeit nur eine Protokoll­ +datei. + Jetzt sehen Sie auch, warum von Ihnen vor Simu­ +lationsbeginn eine "Identifikation" erbeten wurde. +Sie ist Bestandteil des Protokollnamens - danach +können Sie nämlich die Protokolle zuordnen. Verwen­ +den Sie mehrfach die gleiche Identifikation, so +werden die Protokolle in der Reihenfolge ihrer An­ +lage durchnumeriert. + Wenn Sie den/die Dateinamen angekreuzt haben +(z.B. mit ) und die Auswahl durch +verlassen, werden die angekreuzten Protokolldateien +ausgewertet und anschließend auf dem Bildschirm +angezeigt. + Das Protokoll ist jeweils nach folgendem Schema +aufgebaut: Zunächst werden Datum und Uhrzeit des +Simulationslaufs ausgegeben; anschließend alle +Kenndaten der Simulation, so daß daraus die gesamte +Konfiguration des Simulationssystems rekonstruier­ +bar ist. Es folgt die "Gesamtauswertung" des Simu­ +lationslaufes, die identisch ist mit der auf dem +Bildschirm angezeigten 'Kurzauswertung'. Die Ge­ +samtauswertung erfolgt nach den gleichen Grundsät­ +zen wie die sich anschließenden Auswertungen der +einzelnen Werkstücke (es werden hier nur die ggf. +angefallenen Pausenüberschreitung(en) mit in die +Beurteilung einbezogen). + Das Protokoll ist durch die angehängten Bemer­ +kungen nahezu selbsterklärend. Damit Sie sich einen +Eindruck verschaffen können, haben wir auf den +nächsten Seiten ein ausgewertetes Protokoll abge­ +druckt. Bitte studieren Sie es eingehend - insbe­ +sondere die Anmerkungen am Ende des Protokolls: + + + + + + +#on("b")# + gs-Protokoll: TEST - Auswertung + =============================== +Datum : 03.09.87 Uhrzeit (zu Beginn): 10:21 + + Kenndaten der Werkstückbearbeitung: + =================================== +Nach rechts : Anzahl der Arbeitsphasen: 3 +Nach links : Dauer einer Arbeitsphase: 10 min +Nach oben : Dauer einer Pause : 2 min +Nach unten : Simulationsgesamtdauer : 34 min +Ausbesserung : +Nächstes : Fehlerzeichen : F + +Werkstückbreite : 15 Zeichen +Werkstückhöhe : 12 Zeichen +Anzahl Zeichen pro Werkstück : 180 Zeichen +Umfang des Zeichensatzes : A ... Z ( 26 Zeichen) + + Beispielwerkstück: + ------------------ + QQSEUZSTABQBZWI + UKZVNYPHCPLQMGH + NDJZPCMOOPQQICL + ARELRDKUOOZWOIE + NASIPRLRQUKJHGN + YJJVKIGWCJOLRTL + FXSZBOBIBKQPYXN + JJFKFMEVALZNDPU + VTWWIHKWRMPMHZP + CSSFZBOSACLARKQ + WAAIMHJELLFKIWA + XLNHUCZRVXOXHRL + + + + G e s a m t a u s w e r t u n g: + ================================ +Anzahl der vollständig bearbeiteten Werkstücke : 51 +Anzahl der Zeichen pro Werkstück : 180 +Anzahl der insgesamt untersuchten Zeichen : 9180 + +Anzahl der Bedienfehler : 3 + +Anzahl der vorgegebenen Fehler : 363 +Anzahl der Fehlerkorrekturen : 304 +Arbeitszeit (incl. Pausenüberschreitungen) : 1792.5 sec +Anzahl bearbeiteter Zeichen pro Sekunde : 5.1 + +Ausbesserungsrate : 0.8 +Bewertungsfaktor : 0.8 + +Gesamtbewertung (incl. Pausenüberschreitungen) : 4.3 +================================================ ======== +Arbeitszeit (ohne Pausenüberschreitungen) : 1788.5 sec +Anzahl bearbeiteter Zeichen pro Sekunde : 5.1 +Gesamtbewertung (ohne Pausenüberschreitungen) : 4.3 +================================================ ======== + + + Einzelauswertung der Werkstücke: + ================================ + +Werk- | Anzahl | Vorge- | Anzahl | Benö- | Zei- | Aus- |Bewer- | Bewer- +stück- | Be- | gebene | Kor- | tigte | chen | bes- |tungs- | tungs- +nummer | dien- | Feh- | rek- | Zeit | pro | se- |faktor | zahl + | feh- | ler- | turen | [sec] | Se- | rungs-| | + | ler | zahl | | | kunde | rate | | +-------------------------------------------------------------------------- + | | | | | | | | + 1 | 0 | 5 | 3 | 45.6 | 3.9 | 0.6 | 0.6 | 2.4 + 2 | 0 | 10 | 6 | 33.5 | 5.4 | 0.6 | 0.6 | 3.2 + 3 | 0 | 5 | 4 | 35.7 | 5.0 | 0.8 | 0.8 | 4.0 + 4 | 0 | 3 | 3 | 33.9 | 5.3 | 1.0 | 1.0 | 5.3 + 5 | 0 | 10 | 7 | 38.0 | 4.7 | 0.7 | 0.7 | 3.3 + 6 | 0 | 5 | 4 | 37.2 | 4.8 | 0.8 | 0.8 | 3.9 + 7 | 0 | 9 | 8 | 36.9 | 4.9 | 0.9 | 0.9 | 4.3 + 8 | 0 | 5 | 4 | 31.7 | 5.7 | 0.8 | 0.8 | 4.5 + 9 | 0 | 4 | 3 | 27.3 | 6.6 | 0.8 | 0.8 | 4.9 + 10 | 0 | 6 | 6 | 33.3 | 5.4 | 1.0 | 1.0 | 5.4 + 11 | 0 | 3 | 3 | 25.0 | 7.2 | 1.0 | 1.0 | 7.2 + 12 | 0 | 6 | 3 | 28.6 | 6.3 | 0.5 | 0.5 | 3.1 + 13 | 0 | 11 | 10 | 37.9 | 4.7 | 0.9 | 0.9 | 4.3 + 14 | 0 | 4 | 4 | 38.3 | 4.7 | 1.0 | 1.0 | 4.7 + 15 | 0 | 11 | 8 | 39.3 | 4.6 | 0.7 | 0.7 | 3.3 + 16 | 0 | 5 | 4 | 28.4 | 6.3 | 0.8 | 0.8 | 5.1 + 17 | 0 | 4 | 4 | 36.4 | 4.9 | 1.0 | 1.0 | 4.9 + 18 | 0 | 15 | 14 | 44.9 | 4.0 | 0.9 | 0.9 | 3.7 + + PAUSE ---> Überzogen um 2.2 sec + + 19 | 0 | 3 | 3 | 38.9 | 4.6 | 1.0 | 1.0 | 4.6 + 20 | 0 | 11 | 10 | 40.2 | 4.5 | 0.9 | 0.9 | 4.1 + 21 | 0 | 8 | 7 | 34.7 | 5.2 | 0.9 | 0.9 | 4.5 + 22 | 0 | 7 | 5 | 30.3 | 5.9 | 0.7 | 0.7 | 4.2 + 23 | 0 | 4 | 4 | 33.9 | 5.3 | 1.0 | 1.0 | 5.3 + 24 | 0 | 7 | 7 | 39.5 | 4.6 | 1.0 | 1.0 | 4.6 + 25 | 0 | 6 | 4 | 28.1 | 6.4 | 0.7 | 0.7 | 4.3 + 26 | 0 | 11 | 10 | 34.8 | 5.2 | 0.9 | 0.9 | 4.7 + 27 | 0 | 11 | 9 | 34.2 | 5.3 | 0.8 | 0.8 | 4.3 + 28 | 0 | 10 | 8 | 35.0 | 5.1 | 0.8 | 0.8 | 4.1 + 29 | 0 | 9 | 8 | 36.4 | 4.9 | 0.9 | 0.9 | 4.4 + 30 | 0 | 8 | 7 | 34.8 | 5.2 | 0.9 | 0.9 | 4.5 + 31 | 0 | 10 | 8 | 36.2 | 5.0 | 0.8 | 0.8 | 4.0 + 32 | 0 | 10 | 10 | 44.0 | 4.1 | 1.0 | 1.0 | 4.1 + 33 | 0 | 8 | 8 | 44.4 | 4.1 | 1.0 | 1.0 | 4.1 + 34 | 0 | 4 | 3 | 35.6 | 5.1 | 0.8 | 0.8 | 3.8 + + PAUSE ---> Überzogen um 1.8 sec + + 35 | 0 | 8 | 8 | 42.7 | 4.2 | 1.0 | 1.0 | 4.2 + 36 | 1 | 8 | 8 | 45.3 | 4.0 | 1.0 | 1.0 | 4.0 + 37 | 0 | 5 | 5 | 34.3 | 5.2 | 1.0 | 1.0 | 5.2 + 38 | 0 | 5 | 4 | 27.9 | 6.5 | 0.8 | 0.8 | 5.2 + 39 | 0 | 10 | 8 | 39.5 | 4.6 | 0.8 | 0.8 | 3.6 + 40 | 1 | 7 | 6 | 35.5 | 5.1 | 0.9 | 0.9 | 4.3 + 41 | 0 | 3 | 3 | 29.5 | 6.1 | 1.0 | 1.0 | 6.1 + 42 | 0 | 5 | 5 | 30.2 | 6.0 | 1.0 | 1.0 | 6.0 + 43 | 0 | 6 | 3 | 28.0 | 6.4 | 0.5 | 0.5 | 3.2 + 44 | 0 | 5 | 4 | 30.2 | 6.0 | 0.8 | 0.8 | 4.8 + 45 | 0 | 5 | 4 | 33.1 | 5.4 | 0.8 | 0.8 | 4.4 + 46 | 0 | 8 | 7 | 33.7 | 5.3 | 0.9 | 0.9 | 4.7 + 47 | 0 | 9 | 7 | 32.2 | 5.6 | 0.8 | 0.8 | 4.3 + 48 | 0 | 9 | 8 | 37.5 | 4.8 | 0.9 | 0.9 | 4.3 + 49 | 0 | 4 | 4 | 32.0 | 5.6 | 1.0 | 1.0 | 5.6 + 50 | 0 | 9 | 7 | 34.8 | 5.2 | 0.8 | 0.8 | 4.0 + 51 | 1 | 9 | 4 | 29.2 | 6.2 | 0.4 | 0.4 | 2.7 + | | | | | | | | +========================================================================== + +( 52 | 0 | 7 | 7 | 35.9 | 5.0 | 1.0 | 1.0 | 5.0) + + Anmerkungen: + ============= + + - Das zuletzt bearbeitete Werkstück (in der obigen Tabelle unterhalb + der letzten Trennlinie in Klammern angegeben) wurde nicht vollstän- + dig innerhalb der zur Verfügung stehenden Zeit bearbeitet. + Aus diesem Grunde wird es bei der Auswertung (Gesamtwertung) nicht + berücksichtigt! + + - Bei der Auflistung der Daten der einzelnen Werkstücke sind auch die + Pausen eingetragen, so daß sich die einzelnen Arbeitsphasen erken- + nen und miteinander vergleichen lassen. Die dabei notierten Zeiten + geben die Pausenüberschreitungen an. Diese Zeiten bleiben bei der + Betrachtung der einzelnen Werkstücke unberücksichtigt, fließen aber + in die Gesamtauswertung ein! + + - Die Anzahl der Bedienfehler ist ein Maß für die Sicherheit im Um- + gang mit dem System. Bei den weiteren Auswertungen bleibt die Be- + dienfehlerzahl allerdings unberücksichtigt! + + - Die 'Vorgegebene Fehlerzahl', die 'Anzahl Korrekturen' und die 'Be- + nötigte Zeit [sec]' wurden bei der Bearbeitung des Werkstücks er- + faßt. Auf diesen Daten beruhen die folgenden Auswertungen! + + - Da die Werkstücke ganz unterschiedliche Größen haben können, eignet + sich die 'Benötigte Zeit [sec]', die für die Bearbeitung eines je- + den Werkstücks ermittelt wird, als Maß für die "Arbeitsgeschwindig- + keit" nicht! Stattdessen wird ermittelt, wie viele Zeichen pro Se- + kunde "bearbeitet" wurden: + + Anzahl Zeichen pro Werkstück + Zeichen pro Sekunde = ---------------------------- + Benötigte Zeit [sec] + + Die 'Anzahl Zeichen pro Werkstück' kann aus der Werkstückbreite und + Werkstückhöhe ermittelt werden: + + Anzahl Zeichen pro Werkstück = Werkstückbreite * Werkstückhöhe + + - Aus der (zufällig) 'Vorgegebenen Fehlerzahl' und der 'Anzahl Kor- + rekturen' wird die 'Ausbesserungsrate' ermittelt: + + Anzahl Korrekturen + Ausbesserungsrate = ---------------------- + Vorgegebene Fehlerzahl + + Die Ausbesserungsrate gibt an, welcher Anteil der vorhandenen Feh- + ler ausgebessert wurde. Sie ist ein Maß für die Güte der verrichte- + ten Arbeit. + + - Der 'Bewertungsfaktor' ist abhängig von der 'Ausbesserungsrate'. Er + läßt sich aus dem folgenden Diagramm entnehmen: + + Bewertungs- + faktor + + 1.0| + + | + + | + + | + + | + + 0.5| + + | + + | + + | + + | + + 0.0+--|--|--|--|--|--|--|--|--|--| + 0.0 0.5 1.0 + Ausbesserungsrate + + + In diesem Diagramm ist festgelegt, wie die einzelnen 'Ausbesse- + rungsraten' bewertet werden. + + - Am Ende wird die 'Bewertungszahl' folgendermaßen ermittelt: + + Bewertungszahl = Zeichen pro Sekunde * Bewertungsfaktor + + Da der 'Bewertungsfaktor' nur Werte zwischen 0 und 1 annehmen kann, + ist die 'Bewertungszahl' ein Wert zwischen 0 und der 'Zeichen pro + Sekunde'. Die "Arbeitsleistung" war um so größer, je höher die 'Be- + wertungszahl ist. + +Eine weitere Kommentierung des Protokolls dürfte +sich wohl erübrigen, wenn Sie die Anmerkungen in­ +tensiv studiert haben. + + +4.5 Hinweise zur Protokollauswertung + +4.5.1 Der Bewertungsfaktor + + Sie haben sich sicher über den sogenannten 'Be­ +wertungsfaktor' gewundert, der an verschiedenen +Stellen genannt wird - aber bisher unberücksichtigt +blieb. In den bisher aufgezeigten Situationen war +der Bewertungsfaktor identisch mit der 'Ausbesse­ +rungsrate'. Warum dieser Faktor gesondert einge­ +führt wurde, möchten wir an einem kleinen Beispiel +erläutern: + Wenn Ihnen der Auswertalgorithmus vor dem Simu­ +lationslauf bekannt gewesen wäre und Sie die Ab­ +sicht gehabt hätten, eine möglichst hohe Bewer­ +tungszahl zu erzielen, wäre folgende "Arbeitsstra­ +tegie" erfolgversprechend gewesen: + Sobald ein Werkstück auf dem Bildschirm er­ +scheint, bewegen Sie den Cursor schnellstens zum +ersten Fehlerzeichen, das Sie entdecken können und +löschen es mit der Ausbesserungstaste. Sollten zu­ +fällig noch weiterer Fehlerzeichen in unmittelbarer +Nähe zu sehen sein, so können Sie sie ja auch "aus­ +merzen" - aber dann schnell das nächste Werkstück +anfordern usw. + Machen wir uns klar, was das bedeutet: Da sie +das Werkstück in sehr kurzer Zeit bearbeitet haben, +wird der eigentlich entscheidende Faktor hinsicht­ +lich der Auswertung "enorm in die Höhe getrieben" +(die Anzahl der Zeichen pro Sekunde). Da Sie bei +dieser Strategie zumeist nur 2 - 4 Sekunden zur +Bearbeitung eines Werkstücks brauchen, erhalten Sie +- auf das obige Beispielprotokoll bezogen - Werte +zwischen 90.0 und 45.0 (bearbeitete Zeichen pro +Sekunde). + Im Schnitt treten pro Werkstück etwa 7 Fehler­ +zeichen auf (sehen Sie dazu auch unter 'Aufbau der +Werkstücke'), von denen Sie dann eines korrigiert +haben. Sie kommen also auf eine durchschnittliche +Ausbesserungsrate von 0.14. Wäre - wie im obigen +Beispielprotokoll - der Bewertungsfaktor mit der +Ausbesserungsrate identisch, so erhielten Sie Be­ +wertungszahlen zwischen 12.9 und 6.4. Ein deut­ +licher Unterschied zur "Leistung" die im Protokoll +dokumentiert ist - oder? + Das aber ist nicht Sinn der dem Benutzer ge­ +stellten Aufgabe! Es würde auch nicht einer sinn­ +vollen 'Kontrolltätigkeit' entsprechen, wenn derart +viele Fehler unentdeckt blieben. Um hier "regulie­ +rend" einschreiten zu können, ist der 'Bewertungs­ +faktor' eingeführt worden. So können Sie festlegen, +daß Werkstücke, in denen weniger als 80% der Fehler +entdeckt wurden, bei der Auswertung unberücksich­ +tigt bleiben. Sie brauchen dazu nur den Bewertungs­ +schlüssel entsprechend einzustellen. ("Ziehen Sie +dazu bei der Einstellung des Bewertungsschlüssels +die ersten 8 Kreuzchen auf die Grundlinie"). + Anders ausgedrückt: Durch die Manipulation des +Bewertungsschlüssels können Sie die Anforderungen, +die an die Werkstückbearbeitung gestellt werden, +festlegen. Hierdurch entscheiden Sie über die Wer­ +tigkeit von Schnelligkeit und Genauigkeit. + Übrigens wird der zur Simulationszeit einge­ +stellte Wertungsschlüssel mit im Protokoll notiert. +Eine Auswertung des Protokolls mit verschiedenen +Wertungsschlüsseln ist so nicht möglich - und auch +nicht sinnvoll. Denn sonst könnte es ja vorkommen, +daß der Anwender ein ganz anderes Ergebnis in der +Kurzauswertung auf dem Bildschirm gezeigt bekommt +als er nachher im Protokoll nachlesen kann. Wenn +Sie also mit einem veränderten Wertungsschlüssel +arbeiten wollen, müssen Sie ihn #on("u")#vor dem Simula­ +tionslauf#off("u")# eingestellt haben! + + +4.5.2 Fehlerzeichenhäufigkeit in den Werkstücken + + Die Häufigkeit des Auftretens der Fehlerzeichen +in den einzelnen Werkstücken kann deutlich schwan­ +ken. Die Werkstücke werden nämlich mit Hilfe des +Zufallszahlengenerators aufgebaut. Je nach Anzahl +der verschiedenen Zeichen, die in einem Werkstück +auftreten können, ändert sich auch der Anteil der +auftretenden Fehlerzeichen. + In unserem bisher betrachteten Beispiel können +26 verschiedene Buchstaben im Werkstück auftreten. +Ein Werkstück besteht aus 180 Zeichen. In 1/26 al­ +ler Fälle müßte also das Fehlerzeichen auftreten, +d.h. also etwa 7 Fehlerzeichen pro Werkstück - al­ +lerdings auf eine große Anzahl von produzierten +Werkstücken bezogen. Da die Werkstücke zufällig +zusammengesetzt werden, gilt dieser Wert natürlich +nicht für das einzelne Werkstück! + + +4.5.3 Fehlerhafte Auswertungen + + In zwei Situationen kann es zu Fehlern bei der +Auswertung von Protokollen kommen: + + Wurde der Simulationslauf mit der -Taste +rigoros abgebrochen, so ist ggf. eine sinnvolle +Auswertung des Protokolls nicht möglich, da nur +unvollständige Daten vorhanden sind. + + In der letzten Arbeitsphase eines Simulations­ +laufes muß zumindest ein Werkstück angefordert wor­ +den sein. Dehnt ein Anwender die letzte Pause so +lange aus, daß das Pausenende über das Ende der +letzten Arbeitsphase hinausreicht, so erscheinen im +Protokoll keine Werte für die einzelnen Werkstücke +- in der Gesamtauswertung sind (fast) alle Werte +auf '0' gesetzt. + diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 5 b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 5 new file mode 100644 index 0000000..d08e4a7 --- /dev/null +++ b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 5 @@ -0,0 +1,699 @@ +#limit (11.0)##pagelength (16.5)##block##pageblock# +#start (2.0,0.0)# +#page (40)# +#headodd# +#center#gs-MP BAP#right#% + +#end# +#headeven# +%#center#gs-MP BAP + +#end# +#center#5 + +#center#Beschreibung +#center#der +#center#Menufunktionen + +#center#(Programmteil 'Bildschirmarbeitsplatz' (BAP)) + + +5.1 Kurzhinweise zur Bedienung des Menus + + Die Bedienung des Menus ist sehr einfach. Eine +ausführliche Beschreibung dazu finden Sie in den +Unterlagen zum Programmsystem #on("b")#gs-DIALOG#off("b")#. An dieser +Stelle sollen nur die wesentlichen Bedienungsvor­ +gänge beschrieben werden. + +- Mit der Tastenfolge können Sie sich + Informationen zur Bedienung des Menusystems in + das Menu einblenden lassen. + +- Mit den Pfeiltasten und können + Sie zwischen den "Oberbegriffen" in der Kopfzei­ + le wählen. Der aktuelle Oberbegriff ist jeweils + invers dargestellt. Das ausgeklappte 'Pull- + Down-Menu' bezieht sich auf diesen invers darge­ + stellten Oberbegriff. + +- Mit den Pfeiltasten und können + Sie zwischen den Menufunktionen wählen, die + Ihnen im aktuellen Pull-Down-Menu zur Auswahl + angeboten werden. Die aktuell angewählte Menu­ + funktion wird jeweils invers dargestellt. Die + Trennlinien, die in einigen Pull-Down-Menus + sichtbar sind, dienen nur der optischen Unter­ + gliederung; sie können nicht angewählt werden + und werden deshalb automatisch übersprungen. Die + einzelnen Menupunkte sind "zyklisch miteinander + verknüpft", das heißt, man gelangt vom untersten + Menupunkt wieder zum obersten und umgekehrt. + Menupunkte, vor denen ein Minuszeichen steht + ('-'), sind (zur Zeit) nicht aktivierbar; auch + sie können nicht angewählt werden und werden + einfach übersprungen. + +- Durch Tippen der Fragezeichentaste () können + Sie sich jeweils zur aktuellen Menufunktion (in­ + vers im Pull-Down-Menu) Informationen in das + Menu einblenden lassen. + +- Um eine Menufunktion ausführen zu lassen, bewe­ + gen Sie sich mit den Pfeiltasten auf die ge­ + wünschte Menufunktion im aktuellen Pull-Down- + Menu und tippen dann die -Taste. Steht + vor dem gewünschten Menupunkt ein einzelner + Buchstabe oder eine Ziffer, so kann durch Tippen + der entsprechenden Taste diese Menufunktion da­ + durch direkt aufgerufen werden. Sobald eine Me­ + nufunktion aufgerufen worden ist, erscheint da­ + vor ein Stern ('*'). Daraus können Sie entneh­ + men, daß das System bereits den Auftrag aus­ + führt. + +- An verschiedenen Stellen werden Fragen an Sie + gerichtet, die Sie mit 'ja' oder 'nein' beant­ + worten müssen. Tippen Sie dazu entsprechend der + Entscheidung die Taste (für 'ja') bzw. + (für 'nein'). + +- Werden Ihnen vom Menu aus Dateinamen zur Auswahl + angeboten, so können Sie den auf dem Bildschirm + sichtbaren Pfeil vor den gewünschten Namen posi­ + tionieren. Mit den Tasten oder kön­ + nen Sie den Namen ankreuzen. Ist die Auswahl + mehrerer Dateinamen möglich, so können Sie den + Vorgang wiederholen. Mit den Tasten oder + können Sie auch ein Kreuz vor einem + Namen wieder löschen. Daneben gibt es noch eini­ + ge Tastenfunktionen, die für die Bedienung recht + hilfreich sein können. Tippen Sie während der + Auswahl die Fragezeichentaste (), so werden + Ihnen alle Bedienungsmöglichkeiten auf dem Bild­ + schirm angezeigt. Eine Auswahl, in der mehrere + Dateien angekreuzt werden dürfen, wird durch die + Tastenfolge verlassen. Anschließend + wird die eingestellte Operation mit den ange­ + kreuzten Dateien ausgeführt. Sind Sie versehent­ + lich in eine solche Auswahl gelangt, so können + Sie den Vorgang durch die Tastenkombination + abbrechen. + +- An einigen Stellen werden Sie aufgefordert, eine + Eingabe zu machen (z.B. einen Dateinamen einzu­ + geben). Wird Ihnen hier ein Vorschlag gemacht, + den Sie akzeptieren, so brauchen Sie zur Bestä­ + tigung nur die -Taste zu tippen. Ge­ + fällt Ihnen der Vorschlag nicht oder wird Ihnen + kein Vorschlag gemacht, so machen Sie bitte die + gewünschte Eingabe. Zum Schreiben stehen Ihnen + alle aus dem Editor bekannten Funktionen zur + Verfügung. Mit der Taste können Sie + Buchstaben löschen, mit einfügen. Die + Eingabe wird durch Tippen der -Taste + abgeschlossen. Ist der von Ihnen gewünschte Name + schon in Ihrer Task vorhanden und steht in der + Fußzeile der Hinweis 'Zeigen: ', dann + können Sie sich auch alle vorhandenen Namen zur + Auswahl anbieten lassen und durch Ankreuzen den + beabsichtigten Namen auswählen. + +- Ihnen können auch mehrere Alternativen angeboten + werden, zwischen denen Sie wählen müssen. In der + untersten Zeile eines solchen Kastens, in denen + Ihnen die Alternativen auf dem Bildschirm einge­ + blendet werden, sind die Möglichkeiten aufge­ + führt, die darüber beschrieben sind. Mit den + Pfeiltasten können sie die Markierung auf die + gewünschte Alternative positionieren und dann + durch die -Taste zur Ausführung bringen. + (Manchmal ist das auch durch Tippen der den Al­ + ternativen vorangestellten Buchstaben oder Zif­ + fern möglich). + +- Durch die Tastenfolge kann das Menu + insgesamt verlassen werden. Damit das nicht ver­ + sehentlich geschieht, wird jeweils die Frage + gestellt, ob Sie das Menu tatsächlich verlassen + wollen. Diese Frage beantworten Sie bitte je + nach Wunsch mit 'ja' oder 'nein' durch Tippen + der Tasten bzw. . + +#page# +5.2 Menufunktionen zum Oberbegriff 'Simulation' + +#on("b")# +BAP: Simulation Parameter Konfiguration Dateien Archiv ++-------------------------------+----------------------------------------- +| s Simulation ausführen | +| --------------------------- | +| a Auswertung auf Bildschirm | +| d Drucken von Auswertungen | ++-------------------------------+ + + + + + + + + + + + +-------------------------------------------------------------------------- +Info:/ Wahl: Ausführen: Verlassen: +#off("b")# + +#on("u")##on("b")#s Simulation ausführen#off("b")##off("u")# + Mit dieser Menufunktion starten Sie einen + Simulationslauf. Bevor Sie aber mit der Arbeit + am Bildschirmarbeitsplatz beginnen können, + wird eine "Identifikation" (Vor- und Nachname) + von Ihnen verlangt. Das Protokoll, das bei der + Simulation entsteht, erhält dann die hier ein­ + gegebene Kennung. Geben Sie für mehrere Proto­ + kolle den gleichen Namen an, so werden die + Protokolle in der Reihenfolge ihrer Anlage + durchnumeriert. + Nach Eingabe der Kennung werden oben auf + dem Bildschirm die zur Zeit eingestellten Si­ + mulationsdaten angezeigt - alle Daten, die Sie + zur Bedienung während der Simulation benöti­ + gen. Die eigentliche Simulation beginnt erst + mit dem nächsten Tastendruck; dazu erfolgt ein + Hinweis auf dem Bildschirm. + Nach Abschluß der Simulation wird Ihnen + gegebenenfalls (sehen Sie dazu auch die Menu­ + funktion 'k Kurzauswertung' unter dem Oberbe­ + griff 'Konfiguration') eine Kurzauswertung auf + dem Bildschirm ausgegeben. Anschließend gelan­ + gen Sie zurück in das Menu. + Diese Menufunktion hat eine ähnliche Wir­ + kung wie der Aufruf des Programms 'Material­ + prüfung' (MP). Im Gegensatz zum Aufruf des + Programms 'Materialprüfung' (MP - mit dem Be­ + fehl: mp ) werden hier allerdings kei­ + ne ausführlichen Informationen vor dem eigent­ + lichen Simulationslauf ausgegeben, sondern es + wird nur nach einer Identifikation (Vorname + und Nachname) gefragt. Nach Abschluß der Si­ + mulation verbleibt das Protokoll in der Task - + es wird nicht, wie im Programmteil 'Material­ + prüfung', in die Vatertask geschickt. + +#on("u")##on("b")#a Auswertung auf Bildschirm#off("b")##off("u")# + Alle Simulationsprotokolle, die sich in + Ihrer Task befinden, werden Ihnen zur Auswahl + angeboten. Wenn Sie den/die gewünschten Proto­ + kollnamen angekreuzt und die Auswahl mit der + Tastenfolge verlassen haben, werden + die Protokolle nacheinander in der Ankreuzrei­ + henfolge ausgewertet und die Auswertungen auf + dem Bildschirm angezeigt. + Die gesamte Auswertung kann zwar nicht auf + einmal auf dem Bildschirm angezeigt werden - + Sie können aber das Fenster mit + und rollen und so in die gesamte + Datei Einsicht nehmen. Gegebenenfalls (sehen + Sie dazu auch die Menufunktion 'u Umfang der + Auswertung' unter dem Oberbegriff 'Konfigura­ + tion') werden an das Ende der eigentlichen + Ergebnisse noch Erläuterungen zum Protokoll + ausgegeben. (Zur Protokollauswertung selbst + sehen Sie bitte Kapitel 4.4). Da die Auswer­ + tung jeweils in eine Datei geschrieben wird, + können Sie sie mit der Tastenkombination + verlassen. + + Fehlerfälle: - Sehen Sie dazu bitte Kapitel + 4.5.3 + +#on("u")##on("b")#d Drucken von Auswertungen#off("b")##off("u")# + Alle Simulationsprotokolle, die sich in + Ihrer Task befinden, werden Ihnen zur Auswahl + angeboten. Wenn Sie den/die gewünschten Proto­ + kollnamen angekreuzt und die Auswahl mit der + Tastenfolge verlassen haben, werden + die Protokolle nacheinander in der Ankreuzrei­ + henfolge ausgewertet und die Auswertdateien + zum Drucker geschickt. + #on("b")#ACHTUNG!#off("b")# Zum Ausdruck von Simulationsproto­ + kollen muß unbedingt diese Menufunktion ge­ + wählt werden! Zwar können normale Textdateien + auch mit dem Menupunkt 'Drucken' unter dem + Oberbegriff 'Dateien' ausgedruckt werden - das + gilt aber nicht für die bei den Simulationen + erzeugten Protokolldateien, die Sie am Präfix + 'gs-Protokoll:' erkennen können. + Der Ausdruck der Protokollauswertungen er­ + folgt normalerweise im Standardschrifttyp Ih­ + res Druckers. Es besteht allerdings die Mög­ + lichkeit, einen anderen Schrifttyp für den + Ausdruck der Protokolldateien einzustellen. + Sehen Sie dazu bitte im Kapitel 6 'Hinweise + für den Systembetreuer'. + +#page# +5.3 Menufunktionen zum Oberbegriff 'Parameter' + +#on("b")# +BAP: Simulation Parameter Konfiguration Dateien Archiv +-------+---------------------------+-------------------------------------- + | e Einstellung anzeigen | + | s Standardwerte | + | ----------------------- | + | b Breite des Werkstücks | + | h Höhe des Werkstücks | + | i Invers-/Normal | + | z Zeichensatz | + | f Fehlerzeichen | + | t Tastenbelegung | + | ----------------------- | + | a Anzahl Arbeitsphasen | + | d Dauer Arbeitsphase | + | p Pausendauer | + | ----------------------- | + | w Wertungsschlüssel | + +---------------------------+ + + +-------------------------------------------------------------------------- +Info:/ Wahl: Ausführen: Verlassen: +#off("b")# + +#on("u")##on("b")#e Einstellung anzeigen#off("b")##off("u")# + Auf dem Bildschirm erscheinen zwei Fenster. + Im Fenster links werden alle Werte angezeigt, + die die Parameter zur Zeit annehmen. Oben kön­ + nen Sie ablesen, welches Aussehen ein Werk­ + stück nach der augenblicklichen Einstellung + auf dem Bildschirm hätte. Darunter ist angege­ + ben, welche Tasten bei der Bearbeitung der + Werkstücke während des Simulationslauf benutzt + werden können. Unten ist noch aufgeführt, wie + viele Arbeitsphasen vorgesehen sind und wie + lange die Arbeitsphasen, Pausen und die Ge­ + samtsimulation dauern. + Im Fenster rechts wird ein Diagramm ausge­ + geben. Hier ist der Bewertungsfaktors in Ab­ + hängigkeit von der Ausbesserungsrate darge­ + stellt. Hinsichtlich der Bedeutung des Bewer­ + tungsfaktors sehen Sie bitte in Kapitel 4.5.1. + Die Anzeige kann durch Tippen einer belie­ + bigen Taste verlassen werden. + +#on("u")##on("b")#s Standardwerte#off("b")##off("u")# + Mit dieser Menufunktion können Sie mit ei­ + nem Tastendruck die sogenannten "Standardwer­ + te" einstellen - die Werte, die die Parameter + haben, wenn das System "frisch installiert" + ist. + Zur Sicherheit zeigt das System die aktuel­ + len Werte an und erfragt, ob Sie die Standard­ + werte tatsächlich einstellen wollen. Bejahen + Sie diese Frage, so werden alle aktuellen Wer­ + te durch die Standardwerte überschrieben und + auf dem Bildschirm angezeigt. Von dieser Ein­ + stellung ist auch der Wertungsschlüssel be­ + troffen - der aber nicht angezeigt wird. Die + Einstellung wird derart vorgenommen, daß Be­ + wertungsfaktor und Ausbesserungsrate identisch + sind. + +#on("u")##on("b")#b Breite des Werkstücks#off("b")##off("u")# + Mit dieser Menufunktion können Sie die An­ + zahl der Zeichen je Werkstückzeile festlegen. + Im Fenster links oben werden der kleinstmög­ + liche Wert (1), der größtmögliche Wert (70) + und der aktuell eingestellte Wert angezeigt. + Unten erscheint zur Kontrolle ein Werkstück, + das den aktuellen Parameterwerten entspricht. + Im Fenster rechts oben wird an Sie die Fra­ + ge gerichtet, ob Sie tatsächlich eine Verände­ + rung vornehmen möchten. Haben Sie versehent­ + lich diesen Menupunkt gewählt, verneinen Sie + einfach diese Frage (Taste ) und gelangen + so - unter Beibehaltung des z.Z. eingestellten + Wertes - zurück in das Menu. + Bejahen Sie die Frage, so erhalten Sie die + Möglichkeit, den bisher eingestellten Wert mit + der Pfeiltaste zu erhöhen, mit der + Pfeiltaste zu erniedrigen - aller­ + dings nur innerhalb der angezeigten Grenzen. + Wenn Sie die gewünschte Einstellung vorgenom­ + men und die Eingabe durch abgeschlos­ + sen haben, erscheint ein Werkstück in der neu + eingestellten Breite unten auf dem Bildschirm. + Bejahen Sie die Frage, ob Sie mit der Werk­ + stückbreite einverstanden sind, dann gelangen + Sie ins Menu zurück; ansonsten können Sie die + Werkstückbreite nach gleichem Verfahren erneut + einstellen. + +#on("u")##on("b")#h Höhe des Werkstücks#off("b")##off("u")# + Die Einstellung der Werkstückhöhe (Anzahl + Zeichen pro Werkstückspalte) erfolgt analog + zur Einstellung der Werkstückbreite - sehen + Sie bitte dort. + +#on("u")##on("b")#i Invers-/Normal#off("b")##off("u")# + Mit dieser Menufunktion können Sie festle­ + gen, ob das zu bearbeitende Werkstück 'normal' + oder 'invers' dargestellt wird. Diese Darstel­ + lung ist aber immer in Abhängigkeit von der + Grundeinstellung Ihres Bildschirms zu sehen. + Wenn Ihr Bildschirm normalerweise helle Zei­ + chen auf dunklem Grund darstellt, so bedeutet + 'normal' eben diese Einstellung; 'invers' be­ + deutet dann, daß die Zeichen des Werkstücks + dunkel auf hellem Grund dargestellt werden - + bei anderer Bildschirmgrundeinstellung eben + umgekehrt. + Unten auf dem Bildschirm wird Ihnen zur + Kontrolle ein Werkstück in aktueller Darstel­ + lung gezeigt. Im Fenster oben rechts erscheint + die Frage, ob Sie eine Veränderung der augen­ + blicklichen Einstellung wünschen. Je nachdem, + ob Sie die Frage bejahen oder verneinen, wird + eine Veränderung vorgenommen oder nicht. + +#on("u")##on("b")#z Zeichensatz#off("b")##off("u")# + Mit dieser Menufunktion können Sie das Feh­ + lerzeichen festlegen und bestimmen, aus wel­ + chen Zeichen die Werkstücke zusammengesetzt + werden sollen. Bejahen Sie die Frage nach der + Neufestlegung des Zeichensatzes, so werden + Ihnen im Fenster links alle möglichen Zeichen + angezeigt. Die Zeichen werden hier in der Rei­ + henfolge ihres internen Codes ausgegeben. Sie + können nun - indem Sie einfach die entspre­ + chende Taste tippen - eines der angegebenen + Zeichen als 'Fehlerzeichen' bestimmen. Es wird + daraufhin invers dargestellt. + Anschließend können Sie die Zeichen bestim­ + men, die sonst noch im Werkstück vorkommen + sollen. Allerdings sind Sie bei dieser Wahl + nicht so frei wie bei der Wahl des Fehlerzei­ + chens. Es muß sich um einen zusammenhängenden + Bereich von Zeichen handeln, die um das Feh­ + lerzeichen gruppiert sind - 'zusammenhängend' + bezieht sich dabei auf die Reihenfolge der + Zeichen im Fenster links. + Die Festlegung selbst erfolgt in zwei Etap­ + pen. Zuerst können Sie den Bereich der Zeichen + bestimmen, die in der Reihenfolge vor dem Feh­ + lerzeichen stehen. Mit der Pfeiltaste + markieren Sie den Bereich, der vor dem Fehler­ + zeichen liegt; mit der Pfeiltaste + können Sie ggf. die Markierung wieder rückgän­ + gig machen. Wenn Sie so den gewünschten Be­ + reich markiert haben, tippen Sie die + -Taste. + Anschließend bestimmen Sie den Bereich hin­ + ter dem Fehlerzeichen auf vergleichbare Weise + und schließen auch hier die Einstellung mit + der -Taste ab. Daraufhin wird Ihnen + der eingestellte Zeichensatz mit markiertem + Fehlerzeichen noch einmal zur Kontrolle im + Fenster links ausgegeben. Sind Sie mit der + Einstellung einverstanden, so bejahen Sie die + an Sie gerichtete Frage und gelangen ins Menu + zurück; ansonsten können Sie nach gleichem + Verfahren die Einstellung korrigieren. + +#on("u")##on("b")#f Fehlerzeichen#off("b")##off("u")# + Diese Menufunktion ist dann sinnvoll zu + wählen, wenn Sie den eingestellten Zeichensatz + beibehalten und nur das Fehlerzeichen verän­ + dern wollen. Wenn Sie die Frage bejaht haben, + eine Veränderung vornehmen zu wollen, haben + Sie die Möglichkeit, durch Verschiebung der + Markierung im Fenster links (durch die Tasten + und ) das neue Fehlerzeichen + einzustellen. Die Einstellung wird durch + abgeschlossen. Sind Sie mit dem ein­ + gestellten Fehlerzeichen einverstanden, gelan­ + gen Sie zurück ins Menu; ansonsten können Sie + Ihre Einstellung korrigieren. + +#on("u")##on("b")#t Tastenbelegung#off("b")##off("u")# + Mit dieser Menufunktion können Sie die Ta­ + sten bestimmen, die bei einem Simulationslauf + zur Bedienung des Systems benutzt werden kön­ + nen. Ihnen wird im Fenster links oben die ak­ + tuelle Einstellung angezeigt. Haben Sie sich + entschlossen, eine Neueinstellung vorzunehmen, + werden nacheinander die entsprechenden Tasten + erfragt. Sie brauchen dabei jeweils nur die + Taste zu tippen, die Sie für die entsprechende + Funktion vorgesehen haben. + Sie können die Tasten nahezu frei wählen. + Es ist allerdings nicht erlaubt, die - + Taste zu wählen. Ebensowenig wird die Einstel­ + lung akzeptiert, wenn Sie Mehrfachbelegungen + vornehmen, d.h, eine Taste für mehrere Funk­ + tionen vorschlagen. Achten Sie deshalb immer + auf den Kommentar zur Einstellung im Fenster + unten links. Ist die Neueinstellung fehler­ + haft, so erfolgt ein Hinweis darauf - in einem + solchen Falle bleibt die alte Tastenbelegung + erhalten. + +#on("u")##on("b")#a Anzahl Arbeitsphasen#off("b")##off("u")# + Mit dieser Menufunktion können Sie festle­ + gen, in wie viele Arbeitsphasen ein Simula­ + tionslauf jeweils eingeteilt werden soll. Im + Fenster links oben werden der kleinstmögliche + Wert (2), der größtmögliche Wert (20) und der + aktuell eingestellte Wert angezeigt. Im Fen­ + ster unten wird die aktuelle Simulationsdauer + angezeigt. + Im Fenster rechts oben wird an Sie die Fra­ + ge gerichtet, ob Sie tatsächlich eine Verände­ + rung vornehmen möchten. Bejahen Sie die Frage, + so erhalten Sie die Möglichkeit, den bisher + eingestellten Wert mit der Pfeiltaste + zu erhöhen, mit der Pfeiltaste zu + erniedrigen - allerdings nur innerhalb der + angezeigten Grenzen. + Wenn Sie die gewünschte Einstellung vorge­ + nommen und die Eingabe durch abge­ + schlossen haben, erscheinen die neuen Simula­ + tionszeiten im Fenster unten. Bejahen Sie die + Frage, ob Sie mit der Arbeitsphasenanzahl ein­ + verstanden sind, dann gelangen Sie ins Menu + zurück; ansonsten können Sie nach gleichem + Verfahren die getroffene Einstellung korrigie­ + ren. + +#on("u")##on("b")#d Dauer Arbeitsphase#off("b")##off("u")# + Mit dieser Menufunktion können Sie festle­ + gen, wie lange eine Arbeitsphase dauern soll. + Es kann ein Wert zwischen 1 min und 60 min + eingestellt werden. Das Einstellverfahren ver­ + läuft analog zur Festlegung der Anzahl der + Arbeitsphasen - sehen Sie bitte dort. + +#on("u")##on("b")#p Pausendauer#off("b")##off("u")# + Mit dieser Menufunktion können Sie festle­ + gen, wie lange die Pause zwischen je zwei Ar­ + beitsphasen dauern soll. Es kann ein Wert zwi­ + schen 1 min und 30 min eingestellt werden. Das + Einstellverfahren verläuft analog zur Festle­ + gung der Anzahl der Arbeitsphasen - sehen Sie + bitte dort. + +#on("u")##on("b")#w Wertungsschlüssel#off("b")##off("u")# + Mit dieser Menufunktion können Sie den Wer­ + tungsschlüssel festlegen. Zur genauen Erläu­ + terung der Bedeutung des Bewertungsfaktors + sehen Sie bitte Kapitel 4.5.1. + Im Fenster links wird der aktuell einge­ + stellte Wertungsschlüssel angezeigt. Stellen + Sie sich die ins Koordinatensystem eingetrage­ + nen Kreuzchen durch einen Streckenzug verbun­ + den vor. Entscheiden Sie sich für eine Neu­ + festlegung, dann können Sie mit den Pfeil­ + tasten und nacheinander die + einzelnen Kreuzchen im Koordinatensystem nach + oben bzw. nach unten verschieben. + Haben Sie ein Kreuzchen an die gewünschte + Stelle positioniert, so tippen Sie als Kenn­ + zeichen dafür die -Taste. So gelangen + Sie zum nächsten Kreuzchen bzw. nach dem letz­ + ten Kreuzchen zurück in das Fenster oben + rechts. Wenn Sie mit dem eingestellten Wer­ + tungsschlüssel einverstanden sind, gelangen + Sie zurück ins Menu; ansonsten können Sie die + vorgenommene Einstellung korrigieren. + +#page# +5.4 Menufunktionen zum Oberbegriff 'Konfigu­ + ration' + +#on("b")# +BAP: Simulation Parameter Konfiguration Dateien Archiv +--------------------+---------------------------+------------------------- + | u Umfang der Auswertung | + | k Kurzauswertung | + +---------------------------+ + + + + + + + + + + + + +-------------------------------------------------------------------------- +Info:/ Wahl: Ausführen: Verlassen: +#off("b")# + +#on("u")##on("b")#u Umfang der Auswertung#off("b")##off("u")# + Mit dieser Menufunktion können Sie festle­ + gen, ob am Ende einer Protokollauswertung die + sogenannten 'Anmerkungen', die die Zusammen­ + hänge im Protokoll erläutern, jeweils mit aus­ + gegeben werden sollen oder nicht. Die hier + getroffene Festlegung gilt sowohl für die Aus­ + wertung auf dem Bildschirm als auch für den + Ausdruck über einen angeschlossenen Drucker. + Zum Verständnis der Auswertungen sind die + Anmerkungen sehr hilfreich. Hat man aber meh­ + rere Simulationsläufe absolviert, bei denen + der Wertungsschlüssel identisch ist, so wäre + es überflüssig, jeweils die Anmerkungen mit + ausgeben zu lassen. + Die aktuelle Einstellung (mit/ohne Anmer­ + kungen) wird im Fenster links oben angezeigt. + Im Fenster rechts oben wird die Frage ge­ + stellt, ob Sie eine Veränderung der Einstel­ + lung wünschen. Nur wenn Sie diese Frage beja­ + hen, wird die Einstellung verändert; ansonsten + gelangen Sie unter Beibehaltung der alten Ein­ + stellung ins Menu zurück. + +#on("u")##on("b")#k Kurzsauswertung#off("b")##off("u")# + Standardmäßig wird am Ende eines Simula­ + tionslaufes eine Kurzauswertung auf dem Bild­ + schirm ausgegeben. Wenn Sie diese überflüssig + finden oder wenn Sie es aus didaktischen Grün­ + den vorziehen, auf eine solche Kurzauswertung + zu verzichten, können Sie diese Kurzauswertung + durch diese Menufunktion ab- bzw. wieder ein­ + schalten. + Die hier getroffene Einstellung ist auch + gültig für anschließend eingerichtete Sohn­ + tasks - und zwar sowohl für das Teilprogramm + 'Bildschirmarbeitsplatz' als auch für das + Teilprogramm 'Materialprüfung'. + Die aktuelle Einstellung (mit/ohne Kurzaus­ + wertung) wird im Fenster links oben angezeigt. + Im Fenster rechts oben wird die Frage ge­ + stellt, ob Sie eine Veränderung der Einstel­ + lung wünschen. Nur wenn Sie diese Frage beja­ + hen, wird die Einstellung verändert; ansonsten + gelangen Sie unter Beibehaltung der alten Ein­ + stellung ins Menu zurück + +#page# +5.5 Menufunktionen zum Oberbegriff 'Dateien' + +#on("b")# +BAP: Simulation Parameter Konfiguration Dateien Archiv +------------------------------------+-------------------+----------------- + | v Verzeichnis | + | --------------- | + | l Löschen | + | d Drucken | + | --------------- | + | k Kopieren | + | u Umbenennen | + | --------------- | + | s Speicherplatz | + | a Aufräumen | + +-------------------+ + + + + + + + +-------------------------------------------------------------------------- +Info:/ Wahl: Ausführen: Verlassen: +#off("b")# + + Die einzelnen Menufunktionen zu diesem Oberbe­ +griff sind detailliert im Handbuch zum Programm +#on("b")#gs-DIALOG#off("b")# beschrieben und können dort nachgeschla­ +gen werden. An dieser Stelle seien nur einige Be­ +sonderheiten genannt, die hinsichtlich des Pro­ +grammsystems #on("b")#gs-MP BAP#off("b")# zutreffen: + Protokolldateien, die während eines Simulations­ +laufs angelegt werden, können Sie am Präfix 'gs- +Protokoll:' erkennen. Diese Protokolldateien können +#on("u")#nicht#off("u")# mit der in diesem Pull-Down-Menu angegebenen +Menufunktion 'd Drucken' über den Drucker ausge­ +druckt werden. Die Simulationsdaten sind in den +Protokolldateien nämlich in einem gesonderten For­ +mat aufgezeichnet, das vom Drucker nicht ausgewer­ +tet werden kann. + Für die Auswertung und den anschließenden Aus­ +druck dieser Protokolldateien ist die Menufunktion +'d Drucken von Auswertungen' unter dem Oberbegriff +'Simulation' bereitgestellt! + Sie können den Protokolldateien mit der Menu­ +funktion 'u Umbenennen' einen neuen Namen geben. +Achten Sie aber #on("u")#unbedingt(!)#off("u")# darauf, daß das Präfix +'gs-Protokoll:' bei der Umbenennung erhalten bleibt +- sonst wird die Datei nicht mehr als Protokollda­ +tei vom Auswertsystem erkannt! + Die eben angesprochenen Protokolldateien können +auch nicht mit der Menufunktion 'a Aufräumen' bear­ +beitet werden, da hier nur "normale" Textdateien +akzeptiert werden - im übrigen sind die Protokoll­ +dateien immer optimal organisiert. + +#page# +5.6 Menufunktionen zum Oberbegriff 'Archiv' + +#on("b")# +BAP: Simulation Parameter Konfiguration Dateien Archiv +------------------------------------------+-------------------------+----- + | r Reservieren | + | n Neue Diskette | + | --------------------- | + | s Schreiben | + | c Checken | + | k Kombination | + | h Holen/Lesen | + | l Löschen | + | --------------------- | + | v Verzeichnis | + | d Drucken | + | --------------------- | + | i Initialisieren | + | z Zieltask einstellen | + +---------------------+ +-------------------------+ + | Dateiaustausch mit: | + | Archiv | + | Archivname: | + | gs-MP BAP | + +---------------------+ +-------------------------------------------------------------------------- +Info:/ Wahl: Ausführen: Verlassen: +#off("b")# + + Die einzelnen Menufunktionen zu diesem Oberbe­ +griff sind detailliert im Handbuch zum Programm +#on("b")#gs-DIALOG#off("b")# beschrieben und können dort nachgeschla­ +gen werden. + + diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 6 b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 6 new file mode 100644 index 0000000..7d485d7 --- /dev/null +++ b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 6 @@ -0,0 +1,53 @@ +#limit (11.0)##pagelength (16.5)##block##pageblock# +#start (2.0,0.0)# +#page (61)# +#headodd# +#center#gs-MP BAP#right#% + +#end# +#headeven# +%#center#gs-MP BAP + +#end# +#center#6 + +#center#Hinweise +#center#für den +#center#Systembetreuer + + + Für den Ausdruck von Protokollauswertungen ist +der Standardschrifttyp des Druckers voreingestellt. +Sie haben aber die Möglichkeit, einen anderen +Schrifttyp für den Protokollausdruck einzustellen. +Dafür sind die beiden folgenden Prozeduren vorbe­ +reitet: + +PROC druckereinstellung fuer protokolldatei + (TEXT CONST schrifttyp, REAL CONST linker + rand, oberer rand, schreibfeldbreite, + schreibfeldlaenge) + + Geben Sie einen in Ihrer Installation vorhan­ + denen Schrifttyp an. Beachten Sie bei der + Festlegung der anderen Maße (wie gewohnt in + cm), daß auf dem Schreibfeld 80 Druckpositio­ + nen nebeneinander Platz haben müssen! + + +PROC std druckereinstellung fuer protokolldatei + + Sie können mit diesem Befehl wieder die Ein­ + stellung vornehmen, die sonst standardmäßig + von #on("b")#gs-MP BAP#off("b")# vorgegeben wird: + + schrifttyp : "" (Standard- + schrifttyp) + linker rand : 0.0 (cm) + oberer rand : 0.0 (cm) + schreibfeldbreite : 21.0 (cm) + schreibfeldlaenge : 29.5 (cm) + + + + diff --git a/doc/mp-bap/gs-MP BAP handbuch.impressum b/doc/mp-bap/gs-MP BAP handbuch.impressum new file mode 100644 index 0000000..91c6ce0 --- /dev/null +++ b/doc/mp-bap/gs-MP BAP handbuch.impressum @@ -0,0 +1,104 @@ +____________________________________________________________________________ + + +#on("b")##on ("u")# +#center#Betriebssystem E U M E L +#off ("u")# + + +#center#gs-MP BAP + + + + +#off("b")# +#center#Lizenzfreie Software der +#on ("b")# + +#center#Gesellschaft für Mathematik und Datenverarbeitung mbH, +#center#5205 Sankt Augustin + + +#off("b")# +#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für +#center#nichtkommerzielle Zwecke gestattet. + +#center#Gewährleistung und Haftung werden ausgeschlossen + + +____________________________________________________________________________ +#page# + +#free (4.0)##on("b")# +#center#gs-MP BAP + + +#center#Benutzerhandbuch + + +#center#Version 1.0 + + +#off("b")##center#copyright +#center#Eva Latta-Weber +#center#Software- und Hardware-Systeme, 1988 +#center#ERGOS GmbH, 1990 +#page# +#block# +#center#____________________________________________________________________________ + + +Copyright:  ERGOS GmbH   März 1990 + + Alle Rechte vorbehalten. Insbesondere ist die Überführung in + maschinenlesbare Form sowie das Speichern in Informations­ + systemen, auch auszugsweise, nur mit schriftlicher Einwilligung + der ERGOS GmbH gestattet. + + +#center#____________________________________________________________________________ + +Es kann keine Gewähr übernommen werden, daß das Programm für eine +bestimmte Anwendung geeignet ist. Die Verantwortung dafür liegt beim +Anwender. + +Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrektheit und +Vollständigkeit der Angaben kann keine Gewähr übernommen werden. Das +Handbuch kann jederzeit ohne Ankündigung geändert werden. + +Texterstellung :  Dieser Text wurde mit der ERGOS-L3 Textverarbeitung + erstellt und aufbereitet und auf einem Kyocera Laser­ + drucker gedruckt. + + + + +#center#___________________________________________________________________________ + + + +Ergonomic Office Software GmbH + +Bergstr. 7 Telefon: (02241) 63075 +5200 Siegburg Teletex: 2627-2241413=ERGOS + Telefax: (02241) 63078 + + +#center#____________________________________________________________________________ + + + + + + + + + + + + + + + + + diff --git a/doc/programming/programmierhandbuch.1 b/doc/programming/programmierhandbuch.1 new file mode 100644 index 0000000..24f2b03 --- /dev/null +++ b/doc/programming/programmierhandbuch.1 @@ -0,0 +1,650 @@ +#headandbottom("1","EUMEL-Benutzerhandbuch","TEIL 1 : Einleitung","1")# +#pagenr("%",1)##setcount(1)##block##pageblock# +#headeven# +#center#EUMEL-Benutzerhandbuch +#center#____________________________________________________________ + +#end# +#headodd# +#center#TEIL 1 : Einleitung +#center#____________________________________________________________ + +#end# +#bottomeven# +#center#____________________________________________________________ +1 - % #right#GMD +#end# +#bottomodd# +#center#____________________________________________________________ +GMD #rigth#1 - % +#end# + +TEIL 1 : Einleitung + + +1.1 Allgemeines über EUMEL + +Dieses Buch bietet eine Übersicht über die Standardprozeduren des Betriebssystem +EUMEL. Es bietet damit sowohl Hilfestellung für die Benutzung der standardmäßig +vorhandenen Kommandos als auch für die Programmierung, also die Erweiterung +dieses Kommandovorrats. Es ist jedoch kein Lehrbuch der Programmierung! + +In den ersten drei Kapiteln dieses Programmierhandbuches werden einige Grund­ +begriffe des Systems, die grundlegende Programmiersprache (ELAN) und der +EUMEL-Editor erläutert. + +Das vierte Kapitel bietet eine Übersicht über diejenigen Prozeduren und Operatoren, +die eher der 'Job-Control-Language' zugerechnet werden können, also häufig im +Kommandodialog benutzt werden. + +Im fünften Teil sind diejenigen Operationen beschrieben, die meistenteils für die +Programmierung benutzt werden. (Compiler, Operationen auf den elementaren Daten­ +typen, Dateien, Ein- und Ausgabe usw.). + +Diese Trennung ist jedoch recht willkürlich, es ist ja gerade eine der wichtigen Eigen­ +schaften dieses Betriebssystems, daß es keine Trennung zwischen der Kommando­ +sprache des Betriebssystems und Programmmiersprache für das System gibt. Jedes +Systemkommando ist Aufruf einer ELAN Prozedur, jede neue Prozedur stellt eine +Erweiterung des Kommandovorrats des Systems dar. + +Aus Gründen der Übersichtlichkeit der Zusammenstellung ist dieses Buch nicht frei +von Vorwärtsverweisen! + +#page# + +1.2 Struktur des Betriebssystems EUMEL + +Grundlegend für das Verständnis des Betriebssystems EUMEL ist der Begriff der +#on("b")#Task#off("b")#. Eine Task kann als theoretisch unendliche Wiederholung eines Systempro­ +gramms der Form: + + 'nimm Kommando entgegen' + 'verarbeite Kommando' + +aufgefaßt werden. Einige Tasks existieren bereits als Grundstock des Systems, +weitere werden von Benutzern des Systems erschaffen und dienen als persönliche +Arbeitsumgebung für den 'Eigentümer'. Eine Task kann als benutzereigener, unab­ +hängiger Computer im Computer betrachtet werden, denn sie kann Kommandos +entgegennehmen und ausführen und Daten verwalten und aufbewahren. + +Eine Task kann neu erzeugt werden, an einen Bildschirm gekoppelt werden und +beendet werden. + +Das Tasksystem ist in einer baumartigen Struktur angeordnet. Außer der Wurzel 'UR' +hat jede Task einen Vorgänger ('Vater-Task') und möglicherweise Nachfolger +('Sohn-Tasks'). + +#on("u")##ib#Task-Organisation#ie##off("u")# + + + SUPERVISOR + - + SYSUR + ARCHIVE + configurator + OPERATOR + shutup + + UR + PUBLIC + Benutzertask1 + Benutzertask2 + Benutzertask3 + ..... + + + +Jeder Benutzer arbeitet innerhalb eines EUMEL-Systems, indem er eine Task an +sein Terminal koppelt und dort Programme aufruft. + +Dateien sind grundsätzlich Eigentum einer Task. Es ist grundlegend für das Verständ­ +nis des Betriebssystems EUMEL, die Beziehung zwischen Tasks und Dateien zu +erkennen. + +Eine Task ist ein Prozeß, der gegebenenfalls Dateien besitzt. Dateien können nur in +einer Task existieren. Um eine Datei einer anderen Task zur Verfügung zu stellen, +wird eine Kopie der Datei an die andere Task geschickt, die sendende Task ist da­ +nach Eigentümer des 'Originals', die empfangende Task Eigentümer der 'Kopie'. + +Soll eine Hierarchie von Dateien aufgebaut werden, so ist sie über eine Hierarchie +von Tasks zu realisieren, da in einer Task alle Dateien gleichberechtigt sind. + +Bis zu dieser Stelle war stets von Dateien die Rede. Dateien sind jedoch ein Spezial­ +fall der grundlegenderen Struktur des Datenraumes. + +Ein #ib#Datenraum#ie# ist ein allgemeiner Datenbehälter. Ein Datenraum kann beliebige +Daten aufnehmen und erlaubt direkten Zugriff auf diese Daten. Die Struktur der Daten +im Datenraum unterscheidet sich nicht von der Struktur der Programmdaten. Der +'innere Datentyp' eines Datenraums wird vom Programmierer festgelegt. + +Vorgeprägt vom System gibt es Textdateien, jeder andere Datentyp muß vom Pro­ +grammierer geprägt werden, um so Dateien erzeugen zu können, die Objekte eben +dieses neuen Typs enthalten. +#page# + + +1.3 Eigenschaften des Betriebssystems + +Der erste Entwurf des Mikroprozessor-Betriebssystems EUMEL (#on("b")#E#off("b")#xtendable multi +#on("b")#U#off("b")#ser #on("b")#M#off("b")#icroprozessor #on("b")#EL#off("b")#AN system) entstand 1979 mit dem Anspruch, auf Mikrocom­ +putern den Anwendern Hilfsmittel und Unterstützungen zu bieten, wie sie sonst nur +auf Großrechnern zur Verfügung gestellt werden. + +Aspekte, die EUMEL von anderen Betriebssystemen für Mikrocomputer unterscheiden, +sind: + +- Hardwareunabhängigkeit +- Multitaskingkonzept +- Multiuserbetrieb +- Erweiterbarkeit +- virtuelle Speicherverwaltung +- Datensicherheit + + + +#on("u")##on("b")#Das EUMEL-Schichtenmodell#off("b")##off("u")# + +Die Hardwareunabhängigkeit des Betriebssystems EUMEL begründet sich in seinem +Aufbau aus Schichten (sogenannten virtuellen Maschinen), die einen klar definierten +Leistungsumfang haben. + +#center#beliebige Anwendungen +#center#Textverarbeitung, Datenbanken etc. + +#center#Systemdienste: Monitor, Dateiverwaltung, Editor +#center#Task-System +#center#Standardpakete (BOOL, INT, REAL, TEXT) +#center#ELAN-Compiler + +#center#EUMEL0 +#center#(virtueller Prozessor mit eigenem Befehlssatz) + +#center#SHard (Gerätetreiber) + +#center#Hardware + + +Jede Schicht erwartet und erhält von ihren Nachbarn wohldefinierte Eingaben und gibt +wohldefinierte Ausgaben weiter. Änderungen in einer Schicht müssen also in den +angrenzenden Schichten beachtet werden, aber nicht in allen Teilen des Systems. + +Um EUMEL auf Rechner mit einem neuen Prozessortyp zu portieren, wird zunächst +eine auf die Eigenheiten des Prozessors abgestimmte EUMEL0-Maschine entworfen +und eine Hardwareanpassung (#ib#SHard#ie# : Software/Hardware-Interface) für einen +Rechner mit diesem Prozessor hergestellt. Alle höheren Schichten des Systems +bleiben unberührt. Weitere mit diesem Prozessortyp ausgestattete Rechner können mit +EUMEL betrieben werden, indem ein SHard für dieses Rechnermodell geschrieben +wird. + +Aus Benutzersicht ist wichtig, daß dadurch jegliche Software, die auf irgendeinem +Rechner unter EUMEL verfügbar ist, auf jedem anderen Rechner, für den eine +EUMEL Portierung existiert, lauffähig ist und gleiches Verhalten zeigt. Eine Vernet­ +zung beliebiger Rechner, auf die EUMEL portiert ist, ist problemlos möglich. + +Desweiteren ist für den Benutzer des Systems von Bedeutung, daß er von der hard­ +warenahen Schicht entfernt ist. Weder die Programmiersprache noch irgendwelche +speziellen Systemfunktionen gewähren direkten Zugriff auf den Speicher oder Regi­ +sterinhalte. Diese Tatsache hat weitreichende Folgen in Hinsicht auf Datenschutz und +Systemsicherheit. + + + + +Multi-Tasking-/Multi-User-Betrieb +Wie einleitend dargestellt, besteht ein EUMEL-System aus diversen Tasks. Durch +eine Aufteilung der Prozessorzeit in Zeitscheiben ist eine (quasi) parallele Bedienung +mehrerer Tasks möglich. + +Die multi-user-Fähigkeit des Betriebssystems wird durch den Anschluß mehrerer +Bildschirmarbeitsplätze (Terminals) an V.24 Schnittstellen des Rechners erreicht. +Dabei wird jeder Schnittstelle eine sogenannte Kanalnummer zugeordnet. Jeder +Benutzer kann seine Task dann an einen Kanal (=Terminal) koppeln und an diesem +Terminal gleichzeitig mit anderen Benutzern arbeiten. + + + + +Prozeßkommunikation und Netzwerkfähigkeit +Grundlage der Kommunikation ist die 'Manager-Eigenschaft' von Tasks. Eine Task +ist 'Manager', wenn sie Aufträge anderer Tasks annehmen und ausführen kann. +Insbesondere kann ein Manager veranlaßt werden, eine an ihn geschickte Datei anzu­ +nehmen, bzw. eine ihm gehörende Datei an die fordernde Task zu schicken. + +Derartige Kommunikationslinien verlaufen normalerweise in der Baumstruktur des +Systems: z.B. ist die Task 'PUBLIC' (vergl. Seite 2) grundsätzlich Manager-Task. +Eine unterhalb von PUBLIC liegende Task kann eine Datei an PUBLIC senden, bzw. +von PUBLIC holen. + +Es ist auch möglich, eine Task für den Zugriff beliebiger anderer Tasks zu öffnen und +somit beliebige Kommunikationspfade aufzubauen. Prinzipiell ist damit auch schon der +Aufbau eines Netzwerkes beschrieben, denn sendende und empfangende Tasks +können sich auf verschiedenen Rechnern befinden. + +Durch selbst erstellte Programme kann der Eigentümer einer 'Manager-Task' die +Reaktion dieser Task auf einen Auftrag von außen bestimmen. Beispielsweise kann +ein Manager derart programmiert werden, daß er nur Dateien empfängt und ausdruckt, +aber niemals Dateien verschickt (Spool-Task). + + + +Erweiterbarkeit +Die Programmiersprache ELAN ist im EUMEL-System gleichzeitig Programmier- +und System-Kommandosprache (JCL), denn jedes Kommando ist Aufruf einer +ELAN-Prozedur und jede vom Benutzer geschriebene ELAN-Prozedur erweitert +den Kommandovorrat des Systems. + +Da alle EUMEL-Werkzeuge (einschließlich Editor) selbst ELAN-Programme sind, +kann das System vom Benutzer selbst durch Hinzufügen eigener ELAN-Programme +oder Programmpakete beliebig erweitert werden. Dabei können die bereits implemen­ +tierten Systemteile (z.B. die Fenstertechnik des Editors) genutzt werden. + +Ein Benutzer muß, um alle Möglichkeiten vom EUMEL zu nutzen, nur eine Sprache +lernen und nicht - wie bei anderen Betriebssystemen - zwei unterschiedliche, eine +Kommando- und eine Programmiersprache. + +ELAN selbst ist eine PASCAL-ähnliche Programmiersprache, die mit Hilfe der +schrittweisen Verfeinerung (Refinement-Konzept) die Top-Down-Programmierung +unterstützt. Das Paketkonzept, das der Modularisierung dient, und die freie Wahl von +Bezeichnernamen sind Voraussetzung für übersichtliche und effiziente Programmie­ +rung. + + + + +Virtuelle Speicherverwaltung +Im EUMEL-System wird der Hauptspeicherplatz nach dem #on("b")#Demand-Paging-Prinzip#off("b")# +verwaltet. Daten und Programme werden dazu in Seiten von 512 Byte aufgeteilt. Nur +diejenigen Seiten, die wirklich benötigt werden, werden vom Hintergrundspeicher +(Platte) in den Hauptspeicher geholt. Damit ist für den Benutzer bezüglich seiner +Programm- bzw. Dateigrößen nicht mehr der Hauptspeicher, sondern die Hinter­ +grundkapazität von Bedeutung. Die Durchsatzgeschwindigkeit (Performance) ist +abhängig von der Größe des RAM-Speichers und der Zugriffsgeschwindigkeit des +Hintergrundmediums. Das Demand-Paging-Verfahren ist Grundlage für den +Multi-User-Betrieb, wobei der Hauptspeicherplatz möglichst effizient zu nutzen und +kein Benutzer zu benachteiligen ist. + +Beim Duplizieren eines Datenraumes wird im EUMEL-System lediglich eine logische, +keine physische Kopie erzeugt. Zwei Seiten (zweier Datenräume) heißen dann gekop­ +pelt (geshared), wenn beide Seiten physisch demselben Block zugeordnet sind. Erst +bei einem Schreibzugriff werden die Seiten entkoppelt (entshared) und tatsächlich +physisch kopiert. Daher der Name "#on("b")#copy-on-write#off("b")#". + +Dieses Prinzip wird natürlich auch systemintern angewandt. Beispielsweise erbt eine +Sohn-Task den Kommandovorrat der Vater-Task, indem der Standard-Datenraum, +der die vorübersetzten ELAN-Prozeduren enthält, in der beschriebenen Weise kopiert +wird. Prozeduren, die später hinzugefügt werden, werden natürlich nicht vererbt, da +die Standard-Datenräume dann entkoppelt werden. + + + + +Datensicherheit +Störungen (inklusive Stromausfall) werden systemseitig durch eine automatische +#on("b")#Fixpoint-Rerun-Logik#off("b")# aufgefangen, indem zum Zeitpunkt eines Fixpunkts der Inhalt +des RAM Speichers, der seit dem letzten #ib#Fixpunkt#ie# verändert wurde auf den +permanenten Speicher (Festplatte) geschrieben wird. Somit kann nach einer Störung +immer auf den Systemzustand des letzten Fixpunktes aufgesetzt werden und die +Datenverluste halten sich in erträglichen Grenzen. + +Der Zeitraum zwischen zwei Fixpunkten beträgt standardmäßig 15 Minuten, kann aber +vom Benutzer anders eingestellt werden. + +Auch bei dieser Sicherung wird das Copy-on-write-Prinzip angewendet, so daß +Platz- und Zeitaufwand gering sind und den normalen Ablauf nicht stören. + +#page# + +1.4 Wichtige Begriffe + +- #on("b")##ib#archive#ie##off("b")#. Spezielle Task zur Verwaltung des Diskettenlaufwerks. Da für die + längerfristige Datenhaltung und zur zusätzlichen Datensicherung Dateien auf + Disketten geschrieben werden, besitzt das EUMEL-System für diese Aufgabe + eine besondere Task, die die Bedienung vereinfacht und exklusiven Zugriff auf das + Laufwerk garantiert. + +- #on("b")##ib#configurator#ie##off("b")#. Besondere Task im Systemzweig des EUMEL-Systems. In + dieser Task ist die #ib#Konfiguration#ie# von Kanälen möglich, d.h. Kanal und + angeschlossenenes Gerät werden aufeinander abgestimmt. + +- #on("b")##ib#editor#ie##off("b")#. Programm zur Dateibearbeitung am Bildschirm. Das Programm wird + durch das ( Monitor- ) Kommando 'edit' und die Eingabe des Namens der ge­ + wünschten Datei als Parameter gestartet. + + Da ein Bildschirm normalerweise auf 80 Zeichen Zeilenbreite und 24 Zeilen be­ + schränkt ist, kann der Editor als Fenster betrachtet werden, das über die mögli­ + cherweise weitaus größere Datei bewegt wird und durch das der betrachtete Aus­ + schnitt der Datei bearbeitet werden kann. + +- #on("b")##ib#manager task#ie##off("b")#. Task, die Aufträge von anderen Tasks entgegennehmen und + ausführen #on("u")#kann#off("u")#. Beispielsweise ist die Verwaltung von Dateien, die mehreren + Benutzern (= anderen Tasks) zugänglich sein sollen, eine typische Aufgabe für + einen Manager. + +- #on("b")##ib#Monitor#ie##off("b")#. Der Empfänger von Kommandos innerhalb einer Task ist der Monitor. Der + Monitor ist sichtbar durch eine Zeile, in der 'gib kommando' steht. In diese Zeile + werden #ib#Kommando#ie#s und erforderliche Parameter eingegeben. + +- #on("b")##ib#Supervisor#ie##off("b")#. Spezielle Task zur Überwachung eines EUMEL-Systems. Ein + Benutzer kann durch die Supervisor-Kommandos Leistungen von dieser Task + fordern: neue Task einrichten, Task wiederaufnehmen und diverse Informationen. + +- #on("b")##ib#Task#ie##off("b")#. Beliebig langlebiger Prozeß im EUMEL-System, der die Arbeits­ + umgebung für Benutzer bildet. Jede Task besitzt einen #ib#Standard-Datenraum#ie#, der + Code und Compilertabellen der Task enthält und kann weitere Datenräume + (Dateien) besitzen. + +#page# + +1.5 Die Notation in diesem Buch + +Beachten Sie bitte folgende Regeln der Aufschreibung: + +- Funktionstasten werden ebenso wie besondere Tastenkombinationen explizit als + Tasten dargestellt: + + + + +- Alles, was Sie am Bildschirm Ihres Rechners schreiben oder lesen sollen, ist in + Textbereiche, die einen Bildschirm darstellen, eingefaßt. + + Beispiel: + +____________________________________________________________________________ + gib kommando: + edit ("mein programm") + +____________________________________________________________________________ + + +- Innerhalb des Handbuchs sind in der Aufschreibung die Konventionen der Pro­ + grammiersprache ELAN berücksichtigt. Dabei sind folgende Besonderheiten zu + beachten: + + 1) Kommandos werden grundsätzlich klein geschrieben. + + 2) Dateinamen u.ä. sind Textdenoter und werden somit in Klammern und Anfüh­ + rungsstriche gesetzt. In diesem Buch steht an den Stellen, wo ein Dateiname + auftaucht #on("i")# 'dateiname' #off("i")#; den Namen, den Sie tatsächlich verwenden, können + Sie frei wählen. + + 3) Falls besondere Begriffe oder Beispiele innerhalb eines normalen Textes + auftreten, werden sie in einfache Anführungsstriche gesetzt. + + +#page# + +1.6 Die Funktionstasten des EUMEL-Systems + +Die Lage der EUMEL-Funktionstasten entnehmen Sie bitte der speziellen Installa­ +tionsanleitung zu dem von Ihnen benutzten Gerät. #l pos (0.0)##l pos(4.0)# + + + <^> <>> <<> Positionierungstasten +#table# + + Umschalttaste + + Eingabe-/ Absatztaste + + Kommandotaste + + Supervisortaste + + Verstärkertaste + + Löschtaste + + Einfügetaste + + Tabulatortaste + + Markiertaste + + Stoptaste + + Weitertaste +#tableend##clear pos# + +Weitere Informationen hierzu finden Sie in der Installationsanleitung zu dem von Ihnen +benutzten Rechner oder Terminal. +#page# + +1.7 Eine Beispielsitzung + +Im Folgenden wird eine Beispielsitzung skizziert, in der ein ELAN-Programm erstellt +und getestet wird. + + SUPERVISOR aufrufen + + + +____________________________________________________________________________ + + Terminal 2 + + + EUMEL Version 1.8/M + + + gib supervisor kommando: + begin("meine erste Task") + + + + ESC ? --> help + ESC b --> begin("") ESC h --> halt + ESC c --> continue("") ESC s --> storage info + ESC q --> break ESC t --> task info + +____________________________________________________________________________ + + + + +Durch das Kommando 'begin ("meine erste Task")', welches durch abgeschlos­ +sen werden muß, wird eine Task mit dem Namen 'meine erste Task' im Benutzer­ +zweig, also unterhalb von 'PUBLIC' angelegt. Würde diese Task bereits existieren, so +könnten Sie sie mit 'continue ("meine erste Task")' an das Terminal holen. + +____________________________________________________________________________ + + gib kommando : + edit ("mein erstes Programm") + +____________________________________________________________________________ + + +In der Task eröffnen Sie eine Datei mit dem Kommando 'edit ("dateiname")'. + + +____________________________________________________________________________ + + gib kommando : + edit ("mein erstes Programm") + "mein erstes Programm" neu einrichten (j/n) ? j + +____________________________________________________________________________ + + +Falls diese Datei neu ist, erfolgt eine Kontrollfrage (zur Kontrolle der gewünschten +Schreibweise des Dateinamens), die Sie durch bejahen. + + +____________________________________________________________________________ + ............ mein erstes Programm ............... Zeile 1 #markon# +_ +____________________________________________________________________________ + + + + + + +In die noch leere Datei tippen Sie nun den Programmtext ein. + + +____________________________________________________________________________ + ............ mein erstes Programm ............... Zeile 1 + _INT PROC ggt (INT CONST a, b): + INT VAR b kopie :: abs (b), a kopie :: abs (a); + WHILE b kopie <> 0 REPEAT + INT VAR rest := a kopie MOD b kopie; + a kopie := b kopie; + b kopie := rest + END REPEAT; + a kopie + END PROC gt; + + REP + lies 2 zahlen ein; + gib groessten gemeinsamen teiler aus + UNTIL no ("weitertesten") PER. + + lies 2 zahlen ein: + line; put ("2 Zahlen eingeben:"); + INT VAR a, b; + get (a); get (b). + + gib groessten gemeinsamen teiler aus: + put ("der größte gemeinsame Teiler von"); + put (a); put ("und"); put (b); put ("ist"); put (ggt (a,b)); + line. + +____________________________________________________________________________ + + +In dem Programmbeispiel wird ein Prozedur 'ggt' definiert, die den größten gemein­ +samen Teiler zweier Zahlen bestimmt. Die Prozedur soll für verschiedene Beispiele +getestet werden; dies geschieht in dem Hauptprogramm, das solange Zahlen einliest +und den größten gemeinsamen Teiler ausgibt, bis der Benutzer auf die Frage 'weiter­ +testen (j/n) ?' mit antwortet. + +Haben Sie das Programm eingegeben, so können Sie die Bearbeitung dieser Pro­ +grammdatei durch Drücken der Tasten (nacheinander!) beenden. + + +____________________________________________________________________________ + + gib kommando : + run ("mein erstes Programm") + +____________________________________________________________________________ + + +Um Ihr Programm zu übersetzen und auszuführen, geben Sie das Kommando +'run ("dateiname")'. + +Der Verlauf der Übersetzung, die zwei Läufe über das Programm erfordert, ist am +Zähler, der an der linken Seite des Bildschirms ausgegeben wird, zu erkennen. + +Werden beim Übersetzen des Programms Fehler entdeckt, so werden diese im 'note­ +book' parallel zur Programmdatei gezeigt. In dem Beispielprogramm wurde ein +Schreibfehler in Zeile 9 gemacht. + + +____________________________________________________________________________ + ............ mein erstes Programm ............... Zeile 1 + _INT PROC ggt (INT CONST a, b): + INT VAR b kopie :: abs (b), a kopie :: abs (a); + WHILE b kopie <> 0 REPEAT + INT VAR rest := a kopie MOD b kopie; + a kopie := b kopie; + b kopie := rest + END REPEAT; + a kopie + END PROC gt; + + REP + .................. notebook ..................... Zeile 1 #markon# + Zeile 9 FEHLER bei >> gt << + ist nicht der PROC Name + + +____________________________________________________________________________ + + + +Diesen Fehler müssen Sie nun verbessern. + +____________________________________________________________________________ + ............ mein erstes Programm ............... Zeile 9 + INT PROC ggt (INT CONST a, b): + INT VAR b kopie :: abs (b), a kopie :: abs (a); + WHILE b kopie <> 0 REPEAT + INT VAR rest := a kopie MOD b kopie; + a kopie := b kopie; + b kopie := rest + END REPEAT; + a kopie + END PROC ggt;_ + + REP + .................. notebook ..................... Zeile 1 + Zeile 9 FEHLER bei >> gt << + ist nicht der PROC Name + +____________________________________________________________________________ + + + + +Haben Sie das Programm korrigiert, so können Sie die Datei durch Drücken der +Tasten (nacheinander!) wieder verlassen. + + +____________________________________________________________________________ + + gib kommando : + run ("mein erstes Programm") + +____________________________________________________________________________ + + +Nach Eingabe von wird das Programm erneut übersetzt. + + +____________________________________________________________________________ + + Keine Fehler gefunden, 136 B Code, 82 B Paketdaten generiert + + + ******* ENDE DER UEBERSETZUNG ******* + + + 2 Zahlen eingeben: _ + +____________________________________________________________________________ + + +Das Programm war jetzt fehlerfrei. Nach der Übersetzung wurde die Ausführung +gestartet. Nun können Beispiele getestet werden. + +____________________________________________________________________________ + + 2 Zahlen eingeben: 125 250 + der größte gemeinsame Teiler von 125 und 225 ist 25 + weitertesten (j/n) ? + +____________________________________________________________________________ + + +Beantwortet man die Frage mit , so wird die Ausführung des Programms beendet. + + +____________________________________________________________________________ + + gib kommando : + +____________________________________________________________________________ + + +Um die Arbeit in der Task zu beenden, geben Sie auch an dieser Stelle +(nacheinander!) ein. + +Nach Verlassen der Task ist wiederum die EUMEL-Tapete auf dem Bildschirm. Jede +weitere Aktion wird wiederum von hier aus durch begonnen. Insbesondere vor +dem #ib#Ausschalten des Geräts#ie# muß nach eine Task des priviliegierten System­ +zweigs (oft: '#ib#shutup#ie#') mit an das Terminal gekoppelt werden, in der das +Kommando 'shutup' gegeben wird. + diff --git a/doc/programming/programmierhandbuch.2a b/doc/programming/programmierhandbuch.2a new file mode 100644 index 0000000..a204091 --- /dev/null +++ b/doc/programming/programmierhandbuch.2a @@ -0,0 +1,1845 @@ +#headandbottom("1","EUMEL-Benutzerhandbuch","TEIL 2 : ELAN","2")# +#pagenr("%",1)##setcount(1)##block##pageblock# +#headeven# +#center#EUMEL-Benutzerhandbuch +#center#____________________________________________________________ + +#end# +#headodd# +#center#TEIL 2 : ELAN +#center#____________________________________________________________ + +#end# +#bottomeven# +#center#____________________________________________________________ +2 - % #right#GMD +#end# +#bottomodd# +#center#____________________________________________________________ +GMD #right# 2 - % +#end# + +TEIL 2: ELAN + +2.1 Besondere Eigenschaften von ELAN + +Kerneigenschaften von ELAN sind das #ib#Paketkonzept#ie# und die Methode des +#ib#Refinements#ie#. + +#on("b")#Paketkonzept:#off("b")# +ELAN bietet die Möglichkeit, neue Datentypen sowie Prozeduren und Operatoren auf +diesen Datentypen zu definieren. Eine solche Definition von Algorithmen und Daten­ +typen kann zu einer logischen Einheit, einem Paket, zusammengefaßt werden. Pakete +können in einer Task vorübersetzt werden und erweitern damit automatisch den +Sprachumfang. + +#on("b")#Methode des Refinements:#off("b")# +Die Methode des Refinements erlaubt das schrittweise Herleiten von Problemlösungen +von der jeweils geeigneten Terminologie herunter zu den von ELAN standardmäßig +angebotenen Sprachelementen. Durch diese Vorgehensweise wird in äußerst starkem +Maße ein strukturierter Programmentwurf gemäß dem Top-Down-Prinzip gefördert. + +Die Programmiersprache ELAN wird im EUMEL-System zu folgenden Zwecken +eingesetzt: + +- Systemimplementationssprache +- Kommandosprache +- Anwenderprogrammiersprache +#page# + +2.2 Lexikalische Elemente + +Unter lexikalischen Elementen einer Programmiersprache versteht man die Elemente, +in denen ein Programm notiert wird. + +In ELAN sind dies: + +- Schlüsselwörter +- Bezeichner +- Sonderzeichen +- Kommentare + + + + +2.2.1 Schlüsselwörter + +Einige Wörter haben in ELAN eine feste Bedeutung und können somit nicht frei +gewählt werden. Solche Wörter werden im EUMEL-System in Großbuchstaben +geschrieben, Leerzeichen dürfen nicht enthalten sein. + +Beispiele: + + +VAR +INT +WHILE + + +Wie später beschrieben wird, gibt es in ELAN auch die Möglichkeit, neue Schlüssel­ +wörter einzuführen. + + +#page# + +2.2.2 Bezeichner + +Bezeichner oder Namen werden benutzt, um Objekte in einem Programmtext zu +benennen und zu identifizieren (z.B: Variablennamen, Prozedurnamen). + +Namen werden in ELAN folgendermaßen formuliert: + +Das erste Zeichen eines Namens muß immer ein Kleinbuchstabe sein. Danach dürfen +bis zu 254 Kleinbuchstaben, aber auch Ziffern folgen. Zur besseren Lesbarkeit können +Leerzeichen in einem Namen erscheinen, die aber nicht zum Namen zählen. Sonder­ +zeichen sind in Namen nicht erlaubt. + +Beispiele für #on("b")#korrekte#off("b")# Bezeichner: + + +das ist ein langer name +x koordinate +nr 1 + + + +Beispiele für #on("b")#falsche#off("b")# Bezeichner: + + +x*1 +1 exemplar +Nr 1 +#page# + +2.2.3 Sonderzeichen + +Sonderzeichen sind Zeichen, die weder Klein- oder Großbuchstaben, noch Ziffern +sind. Sie werden in ELAN als Trennzeichen oder als Operatoren benutzt. + +In ELAN gibt es folgende Trennungszeichen: + +- das Semikolon (';') trennt Anweisungen +- der Doppelpunkt (':') trennt Definiertes und Definition +- der Punkt ('.') wird als Endezeichen für bestimmte Programmabschnitte, als Dezi­ + malpunkt und als Selektor-Zeichen für Datenstrukturen benutzt +- das Komma (',') trennt Parameter +- Klammernpaare ('(', ')') werden zum Einklammern von Parameterlisten oder Teil­ + ausdrücken benutzt +- mit Anführungszeichen ('"') werden Text-Denoter umrahmt +- eckige Klammernpaare ('[', ']') werden zur Subskription benutzt. + + +Als Operatornamen sind folgende Sonderzeichen erlaubt: + +- ein Sonderzeichen, sofern es nicht als Trennzeichen benutzt wird: + ! $ % & ' * + - / < = > ? § ^ ' ~ +- eine Kombination von zwei Sonderzeichen. Diese Kombination muß jedoch bereits + in ELAN existieren: + := <= >= <> ** + +#page# + +2.2.4 Kommentare + +Kommentare dienen ausschließlich der Dokumentation eines Programms. Sie werden +vom Compiler überlesen und haben somit keinen Einfluß auf die Ausführung eines +Programms. Sie dürfen an beliebigen Stellen eines Programmtextes geschrieben +werden, jedoch nicht innerhalb von Schlüsselwörtern und Namen. Ein Kommentar darf +über mehrere Zeilen gehen. In ELAN sind Kommentare nur in wenigen Fällen notwen­ +dig, da Programme durch andere Mittel gut lesbar geschrieben werden können. + +Ein Kommentar in ELAN wird durch Kommentarklammern eingeschlossen. Es gibt +folgende Formen von Kommentarklammern: + +(* Kommentar *) +{ Kommentar } +\#( Kommentar )# + +Die letzte Version '\#( Kommentar )\#' wird im EUMEL-System nicht +unterstützt; statt dessen gibt es noch folgende Möglichkeit: + +\# Kommentar \# + +Da bei der Kommentarkennzeichnung mit \# für Kommentaranfang und -ende das +gleiche Zeichen benutzt wird, ist eine Schachtelung hier nicht möglich. +#page# + +2.3 Datenobjekte + +Eine Klasse von Objekten mit gleichen Eigenschaften wird in Programmiersprachen +Datentyp genannt. Dabei hat ein Datentyp immer einen Namen, der die Klasse von +Objekten sinnvoll kennzeichnet. Als ein Datenobjekt wird ein Exemplar eines Daten­ +typs (also ein spezielles Objekt einer Klasse) bezeichnet. + +Datentypen sind in ELAN ein zentrales Konzept. Jedes der in einem ELAN- +Programm verwandten Datenobjekte hat einen Datentyp; somit kann man Datentypen +auch als Eigenschaften von Datenobjekten ansehen. Für jeden Datentyp sind nur +spezielle Operationen sinnvoll. Man kann nun Compilern die Aufgabe überlassen zu +überprüfen, ob stets die richtige Operation auf einen Datentyp angewandt wird. + + + +2.3.1 Elementare Datentypen + +Einige Datentypen spielen bei der Programmierung eine besondere Rolle, weil sie +häufig benötigt werden. + +In ELAN sind das die Datentypen für + +- ganze Zahlen (INT) +- reelle Zahlen (REAL) +- Zeichen und Zeichenfolgen (TEXT) +- Wahrheitswerte (BOOL). + +Diese Datentypen sind von der Sprache ELAN vorgegeben und werden elementare +Datentypen genannt. Für effiziente Rechnungen mit elementaren Datentypen gibt es +in den meisten Rechnern spezielle Schaltungen, so daß die Hervorhebung und be­ +sondere Rolle, die sie in Programmiersprachen spielen, gerechtfertigt ist. Zudem hat +man Werte-Darstellungen (Denoter) innerhalb von Programmen für die elementaren +Datentypen vorgesehen. + + + +2.3.1.1 Denoter für elementare Datentypen + +Die Darstellung eines Werts in einem Rechner zur Laufzeit eines Programms wird +Repräsentation genannt. Wenn es eindeutig ist, daß es sich nur um die Repräsenta­ +tion im Rechner handelt, spricht man kurz von Werten. Um mit Objekten elementarer +Datentypen arbeiten zu können, muß es in einem Programm die Möglichkeit geben, +Werte eines Datentyps zu bezeichnen (denotieren). Die Werte-Darstellungen, die in +ELAN Denoter genannt werden, sind für jeden Datentyp unterschiedlich. Wie bereits +erwähnt, haben alle Datenobjekte in ELAN (also auch Denoter) nur einen - vom +Compiler feststellbaren - Datentyp. Aus der Form eines Denoters ist also der Daten­ +typ erkennbar: + + + +INT-Denoter: +Sie bestehen aus einer Aneinanderreihung von Ziffern. + +Beispiele: + + +17 +007 +32767 +0 + + +Führende Nullen spielen bei der Bildung des Wertes keine Rolle (sie werden vom +ELAN-Compiler überlesen). Negative INT-Denoter gibt es nicht. Negative Werte +werden durch eine Aufeinanderfolge des monadischen Operators '-' (siehe 2.4.1.1) +und eines INT- Denoters realisiert. + + +REAL-Denoter: +Hier gibt es zwei Formen: +Die erste besteht aus zwei INT-Denotern, die durch einen Dezimalpunkt getrennt +werden. + +Beispiele: + + +0.314159 +17.28 + + +Der Dezimalpunkt wird wie ein Komma in der deutschen Schreibweise benutzt. Nega­ +tive REAL-Denoter gibt es wiederum nicht. + +Die zweite Form wird als "wissenschaftliche Notation" bezeichnet. Sie findet dann +Verwendung, wenn sehr große Zahlen oder Zahlen, die nahe bei Null liegen, darge­ +stellt werden müssen. + +Beispiele: + + +3.0 e5 +3.0e-5 + + +Der INT-Denoter hinter dem Buchstaben #on("b")#e#off("b")# gibt an, wie viele Stellen der Dezimal­ +punkt nach rechts (positive Werte) bzw. nach links (negative Werte) zu verschieben +ist. Dieser Wert wird Exponent und der Teil vor dem Buchstaben #on("b")#e#off("b")# Mantisse genannt. + + +TEXT-Denoter: +Sie werden in Anführungszeichen eingeschlossen. + +Beispiele: + + +"Das ist ein TEXT-Denoter" +"Jetzt ein TEXT-Denoter ohne ein Zeichen: ein leerer Text" +"" + + +Zu beachten ist, daß das Leerzeichen ebenfalls ein Zeichen ist. Soll ein Anführungs­ +zeichen in einem TEXT erscheinen (also gerade das Zeichen, welches einen Denoter +beendet), so muß es doppelt geschrieben werden. + +Beispiele: + + +"Ein TEXT mit dem ""-Zeichen" +"Ein TEXT-Denoter nur mit dem ""-Zeichen:" +"""" + + +Manchmal sollen Zeichen in einem TEXT-Denoter enthalten sein, die auf dem +Eingabegerät nicht zur Verfügung stehen. In diesem Fall kann der Code-Wert des +Zeichens angegeben werden. + +Beispiel: + + +"da"251"" + + +ist gleichbedeutend mit "daß". Der Code-Wert eines Zeichens ergibt sich aus der +EUMEL-Code-Tabelle (siehe 5.2.4.1), in der jedem Zeichen eine ganze Zahl zuge­ +ordnet ist. + + +BOOL-Denoter: +Es gibt nur zwei BOOL-Denoter: +TRUE für "wahr" und FALSE für "falsch". + + + +2.3.1.2 LET-Konstrukt für Denoter + +Neben der Funktion der Abkürzung von Datentypen (siehe 2.6.3) kann das LET- +Konstrukt auch für die Namensgebung für Denoter verwandt werden. + +Die LET-Vereinbarung sieht folgendermaßen aus: + + +#on("i")##on("b")#LET#off("i")##off("b")# Name #on("i")##on("b")#=#off("i")##off("b")# Denoter + + +Mehrere Namensgebungen können durch Komma getrennt werden. + + +____________________________________________________________________________ + .......................... Beispiele: ......................... + LET anzahl = 27; + LET pi = 3.14159, + blank = " "; +____________________________________________________________________________ + + +Der Einsatz von LET-Namen für Denoter hat zwei Vorteile: + +- feste Werte im Programm sind leicht zu ändern, da nur an einer Stelle des Pro­ + gramms der Denoter geändert werden muß + (z.B.: In Vereinbarungen von Reihungen (siehe 2.6.1) können LET-Denoter, im + Gegensatz zu Konstanten, als Obergrenze angegeben werden. Dieser + Wert kann dann auch an anderen Stellen des Programms, z.B. in Schlei­ + fen (siehe 2.4.2.5), benutzt werden. Bei Änderung der Reihungsgröße + braucht dann nur an einer Stelle des Programms der Wert geändert zu + werden.) +- der Name gibt zusätzliche Information über die Bedeutung des Denoters. + + + +2.3.2 Zugriffsrecht + +Von manchen Datenobjekten weiß man, daß sie nur einmal einen Wert erhalten +sollen. Sie sollen also nicht verändert werden. Oder man weiß, daß in einem Pro­ +grammbereich ein Datenobjekt nicht verändert werden soll. Um ein unbeabsichtigtes +Verändern zu verhindern, wird in ELAN dem Datenobjekt ein zusätzlicher Schutz +mitgegeben: das Zugriffsrecht oder Accessrecht. + +In der Deklaration eines Datenobjekts können folgende Accessattribute angegeben +werden: + +- #on("i")##on("b")#VAR #off("i")##off("b")# für lesenden und schreibenden (verändernden) Zugriff + +- #on("i")##on("b")#CONST#off("i")##off("b")# für nur lesenden Zugriff. + + + +2.3.3 Deklaration + +Damit man Datenobjekte in einem Programm ansprechen kann, gibt man einem +Datenobjekt einen Namen (wie z.B. einen Personennamen, unter der sich eine wirk­ +liche Person "verbirgt"). Will man ein Datenobjekt in einem Programm verwenden, so +muß man dem Compiler mitteilen, welchen Datentyp und welches Accessrecht das +Objekt haben soll. Das dient u.a. dazu, nicht vereinbarte Namen (z.B. verschriebene) +vom Compiler entdecken zu lassen. Weiterhin ist aus dem bei der Deklaration ange­ +gebenen Datentyp zu entnehmen, wieviel Speicherplatz für das Objekt zur Laufzeit zu +reservieren ist. + +Eine Deklaration oder Vereinbarung besteht aus der Angabe von + +- Datentyp +- Zugriffsrecht ( #on("i")##on("b")#VAR#off("i")##off("b")# oder #on("i")##on("b")#CONST#off("i")##off("b")#) +- Name des Datenobjekts. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + INT VAR mein datenobjekt; + +____________________________________________________________________________ + + +Verschiedene Datenobjekte mit gleichem Datentyp und Accessrecht dürfen in einer +Deklaration angegeben werden; sie werden durch Kommata getrennt. Mehrere Dekla­ +rationen werden - genauso wie Anweisungen - durch das Trennzeichen Semikolon +voneinander getrennt. + +____________________________________________________________________________ + .......................... Beispiele: ......................... + INT VAR mein wert, dein wert, unser wert; + BOOL VAR listen ende; + TEXT VAR zeile, wort; + +____________________________________________________________________________ + + +2.3.4 Initialisierung + +Um mit den vereinbarten Datenobjekten arbeiten zu können, muß man ihnen einen +Wert geben. Hat ein Datenobjekt noch keinen Wert erhalten, so sagt man, sein Wert +sei undefiniert. Das versehentliche Arbeiten mit undefinierten Werten ist eine beliebte +Fehlerquelle. Deshalb wird von Programmierern streng darauf geachtet, diese Fehler­ +kuelle zu vermeiden. Eine Wertgebung an ein Datenobjekt kann (muß aber nicht) +bereits bei der Deklaration erfolgen. In ELAN wird dies Initialisierung genannt. Für mit +CONST vereinbarte Datenobjekte ist die Initialisierung die einzige Möglichkeit, ihnen +einen Wert zu geben. Die Initialisierung von Konstanten ist zwingend vorgeschrieben +und wird vom Compiler überprüft. + +Die Initialisierung besteht aus der Angabe von + +- Datentyp +- Zugriffsrecht ( #on("i")##on("b")#VAR#off("i")##off("b")# oder #on("i")##on("b")#CONST#off("i")##off("b")#) +- Name des Datenobjekts +- Operator #on("i")##on("b")#::#off("i")##off("b")# oder #on("i")##on("b")#:=#off("i")##off("b")# +- Wert, den das Datenobjekt erhalten soll (Denoter, Ausdruck). + +____________________________________________________________________________ + .......................... Beispiele: ......................... + INT CONST gewuenschtes gehalt :: 12 000; + TEXT VAR zeile :: ""; + REAL CONST pi :: 3.14159, zwei pi := 2.0 * pi; + BOOL VAR bereits sortiert :: TRUE; +____________________________________________________________________________ +#page# + +2.4 Programmeinheiten + +Neben Deklarationen (Vereinbarungen) sind Programmeinheiten die Grundbestandteile +von ELAN. + + +Programmeinheiten können sein: + +#on("b")#- elementare Programmeinheiten #off("b")# + - Ausdruck + - Zuweisung + - Refinementanwendung + - Prozeduraufruf + +#on("b")#- zusammengesetzte Programmeinheiten #off("b")# + - Folge + - Abfrage + - Auswahl + - Wiederholung + +#on("b")#- abstrahierende Programmeinheiten #off("b")# + - Refinementbvereinbarung + - Prozedurvereinbarung + - Operatorvereinbarung + - Paketvereinbarung. +#page# + +2.4.1 Elementare Programmeinheiten + + +2.4.1.1 Ausdruck + +Ausdrücke sind eine Zusammenstellung von Datenobjekten (Denoter, VAR- oder +CONST-Objekte) und Operatoren. Jeder korrekte Ausdruck liefert einen Wert. Der +Typ des Ausdrucks wird bestimmt durch den Typ des Wertes, den der Ausdruck +liefert. + + +Operatoren + +Operatoren werden in ELAN durch ein oder zwei Sonderzeichen oder durch Groß­ +buchstaben als Schlüsselwort dargestellt (siehe 2.4.3.3). + +Als Operanden (also die Datenobjekte, auf die ein Operator "wirken" soll) dürfen +VAR- und CONST-Datenobjekte, Denoter oder Ausdrücke verwendet werden. Typ +der Operanden und des Resultats eines Operators werden in der Operatorvereinba­ +rung festgelegt (siehe 2.4.3.3). + +Man unterscheidet zwei Arten von Operatoren: + +#on("b")#- monadische Operatoren #off("b")# + Monadischen Operatoren haben nur einen Operanden, der rechts vom Operator­ + zeichen geschrieben werden muß. + + Beispiel: + + + - a + NOT x + + + Der '-' - Operator liefert den Wert von a mit umgekehrten Vorzeichen. a muß + dabei vom Datentyp INT oder REAL sein. + Der Operator 'NOT' realisiert die logische Negation. y muß vom Datentyp BOOL + sein. + + +#on("b")#- dyadische Operatoren #off("b")# + Dyadische Operatoren haben zwei Operanden. Das Operatorzeichen steht zwi­ + schen den beiden Operanden. + + Beispiele: + + + a + b + a - b + a * b + a DIV b + a ** b + x < y + x <> y + x AND y + x OR y + + + In den ersten fünf Beispielen werden jeweils die Werte von zwei INT-Objekten a + und b addiert (Operatorzeichen: '+'), subtrahiert ('-'), multipliziert ('*'), dividiert + (ganzzahlige Division ohne Rest: 'DIV') und potenziert ('**'). + Im sechsten und siebten Beispiel werden zwei BOOL-Werte x und y verglichen + und im achten und neunten Beispiel die logische Operation 'und' (Operator 'AND') + bzw. 'oder' (Operator 'OR') durchgeführt. + + +Priorität von Operatoren + +Es ist erlaubt, einen Ausdruck wiederum als Operanden zu verwenden. Praktisch +bedeutet dies, daß mehrere Operatoren und Datenobjekte zusammen in einem Aus­ +druck geschrieben werden dürfen. + +Beispiele: + + +a + 3 - b * c +- a * b + + +Die Reihenfolge der Auswertung kann man durch Angabe von Klammern steuern. + +Beispiel: + + +(a + b) * (a + b) + + +Es wird jeweils erst 'a + b' ausgewertet und dann erst die Multiplikation durchge­ +führt. In ELAN ist es erlaubt, beliebig viel Klammernpaare zu verwenden (Regel: die +innerste Klammer wird zuerst ausgeführt). Es ist sogar zulässig, Klammern zu ver­ +wenden, wo keine notwendig sind, denn überflüssige Klammernpaare werden überle­ +sen. Man muß jedoch beachten, daß Ausdrücke, und damit auch z.B. #on("b")#(a)#off("b")#, immer +Accessrecht CONST haben. + +Beispiel: + + +((a - b)) * 3 * ((c + d) * (c - d)) + + +Somit können beliebig komplizierte Ausdrücke formuliert werden. + +Um solche Ausdrücke einfacher zu behandeln und sie so ähnlich schreiben zu kön­ +nen, wie man es in der Mathematik gewohnt ist, wird in Programmiersprachen die +Reihenfolge der Auswertung von Operatoren festgelegt. In ELAN wurden neun Ebe­ +nen, Prioritäten genannt, festgelegt: + + +#on("bold")#Priorität Operatoren +#off("bold")# + + 9 alle monadischen Operatoren + 8 ** + 7 *, /, DIV, MOD + 6 +, - + 5 =, <>, <, <=, >, >= + 4 AND + 3 OR + 2 alle übrigen, nicht in dieser Tabelle aufgeführten + dyadischen Operatoren + 1 := + +(Die erwähnten Operatoren in der Tabelle werden in der Beschreibung der Standard­ +prozeduren und -Operatoren besprochen). + +Operatoren mit der höchsten Priorität werden zuerst ausgeführt, dann die mit der +nächst niedrigeren Priorität usw.. Operatoren mit gleicher Priorität werden von links +nach rechts ausgeführt. Dadurch ergibt sich die gewohnte Abarbeitungsfolge wie beim +Rechnen. + +Beispiel: + + +-2 + 3 * 2 ** 3 + +a) -2 +b) 2 ** 3 +c) 3 * (2 ** 3) +d) ((-2)) + (3 * (2 ** 3)) + + +Wie bereits erwähnt, ist es immer erlaubt, Klammern zu setzen. Ist man sich also +über die genaue Abarbeitungsfolge nicht im Klaren, so kann man Klammern verwen­ +den. + + + +2.4.1.2 Zuweisung + +Ein spezieller Operator ist die Zuweisung. + +Form: + + +Variable #on("i")##on("b")#:=#off("i")##off("b")# Wert + + +Dieser Operator hat immer die geringste Priorität, wird also immer als letzter einer +Anweisung ausgeführt. Die Zuweisung wird verwendet, um einer Variablen einen +neuen Wert zu geben. Der Operator ':=' liefert kein Resultat (man sagt auch, er +liefert keinen Wert) und verlangt als linken Operanden ein VAR-Datenobjekt, an den +der Wert des rechten Operanden zugewiesen werden soll). Der Wert des linken Oper­ +anden wird also verändert. Der rechte Operand wird nur gelesen. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + a := b; + +____________________________________________________________________________ + + +Hier wird der Wert von 'b' der Variablen 'a' zugewiesen. Der vorher vorhandene Wert +von 'a' geht dabei verloren. Man sagt auch, der Wert wird überschrieben. + +Als rechter Operand des ':='-Operators darf auch ein Ausdruck stehen. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + a := b + c; + +____________________________________________________________________________ + + +Hier wird das Resultat von 'b + c' an die Variable 'a' zugewiesen. Man beachte +dabei die Prioritäten der Operatoren '+' (Priorität 6) und ':=' (Priorität 1): die Addition +wird vor der Zuweisung ausgeführt. Die Auswertung von Zuweisungen mit Ausdrücken +muß immer so verlaufen, da die Zuweisung stets die niedrigste Priorität aller Operato­ +ren hat. + +Oft kommt es vor, daß ein Objekt auf der linken und rechten Seite des Zuweisungs­ +operators erscheint, z.B. wenn ein Wert erhöht werden soll. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + a := a + 1; + +____________________________________________________________________________ + + +Hier wird der "alte", aktuelle Wert von 'a' genommen, um '1' erhöht und dem Objekt +'a' zugewiesen. Man beachte, daß hier in einer Anweisung ein Datenobjekt unter­ +schiedliche Werte zu unterschiedlichen Zeitpunkten haben kann. + + + +2.4.1.3 Refinementanwendung + +In ELAN ist es möglich, Namen für Ausdrücke oder eine bzw. mehrere Anweisungen +zu vergeben. Das Sprachelement, das diese Namensgebung ermöglicht, heißt Refi­ +nement. Die Ausführung eines solchen Namens heißt Refinementanwendung, die +Namensgebung heißt Refinementvereinbarung (siehe 2.4.3.1). Die Ausdrücke oder +Anweisungen bilden den Refinementrumpf. Ein Refinement kann man in einem Pro­ +gramm unter dem Refinementnamen ansprechen. Man kann sich die Ausführung so +vorstellen, als würden der Refinementrumpf immer dort eingesetzt, wo der Name des +Refinements als Operation benutzt wird. + + + +2.4.1.4 Prozeduraufruf + +Eine Prozedur ist eine Sammlung von Anweisungen und Daten, die zur Lösung einer +bestimmten Aufgabe benötigt werden. Eine Prozedur wird in einer Prozedurvereinba­ +rung definiert (siehe 2.4.3.2). Eine solche Prozedur kann man in einem Programm +unter einem Namen (eventuell unter Angabe von Parametern) ansprechen. Man +spricht dann vom Aufruf einer Prozedur oder einer Prozeduranweisung. + +Formen des Prozeduraufrufs: + +- #on("b")#Prozeduren ohne Parameter#off("b")# werden durch den Prozedurnamen angesprochen. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + pause; + +____________________________________________________________________________ + + + (Die Prozedur 'pause' wartet bis ein Zeichen eingegeben wird) + + +- #on("b")#Prozeduren mit Parameter#off("b")# werden durch + + + Prozedurnamen #on("i")##on("b")#(#off("i")##off("b")# aktuelle Parameterliste #on("i")##on("b")#)#off("i")##off("b")# + + + aufgerufen. Eine Parameterliste ist entweder ein Datenobjekt oder mehrere durch + Kommata getrennte Datenobjekte. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + pause (10); + +____________________________________________________________________________ + + + (Mit der Prozedur 'pause (INT CONST zeitgrenze)' kann für eine Zeitdauer von + 'zeitgrenze' in Zehntel-Sekunden gewartet werden. Die Wartezeit wird durch + Erreichen der Zeitgrenze oder durch Eingabe eines Zeichens abgebrochen) + + + Bei den aktuellen Parametern ist folgendes zu beachten: + + a) Wird ein VAR-Parameter in der Definition der Prozedur vorgeschrieben, darf + kein Ausdruck als aktueller Parameter "übergeben" werden, weil an einen + Ausdruck nichts zugewiesen werden kann. Ausdrücke haben - wie bereits + erwähnt - das Accessrecht CONST. + +____________________________________________________________________________ + ........................ Gegenbeispiel: ....................... + TEXT VAR text1, text2; + text1 := "Dieses Beispiel "; + text2 := "Fehlermeldung"; + insert char (text1 + text2, "liefert eine", 17); + +____________________________________________________________________________ + + + (Die Prozedur 'insert char (TEXT VAR string, TEXT CONST char, INT CONST + pos)' fügt das Zeichen 'char' in den Text 'string' an der Position 'pos' ein) + + b) Wird ein CONST-Parameter verlangt, dann darf in diesem Fall ein Ausdruck + als aktueller Parameter geschrieben werden. Aber auch ein VAR-Datenobjekt + darf angegeben werden. In diesem Fall wird eine Wandlung des Accessrechts + (CONSTing) vorgenommen: der aktuelle Parameter erhält sozusagen für die + Zeit der Abarbeitung der Prozedur das Accessrecht CONST. + + + In ELAN sind auch Prozeduren als Parameter erlaubt. Die Prozedur als aktueller + Parameter wird in der Parameterliste folgendermaßen angegeben: + + + Resultattyp #on("i")##on("b")#PROC#off("i")##off("b")# #on("i")##on("b")#(#off("i")##off("b")# virtuelle Parameterliste #on("i")##on("b")#)#off("i")##off("b")# Procname + + + Die Angabe des Resultattyps entfällt, wenn es sich nicht um eine wertliefernde + Prozedur handelt. Die virtuelle Parameterliste inklusive der Klammern entfällt, falls + die Prozedur keine Parameter hat. Die virtuelle Parameterliste beschreibt die + Parameter der Parameterprozedur. Es werden Datentyp und Zugriffsrecht eines + jeden Parameters angegeben, jedoch ohne Namen. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + wertetabelle (REAL PROC (REAL CONST) sin, + untergrenze, obergrenze, schrittweite); + + + (Die Prozedur 'sin' wird an die Prozedur 'wertetabelle' übergeben) + +____________________________________________________________________________ + + +2.4.2 Zusammengesetzte Programmeinheiten + + +2.4.2.1 Folge + +Mehrere in einer bestimmten Reihenfolge auszuführende Anweisungen werden als +Folge bezeichnet. In ELAN kann man eine oder mehrere Anweisungen in eine Pro­ +grammzeile schreiben oder eine Anweisung über mehrere Zeilen. Das setzt jedoch +voraus, daß die Anweisungen voneinander getrennt werden. Die Trennung von Anwei­ +sungen erfolgt in ELAN durch das Trennsymbol Semikolon. Es bedeutet soviel wie: +"führe die nächste Anweisung aus". + +____________________________________________________________________________ + ........................... Beispiel: ......................... + put ("mein"); + put (1); + put (". Programm") + +____________________________________________________________________________ + + +(Die Prozedur 'put' gibt den als Parameter angegebenen Wert auf dem Ausgabegerät +aus) + + + +2.4.2.2 Abfrage + +Mit Abfragen steuert man die bedingte Ausführung von Anweisungen. Abhängig von +einer Bedingung wird in zwei verschiedene Programmabschnitte verzweigt. + +Der formale Aufbau einer Abfrage sieht folgendermaßen aus: + + +#on("i")##on("b")#IF#off("i")##off("b")# Bedingung + #on("i")##on("b")#THEN#off("i")##off("b")# Abschnitt + #on("i")##on("b")#ELSE#off("i")##off("b")# Abschnitt +#on("i")##on("b")#END IF#off("i")##off("b")# + + +Der ELSE-Teil darf dabei auch fehlen. Anstelle von #on("i")##on("b")#END IF#off("i")##off("b")# darf auch die Abkürzung #on("i")##on("b")#FI#off("i")##off("b")# (IF von hinten gelesen) benutzt werden. + +In folgenden Beispielen wird der Absolutbetrag von 'a' ausgegeben: + +____________________________________________________________________________ + ........................... Beispiel: ......................... + INT VAR a; + get (a); + IF a < 0 + THEN a := -a + END IF; + put (a) + +____________________________________________________________________________ + + +Die Umkehrung des Vorzeichens von a im THEN-Teil wird nur durchgeführt, wenn +der BOOLesche Ausdruck ('a < 0') den Wert TRUE liefert. Liefert er den Wert +FALSE, wird die Anweisung, die der bedingten Anweisung folgt (nach END IF), ausge­ +führt. Das obige Programm kann auch anders geschrieben werden: + +____________________________________________________________________________ + ........................... Beispiel: ......................... + INT VAR a; + get (a); + IF a < 0 + THEN put (-a) + ELSE put (a) + END IF + +____________________________________________________________________________ + + +Der THEN-Teil wird wiederum ausgeführt, wenn die BOOLesche Bedingung erfüllt +ist. Liefert sie dagegen FALSE, wird der ELSE-Teil ausgeführt. + +Die bedingte Anweisung ermöglicht es, abhängig von einer Bedingung eine oder +mehrere Anweisungen ausführen zu lassen. Dabei können im THEN- bzw. ELSE- +Teil wiederum bedingte Anweisungen enthalten sein. + + +Abfragekette +Bei Abfrageketten kann das ELIF-Konstrukt eingesetzt werden. (ELIF ist eine Zu­ +sammenziehung der Worte ELSE und IF). + +Anstatt + +____________________________________________________________________________ + ........................... Beispiel: ......................... + IF bedingung1 + THEN aktion1 + ELSE IF bedingung2 + THEN aktion2 + ELSE aktion3 + END IF + END IF; + +____________________________________________________________________________ + + +kann man besser + +____________________________________________________________________________ + ........................... Beispiel: ......................... + IF bedingung1 + THEN aktion1 + ELIF bedingung2 + THEN aktion2 + ELSE aktion3 + END IF; + +____________________________________________________________________________ + + +schreiben. + + + +2.4.2.3 Auswahl + +Die Auswahl wird benutzt, wenn alternative Anwendungen in Abhängikeit von Werten +eines Datenobjekts ausgeführt werden sollen. + +Der formale Aufbau der Auswahl sieht folgendermaßen aus: + + +#on("i")##on("b")#SELECT#off("i")##off("b")# INT-Ausdruck #on("i")##on("b")#OF#off("i")##off("b")# + #on("i")##on("b")#CASE#off("i")##off("b")# 1. Liste von INT-Denotern #on("i")##on("b")#:#off("i")##off("b")# Abschnitt + #on("i")##on("b")#CASE#off("i")##off("b")# 2. Liste von INT-Denotern #on("i")##on("b")#:#off("i")##off("b")# Abschnitt + . + . + . + #on("i")##on("b")#CASE#off("i")##off("b")# n. Liste von INT-Denotern #on("i")##on("b")#:#off("i")##off("b")# Abschnitt + #on("i")##on("b")#OTHERWISE#off("i")##off("b")# Abschnitt +#on("i")##on("b")#END SELECT#off("i")##off("b")# + + +Eine Liste von INT-Denotern besteht aus einem oder mehreren durch Kommata ge­ +trennten INT-Denotern. Der OTHERWISE-Teil darf auch fehlen. Man sollte ihn +jedoch verwenden, um Fehlerfälle abzufangen. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + SELECT monat OF + CASE 2: IF schaltjahr + THEN tage := 29 + ELSE tage := 28 + END IF + CASE 4, 6, 9, 11: tage := 30 + CASE 1, 3, 5, 7, 8, 10 ,12: tage := 31 + OTHERWISE kein monat + END SELECT; + +____________________________________________________________________________ + + +(In diesem Programmausschnitt werden die Tage eines Monats bestimmt) + + + +2.4.2.4 Wertliefernde Abfrage und + wertliefernde Auswahl + + +Soll eine Abfrage oder eine Auswahl einen Wert liefern, dann darf der ELSE- bzw. +der OTHERWISE-Teil nicht fehlen und alle Zweige müssen einen Wert liefern. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + SELECT monat OF + CASE 2: IF schaltjahr + THEN 29 + ELSE 28 + END IF + CASE 4, 6, 9, 11: 30 + CASE 1, 3, 5, 7, 8, 10 ,12: 31 + OTHERWISE kein monat; 0 + END SELECT; + +____________________________________________________________________________ + + +2.4.2.5 Wiederholung + +Die Wiederholung dient zur mehrfachen Ausführung von Anweisungen, meist in Ab­ +hängigkeit von einer Bedingung. Darum wird die Wiederholungsanweisung oft auch +Schleife genannt und die in ihr enthaltenen Anweisungen Schleifenrumpf. + +Es gibt verschiedene Schleifentypen: + +- Endlosschleife +- abweisende Schleife +- nicht abweisende Schleife +- Zählschleife. + + +Endlosschleife +Bei der Endlosschleife wird nicht spezifiziert, wann die Schleife beendet werden soll. + +Form: + + +#on("i")##on("b")#REPEAT#off("i")##off("b")# + Abschnitt +#on("i")##on("b")#END REPEAT#off("i")##off("b")# + + +Anstelle von #on("i")##on("b")#REPEAT#off("i")##off("b")# darf die Abkürzung #on("i")##on("b")#REP#off("i")##off("b")# und anstelle von #on("i")##on("b")#END REPEAT#off("i")##off("b")# +das Schlüsselwort #on("i")##on("b")#PER#off("i")##off("b")# (REP von hinten gelesen) +benutzt werden. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + break; + REPEAT + fixpoint; + pause (18000) + END REPEAT + +____________________________________________________________________________ + + +Wird dieses Programm in einer Task im SYSUR-Zweig ausgeführt, so führt diese +Task Fixpunkte im Abstand von 30 Minuten durch. + + + +Abweisende Schleife +Bei der abweisenden Schleife wird die Abbruchbedingung an den Anfang der Schleife +geschrieben. + +Form: + + +#on("i")##on("b")#WHILE#off("i")##off("b")# Bedingung #on("i")##on("b")#REPEAT#off("i")##off("b")# + Abschnitt +#on("i")##on("b")#END REPEAT#off("i")##off("b")# + + +Bei jedem erneuten Durchlauf der Schleife wird überprüft, ob der BOOLesche Aus­ +druck den Wert TRUE liefert. Ist das nicht der Fall, wird die Bearbeitung mit der +Anweisung fortgesetzt, die auf das Schleifenende folgt. Die Schleife wird abweisende +Schleife genannt, weil der Schleifenrumpf nicht ausgeführt wird, wenn die Bedingung +vor Eintritt in die Schleife bereits FALSE liefert. + + +Nicht abweisende Schleife +Anders verhält es sich bei der nicht abweisenden Schleife. Bei der nicht abweisenden +Schleife wird die Abbruchbedingung an das Ende der Schleife geschrieben. + +Form: + + +#on("i")##on("b")#REPEAT#off("i")##off("b")# + Abschnitt +#on("i")##on("b")#UNTIL#off("i")##off("b")# Bedingung #on("i")##on("b")#END REPEAT#off("i")##off("b")# + + +Hier wird der Schleifenrumpf auf jeden Fall einmal bearbeitet. Am Ende des Rumpfes +wird die BOOLesche Bedingung abgefragt. Liefert sie den Wert FALSE, wird die +Schleife erneut abgearbeitet. Liefert die Bedingung den Wert TRUE, wird die Schleife +abgebrochen und mit der ersten Anweisung hinter der Schleife in der Bearbeitung +fortgefahren. + +Bei den beiden letztgenannten Arten der Wiederholungsanweisung ist es wichtig, daß +Elemente der BOOLeschen Bedingung in der Schleife verändert werden, damit das +Programm terminieren kann, d.h. die Schleife abgebrochen wird. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + TEXT VAR wort, satz :: ""; + REPEAT + get (wort); + satz CAT wort; + satz CAT " " + UNTIL wort = "." PER; + +____________________________________________________________________________ + + +Dises Programm liest solange Wörter ein und verbindet diese zu einem Satz, bis ein +Punkt eingegeben wurde. + + + +Zählschleife +Zählschleifen werden eingesetzt, wenn die genaue Anzahl der Schleifendurchläufe +bekannt ist. + +Form: + + +#on("i")##on("b")#FOR#off("i")##off("b")# Laufvariable #on("i")##on("b")#FROM#off("i")##off("b")# Anfangswert #on("i")##on("b")#UPTO#off("i")##off("b")# Endwert #on("i")##on("b")#REPEAT#off("i")##off("b")# + Abschnitt +#on("i")##on("b")#END REPEAT#off("i")##off("b")# + + +Bei Zählschleifen wird eine Laufvariable verwendet, die die INT-Werte von 'Anfangs­ +wert' bis 'Endwert' in Schritten von 1 durchläuft. 'Anfangswert' und 'Endwert' können +beliebige INT-Ausdrücke sein. Diese Schleife zählt "aufwärts". Wird anstatt #on("i")##on("b")#UPTO#off("i")##off("b")# +das Schlüsselwort #on("i")##on("b")#DOWNTO#off("i")##off("b")# verwendet, wird mit Schritten von 1 "abwärts" gezählt. + +Form: + + +#on("i")##on("b")#FOR#off("i")##off("b")# Laufvariable #on("i")##on("b")#FROM#off("i")##off("b")# Endwert #on("i")##on("b")#DOWNTO#off("i")##off("b")# Anfangswert #on("i")##on("b")#REPEAT#off("i")##off("b")# + Abschnitt +#on("i")##on("b")#END REPEAT#off("i")##off("b")# + + +Die Laufvariable darf in der Schleife nicht verändert werden. Nach dem normalen +Schleifenende ist der Wert der Laufvariablen nicht definiert. + + +____________________________________________________________________________ + ........................... Beispiel: ......................... + INT VAR summe :: 0, i; + FOR i FROM 1 UPTO 100 REPEAT + summe INCR i + END REPEAT + +____________________________________________________________________________ + + +Dieses Programm berechnet die Summe der natürlichen Zahlen von 1 bis 100. + + +Die verschiedenen Schleifenarten können kombiniert werden: + + +#on("i")##on("b")#FOR#off("i")##off("b")# Laufvariable #on("i")##on("b")#FROM#off("i")##off("b")# Anfangswert #on("i")##on("b")#UPTO#off("i")##off("b")# Endwert +#on("i")##on("b")#WHILE#off("i")##off("b")# Bedingung #on("i")##on("b")#REPEAT#off("i")##off("b")# + Abschnitt +#on("i")##on("b")#END REPEAT#off("i")##off("b")# + + + +#on("i")##on("b")#FOR#off("i")##off("b")# Laufvariable #on("i")##on("b")#FROM#off("i")##off("b")# Anfangswert #on("i")##on("b")#UPTO#off("i")##off("b")# Endwert #on("i")##on("b")#REPEAT#off("i")##off("b")# + Abschnitt +#on("i")##on("b")#UNTIL#off("i")##off("b")# Bedingung #on("i")##on("b")#END REPEAT#off("i")##off("b")# + + + + + +#on("i")##on("b")#WHILE#off("i")##off("b")# Bedingung #on("i")##on("b")#REPEAT#off("i")##off("b")# + Abschnitt +#on("i")##on("b")#UNTIL#off("i")##off("b")# Bedingung #on("i")##on("b")#END REPEAT#off("i")##off("b")# + +#page# + +2.4.3 Abstrahierende Programmeinheiten + + +2.4.3.1 Refinementvereinbarung + +In ELAN ist es möglich, Namen für Ausdrücke oder eine bzw. mehrere Anweisungen +zu vergeben. Das Sprachelement, das diese Namensgebung ermöglicht, heißt Refi­ +nement. Die Ausführung eines solchen Namens heißt Refinementanwendung (siehe +2.4.1.3), die Namensgebung heißt Refinementvereinbarung. Die Ausdrücke oder +Anweisungen bilden den Refinementrumpf. + +Werden in einem Programm Refinements benutzt, dann wird der Programmteil bis +zum ersten Refinement durch einen Punkt abgeschlossen. Die Refinementvereinba­ +rung sieht folgendermaßen aus: + + +Name #on("i")##on("b")#:#off("i")##off("b")# + Abschnitt #on("i")##on("b")#.#off("i")##off("b")# + + + +____________________________________________________________________________ + ........................... Beispiel: ......................... + INT VAR a, b, x; + einlesen von a und b; + vertauschen von a und b; + vertauschte werte ausgeben. + + einlesen von a und b: + get (a); + get (b). + + vertauschen von a und b: + x := a; + a := b; + b := x. + + vertauschte werte ausgeben: + put (a); + put (b). + +____________________________________________________________________________ + + +Für den Namen 'einlesen von a und b' werden die Anweisungen 'get (a); get (b)' vom +ELAN-Compiler eingesetzt. Man kann also die ersten vier Zeilen des Programms als +eigentliches Programm ansehen, wobei die Namen durch die betreffenden Anwei­ +sungen ersetzt werden. Ein Refinement hat also keinen eigenen Datenbereich, d.h. +Vereinbarungen, die in Refinements gemacht werden, gelten auch außerhalb des +Refinements. + + + +Vorteile der Refinementanwendung +Durch die sinnvolle Verwendung von Refinements wird ein Programm im Programm +und nicht in einer separaten Beschreibung dokumentiert. Weiterhin kann ein Pro­ +gramm "von oben nach unten" ("top down") entwickelt werden: Das obige - zuge­ +geben einfache - Beispielprogramm wurde in drei Teile zerlegt und diese durch +Namen beschrieben. Bei der Beschreibung von Aktionen durch Namen wird gesagt +was gemacht werden soll. Es wird noch nicht beschrieben wie, denn auf dieser Stufe +der Programmentwicklung braucht man sich um die Realisierung der Refinements +(noch) keine Sorgen zu machen. Das erfolgt erst, wenn das Refinement programmiert +werden muß. Dabei können wiederum Refinements verwendet werden usw., bis man +auf eine Ebene "heruntergestiegen" ist, bei der eine (jetzt: Teil-) Problemlösung sehr +einfach ist und man sie direkt hinschreiben kann. Man beschäftigt sich also an jedem +Punkt der Problemlösung nur mit einem Teilaspekt des gesamten Problems. Zudem +sieht man - wenn die Refinements einigermaßen vernünftig verwendet werden - +dem Programm an, wie die Problemlösung entstanden ist. + +Die Verwendung von Refinements hat also eine Anzahl von Vorteilen. +Refinements ermöglichen: + +- "top down" - Programmierung +- Strukturierung von Programmen und damit effiziente Fehlersuche und gute Wart­ + barkeit +- Dokumentation im Programmtext. + + +Wertliefernde Refinements +Refinements können auch dort verwendet werden, wo ein Wert erwartet wird, z.B. in +einem Ausdruck oder einer 'put'-Anweisung. In diesem Fall muß die letzte Anwei­ +sung des Refinements einen Wert liefert. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + INT VAR a :: 1, b :: 2, c :: 3; + put (resultat). + + resultat: + (a * b + c) ** 3. + +____________________________________________________________________________ + + +Man kann auch ein wertlieferndes Refinement mit mehreren Anweisungen schrei­ +ben. + +Allgemeine Regel: +Die letzte Anweisung eines Refinements bestimmt, ob es einen Wert liefert - und +wenn ja, von welchen Datentyp. + + + +2.4.3.2 Prozedurvereinbarung + +Eine Prozedur ist eine Sammlung von Anweisungen und Daten, die zur Lösung einer +bestimmten Aufgabe benötigt werden. + +Der formale Aufbau einer Prozedur sieht folgendermaßen aus: + + +#on("i")##on("b")#PROC#off("i")##off("b")# Prozedurname #on("i")##on("b")#:#off("i")##off("b")# + Prozedurrumpf +#on("i")##on("b")#END PROC#off("i")##off("b")# Prozedurname + + +Der Prozedurrumpf kann Deklarationen, Anweisungen und Refinements enthalten. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + PROC loesche bildschirm ab aktueller cursorposition: + out (""4"") + END PROC loesche bildschirm ab aktueller cursorposition + +____________________________________________________________________________ + + +Verwendung von Prozeduren +Prozeduren werden verwendet, wenn + +- Anweisungen und Datenobjekte unter einem Namen zusammengefaßt werden + sollen ("Abstraktion") +- gleiche Anweisungen von mehreren Stellen eines Programms verwandt werden + sollen (Codereduktion), u.U. mit verschieden Datenobjekten (Parameter) +- Datenobjekte nur innerhalb eines Programmteils benötigt werden und diese nicht + von dem gesamten Programm angesprochen werden sollen. + +In den folgenden Programmfragmenten werden zwei Werte vertauscht. In der ersten +Lösung wird ein Refinement, in der zweiten eine Prozedur verwandt. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + IF a > b + THEN vertausche a und b + END IF; + put (a); + put (b); + vertausche a und b. + + vertausche a und b: + INT CONST x :: a; + a := b; + b := x. + +____________________________________________________________________________ + + +____________________________________________________________________________ + ........................... Beispiel: ......................... + PROC vertausche a und b: + INT CONST x :: a; + a := b; + b := x + END PROC vertausche a und b; + + IF a > b + THEN vertausche a und b + END IF; + put (a); + put (b); + vertausche a und b; + +____________________________________________________________________________ + + +Beim ersten Hinsehen leisten beide Programme das Gleiche. Es gibt jedoch drei +wichtige Unterschiede: + +1) Das Refinement 'vertausche a und b' wird zweimal (vom ELAN-Compiler) ein­ + gesetzt, d.h. der Code ist zweimal vorhanden. Die Prozedur dagegen ist vom Code + nur einmal vorhanden, wird aber zweimal - durch das Aufführen des Prozedur­ + namens - aufgerufen. + +2) Die Variable 'x' ist in der ersten Programmversion während des gesamten Ablauf + des Programms vorhanden, d.h. ihr Speicherplatz ist während dieser Zeit belegt. + Solche Datenobjekte nennt man statische Datenobjekte oder auch (aus Gründen, + die erst etwas später offensichtlich werden) Paket-Objekte. Das Datenobjekt 'x' + der rechten Version dagegen ist nur während der Bearbeitung der Prozedur vor­ + handen, sein Speicherplatz wird danach freigegeben. Solche Datenobjekte, die nur + kurzfristig Speicher belegen, werden dynamische Datenobjekte genannt. + + Prozeduren sind also ein Mittel, um die Speicherbelegung zu beeinflussen. + +3) Da Refinements keinen eigenen Datenbereich haben, kann die Variable 'x' in der + ersten Programmversion - obwohl sie in einem Refinement deklariert wurde - + von jeder Stelle des Programms angesprochen werden. Solche Datenobjekte + werden globale Datenobjekte genannt. Das Datenobjekt 'x' der Prozedur dagegen + kann nur innerhalb der Prozedur angesprochen werden, es ist also ein lokales + Datenobjekt der Prozedur. Innerhalb der Prozedur dürfen globale Datenobjekte + (also Objekte, die außerhalb von Prozeduren deklariert wurden) auch angespro­ + chen werden. + + Eine Prozedur in ELAN bildet im Gegensatz zu Refinements einen eigenen Gültig­ + keitsbereich hinsichtlich Datenobjekten und Refinements, die innerhalb der Pro­ + zedur deklariert werden. Prozeduren sind somit ein Mittel, um die in ihr dekla­ + rierten Datenobjekte hinsichtlich der Ansprechbarkeit nach Außen "abzuschotten". + + + +Prozeduren mit Parametern +Prozeduren mit Parametern erlauben es, gleiche Anweisungen mit unterschiedlichen +Datenobjekten auszuführen. + +Form: + + +#on("i")##on("b")#PROC#off("i")##off("b")# Prozedurname #on("i")##on("b")#(#off("i")##off("b")# formale Parameterliste #on("i")##on("b")#)#off("i")##off("b")# #on("i")##on("b")#:#off("i")##off("b")# + Prozedurrumpf +#on("i")##on("b")#END PROC#off("i")##off("b")# Prozedurnamen + + +Die Parameterliste besteht aus einem oder mehreren durch Kommata getrennten Para­ +metern. Ein Parameter wird mit Datentyp, Accessrecht und Namen angegeben. +Ähnlich wie bei der Datendeklaration braucht man für aufeinanderfolgende Parameter +mit gleichem Datentyp und gleichem Accessrecht die Attribute nur einmal anzugeben. +Parameter mit Accessrecht #on("i")##on("b")#CONST#off("i")##off("b")# sind Eingabeparameter, Parameter mit Access­ +recht #on("i")##on("b")#VAR#off("i")##off("b")# realisieren Ein-/Ausgabeparameter. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + PROC vertausche (INT VAR a, b): + INT VAR x :: a; + a := b; + b := x + END PROC vertausche; + + INT VAR eins :: 1, + zwei :: 2, + drei :: 3; + vertausche (eins, zwei); + vertausche (zwei, drei); + vertausche (eins, zwei); + put (eins); put (zwei); put (drei) + +____________________________________________________________________________ + + +Die Datenobjekte 'a' und 'b' der Prozedur 'vertausche' werden formale Parameter +genannt. Sie stehen als Platzhalter für die bei einem Prozeduraufruf einzusetzenden +aktuellen Parameter (in obigen Beispiel die Datenobjekte 'eins', 'zwei' und 'drei'). + + + +Prozeduren als Parameter +Es ist auch möglich, Prozeduren als Parameter zu definieren. + +Eine Prozedur als Parameter wird folgendermaßen in der Parameterliste spezifiziert: + +Resultattyp #on("i")##on("b")#PROC#off("i")##off("b")# #on("i")##on("b")#(#off("i")##off("b")# virtuelle Parameterliste #on("i")##on("b")#)#off("i")##off("b")# Prozedurname + + +Die Angabe des Resultattyps entfällt, wenn es sich nicht um eine wertliefernde Proze­ +dur handelt. Die virtuelle Parameterliste inklusive der Klammern entfällt, falls die +Prozedur keine Parameter hat. Die virtuelle Parameterliste beschreibt die Parame­ +ter der Parameterprozedur. Es werden Datentyp und Zugriffsrecht eines jeden Para­ +meters angegeben, jedoch ohne Namen. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + PROC wertetabelle (REAL PROC (REAL CONST) funktion, + REAL CONST untergrenze, obergrenze, + schrittweite): + + REAL VAR wert; + putline ("W E R T E T A B E L L E"); + putline ("-----------------------"); + wert := untergrenze; + REPEAT + put (text (wert, 10, 5)); + put (text (funktion (wert), 10, 5)); + line; + wert INCR schrittweite + UNTIL wert > obergrenze PER + + END PROC wertetabelle; + + (* Prozeduraufruf: *) + wertetabelle (REAL PROC (REAL CONST) sin, 0.0, pi, 0.2) + +____________________________________________________________________________ + + +Wertliefernde Prozeduren +Eine wertliefernde Prozedur sieht folgendermaßen aus: + + +Resultattyp #on("i")##on("b")#PROC#off("i")##off("b")# Prozedurname #on("i")##on("b")#(#off("i")##off("b")# formale Parameterliste #on("i")##on("b")#)#off("i")##off("b")# #on("i")##on("b")#:#off("i")##off("b")# + wertliefernder Prozedurrumpf +#on("i")##on("b")#END PROC#off("i")##off("b")# Prozedurnamen + + + +Die Parameterliste inklusive Klammerung kann fehlen. Der Prozedurrumpf muß einen +Wert mit dem in Resultattyp angegeben Datentyp liefern. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + INT PROC max (INT CONST a, b): + IF a > b + THEN a + ELSE b + END IF + END PROC max; + + put (max (3, 4)) + +____________________________________________________________________________ + + +(In diesem Beispiel wird das Maximum von 'a' und 'b' ermittelt und ausgegeben) + +#page# + +2.4.3.3 Operatorvereinbarung + +Operatoren können in ELAN ähnlich wie Prozeduren definiert werden. Operatoren +müssen einen und können maximal zwei Operatoren besitzen (monadische und dyadi­ +sche Operatoren). + +Form: + + +Resultattyp #on("i")##on("b")#OP#off("i")##off("b")# Opname #on("i")##on("b")#(#off("i")##off("b")# ein oder zwei Parameter #on("i")##on("b")#)#off("i")##off("b")# #on("i")##on("b")#:#off("i")##off("b")# + Operatorrumpf +#on("i")##on("b")#END OP#off("i")##off("b")# Opname + + +Der Resultattyp wird nur bei wertliefernden Operatoren angegeben. + +Als Operatornamen sind erlaubt: + +- ein Sonderzeichen, sofern es nicht als Trennzeichen benutzt wird: + ! $ % & ' * + - / < = > ? § ^ ' ~ +- eine Kombination von zwei Sonderzeichen. Diese Kombination muß jedoch bereits + in ELAN existieren: + := <= >= <> ** +- ein Schlüsselwort (siehe 2.2.1). + + + +Vereinbarung eines monadischen Operators +____________________________________________________________________________ + ........................... Beispiel: ......................... + INT OP SIGN (REAL CONST argument): + IF argument < 0.0 THEN -1 + ELIF argument = 0.0 THEN 0 + ELSE 1 + FI + END OP SIGN + +____________________________________________________________________________ + + +(Der Operator 'SIGN' liefert abhängig vom Vorzeichen des übergebenen Wertes den +INT-Wert -1, 0 oder 1) + + + +Vereinbarung eines dyadischen Operators +____________________________________________________________________________ + ........................... Beispiel: ......................... + TEXT OP * (INT CONST anzahl, TEXT CONST t): + INT VAR zaehler :: anzahl; + TEXT VAR ergebnis :: ""; + WHILE zaehler > 0 REP + ergebnis := ergebnis + t; + zaehler := zaehler - 1 + END REP; + ergebnis + END OP *; + +____________________________________________________________________________ + + +(Der Operator '*' verkettet 'anzahl'- mal den Text 't') + + + +2.4.3.4 Paketvereinbarung + +Pakete sind in ELAN eine Zusammenfassung von Datenobjekten, Prozeduren, Opera­ +toren und Datentypen. Diese bilden den Paketrumpf. Elemente eines Pakets (Prozedu­ +ren, Operatoren, Datentypen) können außerhalb des Pakets nur angesprochen werden, +wenn sie in der Schnittstelle des Pakets, die auch "interface" genannt wird, aufge­ +führt werden. Mit anderen Worten: es können alle Elemente eines Pakets von außen +nicht angesprochen werden, sofern sie nicht über die Schnittstelle "nach außen ge­ +reicht" werden. Pakete können separat übersetzt werden, so daß der "Zusammen­ +bau" eines umfangreichen Programms aus mehreren Paketen möglich ist. + +Der formale Aufbau eines Pakets sieht folgendermaßen aus: + + +#on("i")##on("b")#PACKET#off("i")##off("b")# Paketname #on("i")##on("b")#DEFINES#off("i")##off("b")# Schnittstelle #on("i")##on("b")#:#off("i")##off("b")# + Paketrumpf +#on("i")##on("b")#END PACKET#off("i")##off("b")# Paketname + + +In der Schnittstelle werden Prozeduren und Operatoren nur mit ihrem Namen, durch +Kommata getrennt, angegeben. Weiterhin können Datentypen und mit CONST verein­ +barte Datenobjekte in der Schnittstelle aufgeführt werden, aber keine VAR-Datenob­ +jekte, weil diese sonst über Paket-Grenzen hinweg verändert werden könnten. + +Im Gegensatz zu einer Prozedur kann ein PACKET nicht aufgerufen werden (nur die +Elemente der Schnittstelle können benutzt werden). + +Pakete werden zu folgenden Zwecken eingesetzt: + +- Spracherweiterung +- Schutz vor fehlerhaftem Zugriff auf Datenobjekte +- Realisierung von abstrakten Datentypen. + + + +Spracherweiterung +____________________________________________________________________________ + ........................... Beispiel: ......................... + PACKET fuer eine prozedur DEFINES swap: + + PROC swap (INT VAR a, b): + INT CONST x :: a; + b := a; + a := x + END PROC swap + + END PACKET fuer eine prozedur + +____________________________________________________________________________ + + +Dies ist ein Paket, das eine Tausch-Prozedur für INT-Datenobjekte bereitstellt. Das +PACKET kann übersetzt und dem ELAN-Compiler bekannt gemacht werden +(EUMEL: "insertieren"). Ist das geschehen, kann man 'swap' wie alle anderen Proze­ +duren (z.B. 'put', 'get') in einem Programm verwenden. Tatsächlich werden die mei­ +sten Prozeduren und Operatoren (aber auch einige Datentypen), die in ELAN zur +Verfügung stehen, nicht durch den ELAN-Compiler realisiert, sondern durch solche +PACKETs. Um solche Objekte einigermaßen zu standardisieren, wurde in der +ELAN-Sprachbeschreibung festgelegt, welche Datentypen, Prozeduren und Operato­ +ren in jedem ELAN-System vorhanden sein müssen. Solche Pakete werden Stan­ +dard-Pakete genannt. Jeder Installation - aber auch jedem Benutzer - steht es +jedoch frei, zu den Standard-Paketen zusätzliche Pakete dem Compiler bekannzu­ +geben, und damit den ELAN-Sprachumfang zu erweitern. + + + +Schutz vor fehlerhaftem Zugriff auf Datenobjekte +____________________________________________________________________________ + ........................... Beispiel: ......................... + PACKET stack handling DEFINES push, pop, init stack: + + LET max = 1000; + ROW max INT VAR stack; (* siehe Kapitel Reihung, 2.6.1. *) + INT VAR stack pointer; + + PROC init stack: + stack pointer := 0 + END PROC init stack; + + PROC push (INT CONST dazu wert): + stack pointer INCR 1; + IF stack pointer > max + THEN errorstop ("stack overflow") + ELSE stack [stack pointer] := dazu wert + END IF + END PROC push; + + PROC pop (INT VAR von wert): + IF stack pointer = 0 + THEN errorstop ("stack empty") + ELSE von wert := stack [stack pointer]; + stack pointer DECR 1 + END IF + END PROC pop + + END PACKET stack handling; + +____________________________________________________________________________ + + +Dieses Packet realisiert einen Stack. Den Stack kann man über die Prozeduren 'init +stack', 'push' und 'pop' benutzen. +#page# +____________________________________________________________________________ + ........................... Beispiel: ......................... + init stack; + werte einlesen und pushen; + werte poppen und ausgeben. + + werte einlesen und pushen: + INT VAR anzahl :: 0, wert; + REP + get (wert); + push (wert); + anzahl INCR 1 + UNTIL ende kriterium END REP. + + werte poppen und ausgeben: + INT VAR i; + FOR i FROM 1 UPTO anzahl REP + pop (wert); + put (wert) + END REP. + +____________________________________________________________________________ + + +Die Datenobjekte 'stack' und 'stack pointer' haben nur Gültigkeit innerhalb des +PACKETs 'stack handling'. + +Anweisungen wie z.B. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + put (stack [3]); + stack [27] := 5 + +____________________________________________________________________________ + + + +außerhalb des PACKETs 'stack handling' sind also verboten und werden vom +ELAN-Compiler entdeckt. + +Ein PACKET bietet also auch einen gewissen Schutz vor fehlerhafter Verwendung von +Programmen und Datenobjekten. Wichtig ist weiterhin, daß die Realisierung des +Stacks ohne weiteres geändert werden kann, ohne daß Benutzerprogramme im 'main +packet' geändert werden müssen, sofern die Schnittstelle nicht verändert wird. Bei­ +spielsweise kann man sich entschließen, den Stack nicht durch eine Reihung, son­ +dern durch eine Struktur zu realisieren. Davon bleibt ein Benutzerprogramm unbe­ +rührt. + + + +Realisierung von abstrakten Datentypen +Der Vollständigkeit halber wird folgendes Beispiel hier gezeigt. Wie neue Datentypen +definiert werden, wird in Kapitel 2.7.1. erklärt. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + PACKET widerstaende DEFINES WIDERSTAND, REIHE, PARALLEL, + :=, get, put: + + TYPE WIDERSTAND = INT; + + OP := (WIDERSTAND VAR l, WIDERSTAND CONST r): + CONCR (l) := CONCR (r) + END OP :=; + + PROC get (WIDERSTAND VAR w): + INT VAR i; + get (i); + w := WIDERSTAND : (i) + END PROC get; + + PROC put (WIDERSTAND CONST w): + put (CONCR (w)) + END PROC put; + + WIDERSTAND OP REIHE (WIDERSTAND CONST l, r): + WIDERSTAND : ( CONCR (l) + CONCR (r)) + END OP REIHE; + + WIDERSTAND OP PARALLEL (WIDERSTAND CONST l, r): + WIDERSTAND : + ((CONCR (l) * CONCR (r)) DIV (CONCR (l) + CONCR (r))) + END OP PARALLEL + + END PACKET widerstaende + +____________________________________________________________________________ + + +Dieses Programm realisiert den Datentyp WIDERSTAND und mit den Operationen +eine Fachsprache. + + + +2.4.4 Terminatoren für Refinements, + Prozeduren und Operatoren + + +Das LEAVE-Konstrukt wird verwendet, um eine benannte Anweisung (Refinement, +Prozedur oder Operator) vorzeitig zu verlassen. Es ist auch möglich, geschachtelte +Refinements zu verlassen. + +Form: + +#on("i")##on("b")#LEAVE#off("i")##off("b")# Name + + +Durch eine (optionale) WITH-Angabe kann auch eine wertliefernde benannte Anwei­ +sung verlassen werden. + +Form: + +#on("i")##on("b")#LEAVE#off("i")##off("b")# Name #on("i")##on("b")#WITH#off("i")##off("b")# Ausdruck + +____________________________________________________________________________ + ........................... Beispiel: ......................... + INT OP ** (INT CONST basis, exp): + IF exp = 0 + THEN LEAVE ** WITH 1 + ELIF exp < 0 + THEN LEAVE ** WITH 0 + FI; + + INT VAR zaehler, ergebnis; + ergebnis := basis; + FOR zaehler FROM 2 UPTO exp REP + ergebnis := ergebnis * basis + PER; + ergebnis + END OP ** + +____________________________________________________________________________ + + +(Diese Operation realisiert die Exponentiation für INT-Werte) + + + +2.4.5 Generizität von Prozeduren + und Operatoren + + +In ELAN ist es möglich, unterschiedlichen Prozeduren bzw. Operatoren gleiche +Namen zu geben. Solche Prozeduren (Operatoren) werden generische Prozeduren +(Operatoren) genannt. Die Identifizierung erfolgt durch Anzahl, Reihenfolge und Daten­ +typ der Parameter (Operanden). + +Deshalb werden Prozeduren und Operatoren unter Angabe des Prozedur- bzw. des +Operatorkopfes dokumentiert. + +Beispiele: + + +INT OP MOD (INT CONST l, r) +REAL OP MOD (REAL CONST l, r) + + +Der MOD-Operator liefert den Rest einer Division. Er ist sowohl für INT- wie auch +für REAL-Datenobjekte definiert. + + + +PROC put (INT CONST wert) +PROC put (REAL CONST wert) +PROC put (TEXT CONST wert) + + +Die put-Prozedur ist für INT-, REAL- und TEXT-Datenobjekte definiert. + + + +Priorität von generischen Operatoren +Bei der Neudefinition von Operatoren kann man bereits benutzte Sonderzeichen oder +Schlüsselwörter benutzen. In diesem Fall bekommt der neudefinierte Operator die +gleiche Priorität wie der bereits vorhandene Operator. + + + +2.4.6 Rekursive Prozeduren + und Operatoren + + +Alle Prozeduren und Operatoren dürfen in ELAN rekursiv sein. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + INT PROC fakultaet (INT CONST n): + IF n > 0 + THEN fakultaet (n-1) * n + ELSE 1 + END IF + END PROC fakultaet + +____________________________________________________________________________ + + +Die Fakultätsfunktion ist kein gutes Beispiel für eine Rekursion, denn das Programm +kann leicht in eine iterative Version umgewandelt werden: + +____________________________________________________________________________ + ........................... Beispiel: ......................... + INT PROC fakultaet (INT CONST n): + INT VAR prod :: 1, i; + FOR i FROM 2 UPTO n REP + prod := prod * i + END REP; + prod + END PROC fakultaet + +____________________________________________________________________________ + + +Die Umwandlung von einem rekursiven Programm in ein iteratives ist übrigens immer +möglich, jedoch oft nicht so einfach, wie in dem Beispiel der Ackermann-Funktion: + +____________________________________________________________________________ + ........................... Beispiel: ......................... + INT PROC acker (INT CONST m, n): + IF m = 0 + THEN n + 1 + ELIF n = 0 + THEN acker (m-1, 0) + ELSE acker (m - 1, acker (m, n - 1)) + ENDIF + END PROC acker + +____________________________________________________________________________ + + +Das eigentliche Einsatzgebiet von rekursiven Algorithmen liegt aber bei den 'back­ +track'-Verfahren. Diese werden eingesetzt, wenn eine exakte algorithmische Lösung +nicht bekannt ist oder nicht gefunden werden kann und man verschiedene Versuche +machen muß, um zu einem Ziel (oder Lösung) zu gelangen. + diff --git a/doc/programming/programmierhandbuch.2b b/doc/programming/programmierhandbuch.2b new file mode 100644 index 0000000..c2103ba --- /dev/null +++ b/doc/programming/programmierhandbuch.2b @@ -0,0 +1,1395 @@ +#headandbottom("52","EUMEL-Benutzerhandbuch","TEIL 2 : ELAN","2")# +#pagenr ("%", 52)##setcount(1)##block##pageblock# +#headeven# +#center#EUMEL-Benutzerhandbuch +#center#____________________________________________________________ + +#end# +#headodd# +#center#TEIL 2 : ELAN +#center#____________________________________________________________ + +#end# +#bottomeven# +#center#____________________________________________________________ +2 - % #right#GMD +#end# +#bottomodd# +#center#____________________________________________________________ +GMD #right#2 - % +#end# + + +2.5 Programmstruktur + +Ein ELAN-Programm kann aus mehreren Moduln (Bausteinen) aufgebaut sein, die in +ELAN PACKETs genannt werden. Das letzte PACKET wird "main packet" genannt, +weil in diesem das eigentliche Benutzerprogramm (Hauptprogramm) enthalten ist. +Dies soll eine Empfehlung sein, in welcher Reihenfolge die Elemente eines PACKETs +geschrieben werden sollen: + +Ein "main packet" kann aus folgenden Elementen bestehen: + +a) Deklarationen und Anweisungen. Diese müssen nicht in einer bestimmten Reihen­ + folge im Programm erscheinen, sondern es ist möglich, erst in dem Augenblick zu + deklarieren, wenn z.B. eine neue Variable benötigt wird. Es ist jedoch gute Pro­ + grammierpraxis, die meisten Deklarationen an den Anfang eines Programms oder + Programmteils (Refinement, Prozedur) zu plazieren. + + ; + + +____________________________________________________________________________ + ........................... Beispiel: ......................... + INT VAR erste zahl, zweite zahl; + + page; + put ("erste Zahl = "); get (erste zahl); + put ("zweite Zahl ="); get (zweite zahl) + +____________________________________________________________________________ + + +b) Deklarationen, Refinements und Anweisungen. In diesem Fall ist es notwendig, die + Refinements hintereinander zu plazieren. Refinement-Aufrufe und/oder + Anweisungen sollten textuell vorher erscheinen. + + ; + . + + + Innerhalb der Refinements sind Anweisungen und/oder Deklarationen möglich. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + INT VAR erste zahl, zweite zahl; + + loesche bildschirm; + lies zwei zahlen ein. + + loesche bildschirm: + page. + + lies zwei zahlen ein: + put ("erste Zahl = "); get (erste zahl); + put ("zweite Zahl ="); get (zweite zahl). + +____________________________________________________________________________ + + +c) Deklarationen, Prozeduren und Anweisungen. Werden Prozeduren vereinbart, + sollte man sie nach den Deklarationen plazieren. Danach sollten die Anweisungen + folgen: + + ; + ; + + + Mehrere Prozeduren werden durch ";" voneinander getrennt. In diesem Fall sind + die Datenobjekte aus den Deklarationen außerhalb von Prozeduren statisch, d.h. + während der gesamten Laufzeit des Programm vorhanden. Solche Datenobjekte + werden auch PACKET-Daten genannt. Im Gegensatz dazu sind die Datenobjekte + aus Deklarationen in Prozeduren dynamische Datenobjekte, die nur während der + Bearbeitungszeit der Prozedur existieren. Innerhalb einer Prozedur dürfen wieder­ + um Refinements verwendet werden. Ein Prozedur-Rumpf hat also den formalen + Aufbau wie unter a) oder b) geschildert. + + Die Refinements und Datenobjekte, die innerhalb einer Prozedur deklariert wurden, + sind lokal zu dieser Prozedur, d.h. können von außerhalb nicht angesprochen + werden. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + INT VAR erste zahl, zweite zahl; + + PROC vertausche (INT VAR a, b): + INT VAR x; + + x := a; + a := b; + b := x + END PROC vertausche; + + put ("erste Zahl = "); get (erste zahl); + put ("zweite Zahl ="); get (zweite zahl); + IF erste zahl > zweite zahl + THEN vertausche (erste zahl, zweite zahl) + FI + +____________________________________________________________________________ + + +d) Deklarationen, Prozeduren, Anweisungen und PACKET-Refinements. Zusätzlich + zu der Möglichkeit c) ist es erlaubt, neben den Anweisungen außerhalb einer + Prozedur auch Refinements zu verwenden: + + ; + ; + . + + + Diese Refinements können nun in Anweisungen außerhalb der Prozeduren benutzt + werden oder auch durch die Prozeduren (im letzteren Fall spricht man analog zu + globalen PACKET-Daten auch von PACKET-Refinements oder globalen Refine­ + ments). In PACKET-Refinements dürfen natürlich keine Datenobjekte verwandt + werden, die lokal zu einer Prozedur sind. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + INT VAR erste zahl, zweite zahl; + + PROC vertausche (INT VAR a, b): + INT VAR x; + + x := a; + a := b; + b := x + END PROC vertausche; + + loesche bildschirm; + lies zwei zahlen ein; + ordne die zahlen. + + loesche bildschirm: + page. + + lies zwei zahlen ein: + put ("erste Zahl = "); get (erste zahl); + put ("zweite Zahl ="); get (zweite zahl). + + ordne die zahlen: + IF erste zahl > zweite zahl + THEN vertausche (erste zahl, zweite zahl) + FI + +____________________________________________________________________________ +#page# + +2.6 Zusammengesetzte Datentypen + +In ELAN gibt es die Möglichkeit, gleichartige oder ungleichartige Datenobjekte zu +einem Objekt zusammenzufassen. + + +2.6.1 Reihung + +Die Zusammenfassung gleichartiger Datenobjekte, wird in ELAN eine Reihung (ROW) +genannt. Die einzelnen Objekte einer Reihung werden Elemente genannt. + +Eine Reihung wird folgendermaßen deklariert: + +- Schlüsselwort #on("i")##on("b")#ROW#off("i")##off("b")# +- Anzahl der zusammengefaßten Elemente + (INT-Denoter oder durch LET definierter Name) +- Datentyp der Elemente +- Zugriffsrecht ( #on("i")##on("b")#VAR#off("i")##off("b")# oder #on("i")##on("b")#CONST#off("i")##off("b")# ) +- Name der Reihung. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + ROW 10 INT VAR feld + +____________________________________________________________________________ + + +Im obigen Beispiel wird eine Reihung von 10 INT-Elementen deklariert. ROW 10 INT +ist ein (neuer, von den elementaren unterschiedlicher) Datentyp, für den keine Opera­ +tionen definiert sind, außer der Zuweisung. Das Accessrecht (VAR im obigen Bei­ +spiel) und der Name ('feld') gilt - wie bei den elementaren Datentypen - für diesen +neuen Datentyp, also für alle 10 Elemente. + +Warum gibt es keine Operationen außer der Zuweisung? Das wird sehr schnell +einsichtig, wenn man bedenkt, daß es ja sehr viele Datentypen (zusätzlich zu den +elementaren) gibt, weil Reihungen von jedem Datentyp gebildet werden können: + + +ROW 1 INT ROW 1 REAL +ROW 2 INT ROW 2 REAL + : : +ROW maxint INT ROW maxint REAL + +ROW 1 TEXT ROW 1 BOOL +ROW 2 TEXT ROW 2 BOOL + : : +ROW maxint TEXT ROW maxint BOOL + + +Für die elementaren INT-, REAL-, BOOL- und TEXT-Datentypen sind unter­ +schiedliche Operationen definiert. Man müßte nun für jeden dieser zusammengesetz­ +ten Datentypen z.B. auch 'get'- und 'put'-Prozeduren schreiben, was allein vom +Schreibaufwand sehr aufwendig wäre. Das ist der Grund dafür, daß es keine vorgege­ +bene Operationen auf zusammengesetzte Datentypen gibt. + +Zugegebenermaßen könnte man mit solchen Datentypen, die nur über eine Operation +verfügen (Zuweisung), nicht sehr viel anfangen, wenn es nicht eine weitere vorgege­ +bene Operation gäbe, die Subskription. Sie erlaubt es, auf die Elemente einer Reih­ +ung zuzugreifen und den Datentyp der Elemente "aufzudecken". + +Form: + +Rowname #on("i")##on("b")#[#off("i")##off("b")# Indexwert #on("i")##on("b")#]#off("i")##off("b")# + +Beispiel: + + +feld [3] + + +bezieht sich auf das dritte Element der Reihung 'feld' und hat den Datentyp INT. Für +INT-Objekte haben wir aber einige Operationen, mit denen wir arbeiten können. + +____________________________________________________________________________ + ........................... Beispiele: ........................ + feld [3] := 7; + feld [4] := feld [3] + 4; + +____________________________________________________________________________ + + +Eine Subskription "schält" also vom Datentyp ein ROW ab und liefert ein Element der +Reihung. Die Angabe der Nummer des Elements in der Reihung nennt man Subskript +oder Index (in obigem Beispiel '3'). Der Subskript wird in ELAN in eckigen Klammern +angegeben, um eine bessere Unterscheidung zu den runden Klammern in Ausdrücken +zu erreichen. Ein subskribiertes ROW-Datenobjekt kann also überall da verwendet +werden, wo ein entsprechender Datentyp benötigt wird (Ausnahme: nicht als Schlei­ +fenvariable). + +____________________________________________________________________________ + ........................... Beispiel: ......................... + PROC get (ROW 10 INT VAR feld): + INT VAR i; + FOR i FROM 1 UPTO 10 REP + put (i); put ("tes Element bitte:"); + get (feld [i]); + line + END REP + END PROC get; + + PROC put (ROW 10 INT CONST feld): + INT VAR i; + FOR i FROM 1 UPTO 10 REP + put (i); put ("tes Element ist:"); + put (feld [i]); + line + END REP + END PROC put + +____________________________________________________________________________ + + +In diesen Beispielen werden Reihungen als Parameter benutzt. + +Diese beiden Prozeduren werden im folgenden Beispiel benutzt um 10 Werte einzu­ +lesen und die Summe zu berechnen: + +____________________________________________________________________________ + ........................... Beispiel: ......................... + ROW 10 INT VAR werte; + lies werte ein; + summiere sie; + drucke die summe und einzelwerte. + + lies werte ein: + get (werte). + + summiere sie: + INT VAR summe :: 0, i; + FOR i FROM 1 UPTO 10 REP + summe INCR werte [i] + END REP. + + drucke die summe und einzelwerte: + put (werte); + line; + put ("Summe:"); put (summe). + +____________________________________________________________________________ + + +Da es möglich ist, von jedem Datentyp eine Reihung zu bilden, kann man natürlich +auch von einer Reihung eine Reihung bilden: + +____________________________________________________________________________ + ........................... Beispiel: ......................... + ROW 5 ROW 10 INT VAR matrix + +____________________________________________________________________________ + + +Für eine "doppelte" Reihung gilt das für "einfache" Reihungen gesagte. Wiederum +existieren keine Operationen für dieses Datenobjekt (außer der Zuweisung), jedoch ist +es durch Subskription möglich, auf die Elemente zuzugreifen: + + +matrix [3] + + +liefert ein Datenobjekt mit dem Datentyp ROW 10 INT. + +Subskribiert man jedoch 'matrix' nochmals, so erhält man ein INT: + + +matrix [2] [8] + + +(jede Subskription "schält" von Außen ein ROW vom Datentyp ab). +#page# + +2.6.2 Struktur + +Strukturen sind Datenverbunde wie Reihungen, aber die Komponenten können unglei­ +chartige Datentypen haben. Die Komponenten von Strukturen heißen Felder (Reihun­ +gen: Elemente) und der Zugriff auf ein Feld Selektion (Reihungen: Subskription). Eine +Struktur ist - genauso wie bei Reihungen - ein eigener Datentyp, der in einer +Deklaration angegeben werden muß. + +Die Deklaration einer Struktur sieht folgendermaßen aus: + +- Schlüsselwort #schl ("STRUCT#off("i")##off("b")# +- unterschiedliche Datenobjekte in Klammern. Die Datenobjekte werden mit Datentyp und Namen angegeben +- Zugriffsrecht ( #on("i")##on("b")#VAR#off("i")##off("b")# oder #on("i")##on("b")#CONST#off("i")##off("b")# ) +- Name der Struktur. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + STRUCT (TEXT name, INT alter) VAR ich + +____________________________________________________________________________ + + +Wiederum existieren keine Operationen auf Strukturen außer der Zuweisung und der +Selektion, die es erlaubt, Komponenten aus einer Struktur herauszulösen. + +Die Selektion hat folgende Form: + +Objektname #on("i")##on("b")#.#off("i")##off("b")# Feldname + +Beispiele: + + +ich . name +ich . alter + + +Die erste Selektion liefert einen TEXT-, die zweite ein INT-Datenobjekt. Mit diesen +(selektierten) Datenobjekten kann - wie gewohnt - gearbeitet werden (Ausnahme: +nicht als Schleifenvariable). + +Zum Datentyp einer Struktur gehören auch die Feldnamen: + +____________________________________________________________________________ + ........................... Beispiel: ......................... + STRUCT (TEXT produkt name, INT artikel nr) VAR erzeugnis + +____________________________________________________________________________ + + +Die obige Struktur ist ein anderer Datentyp als im ersten Beispiel dieses Abschnitts, +da die Namen der Felder zur Unterscheidung hinzugezogen werden. Für Strukturen - +genauso wie bei Reihungen - kann man sich neue Operationen definieren. + +Im folgenden Programm werden eine Struktur, die Personen beschreibt, die Prozedu­ +ren 'put', 'get' und der dyadische Operator HEIRATET definiert. Anschließend werden +drei Paare verHEIRATET. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + PROC get (STRUCT (TEXT name, vorname, INT alter) VAR p): + put ("bitte Nachname:"); get ( p.name); + put ("bitte Vorname:"); get ( p.vorname); + put ("bitte Alter:"); get ( p.alter); + line + END PROC get; + + PROC put (STRUCT (TEXT name, vorname, INT alter) CONST p): + put (p.vorname); put (p.name); + put ("ist"); + put (p.alter); + put ("Jahre alt"); + line + END PROC put; + + OP HEIRATET + (STRUCT (TEXT name, vorname, INT alter) VAR w, + STRUCT (TEXT name, vorname, INT alter) CONST m): + w.name := m.name + END OP HEIRATET; + +____________________________________________________________________________ + + +____________________________________________________________________________ + ........................... Beispiel: ......................... + ROW 3 STRUCT (TEXT name, vorname, INT alter) VAR frau, + mann; + + personendaten einlesen; + heiraten lassen; + paardaten ausgeben. + + personendaten einlesen: + INT VAR i; + FOR i FROM 1 UPTO 3 REP + get (frau [i]); + get (mann [i]) + END REP. + + heiraten lassen: + FOR i FROM 1 UPTO 3 REP + frau [i] HEIRATET mann [i] + END REP. + + paardaten ausgeben: + FOR i FROM 1 UPTO 3 REP + put (frau [i]); + put ("hat geheiratet:"); line; + put (mann [i]); line + END REP. + +____________________________________________________________________________ + + +Reihungen und Strukturen dürfen miteinander kombiniert werden, d.h. es darf eine +Reihung in einer Struktur erscheinen oder es darf eine Reihung von einer Struktur +vorgenommen werden. Selektion und Subskription sind in diesen Fällen in der Reihen­ +folge vorzunehmen, wie die Datentypen aufgebaut wurden (von außen nach innen). +#page# + +2.6.3 LET-Konstrukt für zusammengesetzte Datentypen + + +Die Verwendung von Strukturen oder auch Reihungen kann manchmal schreibauf­ +wendig sein. Mit dem LET-Konstrukt darf man Datentypen einen Namen geben. +Dieser Name steht als Abkürzung und verringert so die Schreibarbeit. Zusätzlich wird +durch die Namensgebung die Lesbarkeit des Programms erhöht. + +Form: + +#on("i")##on("b")#LET#off("i")##off("b")# Name #on("i")##on("b")#=#off("i")##off("b")# Datentyp + +Der Name darf nur aus Großbuchstaben (ohne Blanks) bestehen. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + LET PERSON = STRUCT (TEXT name, vorname, INT alter); + + PROC get (PERSON VAR p): + put ("bitte Nachname:"); get ( p.name); + put ("bitte Vorname:"); get ( p.vorname); + put ("bitte Alter:"); get ( p.alter); + line + END PROC get; + + PROC put (PERSON CONST p): + put (p.vorname); put (p.name); put ("ist"); + put (p.alter); put ("Jahre alt"); line + END PROC put; + + OP HEIRATET (PERSON VAR f, PERSON CONST m): + f.name := m.name + END OP HEIRATET; + + ROW 3 PERSON VAR mann, frau; + +____________________________________________________________________________ + + +Überall, wo der abzukürzende Datentyp verwandt wird, kann stattdessen der Name +PERSON benutzt werden. Wohlgemerkt: PERSON ist kein neuer Datentyp, sondern +nur ein Name, der für STRUCT (....) steht. Der Zugriff auf die Komponenten des +abgekürzten Datentyps bleibt erhalten (was bei abstrakten Datentypen, die später +erklärt werden, nicht mehr der Fall ist). + +Neben der Funktion der Abkürzung von Datentypen kann das LET-Konstrukt auch +zur Namensgebung für Denoter verwandt werden (siehe 2.3.1.2). + + + +2.6.4 Denoter für zusammengesetzte + Datentypen (Konstruktor) + + +Oft ist es notwendig, Datenverbunden Werte zuzuweisen (z.B.: bei der Initialisierung). +Dies kann durch normale Zuweisungen erfolgen: + +____________________________________________________________________________ + ........................... Beispiel: ......................... + LET PERSON = STRUCT (TEXT name, vorname, INT alter); + + PERSON VAR mann; + + mann.name := "meier"; + mann.vorname := "egon"; + mann.alter := 27 + +____________________________________________________________________________ + + +Eine andere Möglichkeit für die Wertbesetzung von Datenverbunden ist der Konstruk­ +tor: + +Form: + +Datentyp #on("i")##on("b")#:#off("i")##off("b")# #on("i")##on("b")#(#off("i")##off("b")# Wertliste #on("i")##on("b")#)#off("i")##off("b")# + +In der Wertliste wird für jede Komponente des Datentyps, durch Kommata getrennt, +ein Wert aufgeführt. Besteht eine der Komponenten wiederum aus einem Datenver­ +bund, muß innerhalb des Konstruktors wiederum ein Konstruktor eingesetzt werden. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + LET PERSON = STRUCT (TEXT name, vorname, INT alter); + + PERSON VAR mann, frau; + + frau := PERSON : ( "niemeyer", "einfalt", 65); + frau HEIRATET PERSON : ( "meier", "egon", 27) + +____________________________________________________________________________ + + +Ein Konstruktor ist also ein Mechanismus, um ein Datenobjekt eines Datenverbundes +in einem Programm zu notieren. + +Konstruktoren sind natürlich für Reihungen auch möglich: + +____________________________________________________________________________ + ........................... Beispiel: ......................... + ROW 7 INT VAR feld; + feld := ROW 7 INT : ( 1, 2, 3, 4, 5, 6, 7); +____________________________________________________________________________ +#page# + +2.7 Abstrakte Datentypen + + +2.7.1 Definition neuer Datentypen + +Im Gegensatz zur LET-Vereinbarung für Datentypen, bei der lediglich ein neuer +Name für einen bereits vorhandenen Datentyp eingeführt wird und bei der somit auch +keine neuen Operationen definiert werden müssen (weil die Operationen für den +abzukürzenden Datentyp verwandt werden können), wird durch eine TYPE-Verein­ +barung ein gänzlich neuer Datentyp eingeführt. + +Form: + +#on("i")##on("b")#TYPE#off("i")##off("b")# Name #on("i")##on("b")#=#off("i")##off("b")# Feinstruktur + +Der Name darf nur aus Großbuchstaben (ohne Blanks) bestehen. Die Feinstruktur +(konkreter Typ, Realisierung des Datentyps) kann jeder bereits definierte Datentyp +sein. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + TYPE PERSON = STRUCT (TEXT name, vorname, INT alter) + +____________________________________________________________________________ + + +Der neudefinierte Datentyp wird abstrakter Datentyp genannt. Im Gegensatz zu +Strukturen und Reihungen stehen für solche Datentypen noch nicht einmal die Zuwei­ +sung zur Verfügung. Ein solcher Datentyp kann genau wie alle anderen Datentypen +verwendet werden (Deklarationen, Parameter, wertliefernde Prozeduren, als Kompo­ +nenten in Reihungen und Strukturen usw.). + +Wird der Datentyp über die Schnittstelle des PACKETs anderen Programmteilen zur +Verfügung gestellt, so müssen Operatoren und/oder Prozeduren für den Datentyp +ebenfalls "herausgereicht" werden. Da dann der neudefinierte Datentyp genauso wie +alle anderen Datentypen verwandt werden kann, aber die Komponenten (Feinstruktur) +nicht zugänglich sind, spricht man von abstrakten Datentypen. + +Welche Operationen sollten für einen abstrakten Datentyp zur Verfügung stehen? +Obwohl das vom Einzelfall abhängt, werden meistens folgende Operationen und +Prozeduren definiert: + +- 'get'- und 'put'-Prozeduren. +- Zuweisung (auch für die Initialisierung notwendig). +- Denotierungs-Prozedur (weil kein Konstruktor für den abstrakten Datentyp außer­ + halb des definierenden PACKETs zur Verfügung steht) + + + +2.7.2 Konkretisierung + +Um neue Operatoren und/oder Prozeduren für einen abstrakten Datentyp zu schrei­ +ben, ist es möglich, auf die Komponenten des Datentyps (also auf die Feinstruktur) +mit Hilfe des Konkretisierers zuzugreifen. Der Konkretisierer arbeitet ähnlich wie die +Subskription oder Selektion: er ermöglicht eine typmäßige Umbetrachtung vom ab­ +strakten Typ zum Datentyp der Feinstruktur. + +Form: + +#on("i")##on("b")#CONCR#off("i")##off("b")# #on("i")##on("b")#(#off("i")##off("b")# Ausdruck #on("i")##on("b")#)#off("i")##off("b")# + +____________________________________________________________________________ + ........................... Beispiel: ......................... + TYPE MONAT = INT; + + PROC put (MONAT CONST m): + put ( CONCR (m)) + END PROC put; + +____________________________________________________________________________ + + +Der Konkretisierer ist bei Feinstrukturen notwendig, die von elementarem Datentyp +sind. Besteht dagegen die Feinstruktur aus Reihungen oder Strukturen, dann wird +durch eine Selektion oder Subskription eine implizite Konkretisierung vorgenommen. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + TYPE LISTE = ROW 100 INT; + + LISTE VAR personal nummer; + ... + personal nummer [3] := ... + (* das gleiche wie *) + CONCR (personal nummer) [3] := ... + +____________________________________________________________________________ + + +2.7.3 Denoter für abstrakte + Datentypen (Konstruktor) + + +Denoter für neudefinierte Datentypen werden mit Hilfe des Konstruktors gebildet: + +Form: + +Datentyp #on("i")##on("b")#:#off("i")##off("b")# #on("i")##on("b")#(#off("i")##off("b")# Wertliste #on("i")##on("b")#)#off("i")##off("b")# + +In der Wertliste wird für jede Komponente des Datentyps, durch Kommata getrennt, +ein Wert aufgeführt. Besteht eine der Komponenten wiederum aus einem Datenver­ +bund, muß innerhalb des Konstruktors wiederum ein Konstruktor eingesetzt werden. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + TYPE GEHALT = INT; + + GEHALT VAR meins :: GEHALT : (10000); + +____________________________________________________________________________ + + +Besteht die Feinstruktur aus einem Datenverbund, muß der Konstruktor u.U. mehrfach +geschachtelt angewandt werden: + +____________________________________________________________________________ + ........................... Beispiel: ......................... + TYPE KOMPLEX = ROW 2 REAL; + + KOMPLEX CONST x :: KOMPLEX : ( ROW 2 REAL : ( 1.0, 2.0)); + +____________________________________________________________________________ + + +Auf die Feinstruktur über den Konkretisierer eines neudefinierten Datentyps darf nur in +dem PACKET zugegriffen werden, in dem der Datentyp definiert wurde. Der Konstruk­ +tor kann ebenfalls nur in dem typdefinierenden PACKET verwandt werden. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + PACKET widerstaende DEFINES WIDERSTAND, REIHE, PARALLEL, + :=, get, put: + + TYPE WIDERSTAND = INT; + + OP := (WIDERSTAND VAR l, WIDERSTAND CONST r): + CONCR (l) := CONCR (r) + END OP :=; + + PROC get (WIDERSTAND VAR w): + INT VAR i; + get (i); + w := WIDERSTAND : (i) + END PROC get; + + PROC put (WIDERSTAND CONST w): + put (CONCR (w)) + END PROC put; + + WIDERSTAND OP REIHE (WIDERSTAND CONST l, r): + WIDERSTAND : ( CONCR (l) + CONCR (r)) + END OP REIHE; + + WIDERSTAND OP PARALLEL (WIDERSTAND CONST l, r): + WIDERSTAND : + ((CONCR (l) * CONCR (r)) DIV (CONCR (l) + CONCR (r))) + END OP PARALLEL + + END PACKET widerstaende + +____________________________________________________________________________ + + +Dieses Programm realisiert den Datentyp WIDERSTAND und mit den Operationen +eine Fachsprache, mit dem man nun leicht WIDERSTANDs-Netzwerke berechnen +kann, wie z.B. folgendes: + + + + +---R4---+ + | | + +---R1---+ +---R5---+ + | | | | + ---+ +---R3---+ +--- + | | | | + +---R2---+ +---R6---+ + | | + +---R7---+ + + +Zur Berechnung des Gesamtwiderstandes kann nun folgendes Programm geschrieben +werden: + +____________________________________________________________________________ + ........................... Beispiel: ......................... + ROW 7 WIDERSTAND VAR r; + widerstaende einlesen; + gesamtwiderstand berechnen; + ergebnis ausgeben. + + widerstaende einlesen: + INT VAR i; + FOR i FROM 1 UPTO 7 REP + put ("bitte widerstand R"); put (i); put (":"); + get (r [i]); + END REP. + + gesamtwiderstand berechnen: + WIDERSTAND CONST rgesamt :: (r [1] PARALLEL r [2]) REIHE + r [3] REIHE (r [4] PARALLEL r [5] PARALLEL r [6] + PARALLEL r [7]). + + ergebnis ausgeben: + line; + put (rgesamt). +____________________________________________________________________________ +#page# + +2.8 Dateien + +Dateien werden benötigt, wenn + +- Daten über die Abarbeitungszeit eines Programms aufbewahrt werden sollen; +- der Zeitpunkt oder Ort der Datenerfassung nicht mit dem Zeitpunkt oder Ort der + Datenverarbeitung übereinstimmt; +- die gesamte Datenmenge nicht auf einmal in den Zentralspeicher eines Rechners + paßt; +- die Anzahl und/oder Art der Daten nicht von vornherein bekannt sind. + +Eine Datei ("file") ist eine Zusammenfassung von Daten, die auf Massenspeichern +aufbewahrt wird. Dateien sind in bestimmten Informationsmengen, den Sätzen ("re­ +cords") organisiert. + + + +2.8.1 Datentypen FILE und DIRFILE + +In ELAN gibt es zwei Arten von Dateien. Sie werden durch die Datentypen FILE +und DIRFILE realisiert: + + + +FILE: +sequentielle Dateien. Die Sätze können nur sequentiell gelesen bzw. geschrieben +werden. Eine Positionierung ist nur zum nächsten Satz möglich. + + +DIRFILE: +indexsequentielle Dateien. Die Positionierung erfolgt direkt mit Hilfe eines Schlüssels +("key") oder Index, kann aber auch sequentiell vorgenommen werden. + +#on("b")#Wichtig: #off("b")# +DIRFILEs sind auf dem EUMEL-System standardmäßig nicht implementiert! Deswe­ +gen wird auf diesen Dateityp hier nicht weiter eingegangen. +#page# + +2.8.2 Deklaration und Assoziierung + +Dateien müssen in einem ELAN-Programm - wie alle anderen Objekte auch - +deklariert werden. + +Form: + +#on("i")##on("b")#FILE#off("i")##off("b")# #on("i")##on("b")#VAR#off("i")##off("b")# interner Dateibezeichner + +____________________________________________________________________________ + ........................... Beispiel: ......................... + FILE VAR f + +____________________________________________________________________________ + + +Dabei ist zu beachten, daß im EUMEL-System alle FILEs als VAR deklariert werden +müssen, denn jede Lese/Schreib-Operation verändert einen FILE. + +Dateien werden normalerweise vom Betriebsystem eines Rechners aufbewahrt und +verwaltet. Somit ist eine Verbindung von einem ELAN-Programm, in dem eine Datei +unter einem Namen - wie jedes andere Datenobjekt auch - angesprochen werden +soll, und dem Betriebssystem notwendig. Dies erfolgt durch die sogenannte Assozi­ +ierungsprozedur. Die Assoziierungsprozedur 'sequential file' hat die Aufgabe, eine in +einem Programm deklarierte FILE VAR mit einer bereits vorhandenen oder noch +einzurichtenden Datei des EUMEL-Systems zu koppeln. + +Form: + +#on("i")##on("b")#sequential file#off("i")##off("b")# #on("i")##on("b")#(#off("i")##off("b")# Betriebsrichtung, Dateiname #on("i")##on("b")#)#off("i")##off("b")# + +Es gibt folgende Betriebsrichtungen (TRANSPUTDIRECTIONs): + + +input: +Die Datei kann vom Programm nur gelesen werden. Durch 'input' wird bei der Asso­ +ziierung automatisch auf den ersten Satz der Datei positioniert. Ist die zu lesende +Datei nicht vorhanden, wird ein Fehler gemeldet. + + +output: +Die Datei kann vom Programm nur beschrieben werden. Durch 'output' wird bei der +Assoziierung automatisch hinter den letzten Satz der Datei positioniert (bei einer +leeren Datei also auf den ersten Satz). Ist die Datei vor der Assoziierung nicht vor­ +handen, wird sie automatisch eingerichtet. + + +modify: +Im EUMEL-System gibt es noch die Betriebsrichtung 'modify'. +Die Datei kann vom Programm in beliebiger Weise gelesen und beschrieben werden. +Im Gegensatz zu den Betriebsrichtungen 'input' und 'output', bei denen ausschließlich +ein rein sequentielles Lesen oder Schreiben erlaubt ist, kann bei 'modify' beliebig +positioniert, gelöscht, eingefügt und neu geschrieben werden. + +Nach erfolgter Assoziiierung ist auf den zuletzt bearbeiteten Satz positioniert. Die +Datei wird automatisch eingerichtet, wenn sie vor der Assoziierung nicht vorhanden +war. + +Der zweite Parameter der Assoziierungsprozedur gibt an, unter welchem Namen die +Datei in der Task existiert oder eingerichtet werden soll. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + FILE VAR meine datei :: sequential file (output, "xyz"); + +____________________________________________________________________________ + + +Folgendes Beispiel zeigt ein Programm, welches eine Datei liest und auf dem Ausga­ +bemedium ausgibt: + +____________________________________________________________________________ + ........................... Beispiel: ......................... + FILE VAR f :: sequential file (input, "datei1"); + TEXT VAR satz; + WHILE NOT eof (f) REP + getline (f, satz); + putline (satz); + END REP. + +____________________________________________________________________________ + + +Eine genau Übersicht der für Dateien existierende Operatoren und Prozeduren finden +Sie im Teil 5.3. +#page# + +2.9 Abstrakte Datentypen + im EUMEL-System + + + +2.9.1 Datentyp TASK + +Tasks müssen im Rechnersystem eindeutig identifiziert werden; sogar im EUMEL- +Rechner-Netz sind Tasks eindeutig identifizierbar. Dazu wird der spezielle Datentyp +'TASK' benutzt, denn die Identifizierung einer Task über den Namen ist nicht eindeu­ +tig. Der Benutzer kann ja einen Tasknamen ändern, eine Task löschen und eine +neue Task mit gleichem Namen einrichten, die jedoch nicht gleich reagiert. Somit +werden Tasks eindeutig über Variablen vom Datentyp TASK identifiziert. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + TASK VAR plotter := task ("PLOTTER 1") + +____________________________________________________________________________ + + +Die Taskvariable 'plotter' bezeichnet jetzt die Task im System, die augenblicklich den +Namen "PLOTTER 1" hat. Die Prozedur 'task' liefert den systeminternen Taskbe­ +zeichner. + +Nun sind Taskvariablen auch unter Berücksichtigung der Zeit und nicht nur im aktuel­ +len Systemzustand eindeutig. Der Programmierer braucht sich also keine Sorgen +darüber zu machen, daß seine Taskvariable irgendwann einmal eine "falsche" Task +(nach Löschen von "PLOTTER 1" neu eingerichtete gleichen oder anderen Namens) +identifiziert. Wenn die Task "PLOTTER 1" gelöscht worden ist, bezeichnet 'plotter' +keine gültige Task mehr. + +Unbenannte Tasks haben alle den Pseudonamen "-". Sie können nur über Taskvari­ +ablen angesprochen werden. + + +____________________________________________________________________________ + ........................... Beispiel: ......................... + PROC generate shutup manager: + TASK VAR son; + begin ("shutup", PROC shutup manager, son) + END PROC generate shutup manager; + + PROC shutup manager: + disable stop; + command dialogue (TRUE); + REP + break; + line; + IF yes ("shutup") + THEN clear error; + shutup + FI + PER + END PROC shutup manager + +____________________________________________________________________________ + + +Ein Taskvariable wird zum Beispiel als Parameter für die Prozedur 'begin' benötigt. + +begin + #on("b")#PROC begin (TEXT CONST son name, PROC start, + TASK VAR new task)#off("b")# + Die Prozedur richtet eine Sohntask mit Namen 'son name' (im Beispiel: shutup) + ein, die mit der Prozedur 'start' (im Beispiel: shutup manager) gestartet wird. 'new + task' (im Beispiel: son) identifiziert den Sohn, falls die Sohntask korrekt eingerich­ + tet wurde. +#page# + +2.9.2 Datentyp THESAURUS + +Ein Thesaurus ist ein Namensverzeichnis, das bis zu 200 Namen beinhalten kann. +Dabei muß jeder Name mindestens ein Zeichen und höchstens 100 Zeichen lang sein. +Steuerzeichen (code < 32) werden im Namen folgendermaßen umgesetzt: + +#on("i")##on("b")#steuerzeichen#off("b")##off("i")# wird umgesetzt in #on("i")##on("b")#"""" + code(steuerzeichen) + """"#off("b")##off("i")# + +Ein Thesaurus ordnet jedem eingetragenen Namen einen Index zwischen 1 und 200 +(einschließlich) zu. Diese Indizes bieten dem Anwender die Möglichkeit, Thesauri zur +Verwaltung benannter Objekte zu verwenden. (Der Zugriff erfolgt dann über den Index +eines Namens in einem Thesaurus). So werden Thesauri u.a. von der Dateiverwaltung +benutzt. Sie bilden die Grundlage der ALL- und SOME-Operatoren. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + initialisiere; + arbeite thesaurus ab. + + initialisiere: + THESAURUS VAR eine auswahl :: SOME (myself); + TEXT VAR thesaurus element; + INT VAR index :: 0. + + arbeite thesaurus ab: + REPEAT + get (eine auswahl, thesaurus element, index); + IF thesaurus element = "" + THEN LEAVE arbeite thesaurus ab + FI; + fuehre aktionen durch + PER. + + fuehre aktionen durch: + edit (thesaurus element); + lineform (thesaurus element); + pageform (thesaurus element); + print (thesaurus element). + +____________________________________________________________________________ + + +Dieses Beispiel führt für eine Auswahl der in der Task befindlichen Dateien nachein­ +ander die Kommandos 'edit', 'lineform', 'pageform' und 'print' aus. + +Die benutzten Operatoren und Prozeduren leisten folgendes: + +#ix("SOME")# + #on("b")#THESAURUS OP SOME (TASK CONST task) #off("b")# + Der Operator bietet das Verzeichnis der in der angegeben Task befindlichen + Dateien zum Editieren an. Namen, die nicht gewünscht sind, müssen aus dem + Verzeichnis gelöscht werden. + + +#ix("get")# + #on("b")#PROC get (THESAURUS CONST t, TEXT VAR name, INT VAR index) + #off("b")# Die Prozedur liefert den nächsten Eintrag aus dem angegebenen Thesaurus 't'. + 'Nächster' heißt hier, der kleinste vorhandene mit einem Index größer als 'index'. + Dabei wird in 'name'der Name und in 'index'der Index des Eintrags geliefert. +#page# + +2.9.3 Datenräume + +Datenräume sind die Grundlage von Dateien im EUMEL-System. Einen Datenraum +kann man sich als eine Sammlung von Daten vorstellen (u.U. leer). Man kann einem +Datenraum durch ein Programm einen Datentyp "aufprägen". Nach einem solchen +"Aufpräge"-Vorgang kann der Datenraum wie ein "normaler" Datentyp behandelt +werden. + +Standarddateien (FILEs) sind eine besondere Form von Datenräumen. Sie können nur +Texte aufnehmen, da sie ja hauptsächlich für die Kommunikation mit dem Menschen +(vorwiegend mit Hilfe des Editors bzw. Ein-/ Ausgabe) gedacht sind. Will man Zahlen +in einen FILE ausgeben, so müssen diese zuvor in Texte umgewandelt werden. Hier­ +für stehen Standardprozeduren zur Verfügung (z.B. 'put (f, 17)'). + +Will man aber Dateien zur Kommunikation zwischen Programmen verwenden, die +große Zahlenmengen austauschen, verursachen die Umwandlungen von Zahlen in +TEXTe und umgekehrt unnötigen Rechenaufwand. Zu diesem Zweck werden im +EUMEL-System Datenräume eingesetzt, die es gestatten, beliebige Strukturen +(Typen) in Dateien zu speichern. Solche Datenräume kann man weder mit dem Editor +noch mit dem Standarddruckprogramm (print) bearbeiten, da diese ja den Typ des in +dem Datenraum gespeicherten Objektes nicht kennen. + + + +2.9.3.1 Datentyp DATASPACE + +Datenräume können als eigener Datentyp (DATASPACE) in einem Programm behan­ +delt werden. Somit können Datenräume (als Ganzes) ohne Kenntnis eines eventuell +(vorher oder später) aufgeprägten Typs benutzt werden. + +Als Operationen auf DATASPACE-Objekte sind nur Transporte, Löschen und Zuwei­ +sung zugelassen. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + DATASPACE VAR ds + +____________________________________________________________________________ + + +Für Datenräume ist die Zuweisung definiert. Der Zuweisungsoperator (':=') bewirkt +eine Kopie des Datenraums vom rechten auf den linken Operanden. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + DATASPACE VAR datenraum :: nilspace; + +____________________________________________________________________________ + + +Die Prozedur 'nilspace' liefert einen leeren Datenraum. Der Datenraum 'datenraum' ist +also eine Kopie des leeren Datenraums. + +Die Prozeduren und Operatoren für Datenräume werden im Teil 5.4.7 beschrieben. +#page# + +2.9.3.2 BOUND-Objekte + +Wie bereits erwähnt, kann man einem Datenraum einen Datentyp aufprägen. Dazu +werden #ib#BOUND#ie#-Objekte benutzt. Mit dem Schlüsselwort #on("i")##on("b")#BOUND#off("i")##off("b")#, welches in der +Deklaration vor den Datentyp gestellt wird, teilt man dem ELAN-Compiler mit, daß +die Werte eines Datentyps in einem Datenraum gespeichert sind bzw. gespeichert +werden sollen. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + BOUND ROW 1000 REAL VAR liste + +____________________________________________________________________________ + + +Die Ankopplung des BOUND-Objekts an eine Datei erfolgt mit dem Operator #on("i")##on("b")#:=#off("i")##off("b")#. + +Form: + +BOUND-Objekt #on("i")##on("b")#:=#off("i")##off("b")# Datenraum + +____________________________________________________________________________ + ........................... Beispiel: ......................... + BOUND ROW 1000 REAL VAR gehaltsliste := new ("Gehälter") + +____________________________________________________________________________ + + +Die Prozedur 'new' kreiert dabei einen leeren Datenraum (hier mit dem Namen 'Ge­ +hälter'), der mit Hilfe der Zuweisung (hier: Initialisierung) an die Variable 'gehaltsliste' +gekoppelt wird. + +Nun kann man mit der 'gehaltsliste' arbeiten wie mit allen anderen Feldern auch. Die +Daten, die in 'gehaltsliste' gespeichert, werden eigentlich im Datenraum 'Gehälter' +abgelegt. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + gehaltsliste [5] := 10 000.0; (* Traumgehalt *) + gehaltsliste [index] INCR 200.0; (* usw. *) + +____________________________________________________________________________ + + +Man kann auch Prozeduren schreiben, die auf der Gehaltsliste arbeiten. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + PROC sort (ROW 1000 REAL VAR liste): + ... + END PROC sort; + ... + sort (CONCR (gehaltsliste)); + ... + +____________________________________________________________________________ + + +Man beachte, daß der formale Parameter der Prozedur 'sort' nicht mit BOUND spezi­ +fiziert werden darf (BOUND wird nur bei der Deklaration des Objekts angegeben). Das +ist übrigens ein weiterer wichtiger Vorteil von BOUND-Objekten: man kann alle +Prozeduren des EUMEL-Systems auch für BOUND-Objekte verwenden, nur die +Datentypen müssen natürlich übereinstimmen. + + +Häufige Fehler bei der Benutzung von Datenräumen + +- Wenn man an ein DATASPACE-Objekt zuweist (z.B.: DATASPACE VAR ds := + new ("mein datenraum")), so erhält man, wie bereits erwähnt, eine Kopie des + Datenraums in 'ds'. Koppelt man jetzt 'ds' an ein BOUND-Objekt an und führt + Änderungen durch, so wirken diese nur auf die Kopie und nicht auf die Quelle. + Für Änderungen in der Quelle, also in der vom Datei-Manager verwalteten Datei, + ist stets direkt anzukoppeln. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + BOUND ROW 10 INT VAR reihe; + INT VAR i; + + PROC zeige dsinhalt (TEXT CONST datenraum): + BOUND ROW 10 INT VAR inhalt := old (datenraum); + INT VAR j; + line; + putline ("Inhalt:" + datenraum); + FOR j FROM 1 UPTO 10 REP + put (inhalt (j)) + PER + END PROC zeige dsinhalt; + + (* falsch: es wird auf der Kopie gearbeitet: *) + DATASPACE VAR ds := new ("Gegenbeispiel: Zahlen 1 bis 10"); + reihe := ds; + besetze reihe; + zeige dsinhalt ("Gegenbeispiel: Zahlen 1 bis 10"); + + (* richtig: es wird auf dem Datenraum gearbeitet: *) + reihe := new ("Beispiel: Zahlen 1 bis 10"); + besetze reihe; + zeige dsinhalt ("Beispiel: Zahlen 1 bis 10"). + + besetze reihe: + FOR i FROM 1 UPTO 10 REP + reihe (i) := i + PER. + +____________________________________________________________________________ + + + Der Datenraum 'Gegenbeispiel: Zahlen 1 bis 10' wird nicht mit Werten besetzt, + sondern die Kopie dieses Datenraums, der unbenannte Datenraum 'ds'. Auf dem + direkt angekoppelten Datenraum 'Beispiel: Zahlen 1 bis 10' werden die Werte + gespeichert. + + +- Wenn man ein DATASPACE-Objekt benutzt, ohne den Datei-Manager zu + verwenden, so muß man selbst dafür sorgen, daß dieses Objekt nach seiner + Benutzung wieder gelöscht wird. Das Löschen geschieht durch die Prozedur + 'forget'. Ein automatisches Löschen von DATASPACE-Objekten erfolgt nicht bei + Programmende (sonst könnten sie ihre Funktion als Datei nicht erfüllen). Nur + durch 'forget' oder beim Löschen einer Task werden alle ihr gehörenden + DATASPACE-Objekte gelöscht und der belegte Speicherplatz freigegeben. + + +- Ferner ist zu beachten, daß vor der Ankopplung an ein BOUND-Objekt das + DATASPACE-Objekt initialisiert wird (im Normalfall mit 'nilspace'). + +____________________________________________________________________________ + ........................... Beispiel: ......................... + DATASPACE VAR ds := nilspace; + BOUND ROW 1000 REAL VAR real feld := ds; + .... + real feld [index] := wert; + .... + forget (ds) (* Datenraum löschen, + damit der Platz wieder verwendet wird *) + +____________________________________________________________________________ + + +- Will man auf die Feinstruktur eines BOUND-Objekts zugreifen, so muß man + strenggenommen den Konkretisierer benutzen: + + Form: + + #on("i")##on("b")#CONCR#off("i")##off("b")# #on("i")##on("b")#(#off("i")##off("b")# Ausdruck #on("i")##on("b")#)#off("i")##off("b")# + + Der Konkretisierer ermöglicht eine typmäßige Umbetrachtung vom BOUND-Objekt + zum Datentyp der Feinstruktur. Ist der Zugriff jedoch eindeutig, so wird 'CONCR' + automatisch vom Compiler ergänzt. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + BOUND INT VAR i := old ("i-Wert"); + INT VAR x; + x := wert. + + wert: + IF x < 0 + THEN 0 + ELSE CONCR (i) + FI. + +____________________________________________________________________________ + + +In diesem Beispiel muß der Konkretisierer benutzt werden, da sonst der Resultattyp +des Refinements nicht eindeutig ist (BOUND oder INT?). + + + +2.9.3.3 Definition neuer Dateitypen + +Durch die Datenräume und die Datentyp-Definition von ELAN ist es für Programmie­ +rer relativ einfach, neue Datei-Datentypen zu definieren. In der Regel reicht der +Datentyp FILE für "normale" Anwendungen aus, jedoch kann es manchmal sinnvoll +und notwendig sein, neue Datei-Typen für spezielle Aufgaben zu definieren. + +In diesem Abschnitt soll an dem Beispiel DIRFILE (welcher zwar im ELAN-Standard +definiert, aber nicht im EUMEL-System realisiert ist) gezeigt werden, wie ein neuer +Datei-Datentyp definiert wird: + +____________________________________________________________________________ + ........................... Beispiel: ......................... + PACKET dirfiles DEFINES DIRFILE, :=, dirfile, getline, ...: + + LET maxsize = 1000; + + TYPE DIRFILE = BOUND ROW maxsize TEXT; + (* DIRFILE besteht aus TEXTen; Zugriff erfolgt ueber einen + Schluessel, der den Index auf die Reihung darstellt *) + + OP := (DIRFILE VAR dest, DATASPACE CONST space): + CONCR (dest) := space + END OP :=; + + DATASPACE PROC dirfile (TEXT CONST name): + IF exists (name) + THEN old (name) + ELSE new (name) + FI + END PROC dirfile; + + PROC getline (DIRFILE CONST df, INT CONST index, + TEXT VAR record): + IF index <= 0 + THEN errorstop ("access before first record") + ELIF index > maxsize + THEN errorstop ("access after last record") + ELSE record := df [index] + FI + END PROC getline; + + PROC putline (DIRFILE CONST df, INT CONST index, + TEXT VAR record): + ... + END PROC putline; + + ... + END PACKET dirfiles; + +____________________________________________________________________________ + + +Die Prozedur 'dirfile' ist die Assoziierungsprozedur für DIRFILEs (analog 'sequential +file' bei FILEs). 'dirfile' liefert entweder einen bereits vorhandenen Datenraum oder +richtet einen neuen ein. Um eine Initialisierung mit der 'dirfile'-Prozedur vorneh­ +men zu können, braucht man auch einen Zuweisungsoperator, der den Datenraum an +den DIRFILE-Datentyp koppelt. + +Zugriffe auf einen DIRFILE sind nun relativ einfach zu schreiben. Im obigen Beispiel +wird nur die Prozedur 'getline' gezeigt. + +Nun ist es möglich, Programme zu schreiben, die den DIRFILE-Datentyp benut­ +zen. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + DIRFILE VAR laeufer :: dirfile ("Nacht von Borgholzhausen"); + INT VAR nummer; + TEXT VAR name; + + REP + put ("Startnummer bitte:"); + get (nummer); + line; + put ("Name des Laeufers:"); + get (name); + putline (laeufer, nummer, name); + line + UNTIL no ("weiter") END REP; + ... + +____________________________________________________________________________ +#page# + +2.9.4 Datentyp INITFLAG + +Im Multi-User-System ist es oft notwendig, Pakete beim Einrichten einer neuen +Task in dieser neu zu initialisieren. Das muß z.B. bei der Dateiverwaltung gemacht +werden, da die neue Task ja nicht die Dateien des Vaters erbt. Mit Hilfe von +INITFLAG-Objekten kann man zu diesem Zweck feststellen, ob ein Paket in dieser +Task schon initialisiert wurde. + + +INITFLAG + #on("b")#TYPE INITFLAG #off("b")# + Erlaubt die Deklaration entsprechender Flaggen. + +:= + #on("b")#OP := (INITFLAG VAR flag, BOOL CONST flagtrue) #off("b")# + Erlaubt die Initialisierung von INITFLAGs + +initialized + #on("b")#BOOL PROC initialized (INITFLAG VAR flag) #off("b")# + Wenn die Flagge in der Task A auf TRUE oder FALSE gesetzt wurde, dann liefert + sie beim ersten Aufruf den entsprechenden Wert, danach immer TRUE (in der + Task A!). + + Beim Einrichten von Söhnen wird die Flagge in den Sohntasks automatisch auf + FALSE gesetzt. So wird erreicht, daß diese Prozedur in den neu eingerichteten + Söhnen und Enkeltasks genau beim ersten Aufruf FALSE liefert. + +____________________________________________________________________________ + ........................... Beispiel: ......................... + PACKET stack DEFINES push, pop: + + INITFLAG VAR in this task := FALSE ; + INT VAR stack pointer ; + ROW 1000 INT VAR stack ; + + PROC push (INT CONST value) : + + initialize stack if necessary ; + .... + + END PROC push ; + + PROC pop (INT VAR value) : + + initialize stack if necessary ; + .... + + END PROC pop ;. + + initialize stack if necessary : + IF NOT initialized (in this task) + THEN stack pointer := 0 + + FI . + + END PACKET stack +____________________________________________________________________________ + diff --git a/doc/programming/programmierhandbuch.3 b/doc/programming/programmierhandbuch.3 new file mode 100644 index 0000000..eade335 --- /dev/null +++ b/doc/programming/programmierhandbuch.3 @@ -0,0 +1,728 @@ +#headandbottom("1","EUMEL-Benutzerhandbuch","TEIL 3 : Editor","3")# +#pagenr("%",1)##setcount##block##pageblock# +#headeven# +#center#EUMEL-Benutzerhandbuch +#center#____________________________________________________________ + +#end# +#headodd# +#center#TEIL 3 : Editor +#center#____________________________________________________________ + +#end# +#bottomeven# +#center#____________________________________________________________ +3 - % #right#GMD +#end# +#bottomodd# +#center#____________________________________________________________ +GMD #right#3 - % +#end# + +TEIL 3: Der Editor + +Mit dem #ib#EUMEL-Editor#ie# steht für den Teil der Programmierung, der aus der Eingabe +von Programmtext besteht, dasselbe komfortable Werkzeug zur Verfügung, wie für die +Textverarbeitung. Merkmale des EUMEL-Editors sind die einfache Fenstertechnik +und die übersichtliche Bedienung durch wenige Funktionstasten. + +Eine mit dem Editor erzeugte Textdatei ist maximal 4075 Zeilen lang, die maximale +Breite einer Zeile beträgt 16000 Zeichen. + + + +3.1 Ein- und Ausschalten des Editors + +Der Editor wird eingeschaltet durch Eingabe von: + +____________________________________________________________________________ + gib kommando : + #ib#edit#ie# ("dateiname") + +____________________________________________________________________________ + + +Falls eine Datei unter dem eingegebenen Namen existiert, wird ein Fenster auf dieser +Datei an der Stelle geöffnet, an der zuletzt ein Zugriff auf diese Datei stattfand. + +Existiert noch keine Datei unter dem angegebenen Namen in der Task, folgt eine +Anfrage, ob eine Datei unter dem eingegebenen Namen neu eingerichtet werden soll: + +____________________________________________________________________________ + gib kommando : + edit("dateiname") + "dateiname" neu einrichten (j/n) ? + +____________________________________________________________________________ + + +Die Abfrage dient der Kontrolle der Schreibweise. Man kann ggf. das Einrichten der +Datei ablehnen, den Dateinamen verbessern und das Kommando erneut geben. + +Bei korrekter Schreibweise bejahen Sie die Kontrollfrage#u# 1)#e#mit + +#center# oder + + +Es erscheint ein leerer Editorbildschirm. Die oberste Zeile des Bildschirms ist die +#ib#Titelzeile#ie#. In ihr kann nicht geschrieben werden. Sie zeigt jedoch verschiedene nütz­ +liche Dinge an: den Namen der Datei, die Nummer der aktuellen Zeile, in der gerade +geschrieben wird, Tabulatormarken, Einfügemodus, Lernmodus usw. + +____________________________________________________________________________ + #mark on# ............... dateiname ....................#mark off# Zeile 1 #mark on# #mark off# + _ + +____________________________________________________________________________ + + + +Wollen Sie die #ib#Schreibarbeit beenden#ie# und den #ib#Editor ausschalten#ie#, so drücken Sie die +beiden Tasten + + + +nacheinander. Sie haben damit den #ib#Editor verlassen#ie# und befinden sich wieder auf +Monitor-Ebene. +#page# + +3.2 Die Funktionstasten + +Die Funktionstasten realisieren diejenigen Fähigkeiten des Editor, die über die reine +Zeicheneingabe hinausgehen. Wo die Tasten auf Ihrem Gerät liegen, hängt von dem +jeweiligen Gerätetyp ab. Die Wirkung der Tasten ist im Weiteren erläutert. + +#l pos (0.0)##l pos(4.0)# +#table# +#free(0.5)# +#taste1(" SHIFT ")# Umschalttaste +#tableend# +#free(0.5)# + <^> <>> <<> Positionierungstasten +#table# +#free(0.5)# + Eingabe-/ Absatztaste +#free(0.5)# + Kommandotaste +#free(0.5)# + Verstärkertaste +#free(0.5)# + Tabulatortaste +#free(0.5)# + Markiertaste +#free(0.5)# + Löschtaste +#free(0.5)# + Einfügetaste +#free(0.5)# + Supervisortaste +#free(0.5)# + Stoptaste +#free(0.5)# + Weitertaste +#tableend##clear pos# +#free(0.5)# +Es kann sein, daß Tasten nicht richtig beschriftet sind. Die Installations-anleitung +muß dann die Entsprechungen beschreiben. Natürlich können sich weitere Funktions­ +tasten außer den im folgenden beschriebenen auf Ihrer Tastatur befinden. Diese +haben standardmäßig jedoch keine besondere Bedeutung für den Editor. + +#page# + +3.3 Die Wirkung der Funktionstasten + + + +#ib#Umschalttaste#ie# + +Wird diese Taste gleichzeitig mit einer anderen betätigt, so wird ein Buchstabe in +Großschreibung, bei den übrigen Tasten das obere Zeichen, ausgegeben. So wird z.B. +anstelle der "9" das Zeichen ")" ausgegeben. +#free(0.5)# +<>> <<> + + <^> + +Positionierungstasten + +#ib#Positionierung des Cursors#ie# um eine Spalten-/Zeilenposition in die jeweilige Richtung. +#free(0.5)# + + +#ib#Eingabetaste / Absatztaste#ie#, Carriage Return, kurz: 'CR' + +Diese Taste schließt die aktuelle Zeile explizit ab und es wird an den Beginn der +nächsten Zeile positioniert. Einrückungen werden beibehalten. + +Der EUMEL-Editor ist auf automatischen Wortumbruch voreingestellt, d.h. ein Wort, +das über das 77. Zeichen der aktuellen Zeile herausreichen würde, wird automatisch +in die nächste Zeile gerückt (siehe 'word wrap' 4.2.5). Die Absatztaste wird also +benötigt, um explizite Zeilenwechsel und Einrückungen bei der Textformatierung zu +erhalten. Eine Absatzmarke wird durch ein 'blank' hinter dem letzten Zeichen der +Zeile erzeugt und ist im Editor an der Inversmarkierung am rechten Bildschirmrand zu +erkennen. + +Im EUMEL-System werden Kommandos auf einer Kommandozeile, auf der alle +Editorfunktionen zur Verfügung stehen, eingegeben. Auf dieser Ebene beendet die +Taste also ausdrücklich die Kommandoeingabe, das gegebene Kommando wird an­ +schließend analysiert und ausgeführt. + + + +"#ib#Verstärkertaste#ie#"; wird als Vorschalttaste bedient. + +In Kombination mit anderen Funktionstasten wird deren Wirkung verstärkt. + + + + +Steht der Cursor nicht am unteren Bildrand, so wird er dorthin positioniert. Steht er +am unteren Bildrand, so wird um einen Bildschirminhalt "weitergeblättert". + +Entsprechend werden auch die Tasten : <^> <>> <<> mit der HOP-Taste verstärkt. + +#page# + + +#ib#Einfügen von Textpassagen#ie#. Die HOP-Taste in Verbindung mit RUBIN und RUBOUT +wird zum 'verstärkten' Löschen und Einfügen verwendet. + +Ab der aktuellen Position des Cursors 'verschwindet' der restliche Text. Es kann wie +bei der anfänglichen Texteingabe fortgefahren werden. Die Anzeige '#ib#REST#ie#' in der +Titelzeile erinnert daran, daß noch ein Resttext existiert. Dieser erscheint nach einem +neuerlichen Betätigen der beiden Tasten HOP RUBIN wieder auf dem Bildschirm (die +Anzeige 'REST' verschwindet dann wieder). + +____________________________________________________________________________ + ................ dateiname ..................... Zeile 4 + In diesem Text soll vor dem zweiten Satz  + etwas eingefügt werden. Hierzu wird der + Cursor an die Position geführt, an der  + ein beliebiger Text eingefügt werden soll.#absatz# + +____________________________________________________________________________ + + +Nach Betätigen der Taste #on("i")##on("b")#HOP#off("i")##off("b")# und #on("i")##on("b")#RUBIN#off("i")##off("b")#sieht der Bildschirm wie folgt aus: + +____________________________________________________________________________ + .............. dateiname ........REST.......... Zeile 4 + In diesem Text soll vor dem zweiten Satz  + etwas eingefügt werden. + + +____________________________________________________________________________ + + + +Nun kann beliebig viel Text eingefügt werden. Nochmaliges Betätigen von HOP und +RUBIN führt den Text-Rest wieder bündig heran. + +#page# + + +Löscht die Zeile ab Cursor-Position bis Zeilenende. + +____________________________________________________________________________ + ................ dateiname ..................... Zeile 4 + Soll eine ganze Zeile oder ein Textrest  + gelöscht werden, so positioniert man an die  + Stelle, ab der gelöscht werden soll. Rest löschen.... + Nach HOP RUBOUT ist der Zeilenrest gelöscht.#absatz# + +____________________________________________________________________________ + + + +Nach Betätigen der Tasten #on("i")##on("b")#HOP#off("i")##off("b")# und #on("i")##on("b")#RUBOUT#off("i")##off("b")# sieht der Bildschirm wie folgt aus. + +____________________________________________________________________________ + ............... dateiname .................... Zeile 4 + Soll eine ganze Zeile oder ein Textrest  + gelöscht werden, so positioniert man an die  + Stelle, ab der gelöscht werden soll. + Nach HOP RUBOUT ist der Zeilenrest gelöscht.#absatz# + +____________________________________________________________________________ + + + +Steht der Cursor am Zeilenanfang, wird nach HOP RUBOUT dementsprechend die +ganze Zeile gelöscht und die Lücke durch Nachrücken der Folgezeilen geschlossen +(HOP RUBOUT betätigen). +#page# + + +#ib#Tabulatortaste#ie# + +Mit der Tabulatortaste werden die eingestellten Tabulatorpositionen angesprungen. +Jeder Tastendruck läßt den Cursor auf die nächste eingestellte Tabulatorposition +springen. + +#on("i")#Voreingestellte#off("i")# Tabulatorpositionen sind die beiden Schreibgrenzen, Textanfang in der +Zeile und Ende der Zeile. + +Weitere Tabulatorpositionen können durch Positionierung auf die gewünschte Spalte +und #on("i")##on("b")#HOP#off("i")##off("b")# #on("i")##on("b")#TAB#off("i")##off("b")# gesetzt werden. Sie können gelöscht werden, indem sie mit #on("i")##on("b")#TAB#off("i")##off("b")# +angesprungen und mit #on("i")##on("b")#HOP#off("i")##off("b")# #on("i")##on("b")#TAB#off("i")##off("b")# +ausgeschaltet werden. + +Die gesamte eingestellte Tabulalation kann durch #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#TAB#off("i")##off("b")# ein-/ und ausge­ +schaltet werden. + +Die eingestellten Tabulatorpositionen erkennen Sie an den Tabulatorzeichen (Dachzei­ +chen) in der obersten Bildschirmzeile. +#page# + + +#ib#Ein- bzw. Ausschalten der Markierung#ie#. + +Bei Betätigung dieser Taste wird in einen speziellen #ib#Markierzustand#ie# geschaltet. Alles, +was Sie jetzt schreiben bzw. durch Bewegen des Cursors in Richtung Dateiende +kennzeichnen, steht als #on("i")#markierter#off("i")# Bereich für die Bearbeitung zur Verfügung. Zur +besseren Sichtbarkeit wird der markierte Bereich invers zum übrigen Text dargestellt. + +Wird der Cursor in eine Richtung bewegt, wird das gesamte Textstück zwischen +Einschaltpunkt der Markierung und aktueller Cursorposition markiert. Rückwärtsbewe­ +gungen des Cursors verkürzen den markierten Bereich wieder. + +Durch erneutes Betätigen der MARK-Taste schalten Sie den Markier-Zustand +wieder aus. + +Mit weiteren Kommandos kann der Bereich nun bearbeitet werden: + + Markierten Abschnitt in 'Scratch'-Datei kopieren. + +

Markierten Abschnitt herauskopieren. + + Markierten Abschnitt löschen. + + +Der mit #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#p#off("i")##off("b")# oder#on("i")##on("b")#d#off("i")##off("b")# kopierte Bereich kann beliebig oft in derselben oder einer +anderen Datei ein/angefügt werden. + +Der mit #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#RUBOUT#off("i")##off("b")# gelöschte Abschnitt kann genau einmal durch #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#RUBOUT#off("i")##off("b")# +an anderer Stelle derselben Datei eingefügt werden. + +(vgl. ESC-Taste, Operationen auf Markierungen, 3-#topage("ESC")#) +#page# + + +#ib#Ein- bzw. Ausschalten des Einfügemodus.#ie# + +Das Betätigen der Taste schaltet in den Einfügemodus. Der Zustand wird durch das +Wort "RUBIN" im linken Drittel der Titelzeile der Datei angezeigt. Vor dem Zeichen, +auf dem der Cursor steht, wird eingefügt. Nochmaliges Betätigen der Taste schaltet +den Einfügemodus aus. +#free(1.0)# + + +#ib#Löschtaste#ie# + +Das Zeichen, auf dem der Cursor steht, wird gelöscht. Wenn der Cursor, wie bei +fortlaufender Eingabe üblich, hinter dem letzten Zeichen einer Zeile steht, wird das +letzte Zeichen gelöscht. + +#page# + +3.4 ESC Kommandos + + + +#ib#Kommandotaste#ie# + +Mit der ESC-Taste in Kombination mit einer Folgetaste werden vordefinierte Aktionen +ausgelöst. Es gibt Aktionen, die vorprogrammiert zur Verfügung stehen, und Sie selbst +können weitere hinzufügen. + +Der Kommandodialog wird eingeschaltet durch: + + + + +____________________________________________________________________________ + ............... Beispiel ..................... Zeile 4 + + gib kommando:                                              + +____________________________________________________________________________ + + +Der Kommandodialog ermöglicht die Eingabe von beliebigen Kommandos ohne den +Editor verlassen zu müssen. Insbesondere Such- und Kopieroperationen stellen auch +für den Programmierer nützliches Werkzeug dar (siehe 3.5). + +Auf der Kommandozeile kann jedes Kommando gegeben werden. Die Kommandozeile +kann wie eine normale Textzeile editiert werden. Nach #on("i")##on("b")#CR#off("i")##off("b")# verschwindet die Kom­ +mandozeile und das Kommando wird ausgeführt. + +Falls ein Fehler auftritt erfolgt eine entsprechende Fehlermeldung in der Kopfzeile und +die Kommandozeile erscheint erneut. + +Um ein weiteres Editor-Fenster zu 'öffnen', betätigt man im Editor + +   + +Betätigt man ESC e ungefähr in der Mitte des Bildschirms, hat man das Fenster auf +die neue Datei in der unteren Hälfte des Bildschirms und die 'alte' Datei in der +oberen Bildschirmhälfte. Zunächst wird der Dateiname erfragt. Nach dessen Eingabe +und #on("i")##on("b")#CR#off("i")##off("b")# wird ein Fenster auf eröffnet. Die obere linke Ecke des Fensters befindet +sich an der aktuellen Cursor-Position. Dabei darf sich der Cursor nicht zu sehr am +rechten oder unteren Rand befinden, weil das Fenster sonst zu klein würde. In diesem +'Fenster' kann man dann genauso arbeiten wie im 'normalen' Editor. + +Mit der Tastenfolge + +   + +wechselt man von einem Fenster (zyklisch) in das benachbarte. Es gibt eine Hier­ +archie zwischen den Fenstern in der Reihenfolge, in der eines im anderen einge­ +richtet worden ist. Gibt man + +   + +in einem Fenster, so verschwindet dieses und alle darin eingeschachtelten Fenster, +und man befindet sich im übergeordneten Fenster. + +Durch + +  

oder    + +schreibt man einen markierten Teil in eine 'Scratch'-Datei (nicht editierbarer +Zwischenspeicher); durch ESC p wird ein markierter Text aus der Ursprungsdatei +entfernt und in die 'Scratch'-Datei geschrieben. Im Gegensatz dazu wird er durch +ESC d kopiert. Durch + +   + +fügt man ihn in eine andere (oder dieselbe) Datei ein. Im Unterschied zu ESC RUBIN +wird die temporäre Datei dadurch nicht entleert. + +Die für ESC p, bzw. ESC d benutzte #ib#'Scratch'-Datei#ie#, die nicht editierbar ist, ist nicht +mit dem sogenannten Notizbuch zu verwechseln. Das Notizbuch ist eine Datei, in der +alle Editorfunktionen benutzt werden können, auf die jedoch ohne Angabe eines +Dateinamens durch + + + +ab der aktuellen Cursorposition ein Fenster eröffnet wird. Das Notizbuch nimmt +insbesondere Fehlermeldungen und Meldungen bei der Übersetzung von Programmen +auf. + + + +erlaubt vom äußeren Fenster aus alle eingeschachtelten Fenster zu verlassen. +#page# + +Vorbelegte Tasten + +#ib#ESC q#ie# Verlassen des Editors bzw. der eingeschachtelten Fenster. + +#ib#ESC e#ie# Weiteres Editorfenster einschalten. + +#ib#ESC n#ie# Notizbuch 'anzeigen'. + +#ib#ESC v#ie# Dateifenster auf ganzen Bildschirm vergrößern + bzw. Bildschirm rekonstruieren (eingeschachteltes Fenster verlas­ + sen). + +#ib#ESC w#ie# Dateiwechsel beim Fenstereditor. + +#ib#ESC f#ie# Nochmalige Ausführung des letzten Kommandos. + +#ib#ESC b#ie# Das Fenster wird auf den linken Rand der aktuellen (ggf. verscho­ + benen) Zeile gesetzt. + +ESC > Zum nächsten Wortanfang. + +ESC < Zum vorherigen Wortanfang. + +#ib#ESC 1#ie# Zum Anfang der Datei. + +#ib#ESC 9#ie# Zum Ende der Datei. +#page# + +Operationen auf Markierungen + + +#goalpage("ESC")# +#ib#ESC RUBOUT#ie# Markiertes "vorsichtig" löschen. + +#ib#ESC RUBIN#ie# Mit ESC RUBOUT vorsichtig Gelöschtes einfügen. + +#ib#ESC p#ie# Markiertes löschen und in die Notiz-Datei schreiben. Kann mit ESC + g an anderer Stelle reproduziert werden. + +#ib#ESC d#ie# Duplizieren: + Markiertes in die Notiz-Datei kopieren, anschließend die + Markierung abschalten. Kann mit ESC g beliebig oft reproduziert + werden. + +#ib#ESC g#ie# Mit ESC p gelöschten oder mit ESC d duplizierten Text an aktuelle + Cursor-Stelle schreiben, d.h. Notiz-Datei an aktueller Stelle einfü­ + gen. +#page# + +Zeichen schreiben +Diese Tasten sind standardmäßig so vorbelegt wie hier aufgeführt, sie können aber +von Benutzern und in Anwenderprogrammen geändert werden. + +#ib#ESC a#ie# Schreibt ein ä. +#ib#ESC A#ie# Schreibt ein Ä. +#ib#ESC o#ie# Schreibt ein ö. +#ib#ESC O#ie# Schreibt ein Ö. +#ib#ESC u#ie# Schreibt ein ü. +#ib#ESC U#ie# Schreibt ein Ü. +#ib#ESC s#ie# Schreibt ein ß. +#ib#ESC (#ie# Schreibt eine [. +#ib#ESC )#ie# Schreibt eine ]. +#ib#ESC <#ie# Schreibt eine {. +#ib#ESC >#ie# Schreibt eine }. +#ib#ESC \##ie# Schreibt ein \#, das auch gedruckt werden kann. +#ib#ESC ­#ie# Schreibt einen (geschützten) Trennstrich, siehe Textverarbeitung. +#ib#ESC k#ie# Schreibt ein (geschütztes) "k", siehe Textverarbeitung. +#ib#ESC blank#ie# Schreibt ein (geschütztes) Leerzeichen, siehe Textverarbeitung. +#free(0.7)# + +Kommando auf Taste legen + +#ib#ESC ESC#ie# Kommandodialog einschalten + +#ib#ESC ! taste#ie# Im Kommandodialog: + Geschriebenes Kommando auf Taste legen. + +#ib#ESC ? taste#ie# Im Kommandodialog: + Auf 'taste' gelegtes Kommando zum Editieren anzeigen. + +#ib#ESC k#ie# Im Kommandodialog: + Das zuletzt editierte Kommando (einzeilige ELAN-Programm) + anzeigen. + + +Der Lernmodus +Der Lernmodus ermöglicht beliebige Tastensequenzen zu speichern und auf eine +Taste 't' zu legen. Durch #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#t#off("i")##off("b")# wird die gesamte Sequenz ausgeführt. + +Nicht belegt werden können die vom System vorbelegten Tasten (3-14). + +Beispielsweise könnte es für einen Programmierer sinnvoll sein die Tastenfolge +'THEN' 'CR' '>' '>' '>' '>' auf die Taste #on("i")##on("b")#T#off("i")##off("b")# zu legen. Durch #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#T#off("i")##off("b")# wird 'THEN' in +die aktuelle Zeile geschrieben und der Cursor mit passender Einrückung in die +Einrückung in die Folgezeile gesetzt. + + +#ib#ESC HOP#ie# #ib#Lernen einschalten#ie#. + +#ib#ESC HOP taste#ie# #ib#Lernen ausschalten#ie# und Lernsequenz auf 'taste'legen. + +#ib#ESC HOP HOP#ie# #ib#Gelerntes vergessen#ie#. Bedingung ist, daß man die Lernsequenz in + der Task löscht, in der man sie hat lernen lassen. + + +#on("b")# +#center#A C H T U N G : +Der Lernmodus bleibt eingeschaltet, auch wenn der Editor beendet wird. Dann werden +die folgenden Monitor-Kommandos usw. usf. 'gelernt'. Durch unsinniges 'Lernen' +lassen sich schlimmstenfalls beliebige Verwüstungen anrichten. + +Der Lernmodus wird in der Editor-Kopfzeile angezeigt. Falls der Editor beendet wird, +ohne den Lernmodus auszuschalten, erfolgt eine Warnung auf Monitor-Ebene. + +Um den Lernmodus zu beenden drücken Sie: + + + +Dadurch wird der Lernmodus ausgeschaltet und nichts gelernt, die Gefahr ist gebannt.#off("b")# + +#page# + + +#ib#SUPERVISOR-Taste#ie# + +Betätigen Sie diese Taste im Editor, dann unterbrechen Sie Ihre Editierarbeit und +erhalten die Meldung + +____________________________________________________________________________ + + Terminal 2 + + + EUMEL Version 1.8/M + + + gib supervisor kommando: + + + + + ESC ? --> help + ESC b --> begin("") ESC h --> halt + ESC c --> continue("") ESC s --> storage info + ESC q --> break ESC t --> task info + +____________________________________________________________________________ + + + +Wollen Sie nun im Editor fortfahren bzw. haben Sie irrtümlich die SV-Taste betätigt, +dann geben Sie das Kommando + +____________________________________________________________________________ + + gib supervisor kommmando : + continue ("meine task") + +____________________________________________________________________________ + + + +(falls Ihre Task, in der Sie arbeiteten, wirklich "meine task" hieß!) + +Um Ihren in Bearbeitung befindlichen Text wieder vollständig auf dem Bildschirm zu +sehen, betätigen die die Tasten + + + +Sie sind wieder an der Stelle, an der Sie den Text mit der SV-Taste verlassen ha­ +ben, und können normal weiterarbeiten. + +#on("u")#Achtung:#off("u")# Die SV-Taste kann, je nach Terminal, durch das Betätigen von zwei +Tasten gleichzeitig realisiert sein (oft 'CTRL b'). Beachten Sie die Beschreibung Ihrer +Tastatur! + + + +#on("b")# +Für die Programmierung ist die Tastenfolge von Bedeutung, da hier­ +durch der Fehler 'halt vom Terminal' erzeugt wird. Dadurch können unerwünscht +laufende Programme abgebrochen werden. +#off("b")# +#page# + + +#ib#Unterbrechen einer Ausgabe#ie# (oft auch als CTRL a realisiert). + +Haben Sie diese Taste aus Versehen betätigt, erkennen Sie dies daran, daß der +Editor nicht "reagiert". Betätigen Sie die WEITER-Taste (oft auch CTRL c). +#free(1.0)# + + +Unterbrochene Ausgabe fortsetzen. + +Ein mit der STOP-Taste angehaltene Ausgabe können Sie durch Betätigen der +#ib#WEITER-Taste#ie# fortsetzen. + + +#on("u")#VORSICHT:#off("u")# Die STOP-Taste unterbricht nur die Ausgabe auf den Bildschirm. Zei­ + chen, die während des STOP eingegeben werden, werden gespeichert + und nach 'WEITER' ausgegeben! + + +#page# + +3.5 Positionieren, Suchen, Ersetzen + im Kommandodialog + + +Um das Editorfenster auf eine bestimmte Zeile zu positionieren wird einfach diese +Zeilennummer angegeben. + +____________________________________________________________________________ + ............... Beispiel ..................... Zeile 4 + + gib kommando: 123                                           + +____________________________________________________________________________ + + + +Falls die Zeilenzahl der Datei geringer als die angegebene Zeilennummer ist, wird auf +die letzte Zeile positioniert. + + +Um das Editorfenster auf ein bestimmtes Textstück zu positionieren, wird der gesuch­ +te Text, ggf. mit Suchrichtung angegeben. + +____________________________________________________________________________ + ............... Beispiel ..................... Zeile 4 + + gib kommando: "END PROC"                                   + +____________________________________________________________________________ + + +Die Suchrichtung kann durch 'D' (down) oder 'U' (up) zusätzlich spezifiziert werden. + +____________________________________________________________________________ + ............... Beispiel ..................... Zeile 4 + + gib kommando: U "INT VAR schleifenzaehler"                  + +____________________________________________________________________________ + + + +Um beliebige Texte durch andere zu ersetzen, dienen die Operatoren 'C' (change) +bzw. 'CA' (change all). + +Bei Ausführung dieses Kommandos wird zunächst nach #on("u")#unten#off("u")# in der editierten Datei +nach dem zu ersetzenden Text gesucht. Wenn der Text gefunden wird, wird er durch +den hinter dem Operator stehenden Text ersetzt. + +____________________________________________________________________________ + ............... Beispiel ..................... Zeile 4 + + gib kommando: "lb" C "lange bezeichnung"                    + +____________________________________________________________________________ + + + +Bei Anwendung von 'CA' wird jedes Auftreten des gesuchten Textes ab der +Cursorposition durch den Ersatztext ersetzt, bis das Dateiende errreicht ist. + +Weitere Erklärungen zum Suchen und Ersetzen in 5.5. +#page# + +Weitere Hilfen + + +Textabschnitt an anderer Stelle der Datei einsetzen: + +- Abschnitt markieren und mit #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#d#off("i")##off("b")# zwischenspeichern. + +- Zweites Editorfenster auf die Datei mit #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#e#off("i")##off("b")# öffnen. + +- Nach #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#ESC#off("i")##off("b")# Zeilennummer oder Suchbegriff angeben und mit #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#g#off("i")##off("b")# Abschnitt an der gewünschte Stelle einsetzen. + + + +Textabschnitt schnell herauskopieren und sichern: + +- Gewünschten Abschnitt markieren + +- #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#ESC#off("i")##off("b")# PUT("dateiname") #on("i")##on("b")#CR#off("i")##off("b")# + Der Abschnitt wird in die Datei 'dateiname' geschrieben. Falls die Frage 'dateina­ + me' löschen (j/n) verneint wird, wird der Abschnitt, an das Ende der Datei angefügt. + Dadurch können Textabschnitte schnell gesammelt werden. + + +Komplette Datei in die editierte Datei einfügen: + +- #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#ESC#off("i")##off("b")# GET("dateiname") #on("i")##on("b")#CR#off("i")##off("b")# + Der komplette Inhalt von 'dateiname' wird an die aktuelle Position geschrieben. + + +Breitere Zeile erzeugen: + +- #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#ESC#off("i")##off("b")# limit(123) #on("i")##on("b")#CR#off("i")##off("b")# + Die Zeilenbreite wird auf 123 Zeichen geändert. Der maximal zulässige Wert ist + 16000. Dieser Wert bezieht sich auf den Zeilenumbruch. Bei Zeilenbreite > 77 wird + nur die aktuelle Zeile verschoben. Um für den ganzen Bildschirm die rechte Seite + der Datei zu sehen, kann die linken Spalte des Bildschirmfenster neu gesetzt wer­ + den: + + #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#ESC#off("i")##off("b")# margin(60) #on("i")##on("b")#CR#off("i")##off("b")# + + Die Normaleinstellung wird durch 'limit(77)' und 'margin(1)' wiederhergestellt. + diff --git a/doc/programming/programmierhandbuch.4 b/doc/programming/programmierhandbuch.4 new file mode 100644 index 0000000..650d945 --- /dev/null +++ b/doc/programming/programmierhandbuch.4 @@ -0,0 +1,1692 @@ +#headandbottom("1","EUMEL-Benutzerhandbuch","TEIL 4 : Kommandosprache","4")# +#pagenr("%",1)##setcount(1)##block##pageblock# +#headeven# +#center#EUMEL-Benutzerhandbuch +#center#____________________________________________________________ + +#end# +#headodd# +#center#TEIL 4 : Kommandosprache +#center#____________________________________________________________ + +#end# +#bottomeven# +#center#____________________________________________________________ +4 - % #right#GMD +#end# +#bottomodd# +#center#____________________________________________________________ +GMD #right#4 - % +#end# +TEIL 4: Kommandosprache + +In Teil 4 sind diejenigen Kommandos beschrieben, die erfahrungsgemäß eher der +Handhabung der Arbeitsumgebung zuzurechnen sind. Es ist den Verfassern bewußt, +daß Auswahl und Zusammenstellung recht willkürlich sind, weil eine klare Abgrenzung +zum Teil 5, welcher die Kommandos, die dem Thema: 'Programmierung' zugeordnet +werden, nicht möglich ist. + +Der Teil 4 ist in die Themen: + +- 4.1. Supervisor-Kommandos + +- 4.2.1 Hilfs- und Informationsprozeduren + +- 4.2.2 Thesaurus + +- 4.2.3 Tasks + +- 4.2.4 Handhabung von Dateien + +- 4.2.5 Editor + +- 4.2.6 Dateitransfer + +- 4.2.7 Passwortschutz + +- 4.2.8 Archiv + +gegliedert. Insbesondere zu 4.2.4 ist anzumerken, daß nur Kommandos, die ganze +Dateien betreffen hier erläutert sind. Kommandos, die Dateiinhalte betreffen (Suchen, +Ersetzen etc.) sind in 3.5, bzw. 5.3 beschrieben. +#page# + +4.1 Supervisor + +Es gibt genau sieben vom Supervisor akzeptierte Kommandos. Diese Kommandos +können gegeben werden wenn nach dem Einschalten des Geräts oder dem Abkoppeln +einer Task die SV-Taste gedrückt wurde und die sogenannte EUMEL-Tapete +erscheint. + +____________________________________________________________________________ + + Terminal 2 + + + EUMEL Version 1.8.1/M + + + gib supervisor kommando: + + + + + ESC ? --> help + ESC b --> begin("") ESC h --> halt + ESC c --> continue("") ESC s --> storage info + ESC q --> break ESC t --> task info + +____________________________________________________________________________ + + + + +Desweiteren kann in einer Task gedrückt werden, um durch einen +Programmabbruch einzuleiten. + +Im Gegensatz zu den im weiteren beschriebenen, durch ELAN Prozeduren realisierten +Kommandos, sind diese Supervisor-Kommandos nicht als Prozeduren im System und +mithin nicht durch 'help (...)' anzeigbar. +#page# +'begin' + #on("b")#PROC begin (TEXT CONST taskname) #off("b")# + Richtet eine neue Task als Sohn von PUBLIC ein. + + + #on("b")#PROC begin (TEXT CONST taskname, vatertask) #off("b")# + Richtet eine neue Task als Sohn der Task 'vatertask' ein, falls die Vater-Task + eine Manager-Task ist. Falls diese Task keinen Managerstatus besitzt, passiert + nichts! In diesem Falle muß das Kommando durch abgebrochen werden. + + + FEHLER : "taskname" existiert bereits + "vatertask" gibt es nicht + + + + +'continue' + #on("b")#PROC continue (TEXT CONST taskname) #off("b")# + Eine existierende Task wird an das Terminal des Benutzers angekoppelt. + + FEHLER : "taskname" gibt es nicht + + + Falls 'begin' oder 'continue' trotz korrekter Voraussetzungen kein Resultat zeigen, + 'hängt' die betroffene Task. Beim 'begin' Kommando kann das der Fall sein, falls + die Vater-Task nicht durch 'break' abgekoppelt wurde, sondern mit < SV > verlas­ + sen wurde. In diesem Fall muß das Kommando durch abgebrochen werden, + die Vater-Task angekoppelt und mit korrekt abgekoppelt werden. +#page# +'break' + #on("b")#PROC break #off("b")# + Das Terminal wird vom Rechner abgekoppelt. + + + +'halt' + #on("b")#PROC halt #off("b")# + Das laufende Programm der dem Terminal aktuell zugeordneten Task wird abge­ + brochen. + + Falls in der an das Terminal gekoppelten Task ein laufendes Programm abgebro­ + chen werden soll, muß zunächst durch der Supervisor aufgerufen werden. + Durch das Supervisor-Kommando 'halt' wird der Fehler 'halt from terminal' + induziert. Das Programm wird wie durch jeden anderen Fehler abgebrochen, falls + nicht 'disable stop' gesetzt wurde! + + + +#page# +'storage info' + #on("b")#PROC storage info #off("b")# + Informationsprozedur über den belegten und den verfügbaren Hintergrund-Spei­ + cher des gesamten Systems in KByte#u#1)#e#. + +#foot# + + 1) Bei der derzeit aktuellen '+' Version EUMEL 1.8.1/M+ sind die beiden Anga­ + ben mit 4 zu multiplizieren ! +#end# + Das Terminal wird unmittelbar abgekoppelt! + + + +'task info' + #on("b")#PROC task info #off("b")# + Informiert über alle Tasknamen im System unter gleichzeitiger Angabe der Vater/ + Sohn-Beziehungen durch Einrückungen. + + + + +'help' + #on("b")#PROC help #off("b")# + Kurzbeschreibung der SV-Kommandos. +#page# + +4.2 Monitor + +Unter dem Stichwort Monitor-Kommandos sind an dieser Stelle Kommandos be­ +schrieben, die ständig zur Handhabung der Arbeitsumgebung benutzt werden. +Gleichwohl sei sofort darauf hingewiesen, daß jedes ELAN Programm dem Monitor zur +Ausführung übergeben werden kann. Es gibt also keine speziellen Monitor- +Kommandos, sondern nur eine Reihe von Prozeduren (=Kommandos), die in dieser +Umgebung erfahrungsgemäß besonders häufig benutzt werden. + + +#on("u")#4.2.1 Hilfs- und Informationsprozeduren#off("u")# + +- Pakete, Prozeduren : packets, bulletin , help + Parameter + +- Tasksystem zeigen : task info , task status + +- Speicherplatz zeigen : storage , storage info + + +#on("u")#4.2.2 Thesaurus #off("u")# + +- besondere Thesauri : ALL , all , SOME , remainder + +- Verknüpfung : + , - , / + + +#on("u")#4.2.3 Taskoperationen#off("u")# + +- besondere Tasknamen : archive , brother , father , myself + printer , public , son , supervisor +- Terminal abkoppeln : break +- Task löschen : end +- Manager-Task : global manager , free global manager +- Umbenennen der Task : rename myself + +#page# +#on("u")#4.2.4 Handhabung von Dateien #off("u")# + + : copy , edit , forget , list , rename , show + + +#on("u")#4.2.5 Editor #off("u")# + +- Editieren : edit , editget , show +- Tastenbelegung : kommando auf taste (legen) , + lernsequenz auf taste (legen) , + std tastenbelegung , + taste enthält kommando , + word wrap + + +#on("u")#4.2.6 Transfer #off("u")# + +- Datei holen : fetch , fetchall +- Datei senden : save , saveall +- Drucken : print +- Datei löschen : erase + + +#on("u")#4.2.7 Passwortschutz #off("u")# + +- 'begin' absichern : begin password +- 'continue' absichern : task password +- Dateien absichern : enter password +- Systemzweig sichern : family password + + +#on("u")#4.2.8 Das Archiv #off("u")# + +- Reservieren/freigeben : archive , release +- Formatieren : format +- Löschen : clear +- Kontrollesen : check + + +#page# + +4.2.1 Hilfsprozeduren + +Die drei Prozeduren listen ihre Ausgabe jeweils in eine temporäre Datei, die mit +'show' (s. 4.2.5) gezeigt wird. + + +'packets' + #on("b")#PROC packets #off("b")# + Auflisten der Namen aller insertierten Pakete in der Task. + + + + + + +'bulletin' + #on("b")#PROC bulletin (TEXT CONST paket name) #off("b")# + Listen aller in der DEFINES-Liste des Pakets mit dem Namen "paket name" + enthaltenen Prozeduren. + + FEHLER : ... ist kein Paketname + + + #on("b")#PROC bulletin #off("b")# + Es wird eine Liste aller bisher insertierten Objekte erstellt. Diese Liste ist paket­ + weise sortiert. 'bulletin' zeigt also eine Liste #on("u")#aller#off("u")# Prozeduren an, die in der Task + benutzt werden können. +#page# +'help' + #on("b")#PROC help (TEXT CONST name) #off("b")# + Listen aller Prozeduren / Operatoren mit dem Namen "name". Der Name des + Packets in dessen Schnittstelle die Prozedur steht wird mit ausgegeben. + + Falls es kein Objekt des erfragten Namens gibt, erfolgt die Ausgabe: + + unbekannt "name". + + Beispiel: +____________________________________________________________________________ + + gib kommando : + help("save") + +____________________________________________________________________________ + + + liefert: + +____________________________________________________________________________ + +PACKET nameset: + + save........... (THESAURUS CONST, TASK CONST) + save........... (THESAURUS CONST) + +PACKET globalmanager: + + save........... (DATASPACE CONST, TEXT CONST, TASK CONST) + save........... (TEXT CONST, TASK CONST) + save........... (TEXT CONST) + save........... + +____________________________________________________________________________ + + + + Desweiteren kann auch nach Prozedurnamen gesucht werden, die nur annähernd + bekannt sind, indem ein Suchmuster spezifiziert wird. Das Suchmuster besteht aus + dem bekannten Teil des Namens und dem Operator '*', der vor und/oder nach + dem Suchbegriff gesetzt werden kann. '*' bezeichnet eine beliebige (auch leere) + Zeichenkette. + + Beispiel: Gesucht werden die verschiedenen 'info' Prozeduren: + +____________________________________________________________________________ + gib kommando : + help("*info*") + +____________________________________________________________________________ + + + +____________________________________________________________________________ + + taskinfo....... (INT CONST, INT CONST) + taskinfo....... (INT CONST, FILE VAR) + taskinfo....... (INT CONST) + taskinfo....... + editinfo....... (FILE VAR, INT CONST) + editinfo....... (FILE CONST) --> INT + storageinfo.... + +____________________________________________________________________________ + + + + Dieser Stern darf nicht mit dem 'joker' des 'Pattern Matching' verwechselt werden. + In der 'help' Prozedur darf '*' #on("u")#nicht#off("u")# in den Suchbegriff eingesetzt werden, sondern + nur an Wortanfang und -Ende gesetzt werden. + + +#page# + +Informationsprozeduren + +'storage' + #on("b")#INT PROC storage (TASK CONST task) #off("b")# + Informationsprozedur über den logisch belegten Hintergrund-Speicher der Task. + (Angabe in KByte, bzw. 4KB Einheiten bei der '+'-Version) + + +____________________________________________________________________________ + + gib kommando : + put(storage(myself)) + 1234 + + gib kommando : + +____________________________________________________________________________ + + +'storage info' + #on("b")#PROC storage info #off("b")# + Informationsprozedur über den belegten und den verfügbaren Hintergrund-Spei­ + cher des gesamten Systems. Die Ausgabe erfolgt in KByte, bei der aktuellen + '+'-Version in 4 KByte Einheiten. + + +____________________________________________________________________________ + + gib kommando : + storage info + 1234K von 12000K + + gib kommando : +____________________________________________________________________________ +#page# + +'task info' + #on("b")#PROC task info #off("b")# + Informiert über alle Tasknamen im System unter gleichzeitiger Angabe der Vater/ + Sohn-Beziehungen (Angabe durch Einrückungen). + + + #on("b")#PROC task info (INT CONST art) #off("b")# + Informiert über alle Tasks im System. Mit 'art' kann man die Art der Zusatz- + Information auswählen. + + art=1: entspricht 'task info' ohne Parameter, d.h. es gibt nur die Tasknamen + unter Angabe der Vater/Sohn-Beziehungen aus. + + art=2: gibt die Tasknamen aus. Zusätzlich erhalten Sie Informationen über die + verbrauchte CPU-Zeit der Task, die Priorität, den Kanal, an dem die + Task angekoppelt ist, und den eigentlichen Taskstatus. Hierbei bedeuten: + + 0 -busy- Task ist aktiv. + 1 i/o Task wartet auf Beendigung des Outputs oder auf + Eingabe. + 2 wait Task wartet auf Sendung von einer anderen Task. + 4 busy-blocked Task ist rechenwillig, aber blockiert#u#1)#e#. + 5 i/o -blocked Task wartet auf I/O, ist aber blockiert. + 6 wait-blocked Task wartet auf Sendung, ist aber blockiert. Ach­ + tung: Die Task wird beim Eintreffen einer Sendung + automatisch entblockiert. + > 6 dead + + art=3: wie 2, aber zusätzlich wird der belegte Speicher angezeigt. (Achtung: + Prozedur ist zeitaufwendig!). + +#foot# + +1) Eine Blockierung kann von 'Scheduler' veranlaßt werden + (siehe Systemhandbuch) +#end# + +#page# +____________________________________________________________________________ + + gib kommando : + task info(2) + +____________________________________________________________________________ + + + + liefert: + +____________________________________________________________________________ + + ............................ ............................... + 15.05.87 10:39 CPU PRIO CHAN STATUS + SUPERVISOR.......................... 0000:19:47 0 - wait + -................................ 0000:07:54 0 - wait + SYSUR............................ 0000:34:02 0 - wait + shutup dialog................ 0000:05:26 0 - i/o + configurator................. 0000:04:17 0 - wait + OPERATOR..................... 0000:00:14 0 - i/o + ARCHIVE...................... 0000:10:33 0 31 wait + net.......................... 0006:41:56 0 - wait + net timer................ 0000:02:48 2 - i/o + net port................. 0000:40:23 0 7 wait + PRINTER...................... 0000:05:59 0 - wait + -........................ 0000:00:11 0 - wait + UR.................................. 0000:02:11 0 - wait + PUBLIC........................... 0002:02:03 0 - wait + task1........................ 0000:41:50 0 - -busy- + task2........................ 0000:03:10 0 - i/o + task3........................ 0000:57:28 0 1 -busy- + +____________________________________________________________________________ + + +#page# + + + #on("b")#PROC task info (INT CONST art, FILE VAR infodatei) #off("b")# + Wie oben, die Ausgabe wird jedoch in die Datei 'infodatei' geschrieben. + +____________________________________________________________________________ + + FILE VAR info := sequential file(output,"infodatei") ; + taskinfo(3, info); + +____________________________________________________________________________ + + + #on("b")#PROC task info ( INT CONST art, stationsnr) #off("b")# + Ermöglicht im Netzbetrieb 'task info' über die Station mit der Nummer 'stationsnr'. + +____________________________________________________________________________ + + gib kommando : + taskinfo(1,12) ; + +____________________________________________________________________________ +#page# +'task status' + + #on("b")#PROC task status #off("b")# + Informationsprozedur über den Zustand der eigenen Task. Informiert über + - Name der Task, Datum und Uhrzeit; + - verbrauchte CPU-Zeit; + - belegten Speicherplatz; + - Kanal, an den die Task angekoppelt ist; + - Zustand der Task (rechnend u.a.m.); + - Priorität. + + #on("b")#PROC task status (TASK CONST t) #off("b")# + Wie obige Prozedur, aber über die Task mit dem internen Tasknamen 't'. + + +____________________________________________________________________________ + + gib kommando : + task status (public) + + 15.05.87 10:30 TASK: PUBLIC + + Speicher: 1234K + CPU Zeit: 0011.12:23 + Zustand : wait, (Prio 0), Kanal - + +____________________________________________________________________________ +#page# + +4.2.2 Thesaurus + +Ein #ib#Thesaurus#ie# ist ein #ib#Namensverzeichnis#ie#, das bis zu 200 Namen beinhalten kann. +Dabei muß jeder Namen mindestens ein Zeichen und darf höchstens 100 Zeichen +lang sein. Steuerzeichen (code < 32) in Namen werden umgesetzt (siehe 2.9.2). + +Thesauri werden unter anderem von der Dateiverwaltung benutzt, um das Dateiver­ +zeichnis einer Task zu führen. + +Man kann einen Thesaurus selbst erstellen, indem eine Datei z.B. mit Namen von +Dateien gefüllt wird. Diese Datei kann dann als Thesaurus für weitere Aktionen die­ +nen. + + + +- Thesaurus liefern : ALL , all , SOME , remainder +- Auswählen : LIKE +- Verknüpfen : + , - , / + + + +#on("b")#ACHTUNG#off("b")# : Bei der Verwendung von Thesaurus Operationen in Verbindung mit +'fetch', 'save' etc. ist zu beachten, daß mit 'SOME', 'ALL' und 'all' zunächst nur eine +Auswahl aus einer Liste getroffen wird. Zusätzlich muß das Ziel oder die Quelle des +Dateitransfers vereinbart werden. + +Ein beliebter Fehler ist z.B.: 'fetch (ALL archive)'. + +Hier ist nicht weiter spezifiziert, von wo Dateien geholt werden sollen - also werden +sie von 'father' geholt! (s. 4.2.5) + +Falls die Dateien vom Archiv geholt werden sollen, ist das Archiv als Quelle zu be­ +nennen: + +Also : 'fetch (ALL archive, archive)' = Hole alle Dateien, die in dem Thesaurus von + 'archive' sind von der Task 'archive'. +#page# +'ALL' + THESAURUS OP ALL (TASK CONST task) + Liefert einen Thesaurus, der alle Dateinamen der angegebenen Task enthält. + + + + #on("b")#THESAURUS OP ALL (TEXT CONST dateiname) #off("b")# + Liefert einen Thesaurus, der die in der angegebenen Datei vorhandenen Namen + (jede Zeile ein Name) enthält. + + + + +'all' + #on("b")#THESAURUS PROC all #off("b")# + Liefert einen Thesaurus, der alle Dateinamen der eigenen Task enthält. Entspricht + 'ALL myself'. + + + + +'SOME' + #on("b")#THESAURUS OP SOME (THESAURUS CONST thesaurus) #off("b")# + Bietet den angegebenen Thesaurus zum editieren an. Dort können nicht erwünsch­ + te Namen gestrichen werden. + + + + #on("b")#THESAURUS OP SOME (TASK CONST task) #off("b")# + Aufruf von: SOME ALL task. + + + #on("b")#THESAURUS OP SOME (TEXT CONST dateiname) #off("b")# + Aufruf von: SOME ALL dateiname. + +#page# +'remainder' + #on("b")#PROC remainder #off("b")# + Liefert nach einem 'errorstop' die noch nicht bearbeiteten Dateien. + +____________________________________________________________________________ + + gib kommando : + save all (archive) + + '"....." kann nicht geschrieben werden (Archiv voll)' + +____________________________________________________________________________ + + + + Nachdem man eine neue Floppy ins Archivlaufwerk gelegt hat, kann man mit + + +____________________________________________________________________________ + gib kommando : + save (remainder, archive) + +____________________________________________________________________________ + + den Rest der Dateien auf die nächste Floppy sichern. +#page# +'LIKE' + #on("b")#THESAURUS OP LIKE (THESAURUS CONST thesaurus, TEXT CONST muster) #off("b")# + Alle im Thesaurus enthaltenen Dateien, die dem 'muster' entsprechen sind im + Ergebnisthesaurus enthalten. + + (Die Syntax von 'muster' ist bei der Beschreibung des Pattern-Matching (5.4) + beschrieben) + + +____________________________________________________________________________ + + gib kommando : + print (all LIKE "*.p") + +____________________________________________________________________________ + + + Alle Dateien, deren Name mit '.p' endet, werden gedruckt. + +#page# +'+' + #on("b")#THESAURUS OP + (THESAURUS CONST links, rechts) #off("b")# + Liefert die Vereinigungsmenge von 'links' und 'rechts'. + Achtung: Die Vereinigungsmenge enthält keine Namen mehrfach. + + #on("b")#THESAURUS OP + (THESAURUS CONST links, TEXT CONST rechts)#off("b")# + Fügt dem Thesaurus 'rechts' zu, wenn 'rechts' noch nicht im Thesaurus enthal­ + ten ist. + + + + +'-' + #on("b")#THESAURUS OP - (THESAURUS CONST links, rechts) #off("b")# + Liefert die Differenzmenge. Achtung: Die Differenzmenge enthält keine Namen + mehrfach. + + #on("b")#THESAURUS OP - (THESAURUS CONST links, TEXT CONST rechts)#off("b")# + Nimmt den Namen 'rechts' aus dem Thesaurus. + +____________________________________________________________________________ + + gib kommando : + fetch(ALL father - ALL myself) + +____________________________________________________________________________ + + +'/' + #on("b")#THESAURUS OP / (THESAURUS CONST links, rechts) #off("b")# + Liefert die Schnittmenge + Achtung: Die Schnittmenge enthält keine Namen mehrfach. + + +#page# + +4.2.3 Tasks + +Zur Identifizierung von Tasks dienen sogenannte 'interne Taskbezeichner'. Ein solcher +Taskbezeichner wird beim Einrichten einer neuen Task vergeben. Interne Taskbe­ +zeichner sind auch unter Berücksichtigung der Zeit eindeutig. + +Der Zugriff auf interne Taskbezeichner erfolgt über Prozeduren und Operatoren, die +auf Objekte des Datentyps TASK (siehe 2.9.1) angewandt werden. + +Zusätzlich zum internen Tasknamen, der nicht auszugeben ist, haben Tasks meistens +einen Namen#u#1) #e#. +#foot# + +1) Unbenannte Tasks haben den Pseudonamen "-". +#end# + +Aus Benutzersicht können benannte Tasks innerhalb eines Rechners vollständig und +eindeutig über ihren Namen identifiziert werden. + + +- Task liefern : / , task , niltask + +- Verwandtschaften : brother , father , myself , son + +- Ausgezeichnete Tasks : archive , printer , public , supervisor + +- Namen liefern : name + +- Tasknamen ändern : rename myself + +- Reservieren bes. Tasks : reserve + +#page# +'/' + #on("b")#TASK OP / (TEXT CONST taskname) #off("b")# + Liefert die Task des angegebenen Namens, falls sie existiert. Der eigene Katal­ + og wird automatisch aktualisiert + + (identisch mit der PROC task (TEXT CONST taskname). + + FEHLER : "taskname" gibt es nicht + + + #on("b")#TASK OP / (INT CONST station number, TEXT CONST name) #off("b")# + Liefert im Netzbetrieb die Task des angegebenen Namen von der Station mit der + angegebenen Nummer. + + + +'niltask' + #on("b")#TASK CONST niltask #off("b")# + Bezeichner für "keine Task". So liefern die Prozeduren 'son', 'brother' und 'father' + als Resultat 'niltask', wenn keine Sohn-, Bruder- oder Vatertask existiert. + + + +'task' + #on("b")#TASK PROC task (TEXT CONST taskname) #off("b")# + Liefert die Task des angegebenen Namens, falls sie existiert. Der eigene Katal­ + og wird automatisch aktualisiert. + + FEHLER : "taskname" gibt es nicht + + + #on("b")#TASK PROC task (INT CONST channel number) #off("b")# + Liefert den Namen der Task, die an dem angegebenen Kanal hängt. +#page# +'brother' + #on("b")#TASK PROC brother (TASK CONST task) #off("b")# + Liefert den nächsten Bruder von 'task'. Falls kein Bruder existiert, wird 'niltask' + geliefert. Aktualisiert den eigenen Katalog nicht automatisch! + + + +'father' + #on("b")#TASK PROC father #off("b")# + Liefert die eigene Vatertask. + + + #on("b")#TASK PROC father (TASK CONST task) #off("b")# + Liefert den Vater von 'task'. Existiert kein Vater (z.B. bei UR), wird niltask gelie­ + fert. Aktualisiert den eigenen Katalog nicht automatisch! + + + +'myself' + #on("b")#TASK PROC myself #off("b")# + Liefert eigenen Task-Bezeichner. + + + +'son' + #on("b")#TASK PROC son (TASK CONST task) #off("b")# + Liefert den ersten Sohn von 'task'. Falls keiner im Katalog vermerkt ist, wird + 'niltask' geliefert. Aktualisiert den eigenen Katalog nicht automatisch! + + +#page# +'archive' + #on("b")#TASK PROC archive #off("b")# + Liefert den internen Taskbezeichner der aktuellen Task mit Namen ARCHIVE. + Diese Prozedur dient zum schnellen und bequemen Ansprechen der Archivtask. + + + +'printer' + #on("b")#TASK PROC printer #off("b")# + Liefert den internen Taskbezeichner der aktuellen Task mit Namen #ib#PRINTER#ie#. + Diese Prozedur dient zum schnellen und bequemen Ansprechen des Druckspoo­ + lers. + + +'public' + #on("b")#TASK PROC public #off("b")# + Liefert den internen Taskbezeichner der Task #ib#PUBLIC#ie#. + + + + +'supervisor' + #on("b")#TASK PROC supervisor #off("b")# + Liefert den internen Taskbezeichner des Supervisors. + + +#page# +'name' + #on("b")#TEXT PROC name (TASK CONST task) #off("b")# + Liefert den Namen von 'task'. Die Task muß noch im System existieren, sonst ist + der Name nicht mehr bekannt. Falls die 'task' noch nicht im eigenen Katalog + enthalten ist, wird er aktualisiert. + + + +'rename myself' + #on("b")#PROC rename myself (TEXT CONST neuer name) #off("b")# + Name der eigenen Task wird in 'neuer name' geändert. Wirkt wie Löschung und + Wiedereinrichten der Task in Bezug auf alle TASK VAR's die sich auf diese Task + beziehen. + + FEHLER : Task existiert bereits + Name unzulässig + => anderen Namen wählen + + + +'reserve' + #on("b")#PROC reserve (TASK CONST task) #off("b")# + Reservieren einer Task für den ausschließlichen Dialog mit der Task, in der das + Kommando gegeben wurde. + + #on("b")#PROC reserve (TEXT CONST message, TASK CONST task) #off("b")# + Wie 'reserve (TASK CONST task)' mit Übergabe einer 'message'. + + + Die reservierte Task muß ein spezieller Manager, (z.B. /"DOS" aus dem Werkzeug + MS-DOS-DAT) sein ! +#page# + +4.2.4 Handhabung von Dateien + +'copy' + #on("b")#PROC copy (TEXT CONST quelle, ziel) #off("b")# + Kopiert die Datei 'quelle' in eine neue Datei mit dem Namen 'ziel' in der Benut­ + zer-Task. + + FEHLER : "ziel" existiert bereits + "quelle" gibt es nicht + zu viele Dateien + + + +'forget' + #on("b")#PROC forget (TEXT CONST dateiname) #off("b")# + Löschen einer Datei mit dem Namen 'dateiname' in der Benutzer-Task. + + FEHLER : "datei" gibt es nicht + + + #on("b")#PROC forget (THESAURUS CONST thesaurus) #off("b")# + Löscht die im 'thesaurus' enthaltenen Dateien in der Benutzer-Task. + + Im Dialog erfolgt vor dem Löschen einer Datei standardmäßig die Abfrage: + + +____________________________________________________________________________ + + gib kommando : + forget("einedatei") + "einedatei" löschen(j/n) ? + +____________________________________________________________________________ + +#page# +'list' + #on("b")#PROC list #off("b")# + Listet alle Dateien der Benutzer-Task mit Namen und Datum des letzten Zugriffs + auf dem Terminal auf. + + + #on("b")#PROC list (TASK CONST task) #off("b")# + Listet alle Dateien der angegebenen 'task' mit Namen und Datum der letzten + Änderung auf dem Terminal auf. Die Task muß Manager sein. + + + #on("b")#PROC list (FILE VAR liste) #off("b")# + Listet alle Dateinamen in die Datei 'liste', die mit 'output'(s. 5.3.5) assoziiert sein + muß. + + + #on("b")#PROC list (FILE VAR liste, TASK CONST manager) #off("b")# + Listet alle Dateien der Task 'manager' mit Namen und Datum der letzten Ände­ + rung in die Datei 'liste'. + + +____________________________________________________________________________ + + gib kommando : + FILE VAR f:= sequential file (output,"list");list(f,archive) + +____________________________________________________________________________ + +#page# +'rename' + #on("b")#PROC rename (TEXT CONST altername, neuername) #off("b")# + Umbenennen einer Datei von 'altername' in 'neuername'. + + + + FEHLER : "neuername" gibt es bereits + "altername" gibt es nicht +#page# + +4.2.5 Editor-Prozeduren + +'edit' + #on("b")#PROC edit (TEXT CONST dateiname) #off("b")# + Ruft den Editor mit 'dateiname' auf. + + + #on("b")#PROC edit #off("b")# + a) Im Monitor: + Ruft den Editor mit den zuletzt verwandten Dateinamen auf. + + b) Im Editor: + Der Dateiname wird erfragt. + + Für jedes 'edit' gilt: + Wurde 'edit' zum ersten Mal aufgerufen, nimmt das Fenster den gesamten Bild­ + schirm ein. Bei erneutem 'edit'-Aufruf wird ein Fenster nach rechts unten ab der + aktuellen Cursor-Position eröffnet. + + + #on("b")#PROC edit (THESAURUS CONST t) #off("b")# + Editieren aller in dem Thesaurus 't' enthaltenen Dateien nacheinander. + + + Weitere 'edit-Prozeduren', die z.B. Variation der Fenstergröße etc. zulassen, sind + in 5.4.6 beschrieben. + +#page# +'editget' + #on("b")#PROC editget (TEXT VAR editsatz) #off("b")# + Ausgabe einer (Kommando)zeile, in der Editorfunktionen zur Verfügung + stehen siehe Teil 5.5.1.4. + + + +'show' + #on("b")#PROC show (TEXT CONST dateiname) #off("b")# + Die Datei wird am Bildschirm gezeigt. Positionierung und Suchen funktionieren wie + in 'edit', Aktionen die Änderungen in der Datei bewirken würden, werden nicht + angenommen. + + + + #on("b")#PROC show #off("b")# + 'show' auf der zuletzt bearbeiteten Datei. + +#page# +'kommando auf taste legen' + #on("b")#PROC kommando auf taste legen (TEXT CONST taste, elan programm)#off("b")# + Die Taste 'taste' wird mit dem angegebenen ELAN-Programm belegt. Durch + wird das Programm direkt ausgeführt. + +____________________________________________________________________________ + + gib kommando : + kommando auf taste legen ("a","fetch (SOME archive,archive)") + +____________________________________________________________________________ + + + +'kommando auf taste' + #on("b")#TEXT PROC kommando auf taste (TEXT CONST taste)#off("b")# + Falls 'taste' mit einem ELAN-Programm belegt ist, liefert die Prozedur den + Programmtext, andernfalls den leeren Text niltext. + +____________________________________________________________________________ + + gib kommando : + put (kommando auf taste("f")) + +____________________________________________________________________________ + + + +'taste enthaelt kommando' + #on("b")#BOOL PROC taste enthaelt kommando (TEXT CONST taste)#off("b")# + Liefert TRUE falls 'taste' mit einem ELAN-Programm belegt ist. + + +'lernsequenz auf taste legen' + #on("b")#PROC lernsequenz auf taste legen (TEXT CONST taste, sequenz)#off("b")# + 'taste' wird mit der Zeichenfolge 'sequenz' belegt. Durch wird die + Zeichenfolge an der aktuellen Position ausgegeben. + + Als Zeichenfolge sind natürlich auch einzelne Zeichen und EUMEL-Codes zuläs­ + sig. + + Die vom System vorbelegten Tasten sind in 3.4 'Zeichen schreiben' aufgelistet. + +____________________________________________________________________________ + + gib kommando : + lernsequenz auf taste legen ("x","gib kommando :"13""2""2"") + +____________________________________________________________________________ + + + +'lernsequenz auf taste' + #on("b")#TEXT PROC lernsequenz auf taste (TEXT CONST taste) #off("b")# + Liefert die auf 'taste' gelegte Zeichenfolge. + + +'std tastenbelegung' + #on("b")#PROC std tastenbelegung #off("b")# + Die Standard-Tastenbelegung (s.3.4) wird (wieder) hergestellt. + + +'word wrap' + #on("b")#PROC word wrap (BOOL CONST b) #off("b")# + Der automatische Zeilenumbruch wird durch 'word wrap (FALSE)' aus- und durch + 'word wrap (TRUE)' eingeschaltet. Wird diese Prozedur während des Editierens + aufgerufen, gilt die Einstellung für die aktuelle Textdatei. Wird die Prozedur als + Monitor-Kommando gegeben, so gilt die Eingabe als Voreinstellung für neue + Dateien. +#page# + +4.2.6 Dateitransfer + +Unter diesem Abschnitt sind diejenigen Prozeduren beschrieben, die der simplen +Kommunikation mit Manager-Tasks dienen: Holen oder Senden einer Dateikopie, +Löschen in der Manager-Task. + +#on("b")#ACHTUNG : Für alle Prozeduren gilt: falls die Manager-Task nicht existiert, wird eine +Fehlermeldung erzeugt, existiert eine Task des angegebenen Namens, die aber nicht +Managertask ist, so terminieren die Prozeduren nicht! +#off("b")# + + +'fetch' + #on("b")#PROC fetch (TEXT CONST dateiname, TASK CONST manager) #off("b")# + Kopiert die Datei 'dateiname' aus der Task 'manager' + + + #on("b")#PROC fetch (THESAURUS CONST th, TASK CONST manager) #off("b")# + Kopiert alle Dateien, deren Namen im Thesaurus th enthalten sind, aus der Task + 'manager'. + + +____________________________________________________________________________ + + gib kommando : + fetch(ALL(12/"PUBLIC"), 12/"PUBLIC") + +____________________________________________________________________________ + + + + Mit diesem Kommando werden (in einem EUMEL Netz) alle Dateien der Task + 'PUBLIC' des Rechners mit der Stationsnummer 12 in diesem Netz kopiert. + +#page# +____________________________________________________________________________ + + gib kommando : + fetch(SOME archive , archive) + +____________________________________________________________________________ + + + + Bietet den Thesaurus von 'ARCHIVE' an, nach Auswahl werden alle Dateien deren + Namen nicht gelöscht wurden, von der Diskette kopiert. + + + #on("b")#PROC fetch (TEXT CONST dateiname) #off("b")# + Kopiert die Datei 'dateiname' aus der Task 'father' + + + #on("b")#PROC fetch (THESAURUS CONST th) #off("b")# + Kopiert alle Dateien, deren Namen in 'th' sind aus der Task 'father'. + + + +'fetchall' + + #on("b")#PROC fetchall #off("b")# + entspricht: fetch (ALL father, father) + + + #on("b")#PROC fetchall (TASK CONST manager)#off("b")# + entspricht: fetch(ALL manager, manager) + +#page# +'save' + #on("b")#PROC save (TEXT CONST dateiname, TASK CONST manager) #off("b")# + Kopiert die Datei 'dateiname' in die Task 'manager' + + + #on("b")#PROC save (THESAURUS CONST th, TASK CONST manager) #off("b")# + Kopiert alle Dateien, deren Namen im Thesaurus th enthalten sind, in die Task + 'manager'. + +____________________________________________________________________________ + + gib kommando : + save(all, (12/"PUBLIC")) + +____________________________________________________________________________ + + + Mit diesem Kommando werden (in einem EUMEL Netz) alle Dateien der eigenen + Task in die Task 'PUBLIC' des Rechners mit der Stationsnummer 12 in diesem + Netz kopiert. + +____________________________________________________________________________ + + gib kommando : + save(SOME myself, manager) + +____________________________________________________________________________ + + + Bietet den eigenen Thesaurus an, nach Auswahl werden alle Dateien deren + Namen nicht gelöscht wurden, zur Task 'manager' kopiert. + + + #on("b")#PROC save (TEXT CONST dateiname) #off("b")# + Kopiert die Datei 'dateiname' in die Task 'father' + + + #on("b")#PROC save (THESAURUS CONST th) #off("b")# + Kopiert alle Dateien, deren Namen in 'th' enthalten sind, in die Task 'father'. + + + #on("b")#PROC save #off("b")# + Kopiert die zuletzt bearbeitete Datei in die Task 'father' + + + + +'saveall' + #on("b")#PROC saveall #off("b")# + entspricht: save (all, father) + + + #on("b")#PROC saveall (TASK CONST manager) #off("b")# + entspricht: save (ALL myself, manager) + +#page# +'erase' + #on("b")#PROC erase (TEXT CONST dateiname, TASK CONST manager) #off("b")# + Löscht die Datei 'dateiname' aus der Task 'manager' + + + #on("b")#PROC erase (THESAURUS CONST th, TASK CONST manager) #off("b")# + Löscht alle Dateien, deren Namen im Thesaurus th enthalten sind, aus der Task + 'manager'. + + + #on("b")#PROC erase (TEXT CONST dateiname) #off("b")# + Löscht die Datei 'dateiname' aus der Task 'father' + + + #on("b")#PROC erase (THESAURUS CONST th) #off("b")# + Löscht alle Dateien, deren Namen in 'th' sind, aus der Task 'father' + + + #on("b")#PROC erase #off("b")# + Löscht die zuletzt bearbeitete Datei aus der Task 'father' + + +#page# +'print' + Das Kommando 'print' beinhaltet den Auftrag an die Task 'PRINTER' die enthal­ + tene(n) Datei(en) auszudrucken. + + Voraussetzung ist natürlich, daß die Druckersoftware ordnungsgemäß benutzt + wurde, um 'PRINTER' einzurichten. Siehe dazu Systemhandbuch Teil 6. + + + #on("b")#PROC print (TEXT CONST dateiname) #off("b")# + Kopiert die Datei 'dateiname' in die Task 'PRINTER'. + + + #on("b")#PROC print (THESAURUS CONST th) #off("b")# + Kopiert alle Dateien, deren Namen im Thesaurus 'th' enthalten sind, in die Task + 'PRINTER'. + + + #on("b")#PROC print #off("b")# + Kopiert die zuletzt bearbeitete Datei in die Task 'PRINTER'. + + +#page# + +4.2.7 Passwortschutz + +Der Passwortschutz im EUMEL-System ist in verschiedener Ausprägung möglich. +Einfachste Möglichkeit ist der Schutz einer Task durch ein Passwort. Falls diese Task +nicht Manager ist, können alle Daten und Programme, die nur in dieser Task zur +Verfügung stehen, auch nur vom Besitzer der Task benutzt werden. + +Ähnlich kann auch von einer Manager-Task aus der gesamte Zweig unterhalb dieser +Task mit einem Passwort geschützt werden: beispielsweise kann es empfehlenswert +sein, den Systemzweig komplett zu schützen, indem in SYSUR ein entsprechendes +Passwort vereinbart wird. + +Ein Umgehen des Passwortschutzes bei Manager-Tasks (durch Einrichten einer +Sohn-Task und 'fetchall') wird durch ein 'begin password' verhindert. + +Auch einzelne Dateien lassen sich schützen, indem Lese/Schreibpasswörter für den +Dateitransfer vereinbart werden. + +Generell gilt für die Verwendung von Passworten: + +- Passworte, die zu naheliegend gewählt sind (Vorname des Lebenspartners o.ä.) + sind meistens sinnlos, falls wirklich Datenschutz bezweckt ist. + +- Passworte, die so raffiniert sind, daß sogar ihr Schöpfer sie vergißt, führen zu + 100%igem Datenverlust, da die betroffene Task oder Datei nur noch gelöscht + werden kann. + +- Die Vereinbarung von "-" als Passwort bewirkt, daß die entsprechende Aktion + nicht mehr durchgeführt werden kann. Wird z.B. '-' als 'task password' + eingegeben, so kann die Task nie wieder an ein Terminal gekoppelt werden. + +- Passwörter können geändert werden, indem das entsprechende Kommando noch + einmal mit dem neuen Passwort gegeben wird. + +#page# +'begin password' + + #on("b")#PROC begin password (TEXT CONST passwort) #off("b")# + + Auf Supervisor-Ebene wird vor Einrichten einer neuen Task als Sohn der Task in + der das 'begin password' gegeben wurde, dieses erfragt. + + Das Password vererbt sich auf die hinzukommenden Sohn-Tasks. + +____________________________________________________________________________ + + #on("b")#SYSUR#off("b")# + maintenance : + begin password ("alles dicht") + +____________________________________________________________________________ + + +bewirkt: + +____________________________________________________________________________ + + Terminal 2 + + + EUMEL Version 1.8.1/M + + + gib supervisor kommando: + begin ("sabotage","SYSUR") + Passwort: + + + ESC ? --> help + ESC b --> begin("") ESC h --> halt + ESC c --> continue("") ESC s --> storage info + ESC q --> break ESC t --> task info + + +____________________________________________________________________________ + + +#page# +'enter password' + #on("b")#PROC enter password (TEXT CONST datei, schreibpass, lesepass) + #off("b")# + Hiermit können ausgewählte Dateien einer Manager-Task geschützt werden. Die + angegebene Datei wird mit Schreib- und Lesepassword versehen. Die Pass­ + wörter werden in der eigenen Task nicht berücksichtigt. + + Bei einem lesenden Zugriff (fetch) von irgendeiner Task aus auf die entsprechende + Datei in der Manager-Task muß das Lesepasswort, bei schreibendem Zugriff + (save/erase) das Schreibpasswort vereinbart sein. + + +____________________________________________________________________________ + + maintenance : + enter password ("wichtige datei","sicher","heit") + +____________________________________________________________________________ + + + + + #on("b")#PROC enter password (TEXT CONST password) #off("b")# + Passwort für den Dateitransfer einstellen. Falls zwei verschiedene Passwörter für + Lesen und Schreiben vereinbart werden sollen, so sind sie als ein Text durch "/" + getrennt einzugeben. + +____________________________________________________________________________ + + gib kommando : + enter password ("sicher/heit") + + gib kommando : + save(SOME all) + +____________________________________________________________________________ +#page# +'family password' + #on("b")#PROC family password (TEXT CONST geheim) #off("b")# + Einstellen eines Passworts für den Zweig des Systems , der unterhalb der (Mana­ + ger) Task liegt, in der das 'family password' eingegeben wurde. Dabei erhalten + alle Tasks, die kein Password oder dasselbe wie diese Manager-Task haben, das + 'family password'. Tasks in dem Zweig, die ein eigenes anderes besitzen, behal­ + ten dieses. + +____________________________________________________________________________ + + PUBLIC + + Task1 "" + + Task2 family password("fingerweg") + Task21 geheim + Task22 "" + + Task3 "" + Task31 "" + +____________________________________________________________________________ + + + + +bewirkt: + +____________________________________________________________________________ + PUBLIC + + Task1 "" + + Task2 fingerweg + Task21 geheim + Task22 fingerweg + + Task3 "" + Task31 "" + +____________________________________________________________________________ + + +#page# + +'task password' + + #on("b")#PROC task password (TEXT CONST geheim) #off("b")# + Einstellen eines Passworts für die Task in der es gegeben wird. Ist eine Task mit + einem Passwort geschützt, so wird durch den Supervisor nach dem 'continue'- + Kommando das Passwort angefragt (Entsprechend dem 'begin password'). Nur + nach Eingabe des richtigen Passworts gelangt man in die gewünschte Task. Das + Passwort kann durch nochmaligen Aufruf von 'task password' geändert werden, + z.B. wenn es in regelmäßigen Abständen geändert werden muß, um personenbe­ + zogene Daten zu schützen. + +#page# + +4.2.8 Das Archiv + +Mit dem Terminus 'Archiv' wird beim EUMEL-System ein Diskettenlaufwerk bezeich­ +net, das nur Datensicherungsaufgaben dient. Falls ein Rechner eins von zwei vorhan­ +denen Diskettenlaufwerk als Arbeitsspeicher benutzt, so wird dieses als Hintergrund +bezeichnet. Falls Sie einen derartigen Rechner benutzen, können Sie der Installa­ +tionsanleitung entnehmen, welches Laufwerk welcher Aufgabe zugeordnet ist. + +Das #ib#Archiv#ie# übernimmt im EUMEL-System die Verwaltung der langfristigen Daten­ +haltung. Das Archiv sollen Sie benutzen, um: + +- Sicherungskopien wichtiger Dateien außerhalb des Rechners zu besitzen; + +- nicht benötigte Dateien außerhalb einer Task zu halten (Speicherplatzersparnis!); + +- Dateien auf andere Rechner zu übertragen. + +Das Archiv wird im EUMEL-System durch die Task 'ARCHIVE', die das Disketten­ +laufwerk des Rechners verwaltet, realisiert. + +- reservieren : archive + +- freigeben : release + +- löschen : clear , format + +- prüfen : check + +#page# +'archive' + #on("b")#PROC archive (TEXT CONST archivname) #off("b")# + Reservierung der Task ARCHIVE für den exklusiven Dialog mit der aufrufenden + Task. 'archivname' wird bei allen folgenden Archivoperationen mit dem der Disket­ + te zugewiesenen (und hoffentlich auf dem Aufkleber vermerkten) Namen abgegli­ + chen. + + + +'release' + #on("b")#PROC release (TASK CONST archive) #off("b")# + Nach diesem Kommando kann die Task 'ARCHIVE' mit ihren Leistungen von einer + anderen Task in Anspruch genommen werden. Falls dieses Kommando nicht + gegeben wird, aber seit 5 Minuten kein Dialog mit 'archive' stattfand, kann eine + andere Task durch die Anforderung 'archive("diskettenname")' das Archiv reser­ + vieren. Durch diese Maßnahme wird verhindert, daß ein vergeßlicher Benutzer bei + einem System mit mehreren Benutzern das Archiv blockiert. + +#page# + +'clear' + #on("b")#PROC clear (TASK CONST archive) #off("b")# + Löschen des Disketten-Inhaltsverzeichnisses und Zuweisung des in der Reservie­ + rung eingegebenen Namens. + +____________________________________________________________________________ + + gib kommando : + archive("name"); #ib#clear#ie# (archive) + +____________________________________________________________________________ + + + Durch die Ausführung des Kommandos erhält die eingelegte Diskette den in der + Reservierung angegebenen Namen. #on("b")#Das Inhaltsverzeichnis, das sich auf der + Diskette befindet, wird gelöscht. Damit sind die Daten, die sich eventuell auf + dieser Diskette befanden, nicht mehr auffindbar#off("b")#. Die Diskette entspricht einer neu + formatierten Diskette#u#1)#e#. + + Man kann also eine beschriebene Diskette nicht umbenennen, ohne die darauf + befindlichen Daten zu löschen. + + #foot# + + #u#1)#e# Das Kommando 'format' enthält implizit 'clear'. +#end# + + Eine Neuformatierung ist demnach bei Wiederverwendung der Diskette nicht + notwendig. + +#page# +'format' + #on("b")#PROC format (TASK CONST archive) #off("b")# + Formatieren einer Diskette. Vor der erstmaligen Benutzung einer Archivdiskette + muß diese formatiert, d.h. in Spuren und Sektoren für die Positionierung des + Schreib-/Lesekopfes des Diskettenlaufwerks eingeteilt werden, um überhaupt ein + Beschreiben der Diskette zu ermöglichen. Die Einteilung ist geräteabhängig, häufi­ + ge Formate sind: + + 40 Spuren zu je 9 Sektoren (360 K) + 80 Spuren zu je 9 Sektoren (720 K). + + Die #on("b")#Erst#off("b")#benutzung einer #ib#Archivdiskette#ie# erfordert nach der Reservierung des Ar­ + chivs das Kommando: + +____________________________________________________________________________ + + gib kommando : + archive("diskname"); + + gib kommando : + format (archive); + +____________________________________________________________________________ + + +Erst nach einer Kontrollabfrage: + +____________________________________________________________________________ + + gib kommando: + format (archive) + + Archiv "diskname" formatieren ? (j/n) + +____________________________________________________________________________ + + + + wird tatsächlich formatiert und die Diskette steht mit dem Namen "diskname" für + Archivoperationen zur Verfügung. + +#page# + + #on("b")#PROC format (INT CONST code, TASK CONST archive) #off("b")# + Bei einigen Rechnern ist es möglich, die Formatierung zu variieren. Falls beim + Formatieren auf einem solchen Rechner ein anderes als das Standardformat + erzeugt werden soll, so ist die Codierung des gewünschten Formats mitanzuge­ + ben. + + + Beispiel: Für ein Gerät mit 5,25 Zoll Disketten wäre z.B. einstellbar: + code 0 : Standardformat + code 1 : 2D , 40 Spuren , 9 Sektoren + code 2 : 2D , 80 Spuren , 9 Sektoren + code 3 : HD , 80 Spuren ,15 Sektoren + + 'format (archive)' erzeugt ebenso wie 'format (0,archive)' eine + standardformatierte Diskette, 'format (3,archive)' erzeugt eine High + Density Formatierung (HD Floppy benutzen!). + +#on("b")# + ACHTUNG: Wird eine bereits beschriebene Diskette noch einmal formatiert, so + sind alle Daten, die auf der Diskette waren, verloren. + + Die Umformatierung einer Diskette (z.B. von 720K auf 360K) auf + unterschiedlichen Laufwerken kann zu Problemen führen. +#off("b")# +#page# +'check' + #on("b")#PROC check (TEXT CONST dateiname, TASK CONST task) #off("b")# + Überprüft, ob die Datei 'dateiname' auf dem Archiv lesbar ist. + + + #on("b")#PROC check (THESAURUS CONST t, TASK CONST task) #off("b")# + Überprüft, ob die in dem Thesaurus 't' enthaltenen Dateien auf dem Archiv lesbar + sind. + + + Mit diesem Kommando kann nach dem Beschreiben einer Diskette überprüft wer­ + den, ob die Datei(en) lesbar sind. Hierdurch können also verschmutzte oder + beschädigte Disketten erkannt werden. + + +____________________________________________________________________________ + + gib kommando : + save (all , archive) + + gib kommando : + check (ALL archive, archive) + +____________________________________________________________________________ + +#page# + +Beispiel: + + +____________________________________________________________________________ + + gib kommando : + archive ("neu") + + gib kommando : + format (archive) + +____________________________________________________________________________ + + +liefert zunächst die Kontollfrage: + +____________________________________________________________________________ + + gib kommando : + format (archive) + + Archiv "neu" formatieren ? (j/n) + +____________________________________________________________________________ + + +Nach Eingabe 'j' + +____________________________________________________________________________ + + gib kommando : + saveall (archive) + + gib kommando : + archive("alt") (* nächste Diskette *) + + gib kommando : + fetch(SOME archive ,archive) + +____________________________________________________________________________ + + +Der Thesaurus des Archivs wird angezeigt: +#page# +____________________________________________________________________________ + + .................alt (100 K belegt von 720 K)............... + + 01.02.87 25 K "handbuch teil 1" + 01.03.87 23 K "handbuch teil 2" + 01.04.87 20 K "handbuch teil 3" + 01.05.87 32 K "handbuch teil 4" + +____________________________________________________________________________ + + + + + +Zum Abschluß Archiv freigeben! +____________________________________________________________________________ + + gib kommando : + release(archive) + +____________________________________________________________________________ +#page# + +Fehlermeldungen des Archivs +Versucht man, eine Datei vom Archiv zu holen, kann es vorkommen, daß das Ar­ +chiv-System + +____________________________________________________________________________ + + gib kommando : + fetch ("datei", archive) + #ib#Lese-Fehler (Archiv)#ie# + +____________________________________________________________________________ + + + +meldet und den Lese-Vorgang abbricht. Dies kann auftreten, wenn die Floppy +beschädigt oder aus anderen Gründen nicht lesbar ist (z.B. nicht justierte Disket­ +ten-Geräte). In einem solchen Fall vermerkt das Archiv-System intern, daß die Datei +nicht korrekt gelesen werden kann. Das sieht man z.B. bei 'list (archive)'. Dort ist der +betreffende Datei-Name mit dem Zusatz 'mit Lese-Fehler' gekennzeichnet. Um +diese Datei trotzdem zu lesen, muß man sie unter ihrem Dateinamen mit dem Zusatz +'mit Lese-Fehler' lesen. + +____________________________________________________________________________ + + gib kommando: + fetch ("datei mit Lese-Fehler", archive) + +____________________________________________________________________________ + + + +Die Datei wird in diesem Fall trotz Lese-Fehler (Informationsverlust!) vom Archiv +gelesen. +#page# + +Weitere Fehlermeldungen des Archivs: + + +FEHLER : Lesen unmöglich (Archiv) + Die Archiv-Diskette ist nicht eingelegt oder die Tür des Laufwerks ist nicht + geschlossen. + => Diskette einlegen bzw. Tür schließen. + +FEHLER : Schreiben unmöglich (Archiv) + Die Diskette ist schreibgeschützt. + => falls wirklich gewünscht, Schreibschutz entfernen. + +FEHLER : Archiv nicht angemeldet + Das Archiv wurde nicht angemeldet + => 'archive ("name")' geben. + +FEHLER : Lese-Fehler (Archiv) + Siehe Lesen unmöglich + +FEHLER : Schreibfehler (Archiv) + Die Diskette kann nicht (mehr) beschrieben werden. + => Andere Diskette verwenden. + +FEHLER : Speicherengpass + Im System ist nicht mehr genügend Platz, um eine Datei vom Archiv zu + laden. + => ggf. Dateien löschen. + +FEHLER : RERUN bei Archiv-Zugriff Das System wurde bei einer Archiv-Operation + durch Ausschalten bzw. Reset unterbrochen. + +FEHLER : "dateiname" gibt es nicht + Die Datei "dateiname" gibt es nicht auf dem Archiv. + => mit 'list(archive)' Archiv prüfen. + +FEHLER : Archiv heißt ... + Die eingelegte Diskette hat einen anderen als den eingegebenen Archivna­ + men. + => Kommando 'archive' mit korrektem Namen geben. + +FEHLER : Archiv wird von Task ... benutzt + Das Archiv wurde von einem anderen Benutzer reserviert. + => Abwarten. + +FEHLER : "dateiname" kann nicht geschrieben werden (Archiv voll) + Die Datei ist zu groß für die eingelegte Diskette. + => Andere Diskette für diese Datei nehmen. + +FEHLER : Archiv inkonsistent + Die eingelegte Diskette hat nicht die Struktur einer Archiv-Diskette. + => 'format (archive)' vergessen. + +FEHLER : save/erase wegen Lese-Fehler verboten + Bei Archiven mit Lese-Fehler sind Schreiboperationen verboten, weil ein + Erfolg nicht garantiert werden kann. + diff --git a/doc/programming/programmierhandbuch.5 b/doc/programming/programmierhandbuch.5 new file mode 100644 index 0000000..a921572 --- /dev/null +++ b/doc/programming/programmierhandbuch.5 @@ -0,0 +1,1329 @@ +#pagenr("%",1)##setcount(1)##block##pageblock# +#headeven# +#center#EUMEL-Benutzerhandbuch +#center#____________________________________________________________ + +#end# +#headodd# +#center#TEIL 5 : Programmierung +#center#____________________________________________________________ + +#end# +#bottomeven# +#center#____________________________________________________________ +5 - % #right#GMD +#end# +#bottomodd# +#center#____________________________________________________________ +GMD #right#5 - % +#end# + +TEIL 5: Programmierung + + +5.1 Der ELAN-Compiler + +Der ELAN-Compiler des EUMEL-Systems dient zweierlei Aufgaben: zum einen der +Übersetzung von ELAN-Programmen, zum anderen der Verwaltung der taskeigenen +Modulbibliothek. + +Diese Moduln, in ELAN Pakete (siehe 2.4.3.4ff.) genannt, stellen als vorübersetzte, +und damit abrufbereite#u#1)#e# Prozeduren den Kommandovorrat einer Task dar. + +Der Codebereich einer Task liegt in ihrem Standarddatenraum (ds4). Die Größe dieses +Codebereiches beträgt 256K. Der Inhalt besteht zunächst aus den von der Vatertask +ererbten (durch Kopie des ds4 dieser Task) Moduln, im weiteren allen in dieser Task +neu hinzu insertierten Packeten. +#on("b")# + + +ACHTUNG: Durch ständiges Neuinsertieren eines Packets kann der + Codebereich der betroffenen Task zum Überlaufen + gebracht werden! + + +#foot# + +1) Die von anderen Systemen her gewohnten Phasen 'Binden' und 'Laden' sind + durch das EUMEL-ELAN-Compiler-Konzept unnötig. +#end# +Jedes Kommando im EUMEL-System ist der Aufruf einer, in der Schnittstelle eines +bereits insertierten Packetes stehenden, Prozedur. + +Kommandos für den ELAN-Compiler: + +- Übersetzen : do , insert , run , runagain + +- Protokollieren : check , checkon/off , + prot , protoff , warnings on/off + + +#page# +'do' + #on("b")#PROC do (TEXT CONST program)#off("b")# + Übersetzen und Ausführen von 'program' von einem Programm aus. 'program' + muß ein ausführbares ELAN Programm sein. + + +____________________________________________________________________________ + + ........................... Beispiel .......................... + PACKET reo DEFINES reorganize all: + + PROC reorganize all(THESAURUS CONST thes): + do (PROC (TEXT CONST) reorganize ,thes) + (* Die Prozedur 'reorganize' (siehe 5-52), die einen*) + (* Dateinamen als Parameter verlangt, wird auf alle *) + (* Dateien des Thesaurus 'thes' angewandt. *) + END PROC reorganize all; + END PACKET reo; + +____________________________________________________________________________ + + +'insert' + #on("b")#PROC insert (TEXT CONST dateiname) #off("b")# + Insertieren eines oder mehrerer PACKETs aus der Datei 'dateiname'. Der Pro­ + grammtext muß sich in #on("u")#einer#off("u")# Datei befinden. + + + #on("b")#PROC insert #off("b")# + Insertieren eines oder mehrerer PACKETs. Der Dateiname ist der zuletzt benutzte + Dateiname. + + + #on("b")#PROC insert (THESAURUS CONST t) #off("b")# + Insertieren aller PACKETs, die in den Dateien des Thesaurus 't' enthalten sind. + + +#page# +'run' + #on("b")#PROC run #off("b")# + Übersetzen und Ausführen eines ELAN-Programms. Der Programmtext muß sich + in einer Datei befinden. Der Dateiname ist der zuletzt benutzte Dateiname. + + + #on("b")#PROC run (TEXT CONST dateiname) #off("b")# + Wie oben. Der Programmtext wird aus der Datei mit dem Namen 'dateiname' + geholt. + + + +'runagain' + #on("b")#PROC runagain #off("b")# + Nochmaliges Ausführen des zuletzt mit 'run' übersetzten ELAN-Programms. + Wurde in der letzten Übersetzung ein Fehler gefunden, erfolgt die Meldung: + + FEHLER : "run again nicht möglich" + +#page# +'check' + #on("b")#BOOL PROC check #off("b")# + Informationsprozedur, die TRUE liefert, wenn 'check' eingeschaltet ist. + + #on("b")#PROC check on #off("b")# + Einschalten der Generierung von Zeilennummern durch den ELAN-Compiler. Der + bei der Übersetzung erzeugte Code wird ca. 25% umfangreicher! + Voreinstellung im 'PUBLIC'- Zweig: 'check on'. + + #on("b")#PROC check off #off("b")# + Ausschalten der Generierung von Zeilennummern durch den ELAN-Compiler. + Voreinstellung im 'SYSUR' - Zweig: 'check off. + + +'prot' + #on("b")#BOOL PROC prot #off("b")# + Informationsprozedur, die TRUE liefert, gdw. 'prot' eingeschaltet ist. + + #on("b")#PROC prot (TEXT CONST dateiname) #off("b")# + Einschalten des Compilerlistings auf dem Bildschirm. Das Listing wird gleichzeitig + in die Datei 'dateiname' geschrieben. + + #on("b")#PROC prot off #off("b")# + Ausschalten des Listings. + + +'warnings' + #on("b")#BOOL PROC warnings #off("b")# + Informationsprozedur, die TRUE liefert gdw. 'warnings' eingeschaltet ist. + + #on("b")#PROC warnings on #off("b")# + Warnungen werden wie Fehlermeldungen ins Notizbuch ausgegeben. + + #on("b")#PROC warnings off#off("b")# + Warnungen werden nicht mit in das Notizbuch ausgegeben. +#page# + +5.1.1 Fehlermeldungen des ELAN-Compilers +erfolgen stets in der Form: + +#ib#COMPILER ERROR#ie#: + +wobei folgende Werte annehmen kann: + +#on("bold")# Bedeutung und eventuelle Abhilfe#off ("bold")#: + + 101 Überlauf der Namenstabelle + Die Anzahl der Namen aller sichtbaren Pakete ist zu groß oder es wurden + die Anführungstriche eines TEXT-Denoters vergessen. + => Keine Abhilfe. + + 102 Überlauf der Symboltabelle + Die Anzahl der deklarierten Objekte ist zu groß. + => Programm in Pakete unterteilen. + + 103 Überlauf des Zwischencodebereiches + => Programm in Pakete unterteilen. + + 104 Überlauf der Permanenttabelle + Zu viele Pakete insertiert. + => Keine (neue Task beginnen). + + 106 Paketdatenadresse zu groß + Im Paket wird zuviel Platz ( > 64K ) von globalen Datenobjekten und + Denotern eingenommen. + => Keine Abhilfe. + + 107 Lokale Datenadresse zu groß + Im Paket wird zuviel Platz ( > 32K ) von lokalen Datenobjekten belegt. + => Keine Abhilfe. + #page# + 204 Überlauf des Compilerstack + => Keine Abhilfe. + + 301 Modulnummern-Überlauf + Zu viele sichtbare Pakete, Prozeduren und Operatoren ( > 2048 ). + => Keine Abhilfe. + + 303 + siehe 304 + + 304 Zu viele Ansprungadressen + In dem gerade übersetzten Modul (Prozedur, Operator oder Paketrumpf) + werden vom Compiler zu viele Marken benötigt (mehr als 2000). Marken + werden z.B. für die Codegenerierung von Auswahl (IF ...) und Wieder­ + holung (REP ...) gebraucht. Insbesondere bei SELECT-Anweisungen + werden 'casemax - casemin + 2' Marken benötigt, wobei 'casemax' der + INT-Wert des maximalen, 'casemin' der des minimalen CASE-Wertes + ist. Dieser Fehler ist somit fast immer auf zu viele und/oder zu weit ge­ + spannte SELECT-Anweisungen zurückzuführen. + => SELECT-Anweisungen über mehrere Prozeduren verteilen oder + Spannweiten verringern. + + 305 Codeüberlauf + Der insgesamt erzeugte sichtbare Code ist zu umfangreich ( > 256K ). + => Keine Abhilfe. + + 306 Paketdatenadresse zu groß + Insgesamt zu viele Datenobjekte in den Paketen ( > 128K ). + => Keine Abhilfe. + + 307 Temporäre Datenadresse zu groß + Zu viele (lokale) Datenobjekte in einer Prozedur ( > 32K ). + => Prozedur in mehrere unterteilen, so daß die Datenobjekte sich über + mehrere Prozeduren verteilen. + + 308 Modulcode-Überlauf + Ein Modul (Prozedur, Operator oder Paket-Initialisierungsteil) ist zu groß + ( > 7.5 KB Code). + => In mehrere Prozeduren oder Pakete zerlegen. + + 309 Zuviele Paketdaten + (Insgesamt mehr als 128K Paketdaten) + => Keine Abhilfe + + +#page# + +5.2 Standardtypen + + +5.2.1 Bool + +Der Wertebereich für Datenobjekte vom Typ BOOL besteht aus den Werten TRUE +und FALSE. + +'AND' + #on("b")#BOOL OP AND (BOOL CONST a, b) #off("b")# + Logisches UND, liefert TRUE gdw. a und b TRUE sind. + + +'CAND' + #on("b")#BOOL OP CAND #off("b")# + Bedingtes logisches UND, entspricht: 'IF a THEN b ELSE false FI'. Der zweite + Operand wird nicht ausgewertet, falls er für das Ergebnis nicht relevant ist. + + +'COR' + #on("b")#BOOL OP COR #off("b")# + Bedingtes logisches ODER, entspricht: 'IF a THEN true ELSE b FI'. Der zweite + Operand wird nicht ausgewertet, falls er für das Ergebnis nicht relevant ist. + + +'false' + #on("b")#BOOL CONST false #off("b")# + + +'NOT' + #on("b")#BOOL OP NOT (BOOL CONST a) #off("b")# + Logische Negation. + + +'OR' + #on("b")#BOOL OP OR (BOOL CONST a, b) #off("b")# + Logisches ODER, liefert TRUE gdw. a und/oder b TRUE ist. + + +'true' + #on("b")#BOOL CONST true #off("b")# + + +'XOR' + #on("b")#BOOL OP XOR (BOOL CONST a, b) #off("b")# + Exklusives ODER, liefert TRUE gdw. entweder a oder b TRUE ist. + +#page# + +5.2.2 Integer-Arithmetik + +Ein Datenobjekt vom Typ INT belegt im Speicher 2 Bytes. Zulässige INT - Werte +sind die ganzen Zahlen von -32768 bis +32767 einschließlich. + +Falls größere ganze Zahlen benötigt werden, muß das Packet 'LONGINT', welches +sich auf dem Archive 'std.zusatz' befindet, nachinsertiert werden (siehe 6.1.2). + +Operationen für Integers: + +- Vergleich : = , <> , < , <= , > , >= + +- Verknüpfung : + , - , * , ** , DECR , DIV , INCR + +- Sonstiges : abs , ABS , initialize random , max , maxint , min , + minint , MOD , random , sign , SIGN , text +#page# +':=' + #on("b")#INT OP := (INT VAR a, INT CONST b) #off("b")# + Zuweisung. + + +'=' + #on("b")#BOOL OP = (INT CONST a, b) #off("b")# + Vergleich. + + +'<>' + #on("b")#BOOL OP <> (INT CONST a, b) #off("b")# + Vergleich auf Ungleichheit. + + +'<' + #on("b")#BOOL OP < (INT CONST a, b) #off("b")# + Vergleich auf kleiner. + + +'<=' + #on("b")#BOOL OP <= (INT CONST a, b) #off("b")# + Vergleich auf kleiner gleich. + + +'>' + #on("b")#BOOL OP > (INT CONST a, b) #off("b")# + Vergleich auf größer. + + +'>=' + #on("b")#BOOL OP >= (INT CONST a, b) #off("b")# + Vergleich auf größer gleich. + +#page# +'+' + #on("b")#INT OP + (INT CONST a) #off("b")# + Monadischer Operator (Vorzeichen, ohne Wirkung). + + #on("b")#INT OP + (INT CONST a, b) #off("b")# + Addition. + + +'-' + #on("b")#INT OP - (INT CONST a) #off("b")# + Vorzeichen-Umkehrung. + + + #on("b")#INT OP - (INT CONST a, b) #off("b")# + Subtraktion. + + +'*' + #on("b")#INT OP * (INT CONST a, b) #off("b")# + Multiplikation. + + +'**' + #on("b")#INT OP ** (INT CONST arg, exp) #off("b")# + Exponentiation mit 'exp' >= 0 + + +'DECR' + #on("b")#OP DECR (INT VAR links, INT CONST rechts) #off("b")# + Wirkt wie links := links - rechts + + +'DIV' + #on("b")#INT OP DIV (INT CONST a, b) #off("b")# + INT-Division. + + FEHLER : + - DIV durch 0 + + +'INCR' + #on("b")#OP INCR (INT VAR links, INT CONST rechts) #off("b")# + Wirkt wie links := links + rechts + +#page# +'abs' + #on("b")#INT PROC abs (INT CONST argument) #off("b")# + Absolutbetrag eines INT-Wertes. + + + #on("b")#INT OP ABS (INT CONST argument) #off("b")# + Absolutbetrag eines INT-Wertes. + + +'initialize random' + #on("b")#PROC initialize random (INT CONST wert) #off("b")# + Initialisieren der 'random'-Prozedur, um nicht reproduzierbare Zufallszahlen zu + bekommen. Diese 'initialize random'-Prozedur gilt für den "INT-Random Gene­ + rator". + + +'max' + #on("b")#INT PROC max (INT CONST links, rechts) #off("b")# + Liefert den Größten der beiden INT-Werte. + + +'maxint' + #on("b")#INT CONST maxint #off("b")# + Größter INT-Wert im EUMEL-System (32 767). + + +'min' + #on("b")#INT PROC min (INT CONST links, rechts) #off("b")# + Liefert den Kleinsten der beiden INT-Werte. + + + min ( 3.0, 2.0) ==> 2.0 + min (-2.0, 3.0) ==> -2.0 + + + +'minint' + #on("b")#INT CONST minint #off("b")# + Kleinster INT-Wert im EUMEL-System (-32768). + + +'MOD' + #on("b")#INT OP MOD (INT CONST links, rechts) #off("b")# + Liefert den Rest einer INT-Division. + + + 3 MOD 2 ==> 1 + -3 MOD 2 ==> 1 + + + FEHLER : + - DIV durch 0 + + +'random' + #on("b")#INT PROC random (INT CONST lower bound, upper bound) #off("b")# + Pseudo-Zufallszahlen-Generator im Intervall 'upper bound' und 'lower bound' + einschließlich. Es handelt sich hier um den "INT Random Generator". + + +'real' + #on("b")#REAL PROC real (INT CONST a) #off("b")# + Konvertierungsprozedur. + +#page# +'sign' + #on("b")#INT PROC sign (INT CONST argument) #off("b")# + Feststellen des Vorzeichens eines INT-Wertes. Folgende Werte werden geliefert: + + + argument > 0 ==> 1 + argument = 0 ==> 0 + argument < 0 ==> -1 + + + + #on("b")#INT OP SIGN (INT CONST argument) #off("b")# + Feststellen des Vorzeichens eines INT-Wertes. + + +'text' + #on("b")#TEXT PROC text (INT CONST zahl) #off("b")# + Konvertierung des INT Wertes 'zahl' in den kürzest möglichen Text. Das Vorzei­ + chen bleibt erhalten. + + #on("b")#TEXT PROC text (INT CONST zahl, länge) #off("b")# + Konvertierung des INT Wertes 'zahl' in einen Text der Länge 'länge'. Das + Vorzeichen bleibt erhalten. Falls der Text kürzer als 'länge' ist, wird er links + (vorne) mit Leerzeichen aufgefüllt, falls er länder ist wird 'länge' mal "*" + ausgegeben. + +____________________________________________________________________________ + + out ("X:"); out(text(12345,7)) ; line; + out ("Y:"); out(text(12345,3)) ; + (* ergibt *) + X: 12345 + Y:*** + +____________________________________________________________________________ +#page# + +5.2.3 Real-Arithmetik + +Für den Datentyp REAL gibt es außer den üblichen Verknüpfungs- und Vergleichs­ +operationen noch eine Anzahl mathematischer Prozeduren und Operationen. Teilweise +stehen diese in mehr als einer Version zur Verfügung. + +Jedes Datenobjekt vom Typ REAL belegt im Speicher 8 Byte. + +REALs haben eine 13-stellige #ib#Mantisse#ie#, die im Rechner dezimal geführt wird. (Das +heißt, bei Konversionen zwischen interner und TEXT-Darstellung treten keine Run­ +dungsfehler auf.) Der Wertebereich wird durch folgende Eckwerte abgegrenzt: +#dpos(0.5,".")##lpos(4.5)# + +#table# + 9.999999999999e+126 größter REAL-Wert + 0.000000000001 kleinster positiver REAL-Wert mit x + 1.0 > 1.0 + 9.999999999999e-126 kleinster positiver REAL-Wert > 0.0 + -9.999999999999e-126 größter negativer REAL-Wert + -9.999999999999e+126 kleinster REAL-Wert + +#clearpos# +#tableend# + +- Vergleiche : = , <> , < , <= , > , >= + +- Verknüpfungen : + , - , * , / , ** , DECR , INCR + +- Diverse : abs , arctan , arctand , cos , cosd , decimal + exponent , e , exp , floor , frac , initialize + random , int , ln , log2 , log10 , max , + maxreal , min , MOD , pi , random , round , + sign , SIGN , sin , sind , smallreal , sqrt , + tan , tand , text + +#page# +':=' + #on("b")#REAL OP := (REAL VAR a, REAL CONST b) #off("b")# + Zuweisung. + + +'=' + #on("b")#BOOL OP = (REAL CONST a, b) #off("b")# + Vergleich. + + +'<>' + #on("b")#BOOL OP <> (REAL CONST a, b) #off("b")# + Vergleich auf Ungleichheit. + + +'<' + #on("b")#BOOL OP < (REAL CONST a, b) #off("b")# + Vergleich auf kleiner. + + +'<=' + #on("b")#BOOL OP <= (REAL CONST a, b) #off("b")# + Vergleich auf kleiner gleich. + + +'>' + #on("b")#BOOL OP > (REAL CONST a, b) #off("b")# + Vergleich auf größer. + + +'>=' + #on("b")#BOOL OP >= (REAL CONST a, b) #off("b")# + Vergleich auf größer gleich. + +#page# +'+' + #on("b")#REAL OP + (REAL CONST a) #off("b")# + Monadischer Operator (Vorzeichen, ohne Wirkung). + + + #on("b")#REAL OP + (REAL CONST a, b) #off("b")# + Addition. + + +'-' + #on("b")#REAL OP - (REAL CONST a) #off("b")# + Vorzeichen-Umkehrung. + + + #on("b")#REAL OP - (REAL CONST a, b) #off("b")# + Subtraktion. + + +'*' + #on("b")#REAL OP * (REAL CONST a, b) #off("b")# + Multiplikation. + + +'/' + #on("b")#REAL OP / (REAL CONST a, b) #off("b")# + Division. + + FEHLER : + - Division durch 0 + + +'**' + #on("b")#REAL OP ** (REAL CONST arg, exp) #off("b")# + Exponentiation. + + #on("b")#REAL OP ** (REAL CONST arg, INT CONST exp) #off("b")# + Exponentiation. + + +'DECR' + #on("b")#OP DECR (REAL VAR links, REAL CONST rechts) #off("b")# + Wirkt wie links := links - rechts + + +'INCR' + #on("b")#OP INCR (REAL VAR links, REAL CONST rechts) #off("b")# + Wirkt wie links := links + rechts + +#page# +'abs' + #on("b")#REAL PROC abs (REAL CONST wert) #off("b")# + Absolutbetrag eines REAL-Wertes. + + #on("b")#REAL OP ABS (REAL CONST wert) #off("b")# + Absolutbetrag eines REAL-Wertes. + + +'arctan' + #on("b")#REAL PROC arctan (REAL CONST x) #off("b")# + Arcus Tangens-Funktion. Liefert einen Wert in Radiant. + + +'arctand' + #on("b")#REAL PROC arctand (REAL CONST x) #off("b")# + Arcus Tangens-Funktion. Liefert einen Wert in Grad. + + +'cos' + #on("b")#REAL PROC cos (REAL CONST x) #off("b")# + Cosinus-Funktion. 'x' muß in Radiant angegeben werden. + + +'cosd' + #on("b")#REAL PROC cosd (REAL CONST x) #off("b")# + Cosinus-Funktion. 'x' muß in Winkelgrad angegeben werden. + + +'decimal exponent' + #on("b")#INT PROC decimal exponent (REAL CONST mantisse) #off("b")# + Liefert aus einem REAL-Wert den dezimalen Exponenten als INT-Wert. + + +'e' + #on("b")#REAL PROC e #off("b")# + Eulersche Zahl (2.718282). + + +'exp' + #on("b")#REAL PROC exp (REAL CONST z) #off("b")# + Exponentialfunktion. + + +'floor' + #on("b")#REAL PROC floor (REAL CONST real) #off("b")# + Schneidet die Nachkommastellen des REAL-Wertes 'real' ab. + + +'frac' + #on("b")#REAL PROC frac (REAL CONST z) #off("b")# + Liefert die Stellen eines REAL-Wertes hinter dem Dezimalpunkt. + + +'initialize random' + #on("b")#PROC initialize random (REAL CONST z) #off("b")# + Initialisieren der 'random'-Prozedur mit verschiedenen Werten für 'z', um nicht + reproduzierbare Zufallszahlen zu bekommen. Diese Prozedur gilt für den + 'REAL-Random Generator'. + + +'int' + #on("b")#INT PROC int (REAL CONST a) #off("b")# + Konvertierungsprozedur. Die Nachkommastellen werden abgeschnitten. + Bsp: int (3.9) => 3 + + +'ln' + #on("b")#REAL PROC ln (REAL CONST x) #off("b")# + Natürlicher Logarithmus. + + FEHLER : + - ln mit negativer Zahl + Nur echt positive Argumente sind zulässig. + + +'log2' + #on("b")#REAL PROC log2 (REAL CONST z) #off("b")# + Logarithmus zur Basis 2. + + FEHLER : + - log2 mit negativer zahl + Nur echt positive Argumente sind zulässig. + + +'log10' + #on("b")#REAL PROC log10 (REAL CONST x) #off("b")# + Logarithmus zur Basis 10. + + FEHLER : + - log10 mit negativer zahl + Nur echt positive Argumente sind zulässig. + + +'max' + #on("b")#REAL PROC max (REAL CONST links, rechts) #off("b")# + Liefert den Größten der beiden REAL-Werte. + + +'maxreal' + #on("b")#REAL CONST maxreal #off("b")# + Größter REAL-Wert im EUMEL-System (9.999999999999e126). + + +'min' + #on("b")#REAL PROC min (REAL CONST links, rechts) #off("b")# + Liefert den Kleinsten der beiden REAL-Werte. + + +'MOD' + #on("b")#REAL OP MOD (REAL CONST links, rechts) #off("b")# + Modulo-Funktion für REALs (liefert den Rest). Beispiele: + + + 5.0 MOD 2.0 ==> 1.0 + 4.5 MOD 4.0 ==> 0.5 + + + +'pi' + #on("b")#REAL CONST pi #off("b")# + Die Zahl pi (3.141593). + + +'random' + #on("b")#REAL PROC random #off("b")# + Pseudo-Zufallszahlen-Generator im Intervall 0 und 1. Es handelt sich hier um + den "REAL Random Generator". + + +'round' + #on("b")#REAL PROC round (REAL CONST real, INT CONST digits) #off("b")# + Runden eines REAL-Wertes auf 'digits' Stellen. Für positive Werte wird auf + Nachkommastellen gerundet. Beispiel: + + + round (3.14159, 3) + + + liefert '3.142'. Für negative 'digits'-Werte wird auf Vorkommastellen gerundet. + + + round (123.456, -2) + + + liefert '100.0'. Abweichung vom Standard: Es wird mit 'digits'-Ziffern gerundet. + + +'sign' + #on("b")#INT PROC sign (REAL CONST argument) #off("b")# + Feststellen des Vorzeichens eines REAL-Wertes. + + #on("b")#INT OP SIGN (REAL CONST argument) #off("b")# + Feststellen des Vorzeichens eines REAL-Wertes. + + +'sin' + #on("b")#REAL PROC sin (REAL CONST x) #off("b")# + Sinus-Funktion. 'x' muß in Radiant (Bogenmaß) angegeben werden. + + +'sind' + #on("b")#REAL PROC sind (REAL CONST x) #off("b")# + Sinus-Funktion. 'x' muß im Winkelgrad angegeben werden. + + +'smallreal' + #on("b")#REAL PROC smallreal #off("b")# + Kleinster darstellbarer REAL-Wert im EUMEL-System für den + + + 1.0 - smallreal <> 1.0 + 1.0 + smallreal <> 1.0 + + + gilt (1.0E-12). + + +'sqrt' + #on("b")#REAL PROC sqrt (REAL CONST z) #off("b")# + Wurzel-Funktion. + + FEHLER : + - sqrt von negativer Zahl + Das Argument muß größer gleich 0.0 sein. + + +'tan' + #on("b")#REAL PROC tan (REAL CONST x) #off("b")# + Tangens-Funktion. 'x' muß in Radiant angegeben werden. + + +'tand' + #on("b")#REAL PROC tand (REAL CONST x) #off("b")# + Tangens-Funktion. 'x' muß in Winkelgrad angegeben werden. + + +'text' + #on("b")#TEXT PROC text (REAL CONST real) #off("b")# + Konvertierung eines REAL-Wertes in einen TEXT. Ggf. wird der TEXT in Expo­ + nenten-Darstellung geliefert. + + #on("b")#TEXT PROC text (REAL CONST real, laenge) #off("b")# + Konvertierung eines REAL-Wertes in einen TEXT. Der TEXT wird in Exponen­ + ten-Darstellung geliefert. Um diese Darstellung zu ermöglichen ist der Wert + 'laenge' größer oder gleich 8 anzugeben. + + #on("b")#TEXT PROC text (REAL CONST real, INT CONST laenge, fracs)#off("b")# + Konvertierung eines REAL-Wertes in einen TEXT. Dabei gibt 'laenge' die Länge + des Resultats einschließlich des Dezimalpunktes und 'fracs' die Anzahl der Dezi­ + malstellen an. Kann der REAL-Wert nicht wie gewünscht dargestellt werden, wird + + + laenge * "*" + + + geliefert. + +#page# + +5.2.4 Text + +Jedes Datenobjekt vom Typ TEXT besteht aus einem festen Teil von 16 Bytes und +möglicherweise aus einem flexiblen Teil auf dem #on("i")##on("b")#Heap#off("i")##off("b")#. Im festen Teil werden Texte +bis zur Länge von 13 Zeichen untergebracht. Wenn eine TEXT-Variable einen Wert +mit mehr als 13 Zeichen Länge annimmt, werden alle Zeichen auf dem Heap unterge­ +bracht. Genauer ergibt sich folgendes Bild: + + kurzer Text (Länge <= 13): + + Heap-Link 2 Bytes + Textlänge 1 Byte + Text 13 Bytes + + langer Text (Länge > 13): + + Heap-Link 2 Bytes + 255 1 Byte + Länge 2 Bytes + ungenutzt 11 Bytes + +Wenn eine Variable einmal Platz auf dem Heap bekommen hat, behält sie diesen +vorbeugend auch dann, wenn sie wieder einen kurzen Text als Wert erhält. So muß +wahrscheinlich kein neuer Platz auf dem Heap zugewiesen werden, wenn sie wieder +länger wird. Das gilt allerdings nur bis zur nächsten #ib#Garbage Collection#ie# auf den +TEXT-Heap, denn dabei werden alle Heap-Container minimal gemacht bzw. ge­ +löscht, wenn sie nicht mehr benötigt werden. Der Platz auf dem Heap wird in Vielfa­ +chen von 16 Bytes vergeben. In Fremddatenräumen wird in jedem #ib#Container#ie# neben +dem eigentlichen Text auch die Containerlänge untergebracht. +#page# +Beispiele: TEXT-Länge Speicherbedarf (Byte) + + 0 16 + 13 16 + 14 32 + 15 48 + 30 48 + 31 64 + 46 64 + 47 80 + 62 80 + + +Die Heapgröße eines Fremddatenraums berechnet sich als: + + 1024 * 1024 = 1048056 - stat Bytes + +'stat' ist dabei die statische Größe der Datenstruktur, die dem Datenraum aufgeprägt +wurde. Bei einem BOUND ROW 1000 TEXT ergibt sich also eine Heapgröße von + + 1048056 - (1000 * 16) = 1032056 Bytes. + + + +'heap size' + #on("b")#INT PROC heap size #off("b")# + Informationsprozedur für die Größe (in KB) des TEXT-Heaps. + +#page# + +TEXT- Operationen: + +- Vergleich : = , <> , < , <= , > , >= + LEXEQUAL , LEXGREATER , + LEXGREATEREQUAL + +- Verkettung : + , * , CAT + +- Veränderung : change , change all , code , compress , delete + char , insert char , length , LENGTH , max + text length , pos , real , replace , SUB , + subtext , text +#page# + +Der EUMEL-Zeichensatz +#goalpage("codetab")# +Das EUMEL System definiert einen Zeichensatz, der gewährleistet, daß gleiche Text­ +zeichen auf allen Maschinen gleich codiert werden. + Die interne Darstellung wird durch die folgende EUMEL-Codetabelle +beschrieben. Der Zeichensatz beruht auf dem ASCII-Zeichensatz mit Erweiterungen. +Der in der Tabelle freie Bereich (z.B code(127) bis code(213)) ist nicht einheitlich +verfügbar und wird deshalb nicht beschrieben. Die Codierung bildet mithin auch +Grundlage für Vergleiche und Sortierungen. + +Die Korrekte Darstellung dieser Zeichen auf Bildschirm, Drucker etc. setzt natürlich +eine korrekte Konfiguration der Geräte voraus. Die Anpassung eines Geräts an diesen +Zeichensatz ist im EUMEL-Systemhandbuch in Teil 2 beschrieben. + + + I 0 1 2 3 4 5 6 7 8 9 +---+-------------------------------------- +3 I SP ! " \# $ % & ' + I +4 I ( ) * + , - . / 0 1 + I +5 I 2 3 4 5 6 7 8 9 : ; + I +6 I < = > ? § A B C D E + I +7 I F G H I J K L M N O + I +8 I P Q R S T U V W X Y + I +9 I Z [ \ ] ^ _ ` a b c + I +10 I d e f g h i j k l m + I +11 I n o p q r s t u v w + I +12 I x y z { | } ~ + I +13 I +. I +. I +. I +20 I + I +21 I Ä Ö Ü ä ö ü + I +22 I k ­ \# SP + I +23 I + I +24 I + I +25 I ß +#page# +':=' + #on("b")#TEXT OP := (TEXT VAR a, TEXT CONST b) #off("b")# + Zuweisung. + + +'=' + #on("b")#BOOL OP = (TEXT CONST links, rechts) #off("b")# + Vergleich von zwei Texten auf Gleichheit (Texte mit ungleichen Längen sind + immer ungleich). + + +'<>' + #on("b")#BOOL OP <> (TEXT CONST links, rechts) #off("b")# + Vergleich von zwei Texten auf Ungleichheit (Texte mit ungleichen Längen sind + stets ungleich). + + +'<' + #on("b")#BOOL OP < (TEXT CONST links, rechts) #off("b")# + Vergleich zweier Texte auf kleiner ('links' kommt lexikographisch vor 'rechts'). + + +'<=' + #on("b")#BOOL OP <= (TEXT CONST links, rechts) #off("b")# + Vergleich von zwei Texten auf kleiner gleich ('links' kommt lexikographisch vor + oder ist gleich 'rechts'). + + +'>' + #on("b")#BOOL OP > (TEXT CONST links, rechts) #off("b")# + Vergleich zweier Texte auf größer ('links' kommt lexikographisch nach 'rechts'). + + +'>=' + #on("b")#BOOL OP >= (TEXT CONST links, rechts) #off("b")# + Vergleich zweier Texte auf größer gleich ('links' kommt lexikographisch nach oder + ist gleich 'rechts'). + +#page# +'LEXEQUAL' + #on("b")#BOOL OP LEXEQUAL (TEXT CONST links, rechts) #off("b")# + Prüfung auf lexikalische Gleichheit. + + +'LEXGREATER' + #on("b")#BOOL OP LEXGREATER (TEXT CONST links, rechts) #off("b")# + Prüfung ob der Text 'links' lexikalisch größer als 'rechts' ist. + + +'LEXGREATEREQUAL' + #on("b")#BOOL OP LEXGREATEREQUAL (TEXT CONST links, rechts) #off("b")# + Prüfung ob der Text 'links' lexikalisch größer oder gleich dem Text 'rechts' ist. + + + + Die drei Operatoren prüfen nach folgenden Regeln: + + - Buchstaben haben die aufsteigende Reihenfolge 'A' bis 'Z'. Dabei werden kleine + und große Buchstaben gleich behandelt. + + - Umlaute werden wie üblich ausgeschrieben. (Ä = Ae usw.) + (ß = ss) + + - Alle Sonderzeichen (auch Ziffern) außer ' '(Leerzeichen) und '-' werden igno­ + riert, diese beiden Zeichen werden gleich behandelt. + +#page# +'+' + #on("b")#TEXT OP + (TEXT CONST links, rechts) #off("b")# + Verkettung der Texte 'links' und 'rechts' in dieser Reihenfolge. Die Länge des + Resultats ergibt sich aus der Addition der Längen der Operanden. + + +'*' + #on("b")#TEXT OP * (INT CONST faktor, TEXT CONST quelle) #off("b")# + 'faktor' fache Erstellung von 'quelle' und Verkettung. Dabei muß + + + times >= 0 + + + sein, sonst wird 'niltext' geliefert. + + +'CAT' + #on("b")#OP CAT (TEXT VAR links, TEXT CONST rechts) #off("b")# + hat die gleiche Wirkung wie + + + links := links + rechts + + + Hinweis: Der Operator 'CAT' hat eine geringere Heap-Belastung als die Opera­ + tion mit expliziter Zuweisung. + +#page# +'change' + #on("b")#PROC change (TEXT VAR senke, TEXT CONST alt, neu) #off("b")# + Ersetzung des (Teil-) TEXTes 'alt' in 'senke' durch 'neu' bei dem erstmaligen + Auftreten. Ist 'alt' nicht in 'senke' vorhanden, so wird keine Meldung abgesetzt + (Abweichung vom Standard). Die Länge von 'senke' kann sich dabei verändern. + Beispiel: + + + TEXT VAR mein text :: "EUMEL-Benutzerhandbuch"; + change (mein text, "Ben", "N"); + (* EUMEL-Nutzerhandbuch *) + + + #on("b")#PROC change (TEXT VAR senke, INT CONST von, bis, TEXT CONST neu) #off("b")# + Der TEXT 'neu' wird in den TEXT 'senke' anstatt des TEXTes, der zwischen 'von' + und 'bis' steht, eingesetzt. Die Länge von 'senke' kann sich dabei verändern. + Beispiel: + + + TEXT VAR mein text :: "EUMEL-Benutzerhandbuch"; + change (mein text, 7, 9, "N"); (* wie oben *) + + + +'change all' + #on("b")#PROC change all (TEXT VAR senke, TEXT CONST alt, neu) #off("b")# + Der Teiltext 'alt' wird durch 'neu' in 'senke' ersetzt. Im Unterschied zur 'chan­ + ge'-Prozedur findet die Ersetzung nicht nur bei dem erstmaligen Auftreten von + 'alt' statt, sondern so oft, wie 'alt' in 'senke' vorhanden ist. Beispiel: + + + TEXT VAR x :: "Das ist ein Satz"; + change all (x, " ", ""); (* DasisteinSatz *) + +#page# +'code' + #on("b")#TEXT PROC code (INT CONST code) #off("b")# + Wandelt einen INT-Wert 'code' in ein Zeichen um. 'code' muß + + + 0 <= code <= 255 + + + sein. + + #on("b")#INT PROC code (TEXT CONST text) #off("b")# + Wandelt ein Zeichen 'text' in einen INT-Wert um. Ist + + + LENGTH text <> 1 + + + dann wird der Wert -1 geliefert (also bei mehr als ein Zeichen oder niltext). + (Codetabelle auf Seite 5- #topage("codetab")#) + + +'compress' + #on("b")#TEXT PROC compress (TEXT CONST text) #off("b")# + Liefert den TEXT 'text' ohne führende und nachfolgende Leerzeichen. + + +'delete char' + #on("b")#PROC delete char (TEXT VAR string, INT CONST delete pos)#off("b")# + Löscht ein Zeichen aus dem Text 'string' an der Position 'delete pos'. Für + + + delete pos <= 0 + + + oder + + + delete pos > LENGTH string + + + wird keine Aktion vorgenommen. + +#page# +'insert char' + #on("b")#PROC insert char (TEXT VAR string, TEXT CONST char,INT CONST insert pos)#off("b")# + Fügt ein Zeichen 'char' in den Text 'string' an der Position 'insert pos' ein. Für + + + insert pos > LENGTH string + 1 + + + wird keine Aktion vorgenommen. Daher ist es möglich, mit dieser Prozedur auch + am Ende eines Textes (Position: LENGTH string + 1) ein Zeichen anzufügen. + + +'length' + #on("b")#INT PROC length (TEXT CONST text) #off("b")# + Anzahl von Zeichen ("Länge") von 'text' einschließlich Leerzeichen. + + +'LENGTH' + #on("b")#INT OP LENGTH (TEXT CONST text) #off("b")# + Anzahl von Zeichen ("Länge") von 'text' einschließlich Leerzeichen. + + +'max text length' + #on("b")#INT CONST max text length #off("b")# + Maximale Anzahl von Zeichen in einem TEXT (32 000). + +#page# +'pos' + #on("b")#INT PROC pos (TEXT CONST quelle, pattern) #off("b")# + Liefert die erste Position des ersten Zeichens von 'pattern' in 'quelle', falls 'pat­ + tern' gefunden wird. Wird 'pattern' nicht gefunden oder ist 'pattern' niltext, so wird + der Wert '0' geliefert. Beispiel: + + + TEXT VAR t1 :: "abcdefghijk...xyz", + t2 :: "cd"; + ... pos (t1, t2) ... (* liefert 3 *) + ... pos (t2, t1) ... (* liefert 0 *) + + + + #on("b")#INT PROC pos (TEXT CONST quelle, pattern, INT CONST von)#off("b")# + Wie obige Prozedur, jedoch wird erst ab der Position 'von' ab gesucht. Dabei gilt + folgende Einschränkung: + + + length (pattern) < 255 + + + + #on("b")#INT PROC pos (TEXT CONST quelle, low char, high char, INT CONST von#off("b")# + Liefert die Position des ersten Zeichens 'x' in 'quelle' ab der Position 'von', so daß + + + low char <= x <= high char + + + 'low char' und 'high char' müssen TEXTe der Länge 1 sein. Wird kein Zeichen in + 'quelle' in dem Bereich zwischen 'low char' und 'high char' gefunden, wird der + Wert '0' geliefert. Beispiel: + +____________________________________________________________________________ + + (*Suche nach dem ersten Zeichen <> blank nach einer Leerspalte*) + TEXT VAR zeile :: "BlaBla Hier gehts weiter"; + INT VAR pos erstes blank :: pos (zeile, " "), + ende leerspalte :: + pos (zeile, ""33"",""254"", pos erstes blank); + +____________________________________________________________________________ + +#page# +'real' + #on("b")#REAL PROC real (TEXT CONST text) #off("b")# + Konvertierung eines TEXTes 'text' in einen REAL-Wert. Achtung: Zur Zeit werden + keine Überprüfungen vorgenommen, d.h. in dem TEXT muß ein REAL-Wert + stehen. + + +'replace' + #on("b")#PROC replace (TEXT VAR senke, INT CONST position, TEXT CONST quelle)#off("b")# + Ersetzung eines Teiltextes in 'senke' durch 'quelle' an der Position 'position' in + 'senke'. Es muß gelten + + + 1 <= position <= LENGTH senke + + + d.h. 'position' muß innerhalb von 'senke' liegen und 'quelle' muß von der Posi­ + tion 'position' ab in 'senke' einsetzbar sein. Dabei bleibt die Länge von 'senke' + unverändert. + + +'SUB' + #on("b")#TEXT OP SUB (TEXT CONST text, INT CONST pos) #off("b")# + Liefert ein Zeichen aus 'text' an der Position 'pos'. Entspricht + + + subtext (text, pos, pos) + + + Anmerkung: Effizienter als obiger Prozedur-Aufruf. Für + + + pos <= 0 + pos > LENGTH text + + + wird niltext geliefert. + +#page# +'subtext' + #on("b")#TEXT PROC subtext (TEXT CONST quelle, INT CONST von) #off("b")# + Teiltext von 'quelle', der bei der Position 'von' anfängt. Die Länge des Resultats + ergibt sich also zu + + + LENGTH quelle - von + 1 + + + d.h. von der Position 'von' bis zum Ende von 'quelle'. 'von' muß innerhalb von + 'quelle' liegen. Ist von < 1, dann wird 'quelle' geliefert. Falls von > LENGTH + quelle ist, wird niltext geliefert. + + + #on("b")#TEXT PROC subtext (TEXT CONST quelle, INT CONST von, bis)#off("b")# + Teiltext von 'quelle' von der Position 'von' bis einschließlich der Position 'bis'. Die + Länge des Resultats ist also + + + bis - von + 1 + + + Dabei muß gelten + + + 1 <= von <= bis <= LENGTH quelle + + + d.h. die Positionen 'von' und 'bis' müssen in dieser Reihenfolge innerhalb von + 'quelle' liegen. Ist + + + bis >= LENGTH quelle + + + wird 'subtext (quelle, von)' ausgeführt. Für die Bedingungen für 'von' siehe vor­ + stehende Beschreibung von 'subtext'. + + +'text' + #on("b")#TEXT PROC text (TEXT CONST quelle, INT CONST laenge) #off("b")# + Teiltext aus 'quelle' mit der Länge 'laenge', beginnend bei der Position 1 von + 'quelle'. Es muß gelten + + + 1 <= laenge <= LENGTH quelle + + + d.h. der gewünschte Teiltext muß aus 'quelle' ausblendbar sein. + Wenn gilt: + + laenge > LENGTH quelle + + + wird der zu liefernde TEXT mit der an 'laenge' fehlenden Zeichen mit Leerzeichen + aufgefüllt. + + #on("b")#TEXT PROC text (TEXT CONST quelle, INT CONST laenge, von)#off("b")# + Teiltext aus 'quelle' mit der Länge 'laenge', beginnend an der Position 'von' in + dem TEXT 'quelle'. Entspricht + + + text (subtext (quelle, von, LENGTH quelle),laenge) + + + Es muß + + + laenge >= 0 + 1 <= von <= LENGTH quelle + + + gelten, d.h. 'von' muß eine Position angeben, die innerhalb von 'quelle' liegt. Für + + + laenge > LENGTH quelle - von + 1 + + + also wenn die angegebene Länge 'laenge' größer ist als der auszublendende Text, + wird das Resultat rechts mit Leerzeichen aufgefüllt. Wenn + + + laenge < LENGTH quelle - von + 1 + + + d.h. wenn die angegebene Länge kleiner ist als der Teiltext von 'von' bis zum + letzten Zeichen von 'quelle', wird das Resultat mit der Länge + + + LENGTH quelle - von + 1 + + + geliefert. + diff --git a/doc/programming/programmierhandbuch.5b b/doc/programming/programmierhandbuch.5b new file mode 100644 index 0000000..d91bcc9 --- /dev/null +++ b/doc/programming/programmierhandbuch.5b @@ -0,0 +1,1481 @@ +#pagenr("%",40)##setcount(1)##block##pageblock# +#headeven# +#center#EUMEL-Benutzerhandbuch +#center#____________________________________________________________ + +#end# +#headodd# +#center#TEIL 5 : Programmierung +#center#____________________________________________________________ + +#end# +#bottomeven# +#center#____________________________________________________________ +5 - % #right#GMD +#end# +#bottomodd# +#center#____________________________________________________________ +GMD #right#5 - % +#end# + +5.3 Der Datentyp FILE (Textdateien) + +Der Datentyp FILE definiert Dateien von sequentieller Struktur, die Texte enthalten. +Ein Objekt vom Datentyp FILE ist charakterisiert durch: + +1) seine Betriebsrichtung : input = nur lesender Zugriff + (TRANSPUTDIRECTION) output= nur schreibender Zugriff + modify= lesender und schreibender Zugriff. +2) seinen Namen. + +Betriebsrichtung und Name werden in der Assoziierungsprozedur 'sequential file' +(siehe Kap 2.8.2) festgelegt. + + +____________________________________________________________________________ + + ........................... Beispiel .......................... + TEXT VAR name := ausgabe ; + + FILE VAR f := sequential file(output,name) ; + + +____________________________________________________________________________ + + + +Das Festlegen einer Betriebsrichtung impliziert eine Kontrolle der Benutzung der +betreffenden Datei, hilft somit Programmierfehler zu vermeiden. + +ACHTUNG : #on("b")##on("u")#Alle#off("b")##off("u")# Prozeduren, die auf FILEs zugreifen, verlangen Objekte vom Typ + FILE VAR, da die Lese/Schreiboperationen als ändernd betrachtet wer­ + den (müssen). + +#page# + +5.3.1 Assoziierung + +'sequential file' + #on("b")#FILE PROC sequential file (TRANSPUTDIRECTION CONST mode, DATASPACE VAR ds) #off("b")# + Assoziierung einer sequentiellen Datei mit dem Dataspace 'ds' und der Betriebs­ + richtung 'mode' (vergl. 'modify', 'input' bzw. 'output'). Diese Prozedur dient zur + Assoziierung eines temporären Datenraums in der Benutzer-Task, der nach der + Beendigung des Programmlaufs nicht mehr zugriffsfähig ist (weil der Name des + Datenraums nicht mehr ansprechbar ist). Somit muß der Datenraum explizit vom + Programm gelöscht werden. + + + #on("b")#FILE PROC sequential file (TRANSPUTDIRECTION CONST mode,TEXT CONST name)#off("b")# + Assoziierung einer sequentiellen Datei mit dem Namen 'name' und der Betriebs­ + richtung 'mode' (vergl. 'input' bzw. 'output'). Existiert der FILE bereits, dann wird + mit 'input' auf den Anfang des FILEs, bei 'output' hinter den letzten Satz der datei + positioniert. Existiert dagagen der FILE noch nicht und ist die + TRANSPUTDIRECTION 'output' oder 'modify', wird ein neuer FILE eingerich­ + tet. + + FEHLER : "name" gibt es nicht" + Es wurde versucht, einen nicht vorhandenen FILE mit 'input' zu asso­ + ziieren. + +#page# + +'input' + #on("b")#PROC input (FILE VAR f) #off("b")# + Ändern der Verarbeitungsart von 'modify' oder 'output' in 'input'. Dabei wird auf + den ersten Satz der Datei positioniert. + + #on("b")#TRANSPUTDIRECTION CONST input #off("b")# + Assoziierung in Zusammenhang mit der Prozedur 'sequential file' einer sequentiel­ + len Datei mit der 'TRANSPUTDIRECTION' 'input' (nur lesen). + + +'output' + #on("b")#PROC output (FILE VAR file) #off("b")# + Ändern der Verarbeitungsart von 'input' oder 'modify' in 'output'. Dabei wird hinter + den letzten Satz der Datei positioniert. + + #on("b")#TRANSPUTDIRECTION CONST output #off("b")# + In Verbindung mit der Prozedur 'sequential file' kann eine Datei assoziiert werden + mit der Betriebsrichtung 'output' (nur schreiben). + + +'modify' + #on("b")#PROC modify (FILE VAR f) #off("b")# + Ändern der Betriebsrichtung von 'input' oder 'output' in die Betriebsrichtung 'mo­ + dify'. + + #on("b")#TRANSPUTDIRECTION CONST modify #off("b")# + Diese Betriebsrichtung erlaubt das Vorwärts- und Rückwärts-Positionieren und + das beliebige Einfügen und Löschen von Sätzen. 'modify' wird für die Assoziie­ + rungsprozedur 'sequential file' benötigt. + + + +#page# + +5.3.2 Informationsprozeduren + +'eof' + #on("b")#BOOL PROC eof (FILE CONST file) #off("b")# + Informationsprozedur auf das Ende eines FILEs. Liefert den Wert TRUE, sofern + hinter den letzten Satz eines FILEs positioniert wurde. + + +'line no' + #on("b")#INT PROC line no (FILE CONST file) #off("b")# + Liefert die aktuelle Zeilennummer. + + +'lines' + #on("b")#PROC lines (FILE VAR f) #off("b")# + Liefert die Anzahl der Zeilen der Datei 'f'. + + +'headline' + #on("b")#TEXT PROC headline (FILE CONST f) #off("b")# + Liefert den Inhalt der Kopfzeile der Datei 'f'. + + #on("b")#PROC headline (FILE VAR f, TEXT CONST ueberschrift) #off("b")# + Setzt #ib#'ueberschrift' in die Kopfzeile#ie# der Datei 'f'. +#page# + +5.3.3 Betriebsrichtung INPUT + +In der Betriebsrichtung 'input' sind nur Leseoperationen auf der Datei zugelassen. Die +Assoziierungsprozedur 'sequential file' bewirkt: + +1) Falls die Eingabedatei noch nicht existiert, wird eine Fehlermeldung ausgegeben. + +2) Falls es eine Datei des Namens gibt, wird auf das erste Zeichen des ersten + Satzes positioniert. + + + +'get' + #on("b")#PROC get (FILE VAR f, INT VAR number) #off("b")# + Lesen des nächsten Wortes aus der Datei 'f' und Konvertierung des Wortes zu + einem Integer-Objekt. + + #on("b")#PROC get (FILE VAR f, REAL VAR number) #off("b")# + Lesen des nächsten Wortes aus der Datei 'f' und Konvertierung des Wortes zu + einem Real-Objekt. + + + #on("b")#PROC get (FILE VAR f, TEXT VAR text) #off("b")# + Lesen des nächsten Wortes aus der Datei 'f'. + + #on("b")#PROC get (FILE VAR f, TEXT VAR text, TEXT CONST delimiter)#off("b")# + Lesen eines TEXT-Wertes 'text' von der Datei 'f', bis das Zeichen 'delimiter' + angetroffen wird. Ein eventueller Zeilenwechsel in der Datei wird dabei übergan­ + gen. + + #on("b")#PROC get (FILE VAR f, TEXT VAR text, INT CONST maxlength)#off("b")# + Lesen eines TEXT-Wertes 'text' von der Datei 'f' mit 'maxlength' Zeichen. Ein + eventueller Zeilenwechsel in der Datei wird dabei nicht übergangen. + + + +'getline' + #on("b")#PROC get line (FILE VAR file, TEXT VAR record) #off("b")# + Lesen der nächsten Zeile aus der sequentiellen Datei 'file'. + Mögliche Fehler bei Betriebsrichtung 'input': + + "Datei zu" + Die Datei 'file' ist gegenwärtig nicht assoziiert. + + "Leseversuch nach Dateiende" + Es wurde versucht, über die letzte Zeile einer Datei zu lesen. + + "Leseversuch auf output file" + Es wurde versucht, von einem mit 'output' assoziierten FILE zu lesen. + + "Unzulässiger Zugriff auf modify-FILE" + +#page# + +5.3.4 Betriebsrichtung OUTPUT + +In der Betriebsrichtung 'output' sind nur Schreiboperationen auf der Datei zugelassen. +Die Assoziierungsprozedur 'sequential file' bewirkt: + +1) Falls die Ausgabedatei noch nicht existiert, wird sie angelegt und auf den ersten + Satz positioniert. + +2) Falls es bereits eine Datei des Namens gibt, wird hinter den letzten Satz positio­ + niert, die Datei wird also fortgeschrieben. + + +'put' + #on("b")#PROC put (FILE VAR f, INT CONST number) #off("b")# + Ausgabe eines INT-Wertes 'number' in die Datei 'f'. Dabei wird ein Leerzeichen + an die Ausgabe angefügt. + + #on("b")#PROC put (FILE VAR f, REAL CONST number) #off("b")# + Ausgabe eines REAL-Wertes 'number' in die Datei 'f'. Dabei wird ein Leerzei­ + chen an die Ausgabe angefügt. + + #on("b")#PROC put (FILE VAR f, TEXT CONST text) #off("b")# + Ausgabe eines TEXT-Wertes 'text' in die Datei 'f'. Dabei wird ein Leerzeichen an + die Ausgabe angefügt. + + + +'putline' + #on("b")#PROC putline (FILE VAR file, TEXT CONST record) #off("b")# + Ausgabe eines TEXTes 'record' in die Datei 'file'. Danach wird auf die nächste + Zeile positioniert. 'file' muß mit 'output' assoziiert sein. + + +'write' + #on("b")#PROC write (FILE VAR f, TEXT CONST text) #off("b")# + Schreibt 'text' in die Datei 'f' (analog 'put (f, text)'), aber ohne Trennblank. + + +'line' + #on("b")#PROC line (FILE VAR file) #off("b")# + Positionierung auf die nächste Zeile der Datei 'file'. Wird versucht, über das Ende + eines mit 'input' assoziierten FILEs zu positionieren, wird keine Aktion vorgenom­ + men. + + #on("b")#PROC line (FILE VAR file, INT CONST lines) #off("b")# + Positionierung mit 'lines' Zeilen Vorschub in der Datei 'file'. + + + FEHLER: "Datei zu!" + Die Datei 'file' ist gegenwärtig nicht assoziiert. + + "Schreibversuch auf input-File" + Es wurde versucht, auf einen mit 'input' assoziierten FILE zu + schreiben. + + + Bei Textdateien, die mit dem Editor weiterbearbeitet werden sollen, ist also zu + beachten: ine Ausgabe mit 'put' setzt ein 'blank' hinter die Ausgabe. Falls dieses + Leerzeichen das letzte Zeichen in der Zeile ist, wird eine Absatzmarke in der Zeile + gesetzt. Wird mit 'write' oder 'putline' ausgegeben, steht kein Leerzeichen und + somit keine Absatzmarke am Zeilenende. +#page# + +5.3.5 Betriebsrichtung MODIFY + +In der Betriebsrichtung 'modify' sind Lese- und Schreiboperationen auf der Datei +zugelassen. Desweiteren ist beliebiges Positionieren in der Datei erlaubt. Neue Sätze +können an beliebiger Stelle in die Datei eingefügt werden, die sequentielle Struktur +der Datei bleibt erhalten. Die Assoziierungsprozedur 'sequential file' bewirkt: + +1) Falls die Ausgabedatei noch nicht existiert, wird sie angelegt. + +2) Falls es bereits eine Datei des Namens gibt, ist undefiniert wo positioniert ist. Die + erste Positionierung muß explizit vorgenommen werden! + + + +'col' + #on("b")#PROC col (FILE VAR f, INT CONST position) #off("b")# + Positionierung auf die Spalte 'position' innerhalb der aktuellen Zeile. + + #on("b")#INT PROC col (FILE CONST f) #off("b")# + Liefert die aktuelle Position innerhalb der aktuellen Zeile. + + +'down' + #on("b")#PROC down (FILE VAR f) #off("b")# + Positionieren um eine Zeile vorwärts. + + #on("b")#PROC down (FILE VAR f, INT CONST number) #off("b")# + Positionieren um 'number' Zeilen vorwärts. + + +'to line' + #on("b")#PROC to line (FILE VAR f, INT CONST number) #off("b")# + Positionierung auf die Zeile 'number'. + + +'up' + #on("b")#PROC up (FILE VAR f) #off("b")# + Positionieren um eine Zeile rückwärts. + + #on("b")#PROC up (FILE VAR f, INT CONST number) #off("b")# + Positionieren um 'number' Zeilen rückwärts. + +#page# +'delete record' + #on("b")#PROC delete record (FILE VAR file) #off("b")# + Der aktuelle Satz der Datei 'file' wird gelöscht. Der folgende Satz wird der aktuelle + Satz. + + +'insert record' + #on("b'PROC insert record (FILE VAR file) #off("b")# + Es wird ein leerer Satz in die Datei 'file' vor die aktuelle Position eingefügt. Dieser + Satz kann anschließend mit 'write record' beschrieben werden (d.h. der neue Satz + ist jetzt der aktuelle Satz). + + + +'read record' + #on("b")#PROC read record (FILE CONST file, TEXT VAR record) #off("b")# + Liest den aktuellen Satz der Datei 'file' in den TEXT 'record'. Die Position wird + dabei nicht verändert. + + + +'write record' + #on("b")#PROC write record (FILE VAR file, TEXT CONST record) #off("b")# + Schreibt einen Satz in die Datei 'file' an die aktuelle Position. Dieser Satz muß + bereits vorhanden sein, d.h. mit 'write record' kann keine leere Datei beschrieben + werden, sondern es wird der Satz an der aktuellen Position überschrieben. Die + Position in der Datei wird nicht verändert. + + +#page# + +5.3.6 FILE -Ausschnitte + +Ähnlich den Editorfunktionen 'ESC RUBOUT' und 'ESC RUBIN', die erlauben ganze +Abschnitte einer Datei zu löschen und das Gelöschte an anderer Stelle wiedereinzu­ +fügen, gibt es die Möglichkeit per Programm solche Segmente +eines 'modify-FILEs' zu verschieben. + + +'clear removed' + #on("b")#PROC clear removed (FILE VAR f) #off("b")# + Das mit 'remove' entfernte Segment wird gelöscht und nicht an anderer Stelle + eingefügt. + + +'reinsert' + #on("b")#PROC reinsert (FILE VAR f) #off("b")# + Das mit 'remove' entfernte Segment wird vor die aktuelle Zeile wiedereingefügt. + + +'remove' + #on("b")#PROC remove (FILE VAR f, INT CONST size) #off("b")# + Löscht 'size' Zeilen vor der aktuellen Position aus 'f'. Das Segment wird in einen + internen Puffer geschrieben. + + +'reorganize' + #on("b")#PROC reorganize (TEXT CONST datei)#off("b")# + Reorganisation von 'datei'. Die durch Löschen und Einfügen aus vielen + Segmenten bestehende Datei wird zu einem Segment zusammengefügt, die + aktuelle Position ist danach das erste Zeichen der ersten Zeile. + + Durch diese Prozedur kann ggf. Speicherplatz gespart werden. + + #on("b")#PROC reorganize#off("b")# + Reorganisation der zuletzt bearbeiteten Datei. + + +'segments' + #on("b")#PROC segments (FILE VAR f) #off("b")# + Liefert die Anzahl der Segmente von 'f'. Eine große Anzahl von Segmenten kann + langsamere Zugriffe zur Folge haben. + +#page# + +5.4 Suchen und Ersetzen in Textdateien + +Such- und Ersetzungsprozeduren können sowohl interaktiv beim Editieren (siehe +dazu 3.3), als auch in Prozeduren, die auf FILEs (siehe 5.3) arbeiten, angewandt +werden. + +Die dazu dienenden Prozeduren sind im Paket 'pattern match' enthalten. Mit 'Pattern +Matching' (Muster treffen) wird ein Verfahren bezeichnet Gleichheit von Objekten +anhand von Regeln, denen diese Objekte genügen, zu überprüfen. + +Da oft nach Texten gesucht werden muß, deren genaue Ausprägung nicht bekannt ist, +oder deren Auftreten nur in einem bestimmten Zusammenhang interessiert, gibt es die +Möglichkeit feststehende Textelemente mit Elementen ungewisser Ausprägung zu +kombinieren, also Textmuster zu erzeugen. + +Um einen Text zu suchen, muß die Suchrichtung und der gesuchte Text oder ein +Muster, welches diesen Text beschreibt, angegeben werden. + +- Aufbauen von Textmustern : + , - , OR , any , bound , notion + +- Suchen nach Textmustern : down , downety , up , uppety + +- Treffer registrieren : LIKE , UNLIKE , at , pattern found + +- Treffer herausnehmen : ** , match , matchend , matchpos , + somefix , word + +- Ändern in Dateien : change + + +Nach einem erfolgreichen Suchvorgang ist stets auf das erste Zeichen der zu such­ +enden Zeichenkette positioniert. + + +Eine besondere Funktion kommt dem 'joker' zu: Dieses Symbol (Defaultwert: '*') steht +für eine beliebige Zeichenkette beliebiger Länge. Insbesondere bei Ersetzungsaktionen +in denen dieses Zeichen zur Musterbeschreibung verwendet wird, ist daher Vorsicht +geboten und sorgfältig zu testen. + +#page# + +5.4.1 Aufbau von Textmustern + +'+' + #on("b")#TEXT OP + (TEXT CONST links, rechts) #off("b")# + Verkettung der Texte 'links' und 'rechts' zu 'linksrechts'. Falls das Ergebnis länger + als die maximal zulässige Textlänge ist, ist es undefiniert. + + Wenn 'muster1' einen beliebigen Text finden sollte, ( Siehe: PROC any) wird das + Ende des von 'muster1' erkannten Textes durch den Anfang des von 'muster2' + erkannten Textes im Nachhinein definiert. + + + +'-' + #on("b")#TEXT OP - (TEXT CONST alphabet) #off("b")# + Der Operator liefert das zu 'alphabet' komplementäre Alphabet, also alle Zeichen + gemäß der EUMEL Codetabelle (5.2.4), die nicht in 'alphabet' enthalten sind. + Sinnvoll im Zusammenhang mit der Textprozedur 'any'. + + +'OR' + #on("b")#TEXT OP OR (TEXT CONST links, rechts) #off("b")# + Liefert die Alternative von 'links' und 'rechts'. Die Reihenfolge spielt beim Suchen + keine Rolle. + + + +'any' + Die Textprozedur 'any' liefert einen unbekannten Text unbestimmter Länge. + Dieser Text sollte entweder durch festen Text sinnvoll eingegrenzt werden, oder + direkt eingeschränkt werden. + + + #on("b")#TEXT PROC any #off("b")# + Beschreibt einen beliebigen Text. + + #on("b")#TEXT PROC any (INT CONST laenge) #off("b")# + Beschreibt einen beliebigen Text der angebenen Länge. + + + #on("b")#TEXT PROC any (TEXT CONST alphabet) #off("b")# + Beschreibt einen beliebigen Text, der nur aus Zeichen besteht, die in 'alphabet' + enthalten sind. + + + #on("b")#TEXT PROC any (INT CONST laenge, TEXT CONST alphabet) #off("b")# + Beschreibt einen Text der vorgegebenen Länge, der nur aus den in 'alphabet' + vorgegebenen Zeichen besteht. + + +____________________________________________________________________________ + + ........................... Beispiel .......................... + Die Textprozedur 'any' liefert einen unbekannten Text unbe­ + stimmter Länge. Dieser Text sollte entweder durch festen Text + sinnvoll eingegrenzt werden, oder direkt eingeschränkt werden. +gib kommando: D("D" OR "d" + any (2,"aeirs") + Sucht nach bestimmten Artikeln: 'der', 'die', 'das' etc. + +____________________________________________________________________________ + + + +'bound' + #on("b")#TEXT PROC bound #off("b")# + Bezeichnet ein Muster der Länge null, das nur am Zeilenanfang oder am Zeilenen­ + de gefunden wird. Ein Präfix 'bound' fordert, daß das gesuchte Muster in der + ersten Spalte beginnen muß, ein Postfix 'bound' fordert, daß das Muster mit dem + Zeilenende abschließt. + +____________________________________________________________________________ + + ........................... Beispiel .......................... + Die Textprozedur 'any' liefert einen unbekannten Text unbe­ + stimmter Länge. Dieser Text sollte entweder durch festen + Textsinnvoll eingegrenzt werden, oder direkt eingeschränkt + werden. +gib kommando: U(bound + any (" ")) + +____________________________________________________________________________ + + + + liefert Treffer bei eingerückten Zeilen. + + + +'notion' + #on("b")#PROC notion (TEXT CONST suchwort) #off("b")# + Mit dieser Prozedur kann ein #on("u")#Wort#off("u")# spezifiziert werden, nach dem gesucht werden + soll. Bei der Suche nach 'suchwort' wird nur dann ein Treffer geliefert, wenn + 'suchwort' als Wort, also begrenzt von ' ' (blank), '.' , ',' oder anderen Sonderzei­ + chen ist. + + #on("b")#PROC notion (TEXT CONST suchwort, INT CONST reg) #off("b")# + Wie oben, der Treffer wird im Register 'reg' gespeichert. + +#page# + +5.4.2 Suche nach Textmustern + +'down' + #on("b")#PROC down (FILE VAR f, TEXT CONST muster) #off("b")# + Suche nach 'muster' in der Datei 'f' in Richtung Dateiende. Wird 'muster' gefun­ + den, ist die Position das erste Zeichen von 'muster'. Andernfalls steht man hinter + dem letzten Zeichen der Datei. + + Achtung: 'down' sucht vom nächsten Zeichen rechts ab, so daß wiederholtes + Suchen keine Endlosschleife ergibt. + + + #on("b")#PROC down (FILE VAR f, TEXT CONST muster, INT CONST number)#off("b")# + Wie obiges 'down', es wird aber maximal nur 'number'-Zeilen weit nach 'muster' + gesucht. + + + +'downety' + #on("b")#PROC downety (FILE VAR f, TEXT CONST muster) #off("b")# + Suche nach 'muster' in der Datei 'f' in Richtung Dateiende. Wird 'muster' gefun­ + den, ist die Position das erste Zeichen von 'muster'. Andernfalls steht man auf + dem letzten Zeichen der Datei. + + Achtung: 'downety' sucht (im Gegensatz zu 'down') vom aktuellen Zeichen an. + Daher muß explizit vorwärts positioniert werden. + + + #on("b")#PROC downety (FILE VAR f, TEXT CONST muster, INT CONST number) #off("b")# + Wie obiges 'downety', aber maximal nur 'number'-Zeilen weit. +#page# +'up' + #on("b")#PROC up (FILE VAR f, TEXT CONST muster) #off("b")# + Suche nach 'muster' in der Datei 'f' in Richtung Dateianfang. Wird 'muster' + gefunden, ist die Position das erste Zeichen von 'muster'. Andernfalls steht man + auf dem ersten Zeichen der Datei. + + Achtung: 'up' sucht vom nächsten Zeichen links ab, so daß wiederholtes Suchen + keine Endlosschleife ergibt. + + + #on("b")#PROC up (FILE VAR f, TEXT CONST muster, INT CONST number)#off("b")# + Wie obiges 'up', aber maximal nur 'number'-Zeilen weit. + + + +'uppety' + #on("b")#PROC uppety (FILE VAR f, TEXT CONST muster) #off("b")# + Suche nach 'muster' in der Datei 'f' in Richtung Dateianfang. Wird 'muster' + gefunden, ist die Position das erste Zeichen von 'muster'. Andernfalls steht man + auf dem ersten Zeichen der Datei. + + Achtung: 'uppety' sucht (im Gegensatz zu 'up') vom aktuellen Zeichen. + + + #on("b")#PROC uppety (FILE VAR f, TEXT CONST muster, INT CONST number)#off("b")# + Wie obiges 'uppety', aber maximal nur 'number'-Zeilen weit. + +#page# + +5.4.3 Treffer registrieren + +'LIKE' + #on("b")#BOOL OP LIKE (TEXT CONST text , muster) #off("b")# + Liefert TRUE, falls der Text 'text' 'muster' entspricht. In 'muster' kann das + Spezialzeichen '*' verwandt werden, das abkürzend für die Konkatenation mit + 'any' steht. + + Daraus folgt, daß das Suchen oder Ersetzen des Zeichens '*' nur durch + any (1,"*") zu bewerkstelligen ist. + + +____________________________________________________________________________ + + ........................... Beispiel .......................... + \#Druckdateien aus Thesaurus löschen\# + gib kommando:"*.p" C "" + 16.04.87 "Handbuch teil1" + 04.05.87 "Handbuch teil1.p" + 16.04.87 "Handbuch teil2" + 06.05.87 "Handbuch teil2.p" + +____________________________________________________________________________ + + + + aber: + +____________________________________________________________________________ + + ........................... Beispiel .......................... + \#Vordere Kommentarklammern löschen \# + gib kommando:"(" + any(1,"*") C "" + lernsequenz auf taste legen("a" , "archive") ; + (* lernsequenz auf taste legen("(" , ""91"") ; *) + (* lernsequenz auf taste legen(")" , ""93"") ; *) + kommando auf taste legen("P" , "print("""")"8""8""11"") . + +____________________________________________________________________________ + + + +'UNLIKE' + #on("b")#BOOL OP UNLIKE (TEXT CONST text , muster) #off("b")# + Wirkt wie: '(NOT text LIKE muster)' +#page# + +5.4.4 Treffer herausnehmen + +Mit Hilfe der 'Register' ist es möglich identifizierte Texte zwischenzuspeichern und in +weiteren Aktionen weiterzuverwenden. + + +'**' + #on("b")#TEXT OP ** (TEXT CONST muster, INT CONST register)#off("b")# + Der als 'muster' erkannte Text wird einem 'Register' mit der Nummer 'register' + zugeordnet. Es können 256 Register (1 bis 256) benutzt werden. + + +'match' + #on("b")#TEXT PROC match (INT CONST nr) #off("b")# + Liefert den Text der dem Register 'nr' zuletzt zugeordnet wurde. + + +'matchpos' + #on("b")#INT PROC matchpos (INT CONST nummer) #off("b")# + Liefert die Spaltennummer, auf der das dem Register 'nummer' zugeordnete Mu­ + ster in der Zeile beginnt. + +____________________________________________________________________________ + + ........................... Beispiel .......................... + + gib kommando:D("file"+any+"("+(any ** (1)... + +____________________________________________________________________________ +#page# + +5.4.5 Ändern in Dateien + +'change' + #on("b")#PROC change (FILE VAR datei, INT CONST von, bis , TEXT CONST neuertext)#off("b")# + In der Datei wird in der aktuellen Zeile in den Ausschnitt zwischen 'von' und 'bis' + der Text 'neuertext' eingesetzt. + + entspricht: + + +____________________________________________________________________________ + + ........................... Beispiel .......................... + FILE VAR file := sequential file (modify, name) + TEXT VAR zeile; + . + . + read record (file ,zeile); + change (zeile, von, bis ,"neuertext"); + write record (file, zeile); + . + +____________________________________________________________________________ + +#page# + +5.4.6 Editor-Prozeduren + +'edit' + #on("b")#edit (TEXT CONST datei)#off("b")# + Editieren der Datei 'datei'. Das Editorfenster ist maximal groß (von 1,1 bis + max,max). Der Standard-Kommandointerpreter ist gültig, so daß Eingaben, die + mit #schl("ESC")# beginnen, interpretiert werden, wie in 3.4 'Vorbelegte Tasten' beschrie­ + ben. + + #on("b")#edit#off("b")# + Wie oben, editiert wird die Datei mit dem zuletzt benutzten Namen. + + #on("b")#edit (THESAURUS CONST thes)#off("b")# + Wie oben, editiert werden alle Dateien, deren Namen im Thesaurus 'thes' enthal­ + ten sind. + + #on("b")#edit (TEXT CONST datei, INT CONST von x, von y, bis x, bis y)#off("b")# + Editieren der Datei 'datei'. Das Editorfenster hat die linke obere Ecke bei 'von x, + von y' und die rechte untere Ecke bei 'bis x, bis y'. + + #on("b")#edit (FILE VAR f)#off("b")# + Editieren der als 'sequential file' assoziierten Textdatei 'f'. + + #on("b")#edit (FILE VAR, INT CONST von x, von y, bis x, bis y)#off("b")# + Editieren der als 'sequential file' assoziierten Textdatei in einem Fenster mit der + linken, oberen Ecke 'von x, von y' und der rechten, unteren Ecke 'bis x, bis y'. + + #on("b")#edit (FILE VAR f, TEXT CONST res, + PROC (TEXT CONST) kdo interpreter)#off("b")# + Editieren der als 'sequential file' assoziierten Textdatei 'f'. In 'res' werden reser­ + vierte Zeichen übergeben, die von der Prozedur 'kdo interpreter' als Kommandos + interpretiert werden, wenn sie als ESC-Sequenz eingegeben werden. + Beispiel : #schl("ESC ")# #schl("e")# + +#page# +'editget' + #on("b")#editget (TEXT VAR ausgabe) #off("b")# + Aufruf des Zeileneditor. An der aktuellen Cursorposition wird eine Zeile ausgegeben in + der 'ausgabe' steht. Für diese Zeile stehen alle Editiermöglichkeiten zur + Verfügung, 'ausgabe' kann also beliebig überschrieben, ergänzt etc. werden. Die + Eingabe wird durch #schl("CR")# abgeschlossen. Im Gegensatz zur Prozedur 'get' ist auch + eine leere Eingabe möglich. + + #on("b")#editget (TEXT VAR ausgabe, INT CONST zeile, INT CONST scroll, + TEXT CONST sep, TEXT CONST res, TEXT VAR exit) #off("b")# + Wie oben, die Zeilenlänge ist jedoch auf 'zeile' Zeichen begrenzt. Die Eingabe + wird durch #schl("CR")# oder durch eine Cursorbewegung über die Position 'zeile' hinaus + abgeschlossen. + + Die Angabe 'scroll' setzt die Breite des Zeilenfensters fest, wird diese Breite + überschritten, so wird 'ausgabe' gerollt. + + In 'sep' (Separator) können Zeichen festgesetzt werden, mit denen die Eingabe + beendet wird (zusätzlich zu CR !). + + In 'res' (reservierte Tasten) können Tasten festgelegt werden, die in Verbindung + mit die Eingabe beenden. + + Wurde der Zeileneditor durch einen Separator verlassen, so steht in 'exit' dieses + Zeichen. Falls der Zeileneditor durch eine reservierte Taste verlassen, so enthält + 'exit' 'ESC' und die Taste. + + #on("b")#editget (TEXT VAR ausgabe, INT CONST zeile, INT CONST scroll)#off("b")# + Bedeutung der Parameter siehe oben. + + #on("b")#editget (TEXT VAR ausgabe, TEXT CONST sep, TEXT CONST res, + TEXT VAR exit) #off("b")# + Bedeutung der Parameter siehe oben. + + #on("b")#editget (TEXT VAR ausgabe, INT CONST zeile, TEXT VAR exit) #off("b")# + Bedeutung der Parameter siehe oben. +#page# + +5.4.7 Sortierung von Textdateien + +Für die Sortierung von Textdateien gibt es zwei Sortierprogramme: + +- Sortierung nach ASCII : sort + +- Sortierung nach + deutschem Alphabet : lexsort + + +'sort' + #on("b")#PROC sort (TEXT CONST datei) #off("b")# + Diese Prozedur sortiert die Datei 'datei' zeilenweise gemäß der von der EUMEL + Codetabelle (siehe 5.2.4) vorgegebenen Reihenfolge. Zur Sortierung werden die + Zeilen vom ersten Zeichen der Zeile beginnend, zeichenweise verglichen und + dementsprechend sortiert. + + #on("b")#PROC sort (TEXT CONST datei, INT CONST position) #off("b")# + Sortierkriterien wie oben, jedoch wird bei Vergleich und Sortierung der Satz erst + ab der Position 'position' beachtet. Sortiert wird der ganze Satz! + + +'lex sort' + #on("b")#PROC lex sort (TEXT CONST datei) #off("b")# + Zeilenweise Sortierung nach lexikographischer Reihenfolge gemäß DIN 5007. Zu + den Vergleichen werden die Operatoren LEXEQUAL, LEXGRATER, + LEXGRATEREQUAL benutzt (siehe 5.2.4). + + #on("b")#PROC lex sort (TEXT CONST datei, INT CONST position) #off("b")# + Lexikalische Sortierung durch Vergleich ab Position 'position'. + +#page# + +5.4.8 Prozeduren auf Datenräumen + +Neben den Textdateien gibt es im EUMEL-System den Typ Datenraum, der Objekte +jeglichen Typs aufnehmen kann und direkten Zugriff auf die Objekte gewährt (siehe +2.9.2). + +Für Objekte von Type Datenraum (nicht für die in Datenräumen enthaltenen Objekte!) +existieren folgende Standardprozeduren: + + +':=' + #on("b")#OP := ( DATASPACE VAR ds1, DATASPACE CONST ds2)#off("b")# + Der Datenraum 'ds1' wird als Kopie von 'ds2' angelegt. Es handelt sich zunächst + um eine logische Kopie, eine physische Kopie wird erst nach einem Schreibzugriff + auf 'ds1' oder 'ds2' nötig. + + +'new' + #on("b")#DATASPACE PROC new (TEXT CONST dsname) #off("b")# + Liefert einen neuen Datenraum namens 'dsname'. + +____________________________________________________________________________ + + DATASPACE VAR ds := new ("datenraum") + (* ergibt zwei Datenräume 'ds' und 'datenraum'! *) + +____________________________________________________________________________ + + + +'nilspace' + #on("b")#DATASPACE PROC nilspace#off("b")# + Der 'nilspace' ist ein leerer Datenraum, der ausschließlich als Quelle zum Kopie­ + ren bei der Initialisierung Verwendung finden darf. + + +'old' + #on("b")#DATASPACE PROC old (TEXT CONST dsname) #off("b")# + Liefert einen bereits existierenden Datenraum (oder auch eine Datei) mit dem + Namen 'dsname'. + + FEHLER : "dsname" gibt es nicht + + +'type' + #on("b")#PROC type (DATASPACE CONST ds, INT CONST typ)#off("b")# + Der Datenraum 'ds' erhält den frei wählbaren Schlüssel 'typ'. Es muß eine positive + Zahl gewählt werden. Der Datenraum muß zum Zeitpunkt der Typzuweisung an + ein BOUND Objekt gekoppelt (gewesen) sein. + + #on("b")#INT PROC type (DATASPACE CONST ds)#off("b")# + Liefert den Schlüssel des Datenraums 'ds'. Falls 'ds' nie an ein BOUND Objekt + gekoppelt war, liefert die Prozedur einen Wert < 0, sonst 0 (keine Zuweisung + erfolgt) oder die zugewiesene Typnummer. + + +'dataspaces' + #on("b")#INT PROC dataspaces (TASK CONST task) #off("b")# + Liefert die Anzahl der Datenräume der Task 'task'. + + #on("b")#INT PROC dataspaces #off("b")# + Anzahl der Datenräume von 'myself'. + + +'ds pages' + #on("b")#INT PROC ds pages (DATASPACE CONST ds)#off("b")# + Liefert die Anzahl der durch 'ds' belegten Seiten (je 512 Byte). + + +'storage' + #on("b")#INT PROC storage (DATASPACE CONST ds)#off("b")# + Liefert den von 'ds' belegten Speicherplatz in KB. + +#page# +'copy' + #on("b")#PROC copy (DATASPACE CONST ds, TEXT CONST datei) #off("b")# + Eine neue Datei mit dem Namen 'datei' wird angelegt. Der Inhalt der Datei ist eine + Kopie des Inhalts des Datenraumes 'ds'. + + +'forget' + #on("b")#PROC forget (DATASPACE CONST ds)#off("b")# + Der Datenraum 'ds' wird gelöscht#u#1)#e#. + +#foot# + + 1) Durch diese Prozedur steht nicht unmittelbar mehr freier Speicherplatz zur + Verfügung. Die physische Räumung von Speicherplatz erfolgt durch die + 'Müllabfuhr' bei einem Fixpunkt. +#end# + +'fetch' + #on("b")#PROC fetch (DATASPACE CONST ziel, TEXT CONST datei, + TASK CONST manager) #off("b")# + Aus der Task 'manager' wird der Datenraum der Datei 'datei' in den eigenen + Datenraum 'ziel' kopiert. + + +'save' + #on("b")#PROC save (DATASPACE CONST quelle, TEXT CONST datei, + TASK CONST manager) #off("b")# + Der eigene Datenraum 'quelle' wird in die Datei 'datei' in der Task 'manager' + kopiert. +#page# + +5.5 Eingabe/Ausgabe + +- Eingabesteuerzeichen : HOP , � � � � , TAB , RUBIN , RUBOUT + CR , MARK , ESC + +- Ausgabesteuerzeichen : HOME , � � � � , CL EOP , CL EOL + CPOS , BELL , CR , ENDMARK , BEGINMARK + +- Positionierung : cursor , get cursor , line , page + +- Eingabe : get , getline , inchar , incharety + +- Ausgabe : cout , out , out subtext , put , putline , + TIMESOUT , write + +- Kontrolle : online , pause , sysin , sysout + +- Zeitmessung : clock , date , day , hour , pause , time + time of day + +#page# + +5.5.1 E/A auf Bildschirm + +Steuerzeichen und Standardprozeduren zur Ein- Ausgabe am Bildschirm werden +zur Steuerung des Dialogverhaltens von Prozeduren benutzt. + + +5.5.1.1 Eingabesteuerzeichen +Eingabesteuerzeichen werden durch die Funktionstasten (s. 3.2) erzeugt. Die Wirkung +der Tasten ist ebenfalls an dieser Stelle beschrieben. + +Durch die Tasten werden folgende Codes an Programme gegeben: + +Codierung I Bezeichnung +-----------+-------------- +HOP I 1 +RECHTS I 2 +OBEN I 3 +LINKS I 8 +TAB I 9 +UNTEN I 10 +RUBIN I 11 +RUBOUT I 12 +CR I 13 +MARK I 16 +ESC I 27 + + +#page# + +5.5.1.2 Ausgabesteuerzeichen + +Die Ausgabe dieser Zeichen bewirkt folgendes Verhalten der Bildschirmausgabe. + +Code I Name I Wirkung +-----+-------------+------------------------------------------------------- + 0 I NUL I keine Wirkung + 1 I HOME I Cursor in die linke obere Ecke setzen (Position 0,0!) + 2 I RECHTS I Cursor eine Stelle nach rechts setzen + 3 I OBEN I Cursor eine Zeile höher setzen + 4 I CL EOP I Rest der Seite löschen + 5 I CL EOL I Rest der Zeile löschen + 6 I CPOS I Cursor setzen, nächstes Ausgabezeichen bestimmt die + I I y-Position, das darauf folgende die x-Position. + 7 I BELL I akustisches Signal + 8 I LINKS I Cursor eine Stelle nach links setzen +10 I UNTEN I Cursor eine Stelle nach unten setzen +13 I CR I Cursor an den Anfang der nächsten Zeile setzen +14 I ENDMARK I Ende des markierten Bereichs +15 I BEGINMARK I Anfang des markierten Bereichs + + + + +____________________________________________________________________________ + + ........................... Beispiel .......................... + TEXT VAR ausgabe := (""7""15"V O R S I C H T"14"7""); + out(ausgabe); + +____________________________________________________________________________ + +#page# + +5.5.1.3 Positionierung + +'cursor' + #on("b")#PROC cursor (INT CONST column, row) #off("b")# + Positioniert den Cursor auf dem Bildschirm, wobei 'column' die Spalte und 'row' + die Zeile angibt. Die zulässigen Bereiche von 'column' und 'row' sind geräteab­ + hängig. + + + +'get cursor' + #on("b")#PROC get cursor (INT VAR x, y) #off("b")# + Erfragung der aktuellen Cursor-Position. Die Koordinaten des Cursors werden in + 'x' und 'y' geliefert. Die aktuelle Cursor-Position ist nach Ausgabe von 'HOME' + (Code = 1) oder einer Positionierung des Cursors mit der Prozedur 'cursor' stets + definiert. Die Prozedur 'get cursor' liefert jedoch undefinierte Werte, wenn über + den rechten Rand einer Zeile hinausgeschrieben wurde (die Wirkung einer solchen + Operation hängt von der Hardware eines Terminals ab). + + +'line' + #on("b")#PROC line #off("b")# + Es wird zum Anfang einer neuen Zeile positioniert. + + #on("b")#PROC line (INT CONST number) #off("b")# + Es werden 'number' Zeilenwechsel vorgenommen. + + +'page' + #on("b")#PROC page #off("b")# + Es wird zum Anfang einer neuen Seite positioniert (hier: linke obere Ecke (Position + 1,1 !) des Bildschirms, wobei der Bildschirm gelöscht wird). + +#page# + +5.5.1.4 Eingabe + + +Grundlegende Prozeduren +Die folgenden Prozeduren dienen ausschließlich der Eingabe vom Terminal. + +'editget' + Siehe 5.4.6 + + +'getchar' + #on("b")#PROC getchar (TEXT VAR zeichen)#off("b")# + Liest genau ein Zeichen von der Tastatur und schreibt es in die Variable 'zeichen'. + + +'inchar' + #on("b")#PROC inchar (TEXT VAR character) #off("b")# + Wartet solange, bis ein Zeichen von der Tastatur eingegeben wird, und schreibt + dieses Zeichen in die Variable 'character'. + + +'incharety' + #on("b")#TEXT PROC incharety #off("b")# + Versucht, ein Zeichen von der Tastatur zu lesen. Wurde kein Zeichen eingegeben, + wird niltext geliefert. + + #on("b")#TEXT PROC incharety (INT CONST time limit) #off("b")# + Versucht, ein Zeichen vom Bildschirm zu lesen. Dabei wird maximal eine 'time + limit' lange Zeit auf das Zeichen gewartet (gemessen in Zehntel-Sekunden). + +#page# + +Umleitbare Eingabeprozeduren +Die folgenden Eingabeprozeduren lesen ebenfalls vom Terminal, die Eingabequelle +kann jedoch durch die Prozedur 'sysin' umgestellt werden. Falls in 'sysin' eine Datei +angegeben wird wird die Eingabe statt vom Terminal aus dieser Datei gelesen. + + +'sysin' + #on("b")#PROC sysin (TEXT CONST file name) #off("b")# + Eingabe-Routinen lesen nicht mehr vom Benutzer-Terminal, sondern aus der + Datei 'file name'. + + #on("b")#TEXT PROC sysin #off("b")# + Liefert den Namen der eingestellten 'sysin'-Datei. "" bezeichnet das Benutzer- + Terminal. + + +'get' + #on("b")#PROC get (INT VAR number) #off("b")# + Einlesen eines INT-Wertes vom Bildschirm. Der einzulesende INT-Wert kann + bei der Eingabe vom Terminal editiert werden. + + #on("b")#PROC get (REAL VAR value) #off("b")# + Einlesen eines REAL-Wertes vom Bildschirm. Der einzulesende REAL-Wert + kann bei der Eingabe vom Terminal editiert werden. + + #on("b")#PROC get (TEXT VAR word) #off("b")# + Liest einen Text in die Variable 'word' mit maximal 255 Zeichen. Es werden + solange Zeichen vom Terminal gelesen, bis ein Leerzeichen oder #schl("CR")# eingegeben + wird. Dabei werden führende Leerzeichen übergeben. Der einzulesende Text + kann bei der Eingabe editiert werden. Eine leere Eingabe ist nicht erlaubt. + + #on("b")#PROC get (TEXT VAR word, INT CONST laenge) #off("b")# + Liest einen Text vom Bildschirm mit der Länge 'laenge' oder bis #schl("CR")# eingegeben + wird. Der einzulesende Wert kann bei der Eingabe editiert werden. + + #on("b")#PROC get (TEXT VAR word, TEXT CONST separator) #off("b")# + Liest einen Text vom Bildschirm, bis ein Zeichen 'separator' angetroffen oder #schl("CR")# + eingegeben wird. Der einzulesende Text kann bei der Eingabe editiert werden. + + +'getline' + #on("b")#PROC get line (TEXT VAR line) #off("b")# + Das System wartet auf eine Zeile vom Bildschirm (max. 255 Zeichen). #schl("CR")# been­ + det die Eingabe. + +#page# + +5.5.1.5 Ausgabe + + +Grundlegende Prozeduren +Die folgenden Prozeduren dienen ausschließlich der Ausgabe auf das Terminal. + + +'cout' + #on("b")#PROC cout (INT CONST number) #off("b")# + Schreibt 'number' an die aktuelle Cursor-Position auf den Bildschirm. Anschlie­ + ßend wird an diese Position wieder zurück positioniert. 'number' muß > 0 sein. + Paßt 'number' nicht mehr auf die Zeile, so ist die Wirkung von 'cout' nicht de­ + finiert. 'cout' gibt den Wert von 'number' nur aus, wenn genügend freie Kanal- + Kapazität für diese Ausgabe vorhanden ist. Das hat zur Folge, daß Programme + nicht auf die Beendigung einer Ausgabe von 'number' warten müssen und ggf. + Ausgaben überschlagen werden. + + +'out' + #on("b")#PROC out (TEXT CONST text) #off("b")# + Ausgabe eines Textes auf dem Bildschirm. Im Unterschied zu 'put' wird kein + Blank an den ausgegebenen Text angefügt. + + + +'out subtext' + #on("b")#PROC out subtext (TEXT CONST source, INT CONST from) #off("b")# + Ausgabe eines Teiltextes von 'source' von der Position 'from' bis Textende. Es + wird keine Aktion vorgenommen für + + + from > LENGTH source + + + #on("b")#PROC out subtext (TEXT CONST source, INT CONST from, to)#off("b")# + Ausgabe eines Teiltextes von 'source' von der Position 'from' bis zur Position 'to'. + Für + + + to > LENGTH source + + + wird out subtext (source, from) ausgeführt. + + #on("b")#PROC out text (TEXT CONST source, INT CONST from, to) #off("b")# + Ausgabe eines Teiltextes von 'source' von der Position 'from' bis zur Position 'to'. + Für + + + to > LENGTH source + + + wird für die fehlenden Zeichen Blanks ausgegeben. + + + +'TIMESOUT' + #on("b")#OP TIMESOUT (INT CONST times, TEXT CONST text) #off("b")# + Ausgabe eines TEXTes 'text' 'times'mal. An die Ausgabe wird im Gegensatz zu + 'put' kein Leerzeichen angefügt. Es wird kein Text ausgegeben für + + + times < 1 + + +#page# + +Umleitbare Ausgabeprozeduren +Die folgenden Ausgabeprozeduren schreiben ebenfalls auf das Terminal, die Ausgabe +kann jedoch durch die Prozedur 'sysout' umgeleitet werden. Falls in 'sysout' eine +Datei angegeben wird wird die Ausgabe statt zum +Terminal in die angegebene Datei geleitet. + + +'sysout' + #on("b")#PROC sysout (TEXT CONST file name) #off("b")# + Ausgabe-Routinen gehen nicht mehr zum Benutzer-Terminal, sondern in die + Datei 'file name'. + + #on("b")#TEXT PROC sysout #off("b")# + Liefert den Namen der eingestellten 'sysout'-Datei. "" bezeichnet das Benut­ + zer-Terminal. + + +'line' + #on("b")#line#off("b")# + Positionierung auf den Anfang einer neuen Ausgabezeile. + + #on("b")#line (INT CONST faktor)#off("b")# + Nächste Ausgabezeile um 'faktor' Zeilen weiter positionieren. + + +'put' + #on("b")#PROC put (INT CONST number) #off("b")# + Ausgabe eines INT-Wertes auf dem Bildschirm. Anschließend wird ein Leer­ + zeichen ausgegeben. + + #on("b")#PROC put (REAL CONST real) #off("b")# + Ausgabe eines REAL-Wertes auf dem Bildschirm. Anschließend wird ein Leer­ + zeichen ausgegeben. + + #on("b")#PROC put (TEXT CONST text) #off("b")# + Ausgabe eines Textes auf dem Bildschirm. Nach der Ausgabe von 'text' wird ein + Blank ausgegeben, um nachfolgenden Ausgaben auf der gleichen Zeile voneinan­ + der zu trennen. Hardwareabhängig sind die Aktionen, wenn eine Ausgabe über + eine Zeilengrenze (hier: Bildschirmzeile) vorgenommen wird. Meist wird die Ausga­ + be auf der nächsten Zeile fortgesetzt. + + +'putline' + #on("b")#PROC putline (TEXT CONST text) #off("b")# + Ausgabe von 'text' auf dem Bildschirm. Nach der Ausgabe wird auf den Anfang + der nächsten Zeile positioniert. Gibt man TEXTe nur mit 'putline' aus, so ist + gesichert, daß jede Ausgabe auf einer neuen Zeile beginnt. Hardwareabhängig + sind die Aktionen, wenn eine Ausgabe über eine Zeilengrenze (hier: Bildschirm­ + zeile) vorgenommen wird. Meist wird die Ausgabe auf der nächsten Zeile fort­ + gesetzt. + + +'write' + #on("b")#PROC write (TEXT CONST text) #off("b")# + Gibt 'text' ohne Trennblank aus ('put' mit Trennblank). + +#page# + +5.5.1.6 Kontrolle + +'online' + #on("b")#BOOL PROC online #off("b")# + Liefert TRUE, wenn die Task mit einem Terminal gekoppelt ist. + + +'pause' + #on("b")#PROC pause (INT CONST time limit) #off("b")# + Wartet 'time limit' in Zehntel-Sekunden. Bei negativen Werten ist die Wirkung + nicht definiert. Die Wartezeit wird nicht nur durch das Erreichen der Grenze ab­ + gebrochen, sondern auch durch die Eingabe eines beliebigen Zeichens. + + #on("b")#PROC pause#off("b")# + Wartet bis zur Eingabe eines beliebigen Zeichens. + + +#page# + +5.5.2 Zeitmessung + +'clock' + #on("b")#REAL PROC clock (INT CONST index) #off("b")# + Datum und Uhrzeit werden vom EUMEL-System für alle Tasks geführt. Neben + einer Uhr ('Realzeituhr'), die das Datum und die aktuelle Uhrzeit enthält, wird eine + Uhr für die von der Task verbrauchte CPU-Zeit geführt ('CPU-Zeituhr'). Beide + Zeiten werden vom System als REALs realisiert. Die Prozedur 'clock' liefert die + aktuellen Werte dieser Uhren. Bei 'index = 0' wird die akkumulierte CPU-Zeit + der Task, bei 'index = 1' der Wert der Realzeituhr geliefert. + + Mit den REAL-Werten der Uhren kann ohne weiteres gerechnet werden, jedoch + sind nur Werte > 0 definiert. Die REAL-Werte der Realzeituhr beginnen beim + 1.1.1900 um 0 Uhr. Es sind nur Werte für dieses Jahrhundert zugelassen. Werte + der Realzeituhr in lesbarer Form kann man durch die Konvertierungsprozeduren + 'date' (vergl. 5- #topage("date")# ) (für den aktuellen Tag) und 'time of day' (Uhrzeit, vergl. + 5-#topage("time")#) erhalten. + + Um die benötigte CPU-Zeit eines Programms zu berechnen, muß man die + CPU-Zeituhr zweimal abfragen. Um solche Zeiten in lesbarer Form zu erhalten, + kann man die Konvertierungsprozedur 'time' (vergl. 5- #topage("time")#) verwenden. Beispiel: + +____________________________________________________________________________ + + ........................... Beispiel .......................... + REAL CONST anfang :: clock (0); + berechnungen; + REAL CONST ende :: clock (0); + put ("benoetigte CPU-Zeit in Sek:"); + put (time (ende - anfang)) + +____________________________________________________________________________ +#page# +'date' +#goalpage("date")# + #on("b")#TEXT PROC date (REAL CONST time) #off("b")# + Konvertierungsprozedur für das Datum, welches sich aus dem Aufruf der Prozedur + 'clock (1)' ergibt. Das Datum wird in der Form 'tt.mm.jj' geliefert. Beispiel: + +____________________________________________________________________________ + + put (date (clock (1))) (* z.B.: 24.12.87 *) + +____________________________________________________________________________ + + + #on("b")#REAL PROC date (TEXT CONST datum) #off("b")# + Konvertierungsprozedur für ein Datum in der Form 'tt.mm.jj'. Liefert einen + REAL-Wert, wie ihn die Prozedur 'clock (1)' liefern würde. Beispiel: + +____________________________________________________________________________ + + put (date ("24.12.87")) (* 6.273539e10 *) + +____________________________________________________________________________ + + + #on("b")#TEXT PROC date#off("b")# + Liefert das Tagesdatum. Wirkt wie 'date (clock (1))', ist jedoch erheblich schneller. + + + +'day' + #on("b")#REAL CONST day #off("b")# + Liefert die Anzahl der Sekunden eines Tages (86 400.0). + + + +'hour' + #on("b")#REAL CONST hour #off("b")# + Liefert die Anzahl der Sekunden einer Stunde (3600.0). + + + +'pause' + #on("b")#PROC pause (INT CONST time limit) #off("b")# + Wartet 'time limit' in Zehntel-Sekunden. Bei negativen Werten ist die Wirkung + nicht definiert. Die Wartezeit wird nicht nur durch das Erreichen der Grenze ab­ + gebrochen, sondern auch durch die Eingabe eines beliebigen Zeichens. + + + +'time' +#goalpage("time")# + #on("b")#TEXT PROC time (REAL CONST time) #off("b")# + Konvertierungsprozedur für die Zeiten der CPU-Zeituhr. Liefert die Zeiten in der + Form 'hh:mm:ss.s'. Vergl. dazu 'clock'. + + #on("b")#TEXT PROC time (REAL CONST value, INT CONST laenge) #off("b")# + Konvertiert die Zeit in externe Darstellung. Für die 'laenge'-Werte ergibt sich: + + + laenge = 10 (* hh:mm:ss.s *) + laenge = 12 (* hhhh:mm:ss.s *) + + + + #on("b")#REAL PROC time (TEXT CONST time) #off("b")# + Konvertierungsprozedur für Texte der CPU-Zeituhr in REAL-Werte. + + + +'time of day' + #on("b")#TEXT PROC time of day (REAL CONST time) #off("b")# + Konvertierungsprozedur für REALs, wie sie die Realzeituhr + liefert. Es wird die Tageszeit in der Form 'hh:mm' geliefert. Beispiel: + +____________________________________________________________________________ + + put (time of day (clock (1))) (* z.B.: 17:25 *) + +____________________________________________________________________________ + + + #on("b")#TEXT PROC time of day #off("b")# + Liefert die aktuelle Tageszeit. Entspricht + +____________________________________________________________________________ + + time of day (clock (1)) + +____________________________________________________________________________ +#page# + +5.6 Scanner + +Der Scanner kann benutzt werden, um festzustellen, welche Art von Symbolen in +einem TEXT enthalten sind. Die Repräsentation der Symbole müssen dabei der +ELAN-Syntax entsprechen. Folgende #ib#Symbole#ie# kann der Scanner erkennen: + + - "tags", d.h. Namen, + - "bolds", d.h. Schlüsselworte, + - "number", d.h. INT oder REAL Zahlen, + - Operatoren, + - "delimiter", d.h. Begrenzer wie z.B. ";", + - und das Ende des Scan-Textes. + + +Der Scanner überliest Kommentare und Leerzeichen zwischen den Symbolen. Der +(erste) zu verarbeitende Text muß mit der Prozedur + + + #ib#scan#ie# + + +in den Scanner "hineingesteckt" werden. Mit der Prozedur + + + #ib#next symbol#ie# + + +wird das jeweils nächste Symbol des TEXTes geholt. Am Ende wird "end of scan" +und als Symbol 'niltext' geliefert. Falls innerhalb eines TEXT-Denoters oder eines +Kommentars "end of scan" auftritt, wird "within text" bzw. "within comment" gemel­ +det. Der Scan-Prozeß kann dann mit dem nächsten zu scannenden TEXT (der +nächsten Zeile) fortgesetzt werden. Dafür wird nicht die Prozedur 'scan', sondern + + + #ib#continue scan#ie# + + +verwandt. Sie setzt im letzten Scan-Zustand (z.B. Kommentar oder TEXT-Deno­ +ter) wieder auf, so daß auch Folgen von TEXTen (Zeilen) wie z.B. Dateien leicht +gescannt werden können. + +Mit den Prozeduren + + + scan (* meldet eine Datei zum scannen an *) + next symbol (* holt die Symbole *) + + +kann man auch eine Datei nach ELAN-Symbolen untersuchen. + +____________________________________________________________________________ + + FILE VAR f :: ... + ... + scan (f); (* beginnt das Scanning in + der nächsten Zeile *) + TEXT VAR symbol; + INT VAR type; + REP + next symbol (f, symbol, type); + verarbeite symbol + UNTIL type >= 7 END REP. + +____________________________________________________________________________ + +#page# + +Scanner-Kommandos + + +'continue scan' + #on("b")#PROC continue scan (TEXT CONST scan text) #off("b")# + Das Scanning soll mit 'scan text' fortgesetzt werden. Falls der Scan-Vorgang + beim vorigen 'scan text' innerhalb eines TEXT-Denoters oder eines Kommentars + abgebrochen wurde, wird er jetzt entsprechend mit dem nächsten 'next symbol' + fortgesetzt. Der erste Teil-Scan einer Folge muß aber stets mit 'scan' eingeleitet + werden! + +'next symbol' + #on("b")#PROC next symbol (TEXT VAR symbol, INT VAR type) #off("b")# + Holt das nächste Symbol. In "symbol" steht der TEXT des Symbols, so z.B. die + Ziffern eines INT-Denoters. Bei TEXT-Denotern werden die führenden und + abschließenden Anführungsstriche abgeschnitten. Leerzeichen oder Kommentare + spielen in "tags" oder "numbers" keine Rolle. Zwischen Symbolen spielen Leer­ + zeichen oder Kommentare keine Rolle. In "type" steht eine Kennzeichung für den + Typ des Symbols: + + tag = 1 , + bold = 2 , + number = 3 , + text = 4 , + operator = 5 , + delimiter = 6 , + end of file = 7 , + within comment = 8 , + within text = 9 . + + Wird Scan-Ende innerhalb eines Kommentars gefunden, so wird 'niltext' und + 'within comment' geliefert. Wird Scan-Ende innerhalb eines TEXT-Denoters + gefunden, so wird der schon analysierte Teil des Denoters und 'within text' gelie­ + fert. + + #on("b")#PROC next symbol (TEXT VAR symbol) #off("b")# + s.o. Es wird aber nur der Text des Symbols (ohne Typ) geliefert. + + #on("b")#PROC next symbol (FILE VAR f, TEXT CONST symbol) #off("b")# + Arbeitet wie obige Prozeduren, jedoch auf einen FILE. + + #on("b")#PROC next symbol (FILE VAR f, TEXT CONST symbol, INT VAR type)#off("b")# + Arbeitet wie obige Prozeduren, jedoch auf einen FILE. + + +'scan' + #on("b")#PROC scan (TEXT CONST scan text) #off("b")# + Meldet einen 'scan text' für den Scanner zur Verarbeitung an. Die Prozedur 'scan' + muß vor dem ersten Aufruf von 'next symbol' gegeben werden. Im Gegensatz zu + 'continue scan' normiert 'scan' den inneren Zustand des Scanners, d.h. vorherige + Scan-Vorgänge haben keinen Einfluß mehr auf das Scanning. + + #on("b")#PROC scan (FILE VAR f) #off("b")# + Wie obige Prozedur, jedoch auf einen FILE. Die zu scannende Zeile ist die näch­ + ste Zeile im FILE 'f' ('scan' macht zuerst ein 'getline'). + diff --git a/doc/programming/programmierhandbuch.6 b/doc/programming/programmierhandbuch.6 new file mode 100644 index 0000000..ce11f6f --- /dev/null +++ b/doc/programming/programmierhandbuch.6 @@ -0,0 +1,1441 @@ +#pagenr("%",1)##setcount(1)##block##pageblock# +#headeven# +#center#EUMEL-Benutzerhandbuch +#center#____________________________________________________________ + +#end# +#headodd# +#center#TEIL 6 : Das Archiv 'std.zusatz' +#center#____________________________________________________________ + +#end# +#bottomeven# +#center#____________________________________________________________ +6 - % #right#GMD +#end# +#bottomodd# +#center#____________________________________________________________ +GMD #right#6 - % +#end# + +TEIL 6: Das Archiv 'std.zusatz' + +Das Archiv 'std.zusatz' enthält Pakete, die nur bei Bedarf insertiert werden sollen. +Eine Einbindung in das EUMEL Grundsystem würde dieses ungebührlich unfangreich +machen. + +Das Archiv enthält zusätzliche Software für: + +- mathematische Operationen : complex , longint , vector , matrix + +- Analyse : reporter , referencer + +- Taschenrechnerfunktion + zur Editor-Erweiterung : TeCal , TeCal Auskunft + + +#page# + +6.1. Erweiterungen um + Mathematische Operationen + + +6.1.1 COMPLEX + +Das Packet COMPLEX erweitert das System um den Datentyp COMPLEX (komplexe +Zahlen) und Operationen auf komplexen Zahlen. Folgende Operationen stehen für +COMPLEX zur Verfügung: + +- Einfache Operatoren : := , = , <> , + ,- , * + +- Eingabe/Ausgabe : get , put + +- Denotierungsprozedur : complex , complex i , complex one , com­ + plex zero + +- Komponenten : real part , imag part + +- bes. Funktionen : ABS , CONJ , phi , dphi , sqrt + +#page# + +COMPLEX Operationen + + +'TYPE COMPLEX' + Komplexe Zahl, bestehend aud Realteil 're' und Imaginärteil 'im'. + + +':=' + #on("b")#OP := (COMPLEX VAR a, COMPLEX CONST b) #off("b")# + Zuweisung. + + +'=' + #on("b")#BOOL OP = (COMPLEX CONST a, b) #off("b")# + Vergleich von 'a' und 'b' auf Gleichheit. + + +'<>' + #on("b")#BOOL OP <> (COMPLEX CONST a, b) #off("b")# + Vergleich von 'a' und 'b' auf Ungleichheit. + + +'+' + #on("b")#COMPLEX OP + (COMPLEX CONST a, b) #off("b")# + Summe von 'a' und 'b'. + + +'-' + #on("b")#COMPLEX OP - (COMPLEX CONST a, b) #off("b")# + Differenz von 'a' und 'b'. + + +'*' + #on("b")#COMPLEX OP * (COMPLEX CONST a, b) #off("b")# + Multiplikation von 'a' mit 'b'. + + +'/' + #on("b")#COMPLEX OP / (COMPLEX CONST a, b) #off("b")# + Division von 'a' mit 'b'. + +#page# +'get' + #on("b")#PROC get (COMPLEX VAR a) #off("b")# + Einlesen eines komplexen Wertes vom Bildschirm in der Form zweier REAL-De­ + noter. Die Eingabe kann editiert werden. + + +'put' + #on("b")#PROC put (COMPLEX CONST a) #off("b")# + Ausgabe eines komplexen Wertes auf dem Bildschirm in Form zweier REAL- + Werte. Hinter jedem REAL-Wert wird ein Leerzeichen angefügt. + + +'complex' + #on("b")#COMPLEX PROC complex (REAL CONST re, im) #off("b")# + Denotierungsprozedur. Angabe in kartesischen Koordinaten. + + +'complex i' + #on("b")#COMPLEX PROC complex i #off("b")# + Denotierungsprozedur für den komplexen Wert '0.0 + i 1.0'. + + +'complex one' + #on("b")#COMPLEX PROC complex one #off("b")# + Denotierungsprozedur für den komplexen Wert '1.0 + i 0.0'. + + +'complex zero' + #on("b")#COMPLEX PROC complex zero #off("b")# + Denotierungsprozedur für den komplexen Wert '0.0 + i 0.0'. + + +'imag part' + #on("b")#REAL PROC imag part (COMPLEX CONST number) #off("b")# + Liefert den Imaginärteil des komplexen Wertes 'number'. + + +'real part' + #on("b")#REAL PROC real part (COMPLEX CONST number) #off("b")# + Liefert den Real-Teil des komplexen Wertes 'number'. + + +'ABS' + #on("b")#REAL OP ABS (COMPLEX CONST x) #off("b")# + REAL-Betrag von 'x'. + + +'CONJ' + #on("b")#COMPLEX OP CONJ (COMPLEX CONST number) #off("b")# + Liefert den konjugiert komplexen Wert von 'number'. + + +'dphi' + #on("b")#REAL PROC dphi (COMPLEX CONST x) #off("b")# + Winkel von 'x' (Polardarstellung). + + +'phi' + #on("b")#REAL PROC phi (COMPLEX CONST x) #off("b")# + Winkel von 'x' (Polardarstellung) in Radiant. + + +'sqrt' + #on("b")#COMPLEX PROC sqrt (COMPLEX CONST x) #off("b")# + Wurzelfunktion für komplexe Werte. + +#page# + +6.1.2 LONGINT + +LONGINT ist ein Datentyp, für den (fast) alle Prozeduren und Operatoren des Daten­ +typs INT implementiert wurden. LONGINT unterscheidet sich von INT dadurch, daß +erheblich größere Werte darstellbar sind. + +Für den Datentyp LONGINT stehen folgende Operationen zur Verfügung: + +- Operatoren : := , = , <> , < , <= ,> , >= , + , - , * , + ** , + ABS , DECR , DIV , INCR , MOD , SIGN + +- Eingabe/Ausgabe : get , put + + +- Math. Prozeduren : abs , int , longint , max , max logint , min , + random , sign , text , zero + + + +LONGINT-Operationen + + +'TYPE LONGINT' + Datentyp + + +':=' + #on("b")#OP := (LONGINT VAR links, LONGINT CONST rechts) : #off("b")# + Zuweisungsoperator + + +'= ' + #on("b")#BOOL OP = (LONGINT CONST links, rechts) #off("b")# + Vergleichen zweier LONGINTs auf Gleichheit. + + +'<>' + #on("b")#BOOL OP <> (LONGINT CONST links, rechts) #off("b")# + Vergleichen zweier LONGINTs auf Ungleichheit. + + +'< ' + #on("b")#BOOL OP < (LONGINT CONST links, rechts) #off("b")# + Vergleichen zweier LONGINTs auf kleiner. + + +'<=' + #on("b")#BOOL OP <= (LONGINT CONST links, rechts) #off("b")# + Vergleichen zweier LONGINTs auf kleiner gleich. + + +'> ' + #on("b")#BOOL OP > (LONGINT CONST links, rechts) #off("b")# + Vergleichen zweier LONGINTs auf größer. + + +'>=' + #on("b")#BOOL OP >= (LONGINT CONST links, rechts) #off("b")# + Vergleichen zweier LONGINTs auf größer gleich. + + +'+ ' + #on("b")#LONGINT OP + (LONGINT CONST argument) #off("b")# + Monadischer Operator. Ohne Wirkung. + + #on("b")#LONGINT OP + (LONGINT CONST links, rechts) #off("b")# + Addition zweier LONGINTs. + + +'- ' + #on("b")#LONGINT OP - (LONGINT CONST argument) #off("b")# + Vorzeichenumkehrung. + + #on("b")#LONGINT OP - (LONGINT CONST links, rechts) #off("b")# + Subtraktion zweier LONGINTs. + + +'* ' + #on("b")#LONGINT OP * (LONGINT CONST links, rechts) #off("b")# + Multiplikation von zwei LONGINTs. + + +'**' + #on("b")#LONGINT OP ** (LONGINT CONST argument, exponent) #off("b")# + Exponentiation zweier LONGINTs mit positivem Exponenten. + + FEHLER : + LONGINT OP ** : negative exponent + Der 'exponent' muß >= 0 sein. + 0 ** 0 is not defined + 'argument' und 'exponent' dürfen nicht gleich 0 sein. + + + #on("b")#LONGINT OP ** (LONGINT CONST argument, INT CONST exponent)#off("b")# + Exponentiation eines LONGINT mit positiven INT Exponenten. + + FEHLER : + LONGINT OP ** : negative exponent + Der 'exponent' muß >= 0 sein. + 0 ** 0 is not defined + 'argument' und 'exponent' dürfen nicht gleich 0 sein. + +'ABS' + #on("b")#LONGINT OP ABS (LONGINT CONST argument) #off("b")# + Absolutbetrag eines LONGINT. + + +'DECR' + #on("b")#OP DECR (LONGINT VAR resultat, LONGINT CONST ab) #off("b")# + resultat := resultat - ab + + +'DIV' + #on("b")#LONGINT OP DIV (LONGINT CONST links, rechts) #off("b")# + Division zweier LONGINTs. + + FEHLER : + Division durch 0 + 'rechts' muß <> 0 sein. + + +'INCR' + #on("b")#LONGINT OP INCR (LONGINT VAR resultat, LONGINT CONST dazu)#off("b")# + resultat := resultat + dazu + + + +'MOD' + #on("b")#LONGINT OP MOD (LONGINT CONST links, rechts) #off("b")# + Modulo-Funktion für LONGINTs. Der Rest einer LONGINT-Division wird ermit­ + telt. + + FEHLER : + text (links) + 'MOD 0' + 'rechts' muß ungleich null sein. + + +'SIGN' + #on("b")#INT OP SIGN (LONGINT CONST longint) #off("b")# + Feststellen des Vorzeichens von 'longint'. Liefert: + + + 0 wenn 'longint' = 0, + 1 wenn 'longint' > 0, + -1 wenn 'longint' < 0. + + +#page# +'get' + #on("b")#PROC get (LONGINT VAR zahl) #off("b")# + Eingabe eines LONGINTs vom Terminal. + + #on("b")#PROC get (FILE VAR file, LONGINT VAR zahl) #off("b")# + Einlesen von 'zahl' aus der sequentiellen Datei 'file'. Die Datei muß mit 'input' + assoziiert sein (vergl. 'sequential file'). + + FEHLER : + Datei zu + Leseversuch nach Daateiende + Leseversuch auf output-FILE + + +'put' + #on("b")#PROC put (LONGINT CONST longint) #off("b")# + Ausgabe eines LONGINTs auf dem Bildschirm. Anschließend wird ein Leerzeichen + ausgegeben. Hardwareabhängig sind die Aktionen, wenn eine Ausgabe über die + Bildschirmzeilengrenze vorgenommen wird. Meist wird jedoch die Ausgabe auf der + nächsten Zeile fortgesetzt. + + #on("b")#PROC put (FILE VAR file, LONGINT CONST zahl) #off("b")# + Ausgabe von 'zahl' in die sequentielle Datei 'file'. 'file' muß mit 'output' assoziiert + sein. + + FEHLER : + Datei zu + Schreibversuch auf input-FILE +#page# +'abs' + #on("b")#LONGINT PROC abs (LONGINT CONST argument) #off("b")# + Absolutbetrag eines LONGINT. + + +'int' + #on("b")#INT PROC int (LONGINT CONST longint) #off("b")# + Konvertierung von LONGINT nach INT. + + FEHLER : + integer overflow + 'longint' ist größer als 'maxint'. + + +'longint' + #on("b")#LONGINT PROC longint (INT CONST int) #off("b")# + Konvertierung von 'int' nach LONGINT. + + #on("b")#LONGINT PROC longint (TEXT CONST text) #off("b")# + Konvertierung von 'text' nach LONGINT. + + +'max' + #on("b")#LONGINT PROC max (LONGINT CONST links, rechts) #off("b")# + Liefert das Maximum zweier LONGINTs. + + +'maxlongint' + #on("b")#LONGINT PROC max longint #off("b")# + Liefert größten LONGINT Wert. + + +'min' + #on("b")#LONGINT PROC min (LONGINT CONST links, rechts) #off("b")# + Liefert das Minimum zweier LONGINTs. + + +'random' + #on("b")#LONGINT PROC random (LONGINT CONST lower bound, upper bound)#off("b")# + Pseudo-Zufallszahlen-Generator im Intervall 'lower bound' und 'upper bound' + einschließlich. Es handelt sich hier um den 'LONGINT Random Generator'. + + +'sign' + #on("b")#INT PROC sign (LONGINT CONST longint) #off("b")# + Feststellen des Vorzeichens von 'longint'. Liefert: + + + 0 wenn 'longint' = 0, + 1 wenn 'longint' > 0, + -1 wenn 'longint' < 0. + + + +'text' + #on("b")#TEXT PROC text (LONGINT CONST longint) #off("b")# + Konvertierung von 'longint' nach TEXT. + + #on("b")#TEXT PROC text (LONGINT CONST longint, INT CONST laenge) #off("b")# + Konvertierung von 'longint' nach TEXT. Die Anzahl der Zeichen soll 'laenge' + betragen. Für + + + LENGTH (text (longint)) < laenge + + + werden die Zeichen rechtsbündig in einen Text mit der Länge 'laenge' eingetra­ + gen. Ist der daraus entstehende TEXT kleiner als 'laenge', werden die an 'laenge' + fehlenden Zeichen im TEXT mit Leerzeichen aufgefüllt. Für + + + LENGTH (text (longint)) > laenge + + + wird ein Text mit der Länge 'laenge' geliefert, der mit '*'-Zeichen gefüllt ist. + + +'zero' + #on("b")#LONGINT PROC zero #off("b")# + Liefert LONGINT Wert Null. + + +#page# + +6.1.3 VECTOR + +Der Datentyp VECTOR erlaubt Operationen auf Vektoren aus Elementen vom Typ +REAL. Im Gegensatz zur Struktur 'ROW m REAL' muß die Anzahl der Elemente nicht +zur Übersetzungszeit deklariert werden, sondern kann zur Laufzeit festgelegt werden. +Somit kann eine zur Übersetzungszeit unbekannte Anzahl von REALs bearbeitet +werden, wobei nur soviel Speicherplatz wie nötig verwendet wird. Die maximale Größe +eines VECTOR beträgt 4000 Elemente. + +Der in den Operationen ':=', 'idn' und 'vector' benutzte Datentyp INITVECTOR wird +nur intern gehalten. Er dient der Speicherplatzersparnis bei der Initialisierung. + + +- Operatoren : := , = , <> , + , - , * , / + LENGTH , SUB + +- Eingabe/Ausgabe : get , put + +- Besondere Vector- : length , nilvector , norm , vector , replace + Operationen + +#page# +':=' + #on("b")#OP := (VECTOR VAR ziel, VECTOR CONST quelle) #off("b")# + Zuweisung. Nach der Zuweisung gilt auch + + + length (quelle) = length (ziel) + + + d.h. der linke Operand besitzt nach der Zuweisung genauso viele Elemente wie + 'quelle', unabhängig davon, ob 'ziel' vor der Zuweisung mehr oder weniger Ele­ + mente als 'quelle' besaß. Beispiel: + + + VECTOR VAR y :: vector (10, 1.0), + z :: vector (15, 2.0); + ... + y := z; (* length (y) liefert nun 15 ! *) + + + #on("b")#OP := (VECTOR VAR ziel, INITVECTOR CONST quelle) #off("b")# + Dient zur Initialisierung eines VECTORs. Beispiel: + + + VECTOR VAR x :: vector (17); + + + 'vector' erzeugt ein Objekt vom Datentyp INITVECTOR. Dieses Objekt braucht + nicht soviel Speicherplatz wie ein VECTOR-Objekt. Dadurch wird vermieden, daß + nach erfolgter Zuweisung nicht ein durch 'vector' erzeugtes Objekt auf dem Heap + unnötig Speicherplatz verbraucht. + + +'=' + #on("b")#BOOL OP = (VECTOR CONST a, b) #off("b")# + Vergleich zweier Vektoren. Der Operator liefert FALSE, wenn die Anzahl der + Elemente von 'a' und 'b' ungleich ist oder wenn zwei Elemente mit gleichem + Index ungleich sind. Beispiel: + + + VECTOR VAR x :: vector (10, 1.0), + y :: vector (15, 2.0), + z :: vector (10, 1.0); + ... x = y ... (* FALSE *) + ... x = z ... (* TRUE *) + + +'<>' + #on("b")#BOOL OP <> (VECTOR CONST a, b) #off("b")# + Vergleich zweier Vektoren auf Ungleichheit (NOT (a = b)). + + +'+' + #on("b")#VECTOR OP + (VECTOR CONST a) #off("b")# + Monadisches '+' für VECTOR. Keine Auswirkung. + + #on("b")#VECTOR OP + (VECTOR CONST a, b) #off("b")# + Elementweise Addition der Vektoren 'a' und 'b'. Beispiel: + + + VECTOR VAR x, (* 'x' hat undefinierte Länge *) + a :: vector (10, 1.0), + b :: vector (10, 2.0); + ... + x := a + b; (* 'x' hat nun 10 Elemente mit Werten'3.0' + *) + + FEHLER : + VECTOR OP + : LENGTH a <> LENGTH b + 'a' und 'b' haben nicht die gleiche Anzahl von Elementen. + + +'-' + #on("b")#VECTOR OP - (VECTOR CONST a) #off("b")# + Monadisches '-'. + + #on("b")#VECTOR OP - (VECTOR CONST a, b) #off("b")# + Elementweise Subtraktion der Vektoren 'a' und 'b'. + + FEHLER : + VECTOR OP - : LENGTH a <> LENGTH b + 'a' und 'b' haben nicht die gleiche Anzahl von Elementen. + +'*' + #on("b")#REAL OP * (VECTOR CONST a, b) #off("b")# + Skalarprodukt zweier Vektoren. Liefert die Summe der elementweisen Multiplika­ + tion der Vektoren 'a' und 'b'. Beachte eventuelle Rundungsfehler! Beispiel: + + + REAL VAR a; + VECTOR VAR b :: vector (10, 2.0), + c :: vector (10, 2.0); + ... + a := b * c; (* 40.0 *) + + FEHLER : + REAL OP * : LENGTH a <> LENGTH b + 'a' und 'b' haben nicht die gleiche Anzahl von Elementen. + + #on("b")#VECTOR OP * (VECTOR CONST a, REAL CONST s) #off("b")# + Multiplikation des Vektors 'a' mit dem Skalar 's'. + + #on("b")#VECTOR OP * (REAL CONST s, VECTOR CONST a) #off("b")# + Multiplikation des Skalars 's' mit dem Vektor 'a'. + + +'/' + #on("b")#VECTOR OP / (VECTOR CONST a, REAL CONST s) #off("b")# + Division des Vektors 'a' durch den Skalar 's'. Beispiel: + + + VECTOR VAR a, (* 'a' hat undefinierte Laenge *) + b :: vector (10, 4.0); + ... + a := b / 2.0; + (* 'a' hat nun 10 Elemente mit Werten '2.0' *) + + + +'LENGTH' + #on("b")#INT OP LENGTH (VECTOR CONST a) #off("b")# + Liefert die Anzahl der Elemente von 'a'. + + +'SUB' + #on("b")#REAL OP SUB (VECTOR CONST v, INT CONST i) #off("b")# + Liefert das 'i'-te Element von 'v'. + + FEHLER : + OP SUB : subscript overflow + Der Index 'i' liegt außerhalb des Vektors (i > LENGTH v). + OP SUB : subscript underflow + Der Index 'i' liegt außerhalb des Vektors (i < 1). + +#page# +'get' + #on("b")#PROC get (VECTOR VAR a, INT CONST l) #off("b")# + Einlesen der Elemente von 'a' vom Terminal, wobei 'l' die Anzahl der Elemente + angibt. + + FEHLER : + PROC get : size <= 0 + Die angeforderte Elementanzahl 'l' muß > 0 sein. + + +'put' + #on("b")#PROC put (VECTOR CONST v) #off("b")# + Ausgabe der Werte der Elemente von 'v' auf dem Terminal. + + +#page# +'length' + #on("b")#INT PROC length (VECTOR CONST a) #off("b")# + Liefert die Anzahl der Elemente von 'a'. Beispiel: + + + VECTOR VAR a :: vector (10, 1.0), + b :: vector (15, 2.0); + ... + ... length (a) ... (* 10 *) + ... length (b) ... (* 15 *) + + + +'nilvector' + #on("b")#INITVECTOR PROC nilvector #off("b")# + Erzeugen eines Vektors mit einem Element mit dem Wert '0.0'. + + +'norm' + #on("b")#REAL PROC norm (VECTOR CONST v) #off("b")# + Euklidische Norm (Wurzel aus der Summe der Quadrate der Elemente). + + + +'replace' + #on("b")#PROC replace (VECTOR VAR v, INT CONST i, REAL CONST r)#off("b")# + Zuweisung des i-ten Elementes von 'v' mit dem Wert von 'r'. Beispiel: + + + VECTOR VAR v :: ...; + ... + replace (v, 13, 3.14); + (* Das 13. Element von 'v' bekommt den Wert '3.14' *) + + FEHLER : + PROC replace : subscript overflow + Der Index 'i' liegt außerhalb des Vektors (i > LENGTH v). + PROC replace : subscript underflow + Der Index 'i' liegt außerhalb des Vektors (i < 1). + + +'vector' + #on("b")#INITVECTOR PROC vector (INT CONST l) #off("b")# + Erzeugen eines Vektors mit 'l' Elementen. Ein INITVECTOR-Objekt benötigt nicht + soviel Speicherplatz wie ein VECTOR-Objekt. Die Elemente werden mit dem + Wert '0.0' initialisiert. + + FEHLER : + PROC vector : size <= 0 + Die angeforderte Elementanzahl 'l' muß > 0 sein. + + #on("b")#INITVECTOR PROC vector (INT CONST l, REAL CONST value)#off("b")# + Erzeugen eines Vektors mit 'l' Elementen. Ein INITVECTOR-Objekt benötigt nicht + soviel Speicherplatz wie ein VECTOR-Objekt. Die Elemente werden mit dem + Wert 'value' initialisiert. Beispiel: + + + VECTOR VAR v := vector (17, 3.14159); + (* 'v' hat 17 Elemente mit den Wert '3.14159' *) + + FEHLER : + PROC vector : size <= 0 + Die angeforderte Elementanzahl 'l' muß > 0 sein. + +#page# + +6.1.4 MATRIX + +Der Datentyp MATRIX erlaubt Operationen auf m x n Matrizen. Im Gegensatz zur +Struktur 'ROW m ROW n REAL' muß die Anzahl der Elemente nicht zur Überset­ +zungszeit deklariert werden, sondern kann zur Laufzeit festgelegt werden. Somit kann +eine zur Übersetzungszeit unbekannte Anzahl von REALs bearbeitet werden, wobei +nur soviel Speicherplatz wie nötig verwendet wird. Die maximale Größe einer MATRIX +beträgt 4000 Elemente. + +Der in den Operationen ':=', 'idn' und 'matrix' benutzte Datentyp INITMATRIX wird +nur intern gehalten. Er dient der Speicherplatzersparnis bei der Initialisierung. + + +- Operatoren : := , = , <> , + , - , * + COLUMNS , DET , INV , ROWS , TRANSP , + +- Eingabe/Ausgabe : get , put + +- Besondere Matrix- : column , idn , matrix , row , sub + Operationen transp , + replace column , replace element , + replace row + + + +#page# +':=' + #on("b")#OP := (MATRIX VAR l, MATRIX CONST r) #off("b")# + Zuweisung von 'r' auf 'l'. Die MATRIX 'l' bekommt u.U. eine neue Anzahl von + Elementen. Beispiel: + + + MATRIX VAR a :: matrix (3, 4, 0.0), + b :: matrix (5, 5, 3.0); + ... + a := b; (* 'a' hat jetzt 5 x 5 Elemente *) + + + #on("b")#OP := (MATRIX VAR l, INITMATRIX CONST r) #off("b")# + Dient zur Initialisierung einer Matrix. Beispiel: + + + MATRIX VAR x :: matrix (17, 4); + + + 'matrix' erzeugt ein Objekt vom Datentyp INITMATRIX. Dieses Objekt braucht + nicht soviel Speicherplatz wie ein MATRIX-Objekt. Dadurch wird vermieden, daß + nach erfolgter Zuweisung nicht ein durch 'matrix' erzeugtes Objekt auf dem Heap + unnötig Speicherplatz verbraucht. + +'=' + #on("b")#BOOL OP = (MATRIX CONST l, r) #off("b")# + Vergleich zweier Matrizen. Der Operator '=' liefert FALSE, wenn die Anzahl + Spalten oder Reihen der Matrizen 'l' und 'r' ungleich ist und wenn mindestens ein + Element mit gleichen Indizes der zwei Matrizen ungleiche Werte haben. Beispiel: + + + MATRIX VAR a :: matrix (3, 3), + b :: matrix (3, 3, 1.0), + c :: matrix (4, 4); + ... a = b ... + (* FALSE wegen ungleicher Werte *) + ... a = c ... + (* FALSE wegen ungleicher Groesse *) + ... b = c ... + (* FALSE wegen ungleicher Groesse *) + + + +'<>' + #on("b")#BOOL OP <> (MATRIX CONST l, r) #off("b")# + Vergleich der Matrizen 'l' und 'r' auf Ungleichheit. + + +'+' + #on("b")#MATRIX OP + (MATRIX CONST m) #off("b")# + Monadisches '+'. Keine Auswirkungen. + + #on("b")#MATRIX OP + (MATRIX CONST l, r) #off("b")# + Addition zweier Matrizen. Die Anzahl der Reihen und der Spalten muß gleich sein. + Beispiel: + + MATRIX VAR a :: matrix (3, 43, 1.0), + b :: matrix (3, 43, 2.0), + summe; + summe := a + b; + (* Alle Elemente haben den Wert '3.0' *) + + + FEHLER: + MATRIX OP + : COLUMNS l <> COLUMNS r + Die Anzahl der Spalten von 'l' und 'r' sind nicht gleich. + MATRIX OP + : ROWS l <> ROWS r + Die Anzahl der Zeilen von 'l' und 'r' sind nicht gleich. + + +'-' + #on("b")#MATRIX OP - (MATRIX CONST m) #off("b")# + Monadisches Minus. Beispiel: + + + MATRIX VAR a :: matrix (3, 4, 10.0) + a := - a; (* Alle Elemente haben den Wert '- 10.0' *) + + + #on("b")#MATRIX OP - (MATRIX CONST l, r) #off("b")# + Subtraktion zweier Matrizen. Die Anzahl der Reihen und Spalten muß gleich sein. + + FEHLER: + MATRIX OP - : COLUMNS l <> COLUMNS r + Die Anzahl der Spalten von 'l' und 'r' sind nicht gleich. + MATRIX OP - : ROWS l <> ROWS r + Die Anzahl der Zeilen von 'l' und 'r' sind nicht gleich. + +'*' + #on("b")#MATRIX OP * (REAL CONST r, MATRIX CONST m) #off("b")# + Multiplikation einer Matrix 'm' mit einem Skalar 'r'. Beispiel: + + + MATRIX VAR a :: matrix (3, 4, 2.0); + ... + a := 3 * a; (* Alle Elemente haben den Wert '6.0' *) + + + #on("b")#MATRIX OP * (MATRIX CONST m, REAL CONST r) #off("b")# + Multiplikation einer Matrix 'm' mit einem Skalar 'r'. + + #on("b")#MATRIX OP * (MATRIX CONST l, r) #off("b")# + Multiplikation zweier Matrizen. Die Anzahl der Spalten von 'l' und die Anzahl der + Zeilen von 'r' müssen gleich sein. Beispiel: + + + MATRIX VAR a :: matrix (3, 4, 2.0), + b :: matrix (4, 2, 3.0), + produkt; + produkt := a * b; + (* Alle Elemente haben den Wert '24.0' *) + + + FEHLER : + MATRIX OP * : COLUMNS l <> ROWS r + Die Anzahl der Spalten von 'l' muß mit der Anzahl der Zeilen von 'r' + übereinstimmen. + + #on("b")#VECTOR OP * (VECTOR CONST v, MATRIX CONST m) #off("b")# + Multiplikation des Vektors 'v' mit der Matrix 'm'. + + FEHLER : + VECTOR OP * : LENGTH v <> ROWS m + Die Anzahl der Elemente von 'v' stimmt nicht mit den Anzahl der Zeilen + von 'm' überein. + + #on("b")#VECTOR OP * (MATRIX CONST m, VECTOR CONST v) #off("b")# + Multiplikation der Matrix 'm' mit dem Vektor 'v'. + + FEHLER : + VECTOR OP * : COLUMNS m <> LENGTH v + Die Anzahl der Spalten von 'm' stimmt nicht mit der Anzahl der Ele­ + menten von 'v' überein. + + +'COLUMNS' + #on("b")#INT OP COLUMNS (MATRIX CONST m) #off("b")# + Liefert die Anzahl der Spalten von 'm'. Beispiel: + + + MATRIX VAR a :: matrix (3, 4), + b :: matrix (7, 10); + put (COLUMNS a); (* 4 *) + put (COLUMNS b); (* 10 *) + + + +'DET' + #on("b")#REAL OP DET (MATRIX CONST m) #off("b")# + Es wird der Wert der Determinanten von 'm' geliefert. + + FEHLER : + OP DET : no square matrix + Die Matrix ist nicht quadratisch, d.h. ROWS m <> COLUMNS m + + +'INV' + #on("b")#MATRIX OP INV (MATRIX CONST m) #off("b")# + Liefert als Ergebnis die Inverse von 'm' (Achtung: starke Rundungsfehler möglich). + + FEHLER: + OP INV : no square matrix + Die Matrix 'm' ist nicht quadratisch, + d.h. ROWS m <> COLUMNS m + OP INV : singular matrix + Die Matrix ist singulär. + + +'ROWS' + #on("b")#INT OP ROWS (MATRIX CONST m) #off("b")# + Liefert die Anzahl der Zeilen von 'm'. Beispiel: + + + MATRIX VAR a :: matrix (3, 4), + b :: matrix (7, 10); + ... + put (ROWS a); (* 3 *) + put (ROWS b); (* 7 *) + + + +'TRANSP' + #on("b")#MATRIX OP TRANSP (MATRIX CONST m) #off("b")# + Liefert als Ergebnis die transponierte Matrix 'm'. + +#page# +'get' + #on("b")#PROC get (MATRIX VAR m, INT CONST rows, columns) #off("b")# + Einlesen von Werten für die Matrix 'm' vom Terminal mit 'rows'-Zeilen und + 'columns'-Spalten. + + +'put' + #on("b")#PROC put (MATRIX CONST m) #off("b")# + Ausgabe der Werte einer Matrix auf dem Terminal. +#page# +'column' + #on("b")#VECTOR PROC column (MATRIX CONST m, INT CONST i) #off("b")# + Die 'i'-te Spalte von 'm' wird als VECTOR mit 'ROWS m' Elementen geliefert. + Beispiel: + + + MATRIX CONST a :: matrix (3, 4); + VECTOR VAR b :: column (a, 1); + (* 'b' hat drei Elemente mit den Werten '0.0' *) + + FEHLER: + PROC column : subscript overflow + Der Index 'i' liegt außerhalb der Matrix 'm' (i > COLUMNS m). + PROC column : subscript underflow + Der Index 'i' liegt außerhalb der Matrix 'm' (i < 1). + +'idn' + #on("b")#INITMATRIX PROC idn (INT CONST size) #off("b")# + Erzeugen einer Einheitsmatrix vom Datentyp INITMATRIX. Beispiel: + + + MATRIX VAR a :: idn (10); + (* Erzeugt eine Matrix mit 10 x 10 Elementen, deren + Werte '0.0' sind, mit der Ausnahme der Diagonalele­ + mente, die den Wert '1.0' haben.*) + + FEHLER : + PROC idn : size <= 0 + Die angeforderte 'size' Anzahl Spalten oder Zeilen muß > 0 sein. + + +'matrix' + #on("b")#INITMATRIX PROC matrix (INT CONST rows, columns) #off("b")# + Erzeugen eines Datenobjekts vom Datentyp INITMATRIX mit 'rows' Zeilen und + 'columns' Spalten. Alle Elemente werden mit dem Wert '0.0' initialisiert. Beispiel: + + + MATRIX CONST :: matrix (3, 3); + + FEHLER: + PROC matrix : rows <= 0 + Die angeforderte Zeilenanzahl 'rows' muß > 0 sein. + PROC matrix : columns <= 0 + Die angeforderte Spaltenanzahl 'columns' muß > 0 sein. + + #on("b")#INITMATRIX PROC matrix (INT CONST rows, columns, REAL CONST value)#off("b")# + Erzeugen eines Datenobjekts vom Datentyp MATRIX mit 'rows' Zeilen und 'co­ + lumns' Spalten. Alle Elemente der erzeugten MATRIX werden mit dem Wert + 'value' initialisiert. Beispiel: + + + MATRIX CONST :: matrix (3, 3, 3.14); + + FEHLER: + PROC matrix : rows <= 0 + Die angeforderte Zeilenanzahl 'rows' muß > 0 sein. + PROC matrix : columns <= 0 + Die angeforderte Spaltenanzahl 'columns' muß > 0 sein. + + +'row' + #on("b")#VECTOR PROC row (MATRIX CONST m, INT CONST i) #off("b")# + Die 'i'-te Reihe von 'm' wird als VECTOR mit 'COLUMNS m' Elementen gelie­ + fert. Beispiel: + + + MATRIX CONST a :: matrix (3, 4); + VECTOR VAR b :: row (a, 1); + (* 'b' hat vier Elemente mit den Werten '0.0'*) + + FEHLER: + PROC row : subscript overflow + Der Index 'i' liegt außerhalb der Matrix 'm' (i > ROWS m). + PROC row : subscript underflow + Der Index 'i' liegt außerhalb der Matrix 'm' (i < 1). + + +'sub' + #on("b")#REAL PROC sub (MATRIX CONST m, INT CONST row, column) #off("b")# + Liefert den Wert eines Elementes von 'm', welches durch die Indizes 'row' und + 'column' bestimmt wird. Beispiel: + + + MATRIX VAR m :: matrix (5, 10, 1.0); + put (sub (m, 3, 7)); + + FEHLER: + PROC sub : row subscript overflow + Der Index 'row' liegt außerhalb von 'm' (row > ROWS m). + PROC sub : row subscript underflow + Der Index 'row' liegt außerhalb von 'm' (row < 1). + PROC sub : column subscript overflow + Der Index 'column' liegt außerhalb von 'm' (column > ROWS m). + PROC sub : row subscript underflow + Der Index 'column' liegt außerhalb von 'm' (column < 1). + + +'transp' + #on("b")#PROC transp (MATRIX VAR m) #off("b")# + Transponieren der Matrix 'm', wobei kaum zusätzlicher Speicherplatz benötigt + wird. + +#page# +'replace column' + #on("b")#PROC replace column (MATRIX VAR m, INT CONST column index, VECTOR + CONST column value) #off("b")# + Ersetzung der durch 'column index' definierten Spalte in der MATRIX 'm' durch + den VECTOR 'column value'. Beispiel: + + + MATRIX VAR a :: matrix (3, 5, 1.0); + VECTOR VAR b :: vector (3, 2.0); + ... + replace column (a, 2, b); + (* Die zweite Spalte von 'a' wird durch die Werte von + 'b' ersetzt *) + + FEHLER: + PROC replace column : LENGTH columnvalue <> ROWS m + Die Anzahl der Zeilen der MATRIX 'm' stimmt nicht mit der Anzahl der + Elemente von 'columnvalue' überein. + PROC replace column : column subscript overflow + Der Index 'columnindex' liegt außerhalb von 'm' + (columnindex > COLUMNS m). + PROC sub : column subscript underflow + Der Index 'columnindex' liegt außerhalb von 'm' (columnindex < 1). + + +'replace element' + #on("b")#PROC replace element (MATRIX VAR m , INT CONST row, column, + REAL CONST value) #off("b")# + Ersetzung eines Elementes von 'm' in der 'row'-ten Zeile und 'column'-ten + Spalte durch den Wert 'value'. Beispiel: + + + MATRIX VAR a :: matrix (5, 5); + ... + replace element (1, 1, 3.14159); + + FEHLER: + PROC replace element : row subscript overflow + Der Index 'row' liegt außerhalb von 'm' (row > ROWS m). + PROC replace element : row subscript underflow + Der Index 'row' liegt außerhalb von 'm' (row < 1). + PROC replace element : column subscript overflow + Der Index 'column' liegt außerhalb von 'm' (column > COLUMNS m). + PROC replace element : row subscript underflow + Der Index 'column' liegt außerhalb von 'm' (column < 1). + + +'replace row' + #on("b")#PROC replace row (MATRIX VAR m, INT CONST rowindex, + VECTOR CONST rowvalue) #off("b")# + Ersetzung der Reihe 'rowindex' in der MATRIX 'm' durch den VECTOR 'rowvalue'. + Beispiel: + + + MATRIX VAR a :: matrix (3, 5, 1.0); + VECTOR VAR b :: vector (5, 2.0); + ... + replace row (a, 2, b); + (* Die 2. Reihe von 'a' wird durch Werte von 'b'ersetzt *) + + FEHLER: + PROC replace row : LENGTH rowvalue <> COLUMNS m + Die Anzahl der Spalten der MATRIX 'm' stimmt nicht mit der Anzahl der + Elemente von 'rowvalue' überein. + PROC replace row : row subscript overflow + Der Index 'rowindex' liegt außerhalb von 'm' + (rowindex > ROWS m). + PROC sub : row subscript underflow + Der Index 'rowindex' liegt außerhalb von 'm' (rowindex < 1). + +6.2 Programmanalyse + +Das Packet 'reporter' ermöglicht: + +a) Ablaufinformationen ("trace"); +b) #ib#Häufigkeitszählung#ie# ("frequency count"); +c) Programmunterbrechung bei Nichterfüllung einer Bedingung ("#ib#assertion#ie#"). + + +'Installation' +Das Programm befindet sich in der Datei 'reporter' und kann wie üblich insertiert +werden. Jedoch muß es mit 'check off' übersetzt werden, damit keine Zeilennummern +für 'reporter' generiert werden. Dies ist notwendig, damit die Zeilennummern des zu +testenden Programms nicht mit den Zeilennummern des Programms 'reporter' ver­ +wechselt werden können. Beispiel: + + + check off; insert ("reporter"); check on + + +Mit dem Kommando + + + #ib#generate reports#ie# ("testdatei") + + +werden die oben erwähnten Prozeduraufrufe ('#ib#report#ie#') in das zu testende Programm, +welches in der Datei 'testdatei' steht, geschrieben. Die Prozeduraufrufe werden nach +jedem Prozedur-, Operator- oder Refinement-Kopf eingefügt und erhalten den +entsprechenden Namen als Parameter. Diese Prozeduraufrufe werden gekennzeichnet, +damit sie von der Prozedur + + + eliminate reports ("testdatei") + + +automatisch wieder entfernt werden können. Beispiel (für die eingefügten Prozedurauf­ +rufe): + + + ... + PROC beispiel (INT CONST mist): + \#\#report ("PROC beispiel");\#\# + ... + + + +'Automatische Ablaufinformation' +Ist ein Programm mit 'generate reports' mit 'report'-Aufrufen versehen worden, kann +es wie gewohnt übersetzt werden. Wird das Programm vom ELAN-Compiler kor­ +rekt übersetzt und dann gestartet, wird bei jedem Antreffen eines 'report'-Aufrufs der +Parameter (Name der Prozedur, Operator oder Refinement) in eine Datei, die +TRACE-Datei geschrieben. Die TRACE-Datei wird beim Programmlauf automatisch +von 'reporter' unter dem Namen 'TRACE' eingerichtet. + +Mit Hilfe dieser Datei kann der Programmablauf verfolgt werden. Es ist damit auch +möglich festzustellen, wo eine "Endlos-Rekursion" auftritt. Die Ablaufinformationen +bestehen nur aus den Namen der angetroffenen Prozeduren und Refinements. Trotz­ +dem können die Anzahl der Informationen sehr umfangreich werden. Deshalb gibt es +die Möglichkeit, die Erzeugung der Ablaufinformationen ab- bzw. wieder anzuschal­ +ten. Dazu gibt es die Möglichkeit, in das zu testende Programm die Prozeduren + + + #ib#report on#ie# + #ib#report off#ie# + + +einzufügen und das zu testende Programm mit diesen Prozeduraufrufen (erneut) zu +übersetzen. + + +'Benutzereigene Ablaufinformation' +Zusätzlich zu den von 'generate reports' eingefügten 'report'-Aufrufen kann ein +Benutzer eigene Aufrufe an geeigneten Stellen in ein Programm schreiben. Dafür +werden weitere 'report'-Prozeduren zur Verfügung gestellt, die als ersten Parameter +ein TEXT-Objekt (meist Name des Objekts oder der Ausdruck selbst) und als zwei­ +ten ein INT/REAL/TEXT/ BOOL-Objekt (der zu überprüfende Wert oder Ausdruck) +enthalten. Beispiel: + + + ... + PROC beispiel (INT CONST mist): + \#\#report ("beispiel");\#\# (* automatisch eingefuegte *) + INT VAR mist :: ...; ... + \#\#report ("mist:", mist);\#\# (* vom Benutzer per Hand einge­ + fuegt *) + ... + + +Folgende 'report'-Routinen stehen zur Verfügung, damit man sie "von Hand" in ein +zu testendes Programm einfügen kann: + + + PROC report on + PROC report off + PROC report (TEXT CONST message) + PROC report (TEXT CONST message, INT CONST value) + PROC report (TEXT CONST message, REAL CONST value) + PROC report (TEXT CONST message, TEXT CONST value) + PROC report (TEXT CONST message, BOOL CONST value) + + +Wichtig: Hier - wie bei allen anderen "von Hand eingefügten" Aufrufen - sollte +ein Nutzer sich an die Konvention halten, diese in "\#\#" einzuklammern. Mit 'eliminate +reports' werden diese Einfügungen automatisch entfernt. Sollen diese Aufrufe aber +immer im Programm erhalten bleiben (jedoch nicht wirksam sein), sollten sie + +a) vor 'generate reports'-Aufruf mit jeweils '\#\#\#' eingefaßt werden. Beispiel: + \#\#\# report ("...") \#\#\# + So steht das 'report'-Statement in einem Kommentar. 'generate reports' wandelt + '\#\#\#' --> '\#\#\#\#' um, so daß ein solches Statement wirksam wird. 'eliminate + reports' wandelt ein '\#\#\#\#' --> '\#\#\#' zurück. + +b) nach 'generate reports' in '\#\#\#\#' eingefaßt werden. + + +'Häufigkeitszählung' +Eine Häufigkeitszählung erhält man, in dem man in das zu testende Programm die +Aufrufe + + + count on + count off + + +einfügt. Ist die Häufigkeitszählung eingeschaltet, merkt sich 'reporter' die Anzahl der +Durchläufe für jede Prozedur bzw. Refinement. Mit der Prozedur + + + #ib#generate counts#ie# ("zu testende datei") + + +werden die vermerkten Häufigkeiten in das zu testende Programm direkt eingefügt. +Die Häufigkeiten werden wie oben beschrieben gekennzeichnet, so daß sie mit 'elimi­ +nate reports' entfernt werden können. + + +'Assertions' +Zusätzlich zu den oben erwähnten Möglichkeiten bietet 'reporter' noch die Prozedur + + + #ib#assert#ie# + + +an. Diese Prozedur kann von einem Programmierer an einer Stelle in das zu testende +Programm eingefügt werden, an der bestimmte Bedingungen erfüllt sein müssen. Die +Prozedur 'assert' steht in zwei Formen zur Verfügung: + + + PROC #ib#assert#ie# (BOOL CONST zusicherung) + PROC assert (TEXT CONST message, BOOL CONST zusicherung) + + +Ist der Wert von 'zusicherung' nicht TRUE, wird der Programmlauf abgebrochen. + + + +reporter - Kommandos + + +'count on' + #on("b")#PROC count on #off("b")# + Schaltet die Häufigkeitszählung ein. + +'count off' + #on("b")#PROC count off #off("b")# + Schaltet die Häufigkeitszählung aus. + +'eliminate reports' + #on("b")#PROC eliminate reports (TEXT CONST datei) #off("b")# + Entfernt gekennzeichnete 'report'-Aufrufe aus der Datei 'datei'. + +'generate reports' + #on("b")#PROC generate reports (TEXT CONST datei) #off("b")# + Fügt 'report'-Aufrufe in die Datei 'datei' ein und kennzeichnet diese mit '\#\#'. + +'report on' + #on("b")#PROC report on #off("b")# + Schaltet die Ablaufinformationen in die Datei 'TRACE' ein. + +'report off' + #on("b")#PROC report off #off("b")# + Schaltet die Ablaufinformationen wieder aus. + +'generate counts' + #on("b")#PROC generate counts (TEXT CONST datei) #off("b")# + Bringt die Häufigkeitszählung (wie oft eine Prozedur oder Refinement durchlaufen + wurde) in die Programmdatei 'datei'. Mit 'eliminate reports' werden diese wieder + automatisch entfernt. + +'assert' + #on("b")#PROC assert (TEXT CONST message, BOOL CONST value) #off("b")# + Schreibt 'message' und den Wert von 'value' in die TRACE-Datei. Ist 'value' + FALSE, wird angefragt, ob das Programm fortgesetzt werden soll. +#page# + +Referencer + + +'referencer' wird durch + + + referencer ("ref datei", "referenz liste") + + +aufgerufen, wobei die Datei 'referenz liste' nicht existieren darf. 'referenz liste' enthält +nach Ablauf des Programms die gewünschte Liste, die sogenannte #ib# Referenzliste#ie#. + +#ub#Achtung#ue#: 'referencer' arbeitet ausschließlich mit Namen und verarbeitet nur wenige +syntaktische Konstrukte. Darum ist es nur erlaubt, ein PACKET auf einmal von 'refe­ +rencer' verarbeiten zu lassen. Verarbeitet man mehrere PACKETs auf einmal, kann es +geschehen, daß gleichnamige Objekte in unterschiedlichen Paketen zu Warnungen +(vergl. die unten beschriebenen Überprüfungen) führen. + +In der Referenzliste sind + +- alle Objekte mit ihrem Namen (in der Reihenfolge ihres Auftretens im Programm) + +- alle Zeilennummern, in der das Objekt angesprochen wird + +- die Zeilennummern, in der das Objekt deklariert wurde ('L' für ein lokales und 'G' + für ein globales Objekt, 'R' für ein Refinement) + +verzeichnet. + +Die Referenzliste kann u.a. dazu dienen, zu kontrollieren, ob und wie (bzw. wo) ein +Objekt angesprochen wird. Dies lohnt sich selbstverständlich nur bei etwas umfan­ +greicheren Programmen (bei "Mini"-Programmen kann man dies sofort sehen). + +Bei der Erstellung der Referenzliste nimmt das Programm 'referencer' gleichzeitig +einige Überprüfungen vor, die helfen können, ein Programm zu verbessern: + +1. Warnung bei mehrzeiligen Kommentaren. + +2. Überdeckungsfehler. Wird ein Objekt global (auf PACKET-Ebene) und nochmals + lokal in einer Prozedur deklariert, ist das globale Objekt nicht mehr ansprechbar. + Überdeckungen sind nach der gültigen Sprachdefinition z.Zt. noch erlaubt, werden + aber bei einer Revision des Sprachstandards verboten sein. + +3. Mehrmaliges Einsetzen von Refinements. Wird ein Refinement mehrmals einge­ + setzt (das ist völlig legal), sollte man überlegen, ob sich dieses Refinement nicht + zu einer Prozedur umgestalten läßt. + +4. Nicht angewandte Refinements. Wird ein Refinement zwar deklariert, aber nicht + "aufgerufen", erfolgt eine Warnung. + +5. Nicht angesprochene Daten-Objekte. Werden Daten-Objekte zwar deklariert, + aber im folgenden nicht angesprochen, wird eine Warnung ausgegeben. Hinweis: + Alle Objekte, die nur wenig angesprochen werden, also nur wenige Zeilennum­ + mern in der Referenzliste besitzen, sind verdächtig (Ausnahmen: importierte + Prozeduren, LET-Objekte u.a.m.). + + + +referencer - Kommandos + + +'referencer' + #on("b")#PROC referencer (TEXT CONST check file, dump file) #off("b")# + Überprüft 'check file'. In 'dump file' steht nach Abschluß die Referenzliste. + +#page# + +6.3 Rechnen im Editor + +Das Programm TeCal ermöglicht einfache Rechnungen (ähnlich wie mit einem Ta­ +schenrechner) unter der Benutzung des Editors. Gleichzeitig stehen dem Benutzer +aber alle Fähigkeiten des Editors zur Verfügung. TeCal ermöglicht Rechnungen auf +einfache Weise zu erstellen oder Tabellenspalten zu berechnen. Zur Benutzung +müssen 'TeCal' und 'TeCal Auskunft' insertiert werden. + +TeCal wird aus dem Editor heraus durch 'ESC t' oder durch das Editor-Kommando + + + tecal + + +aktiviert. Dadurch wird in der untersten Zeile des Bildschirms eine Informationszeile +aufgebaut, in der die (Zwischen-) Ergebnisse einer Rechnung zur Kontrolle fest­ +gehalten werden. + + + +Arbeitsweise + + +Wenn TeCal insertiert ist, kann die Taschenrechnerfunktion jederzeit durch +aufgerufen werden. Aus der editierten Datei werden Werte mit gelesen, +durch <+> (bzw. -,*,/) verknüpft und mit an die aktuelle Cursor­ +position geschrieben werden. + +Der von TeCal errechnete Wert wird durch derart ausgegeben, daß an der +Stelle an der der Cursor steht die letzte Stelle vor dem Dezimalpunkt geschrieben +wird. + +Die Eingabe von Klammern geschieht durch <(> <)>. + +Durch die Hilfsfunktion lassen sich die TeCal Funktionen auflisten. + +Der Prozentoperator <%> erlaubt einfache Rechnungen der Form: 'zahl' <+> + <%> <=> . + +Derartige Folgen können natürlich mit der bekannten Editor-Lernfunktion auch ge­ +lernt werden, so daß sich z.B. die Mehrwertsteuerberechnung auf wenige Tasten +reduziert. + +Spalten können summiert werden, indem auf der #on("u")#untersten#off("u")# Zahl einer Spalte +eingegeben wird. Daraufhin werden alle darüberliegende Zahlen addiert, bis ein +Zeichen auftritt, das nicht in einer Zahl auftritt (Leerzeichen stören nicht!). + +____________________________________________________________________________ + ............ + 55.00 + 66.99 + 123.45 + + 99.99 + + 9876.54 + ........... + + Anzeige: 0.00 14.00% Memory: 0.00 + +____________________________________________________________________________ + + +TeCal Prozeduren + + +'evaluate' + #on("b")#evaluate (TEXT CONST zeile, INT CONST von) #off("b")# + Ausdruck 'zeile' ab der Stelle 'von' berechnen. + + #on("b")#evaluate (TEXT CONST zeile) #off("b")# + Ausdruck 'zeile' ab Stelle 1 berechnen. + + +'kommastellen' + #on("b")#kommastellen (INT CONST stellen) #off("b")# + Berechnungen auf 'stellen' Zahlen hinter dem Komma einstellen. + + +'merke' + #on("b")#PROC merke (INT CONST zahl)#off("b")# + Integer 'zahl' im Merkregister abspeichern. + + #on("b")#PROC merke (REAL CONST zahl)#off("b")# + Real 'zahl' im Merkregister abspeichern. + +'prozentsatz' + #on("b")#PROC prozentsatz (INT CONST zahl) #off("b")# + Prozentsatz von 'zahl' Prozent einstellen. Der Wert wird automatisch konvertiert. + + #on("b")#PROC prozentsatz (REAL CONST zahl) #off("b")# + Prozentsatz von 'zahl' Prozent einstellen. + + +'tecal' + #on("b")#PROC tecal (FILE VAR f) #off("b")# + Datei 'f', die mit 'sequential file' assoziiert ist, mit TeCal editieren. + + #on("b")#PROC tecal (TEXT VAR datei) #off("b")# + 'datei' mit TeCal editieren. + + #on("b")#PROC tecal #off("b")# + Zuletzt editierte Datei mit TeCal editieren. + + +'tecalauskunft' + #on("b")#PROC tecalauskunft #off("b")# + Auskunft zeigen. + + #on("b")#PROC tecalauskunft (TEXT CONST zeichen) #off("b")# + Auskunft zu 'zeichen' zeigen. + diff --git a/doc/programming/programmierhandbuch.index b/doc/programming/programmierhandbuch.index new file mode 100644 index 0000000..f3f4ede --- /dev/null +++ b/doc/programming/programmierhandbuch.index @@ -0,0 +1,449 @@ +#pagenr("%",1)##block##pageblock# +#headandbottom("1","EUMEL-Benutzerhandbuch","INDEX","Index")# +#headeven# +#center#EUMEL-Benutzerhandbuch +#center#____________________________________________________________ + +#end# +#headodd# +#center#INDEX +#center#____________________________________________________________ + +#end# +#bottomeven# +#center#____________________________________________________________ +Index - % #right#GMD +#end# +#bottomodd# +#center#____________________________________________________________ +GMD #right#Index - % +#end# +#lpos(0.2)##lpos(6.2)# + +INDEX + +#table# +* 5-11, 5-18, 5-32, 6-19, 6-27, 6-4, 6-9 +** 5-11, 5-19, 5-60, 6-10 ++ 4-20, 5-11, 5-18, 5-32, 5-54, 6-18, 6-26, 6-3, 6-9 +- 4-20, 5-11, 5-18, 5-54, 6-18, 6-26, 6-3, 6-9 +/ 4-20, 4-22, 5-18, 6-19, 6-4 +:= 2-91, 5-10, 5-17, 5-30, 5-65, 6-17, 6-25, 6-3, 6-8 +< 5-10, 5-17, 5-30, 6-8 +<= 5-10, 5-17, 5-30, 6-8 +<> 5-10, 5-17, 5-30, 6-18, 6-26, 6-3, 6-8 += 5-10, 5-17, 5-30, 6-17, 6-25, 6-3, 6-8 +> 5-10, 5-17, 5-30, 6-9 +>= 5-10, 5-17, 5-30, 6-9 + +Abfragekette 2-25 +ABS 6-10, 6-6 +abs 5-13, 5-20, 6-13 +Abweisende Schleife 2-29 +ALL 4-17 +all 4-17 +AND 5-7 +any 5-54 +Archiv 4-44 +Archivdiskette 4-47 +archive 1-9, 4-24, 4-45 +arctan 5-20 +arctand 5-20 +assert 6-39 +assertion 6-36 +Assertions 6-39 +Ausgabesteuerzeichen 5-70 +Ausschalten des Geräts 1-17 +Automatische Ablaufinformation 6-37 + +begin 2-78, 4-3 +begin password 4-40 +Benutzereigene Ablaufinformation 6-37 +BOOL-Denoter: 2-9 +BOUND 2-83 +bound 5-56 +break 4-4 +brother 4-23 +bulletin 4-8 + +CAND 5-7 +CAT 5-32 +change 5-33 +change 5-61 +change all 5-33 +check 4-49, 5-4 +clear 4-46 +clear removed 5-51 +clock 5-80 +code 5-34 +col 5-48 +column 6-31 +COLUMNS 6-28 +COMPILER ERROR 5-5 +complex 6-5 +complex i 6-5 +complex one 6-5 +complex zero 6-5 +compress 5-34 +configurator 1-9 +CONJ 6-6 +Container 5-26 +continue 4-3 +continue scan 5-83 +copy 4-26, 5-67 +COR 5-7 +cos 5-20 +cosd 5-20 +count off 6-39 +count on 6-39 +cout 5-75 +cursor 5-71 + +dataspaces 5-66 +date 5-81 +Datenraum 1-3 +Datensicherheit 1-8 +day 5-81 +decimal exponent 5-20 +DECR 5-12, 5-19, 6-10 +delete char 5-34 +delete record 5-50 +Der EUMEL-Zeichensatz 5-29 +Der Lernmodus 3-17 +DET 6-28 +DIRFILE 2-73 +DIV 5-12, 6-11 +do 5-2 +down 5-48, 5-57 +downety 5-57 +dphi 6-6 +ds pages 5-66 + +e 5-21 +edit 3-1, 4-29, 5-62 +editget 4-30, 5-63, 5-72 +editor 1-9 +Editor verlassen 3-2 +Ein- bzw. Ausschalten der Markierung 3-9 +Ein- bzw. Ausschalten des Einfügemodus 3-10 +Einfügen von Textpassagen 3-6 +Eingabesteuerzeichen 5-69 +Eingabetaste / Absatztaste 3-4 +eliminate reports 6-39 +Endlosschleife 2-28 +enter password 4-41 +eof 5-43 +erase 4-37 +Erweiterbarkeit 1-6 + +ESC ) 3-16 +ESC ( 3-16 +ESC > 3-16 +ESC < 3-16 +ESC 9 3-14 +ESC 1 3-14 +ESC a 3-16 +ESC A 3-16 +ESC b 3-14 +ESC blank 3-16 +ESC d 3-15 +ESC e 3-14 +ESC ESC 3-16 +ESC f 3-14 +ESC g 3-15 +ESC HOP 3-17 +ESC HOP HOP 3-17 +ESC HOP taste 3-17 +ESC k 3-16 +ESC n 3-14 +ESC O 3-16 +ESC o 3-16 +ESC p 3-15 +ESC q 3-14 +ESC RUBIN 3-15 +ESC RUBOUT 3-15 +ESC s 3-16 +ESC ? taste 3-16 +ESC ! taste 3-16 +ESC U 3-16 +ESC u 3-16 +ESC v 3-14 +ESC w 3-14 +ESC k 3-16 +ESC ­ 3-16 + +EUMEL-Editor 3-1 +evaluate 6-44 +exp 5-21 + +false 5-7 +family password 4-42 +father 4-23 +Fehlermeldungen des Archivs 4-52 +fetch 4-33, 5-67 +fetchall 4-34 +FILE 2-73 +Fixpunkt 1-8 +floor 5-21 +forget 4-26, 4-47, 5-67 +frac 5-21 + +Garbage Collection 5-26 +Gelerntes vergessen 3-17 +generate counts 6-40 +generate reports 6-40 +get 2-80, 5-44, 5-73, 6-5, 6-12, 6-21, 6-30 +getchar 5-72 +get cursor 5-71 +getline 5-45, 5-74 + +Häufige Fehler bei der Benutzung von Datenräumen 2-85 +Häufigkeitszählung 6-36 +halt 4-4 +headline 5-43 +heap size 5-27 +help 4-5, 4-9 +hour 5-81 + +idn 6-31 +imag part 6-6 +inchar 5-72 +incharety 5-72 +INCR 5-12, 5-19, 6-11 +INITFLAG 2-91 +initialized 2-91 +initialize random 5-13, 5-21 +input 2-75, 5-42 +insert 5-2 +insert char 5-35 +insert record 5-50 +Installation 6-36 +int 5-21 +int 6-13 +INT-Denoter: 2-7 +INV 6-28 + +Kommando 1-9 +kommando auf taste 4-31 +kommando auf taste legen 4-31 +Kommando auf Taste legen 3-16 +Kommandotaste 3-11 +kommastellen 6-44 +Konfiguration 1-9 + +length 5-35, 6-22 +LENGTH 5-35, 6-19 +Lernen ausschalten 3-17 +Lernen einschalten 3-17 +lernsequenz auf taste 4-32 +lernsequenz auf taste legen 4-32 +Lese-Fehler (Archiv) 4-52 +LEXEQUAL 5-31 +LEXGREATER 5-31 +LEXGREATEREQUAL 5-31 +lex sort 5-64 +LIKE 4-19, 5-59 +line 5-47, 5-71, 5-77 +line no 5-43 +lines 5-43 +list 4-27 +ln 5-22 +Löschtaste 3-10 +log10 5-22 +log2 5-22 +longint 6-13 + +manager task 1-9 +Mantisse 5-16 +Markierzustand 3-9 +match 5-60 +matchpos 5-60 +matrix 6-32 +max 5-13, 5-22, 6-13 +maxint 5-13 +maxlongint 6-13 +maxreal 5-22 +max text length 5-35 +merke 6-45 +min 5-13, 5-23, 6-14 +minint 5-14 +MOD 5-14, 5-23, 6-11 +modify 2-75, 5-42 +Monitor 1-9 +Multi-Tasking-/Multi-User-Betrieb 1-5 +myself 4-23 + +name 4-25 +Namensverzeichnis 4-16 +Netzwerkfähigkeit 1-6 +new 5-65 +next symbol 5-83 +next symbol 5-85 +Nicht abweisende Schleife 2-29 +nilspace 5-65 +niltask 4-22 +nilvector 6-22 +norm 6-22 +NOT 5-8 +notion 5-56 + +old 5-66 +online 5-79 +Operationen auf Markierungen 3-15 +Operatoren 2-14 +OR 5-8 +OR 5-54 +out 5-75 +output 2-75, 5-42 +out subtext 5-76 + +packets 4-8 +page 5-71 +Paketkonzept 2-1 +pause 5-79, 5-82 +phi 6-6 +pi 5-23 +pos 5-36 +Positionierung 5-71 +Positionierung des Cursors 3-4 +print 4-38 +PRINTER 4-24 +printer 4-24 +Priorität von generischen Operatoren 2-49 +Priorität von Operatoren 2-16 +prot 5-4 +Prozeduren als Parameter 2-39 +Prozeduren mit Parametern 2-38 +prozentsatz 6-45 +Prozeßkommunikation 1-6 +PUBLIC 4-24 +public 4-24 +put 5-46, 5-78, 6-12, 6-21, 6-30, 6-5 +putline 5-46, 5-78 + +random 5-14, 5-23, 6-14 +read record 5-50 +real 5-14, 5-37 +REAL-Denoter: 2-8 +Realisierung von abstrakten Datentypen 2-47 +real part 6-6 +referencer 6-42 +Referenzliste 6-41 +Refinements 2-1 +reinsert 5-51 +release 4-45 +remainder 4-18 +remove 5-51 +rename 4-28 +rename myself 4-25 +reorganize 5-52 +replace 5-37, 6-22 +replace column 6-34 +replace element 6-34 +replace row 6-35 +report 6-36 +report off 6-40 +report on 6-40 +reserve 4-25 +REST 3-6 +round 5-23 +row 6-32 +ROWS 6-29 +run 5-3 +runagain 5-3 + +save 4-35, 5-67 +saveall 4-36 +scan 5-86 +Schreibarbeit beenden 3-2 +Schutz vor fehlerhaftem Zugriff auf Datenobjekte 2-45 +Scratch-Datei 3-13 +segments 5-52 +sequential file 5-41 +SHard 1-5 +show 4-30 +shutup 1-17 +sign 5-15, 5-24, 6-14 +SIGN 6-11 +sin 5-24 +sind 5-24 +smallreal 5-24 +SOME 2-80, 4-17 +son 4-23 +sort 5-64 +Spracherweiterung 2-44 +sqrt 5-24, 6-6 +Standard-Datenraum 1-9 +std tastenbelegung 4-32 +STOP-Taste 3-20 +storage 4-11, 5-66 +storage info 4-5, 4-11 +sub 6-33 +SUB 5-37, 6-20 +subtext 5-38 +supervisor 4-24 +Supervisor 1-9 +SUPERVISOR-Taste 3-18 +Symbole 5-83 +sysin 5-73 +sysout 5-77 + +Tabulatortaste 3-8 +tan 5-25 +tand 5-25 +task 4-22 +Task 1-9 +task info 4-5, 4-12 +Task-Organisation 1-2 +task password 4-43 +task status 4-15 +taste enthaelt kommando 4-31 +tecal 6-45 +tecalauskunft 6-45 +text 5-15, 5-25, 5-39, 6-15 +TEXT-Denoter: 2-9 +Thesaurus 4-16 +time 5-82 +time of day 5-82 +TIMESOUT 5-76 +Titelzeile 3-2 +to line 5-48 +transp 6-33 +TRANSP 6-29 +true 5-8 +type 5-66 +TYPE COMPLEX 6-3 +TYPE LONGINT 6-8 + +Überschrift in die Kopfzeile 5-43 +Umschalttaste 3-4 +UNLIKE 5-59 +Unterbrechen einer Ausgabe 3-20 +up 5-49 +up 5-58 +uppety 5-58 + +vector 6-23 +Vereinbarung eines dyadischen Operators 2-42 +Vereinbarung eines monadischen Operators 2-42 +Verstärkertaste 3-5 +Verwendung von Prozeduren 2-35 +Virtuelle Speicherverwaltung 1-7 +Vorbelegte Tasten 3-17 + +warnings 5-4 +WEITER-Taste 3-20 +Wertliefernde Prozeduren 2-40 +Wertliefernde Refinements 2-34 +word wrap 4-32 +write 5-78 +write 5-47 +write record 5-50 + +XOR 5-8 + +Zählschleife 2-30 +Zeichen schreiben 3-16 +zero 6-15 +#tableend# + diff --git a/doc/programming/programmierhandbuch.inhalt b/doc/programming/programmierhandbuch.inhalt new file mode 100644 index 0000000..45b3f1f --- /dev/null +++ b/doc/programming/programmierhandbuch.inhalt @@ -0,0 +1,249 @@ +#setcount (1)# +#block##pageblock# +#pagenr ("%", 1)# +#headeven# +#center#EUMEL-Benutzerhandbuch +#center#____________________________________________________________ + +#end# +#headodd# +#center#Inhalt +#center#____________________________________________________________ + +#end# +#bottomeven# + +#center#____________________________________________________________ +I - % #right#GMD +#end# +#bottomodd# + +#center#____________________________________________________________ +GMD #right# I - % +#end# + +#lpos(0.2)##lpos(1.8)##lpos(9.0)# + +TEIL 1 : Einleitung +#table# +1.1 Allgemeines über EUMEL 1 +1.2 Struktur des Betriebssystems EUMEL 2 +1.3 Eigenschaften des Betriebssystems 4 + Multi-Tasking-/Multi-User-Betrieb 5 + Prozeßkommunikation und Netzwerkfähigkeit 6 + Erweiterbarkeit 6 + Virtuelle Speicherverwaltung 7 + Datensicherheit 8 +1.4 Wichtige Begriffe 9 +1.5 Die Notation in diesem Buch 10 +1.6 Die Funktionstasten des EUMEL-Systems 11 +1.7 Eine Beispielsitzung 12 +#tableend# + + + + +TEIL 2 : ELAN +#table# +2.1 Besondere Eigenschaften von ELAN 1 +2.2 Lexikalische Elemente 2 +2.2.1 Schlüsselwörter 2 +2.2.2 Bezeichner 3 +2.2.3 Sonderzeichen 4 +2.2.4 Kommentare 5 +2.3 Datenobjekte 6 +2.3.1 Elementare Datentypen 6 +2.3.1.1 Denoter für elementare Datentypen 7 + INT-Denoter: 7 + REAL-Denoter: 8 + TEXT-Denoter: 9 + BOOL-Denoter: 9 +2.3.1.2 LET-Konstrukt für Denoter 10 +2.3.2 Zugriffsrecht 11 +2.3.3 Deklaration 11 +2.3.4 Initialisierung 12 +2.4 Programmeinheiten 13 +2.4.1 Elementare Programmeinheiten 14 +2.4.1.1 Ausdruck 14 + Operatoren 14 + Priorität von Operatoren 16 +2.4.1.2 Zuweisung 18 +2.4.1.3 Refinementanwendung 19 +2.4.1.4 Prozeduraufruf 20 +2.4.2 Zusammengesetzte Programmeinheiten 22 +2.4.2.1 Folge 22 +2.4.2.2 Abfrage 23 +2.4.2.3 Auswahl 26 +2.4.2.4 Wertliefernde Abfrage + und wertliefernde Auswahl 27 +2.4.2.5 Wiederholung 27 + Abfragekette 25 + Endlosschleife 28 + Abweisende Schleife 29 + Nicht abweisende Schleife 29 + Zählschleife 30 +2.4.3 Abstrahierende Programmeinheiten 32 +2.4.3.1 Refinementvereinbarung 32 + Vorteile der Refinementanwendung 33 + Wertliefernde Refinements 34 +2.4.3.2 Prozedurvereinbarung 35 +2.4.3.3 Operatorvereinbarung 41 + Verwendung von Prozeduren 35 + Prozeduren mit Parametern 38 + Prozeduren als Parameter 39 + Wertliefernde Prozeduren 40 + Vereinbarung eines monadischen Operators 42 + Vereinbarung eines dyadischen Operators 42 +2.4.3.4 Paketvereinbarung 43 + Spracherweiterung 44 + Schutz vor fehlerhaftem Zugriff + auf Datenobjekte 45 + Realisierung von abstrakten Datentypen 47 +2.4.4 Terminatoren für Refinements, + Prozeduren und Operatoren 48 +2.4.5 Generizität von Prozeduren und Operatoren 49 + Priorität von generischen Operatoren 49 +2.4.6 Rekursive Prozeduren und Operatoren 50 +2.5 Programmstruktur 52 +2.6 Zusammengesetzte Datentypen 56 +2.6.1 Reihung 56 +2.6.2 Struktur 61 +2.6.3 LET-Konstrukt für + zusammengesetzte Datentypen 64 +2.6.4 Denoter für zusammengesetzte + Datentypen (Konstruktor) 65 +2.7 Abstrakte Datentypen 67 +2.7.1 Definition neuer Datentypen 67 +2.7.2 Konkretisierung 69 +2.7.3 Denoter für abstrakte Datentypen (Konstruktor) 70 +2.8 Dateien 73 +2.8.1 Datentypen FILE und DIRFILE 73 + FILE: 73 + DIRFILE: 73 +2.8.2 Deklaration und Assoziierung 74 + input: 75 + output: 75 + modify: 75 +2.9 Abstrakte Datentypen im EUMEL-System 77 +2.9.1 Datentyp TASK 77 +2.9.2 Datentyp THESAURUS 79 +2.9.3 Datenräume 81 +2.9.3.1 Datentyp DATASPACE 82 +2.9.3.2 BOUND-Objekte 83 + Häufige Fehler bei der Benutzung von Datenräume 85 +2.9.3.3 Definition neuer Dateitypen 88 +2.9.4 Datentyp INITFLAG 91 +#tableend# + + + + +TEIL 3 : Der Editor +#table# +3.1 Ein- und Ausschalten des Editors 1 +3.2 Die Funktionstasten 3 +3.3 Die Wirkung der Funktionstasten 4 +3.4 ESC Kommandos 11 + Operationen auf Markierungen 15 + Zeichen schreiben 16 + Kommando auf Taste legen 16 + Vorbelegte Tasten 17 + Der Lernmodus 17 +3.5 Positionieren, Suchen, Ersetzen + im Kommandodialog 21 + Weitere Hilfen 23 +#tableend# + + + + +TEIL 4 : Kommandosprache +#table# +4.1 Supervisor 2 +4.2 Monitor 6 +4.2.1 Hilfsprozeduren 8 + Informationsprozeduren 11 +4.2.2 Thesaurus 16 +4.2.3 Tasks 21 +4.2.4 Handhabung von Dateien 26 +4.2.5 Editor-Prozeduren 29 +4.2.6 Dateitransfer 33 +4.2.7 Passwortschutz 39 +4.2.8 Das Archiv 44 + Fehlermeldungen des Archivs 52 +#tableend# + + + + +TEIL 5 : Programmierung +#table# +5.1 Der ELAN-Compiler 1 +5.1.1 Fehlermeldungen des ELAN-Compilers 5 +5.2 Standardtypen 7 +5.2.1 Bool 7 +5.2.2 Integer-Arithmetik 9 +5.2.3 Real-Arithmetik 16 +5.2.4 Text 26 + Der EUMEL-Zeichensatz 29 +5.3.1 Assoziierung 41 +5.3.2 Informationsprozeduren 43 +5.3.3 Betriebsrichtung INPUT 44 +5.3.4 Betriebsrichtung OUTPUT 46 +5.3.5 Betriebsrichtung MODIFY 48 +5.3.6 FILE -Ausschnitte 51 +5.4 Suchen und Ersetzen in Textdateien 53 +5.4.1 Aufbau von Textmustern 54 +5.4.2 Suche nach Textmustern 57 +5.4.3 Treffer registrieren 59 +5.4.4 Treffer herausnehmen 60 +5.4.5 Ändern in Dateien 61 +5.4.6 Editor-Prozeduren 62 +5.4.7 Sortierung von Textdateien 64 +5.4.8 Prozeduren auf Datenräumen 65 +5.5 Eingabe/Ausgabe 68 +5.5.1 E/A auf Bildschirm 69 +5.5.1.1 Eingabesteuerzeichen 69 +5.5.1.2 Ausgabesteuerzeichen 70 +5.5.1.3 Positionierung 71 + Grundlegende Prozeduren 72 + Umleitbare Eingabeprozeduren 73 + Grundlegende Prozeduren 75 + Umleitbare Ausgabeprozeduren 77 +5.5.1.4 Eingabe 72 +5.5.1.5 Ausgabe 75 +5.5.1.6 Kontrolle 79 +5.5.2 Zeitmessung 80 +5.6 Scanner 83 + Scanner-Kommandos 85 +#tableend# + + + + +TEIL 6 : Das Archiv 'std zusatz' +#table# +6.1 Erweiterungen um Mathematische Operationen 2 +6.1.1 COMPLEX 2 +6.1.2 LONGINT 7 +6.1.3 VECTOR 16 +6.1.4 MATRIX 24 +6.2 Programmanalyse 36 + reporter - Kommandos 39 + Referencer 41 + referencer - Kommandos 42 +6.3 Rechnen im Editor 43 + Arbeitsweise 43 + TeCal Prozeduren 44 +#tableend# + + + + +Anhang : ELAN-Syntaxdiagramme + + + + +INDEX + diff --git a/doc/programming/programmierhandbuch.titel b/doc/programming/programmierhandbuch.titel new file mode 100644 index 0000000..79b09b0 --- /dev/null +++ b/doc/programming/programmierhandbuch.titel @@ -0,0 +1,52 @@ +____________________________________________________________________________ + + +#on("b")##on ("u")# +#center#Betriebssystem E U M E L +#off ("u")# + + +#center#Programmierhandbuch + + + + +#off("b")# +#center#Lizenzfreie Software der +#on ("b")# + +#center#Gesellschaft für Mathematik und Datenverarbeitung mbH, +#center#5205 Sankt Augustin + + +#off("b")# +#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für +#center#nichtkommerzielle Zwecke gestattet. + +#center#Gewährleistung und Haftung werden ausgeschlossen + + +____________________________________________________________________________ +#page# +#block##pageblock# +#start(5.0,1.5)# + +#lpos(3.0)# +#table# + + + + + + +Benutzerhandbuch + +Programmierung + + + +Stand: 1.7.87 + +#tableend##page# + + diff --git a/doc/prolog/prolog handbuch b/doc/prolog/prolog handbuch new file mode 100644 index 0000000..ea7c6a5 --- /dev/null +++ b/doc/prolog/prolog handbuch @@ -0,0 +1,581 @@ +____________________________________________________________________________ + + +#on("b")##on ("u")# +#center#Betriebssystem E U M E L +#off ("u")# + + +#center#Prolog + + + + +#off("b")# +#center#Lizenzfreie Software der +#on ("b")# + +#center#Gesellschaft für Mathematik und Datenverarbeitung mbH, +#center#5205 Sankt Augustin + + +#off("b")# +#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für +#center#nichtkommerzielle Zwecke gestattet. + +#center#Gewährleistung und Haftung werden ausgeschlossen + + +____________________________________________________________________________ +#page# + +Dr.P.Heyderhoff 12.03.1987 +GMD.F2.G2 + + + + + + + E L A N - P R O L O G + _____________________ + + (Die Fachsprache der künstlichen Intelligenz) + +#on("u")#Benutzungsanleitung und technische Beschreibung#off("u")# + + +Elan-Prolog ist eine Computersprache der fünften Generation, die für +die Praxis der Programmierung und die Lehre in Informatik eine neue +Dimension erschließt. Für den professionellen Programmierer eröffnet sie +neue Möglichkeiten, mächtige Anwendungen, wie Expertensysteme und andere +neuartige Systeme der Wissensverarbeitung zu entwickeln. + +Elan-Prolog unterscheidet sich grundsätzlich von üblichen konventionellen +Programmiersprachen. In Sprachen wie Elan und Pascal muß der Programmierer +genau angeben, wie ein gewünschtes Ergebnis errechnet werden soll. Um was es +sich dabei handelt, steht bestenfalls dann in der Dokumentation. Ganz anders +ist es in Prolog. PROLOG steht für PROgrammieren in LOgik und basiert auf +dem Prädikaten-Kalkül, der bekanntesten Form der formalen Logik. Also in +Prolog schreibt der Programmierer hin, worin das Problem besteht. Er bedient +sich dabei dieser formalen Logik. Prolog versucht dann eine Lösung zu +finden. Der Lösungsweg ist dabei im Programm nicht vorgeschrieben. Das +entlastet den Programmierer, und er kann seine ganze Kraft auf die logische +Beschreibung des Problems konzentrieren. + +Elan-Prolog ist ein interpretatives System, das voll kompatibel ist mit dem +Edinburgh Standard Prolog und in in komfortabler Weise in das Betriebssystem +Eumel eingebettet ist. + +Eigenschaftes von Elan-Prolog: + +- Syntax gemäß dem Edinburgh Standard Prolog nach Clocksin-Mellish + +- Interpretierendes System mit inkrementellem Einpass-Compiler + +- Interaktiver Mehrfenster-Texteditor des Eumelsystems + +- Zugriff auf Elan-Prozeduren als Prolog-Regeln + +- Geschwindigkeit ca. 100 LIPS auf IBM/PC-XT + +- optionale dynamische Ablaufverfolgung + +- Erklärungskomponente + +- Eingabe und Ausgabe von Prolog-Ausdrücken und Klartext + +- Programmiert und dokumentiert in ELAN (über 2000 Zeilen) + +- daher besonders für den Informatik-Unterricht geeignet +#page# +#on("u")#Beschränkungen des Elan-Prolog:#off("u")# + +Folgende Beschränkungen gelten für die Implementierung von Elan-Prolog im +Eumel-Systems: + +- Maximal 16000 Fakten und Regeln + +- Maximal 16000 Terme zur Konstruktion von Ausdrücken, Listen und Regeln + +- Maximal 800 Variablenbindungen + +- Maximal 800 Einträge im Beweisbaum + +- Maximal 4000 Bezeichner für Atome und Variablen + +- Maximal 16000 Buchstaben für alle Bezeichner zusammen + + +Wie sieht ein Prolog-Programm aus? + +Ein Prolog-Programm besteht aus + + - Fakten über Objekte und ihre Beziehungen + + - Regeln über Objekte und ihre Beziehungen + +und besonders wichtig: + + - Der Benutzer kann Prolog über die Fakten und Regeln ausfragen. + +Fakten aus einer Wissensbasis, nämlich dem Prolog-Programm, sind z.B.: + + enthaelt (wisky, aethanol). + +Das wird gelesen als: "Wisky enthält Aethanol.". Grundzüge der sehr +einfachen Syntax lassen sich hieran erklären. Ein Faktum wird geschrieben +wie in diesem Beispiel: + + - Erst kommt der Name der Relation, geschrieben wie ein Elan-Name in + kleinen Buchstaben. + + - Dann folgt in runden Klammern und durch Kommata getrennt eine Liste + von Objektnamen. + + - Zum Schluß steht ein Punkt. + +Regeln sind Problembeschreibungen in der Form von logischen Ausdrücken der +symbolischen Logik, wie z.B. die folgende Regel: + + bewirkt (A, B, kopfschmerz) :- enthaelt (A, aethanol), + enthaelt (B, aspirin ). + +Das wird gelesen als: "Wenn man eine Droge A, die Aethanol enthält, +und eine Droge B, die Aspirin enthält gleichzeitig einnimmt, dann bewirkt +das Kopfschmerzen." Wie man sieht werden logische Variablen mit großen +Buchstaben (wie Elan-Operatoren) geschrieben. Das Zeichen ":-" steht für das +logische Wenn, und das Komma(",") für die logische Konjunktion. Die logische +Disjunktion wird durch Semikolon(";") ausgedrückt. +#page# +Neben der hiermit vorgestellten Prefix-Schreibweise für Relationen gibt es in +ELAN-Prolog auch noch eine Infix-Schreibweise für zweistellige Relationen. +Hierbei werden die Relationen als Infix-Operatoren in großen +Buchstaben geschrieben (wie in ELAN) und zwischen die beiden Operanden +gesetzt. Als Operatoren sind auch die in Elan üblichen Operatoren + + ( +, -, *, /, MOD, =, <, >, <=, >=, <> ) +zulässig. + +In Infixausdrücken (wie z.B. 2+3*4) gelten die bekannten Vorrangregeln. Auch +Klammern sind zulässig. Selbstdefinierte Operatoren haben niedrigste +Priorität. + +Obiges Beispiel in Infix-Schreibweise: + + wisky ENTHAELT aethanol. + + bewirkt (A, B, kopfschmerz) :- A ENTHAELT aethanol, + B ENTHAELT aspirin. + + +Objekte in Prolog können Atome oder Listen sein. Für Atome gibt es zwei +Schreibweisen: + + - genau so wie Elan-Bezeichner, also bestehend aus kleinen Buchstaben + und Blanks. Dabei werden die Blanks eliminiert. + + - genauso wie Elan-Texte, nämlich in Gänsefüßchen eingeschlossen. + +Für Listen von Objekten gibt es wiederrum zwei Schreibweisen, wie folgende +zwei unterschiedlichen Notationen des gleichen Beispiels zeigen: + + - [ das, ist, [ zum, beispiel ], eine, liste ] + + - [ das, ist, [ zum | [ beispiel | [] ] ], eine, liste ] + +Im zweiten Fall ist die als drittes Element in der Gesamtlisten enthaltene +Teilliste mit dem Konstruktor "|" und der leeren Liste "[]" zusammengesetzt. +Die Grundoperationen, die aus der Programmiersprache LISP bekannt sind, +können als Prolog-Fakten unmittelbar wie folgt definiert werden: + + eq (X, X). + head ([X|Y], X). + tail ([X|Y], Y). + cons (X, Y, [X|Y]). +#page# +#on("u")#Standard - Operatoren von Elan-Prolog:#off("u")# + +Im System sind nur ganz wenige Standardoperatoren eingebaut. Es sind die +folgenden Fakten: + + - ! . der CUT-Operator schaltet des Backtracking ab. + + - bye. beendet die prolog Anwendung. + + - listing. zeigt alle insertierten Regeln. + + - listing (X). zeigt alle insertierten Regeln über X. + + - call (X). X wird ausgeführt. + + - write (X). das an X gebundenen Prolog-Objekts wird ausgegeben, + writeq (X). und wenn nicht eindeutig, gequotet, + put (X). das Zeichen, dessen ASCII-Code X ist wird ausgegeben, + name (X,[Y]). unifiziert das Atom X mit der Liste seiner Buchstaben. + + - read (X). ein Objekt wird gelesen und an die Variable gebunden. + get0 (X). das nächste Zeichen wird gelesen, + get (X). das nächste druckbare Zeichen wird gelesen, + + - X = Y . Die an X und Y gebundenen Objekte sind gleich, + X <> Y . sie sind ungleich, + X <= Y . sie sind kleiner oder gleich, + X == Y . sie sind wörtlich gleich, + X =.. [F|A] . X ist der Term mit Funktor F und Argumentliste A. + + - X + Y . sie sollen addiert, + X - Y . subtrahiert, + X * Y . multipliziert, + X / Y . dividiert, + X MOD Y . der Divisionsrest soll ermittelt werden, + die Auswertung geschieht durch den 'is'-Operators. + + - X IS EXPR . Das Ergebnis des arithmetischen Ausdrucks EXPR wird + gebildet und mit X unifiziert. + + - incr (X). der arithmetische Wert von X wird um eins erhöht. + + - assertz ([X]). insertiert die Regel X am Ende einfügend. + asserta ([Χ]). insertiert die Regel X am Anfang einfügend. + retract ([X]). entfernt die Regel X wieder. + clause (X,[Y]). holt die Regel Y mit dem Kopf X aus der Knowledgebase. + + - functor (X,Y,Z) Y ist der Funktor von X und Z ist seine Arität. + arg (X,Y,Z). Z ist das x-te Argument der Funktion Y. + + - elan (X). Ausführung der insertierten ELAN-Prozedur X + elan (X,Y). Ausführung von X mit dem TEXT-CONST-Parameter Y + + - elan(trace,on). schaltet den dynamischen Ablaufverfolger ein und + elan(trace,off) schaltet ihn wieder ab. + + - elan(consult,X) lädt das Prologprogramm aus der Datei namens X hinzu. + elan(reconsult,X) ersetzt das Prologprogramm aus der Datei X. + elan(abolish,X) entfernt alle Regeln mit dem Namen X. +#page# +#on("u")#Das Dialogverhalten von Elan-Prolog:#off("u")# + +Elan-Prolog wird, sobald es in das Eumel-System insertiert ist, als Prozedur +mit dem Namen "prolog" und einem optionalen TEXT-Parameter aufgerufen. Der +Textparameter enthält den Namen einer Datei, die ein Prolog-Programm enthält, +das geladen werden soll. Fehlt der Parameter, wird, wie üblich, die zuletzt +bearbeitete Datei genommen. Im Prolog-Dialog können später weitere +Prolog-Programme mit der Prozedur namens "consult" hinzugeladen werden. + +Also +einfachster Aufruf: prolog ("") + +Antwort: ?- +Beispiel-Eingabe: 3 = 3 +Antwort: yes + ?- +Eingabe: 4 = -5 +Antwort: no + ?- + +Besondere Dialogkommandos: + + ?- +Eingabe: ? +Antwort z.B.: 13.5 SEC + ?- +Eingabe: listing +Antwort: { zeigt alle aktuell verfügbaren Regeln } + ?- +Eingabe: {ESCAPE} q +Ausgabe: gib kommando: + +Eingabe: prolog again +Ausgabe: ?- +Eingabe: [sum, permute] {in eckigen Klammern!} + { konsultiert diese beiden Dateien } +Antwort z.B.: 25 rules inserted. + ?- +Eingabe: [-sum, -permute] + { löscht und rekonsultiert aus diesen Dateien } +Antwort z.B.: 25 rules inserted. + +Eingabe: {ESCAPE} {ESCAPE} +Antwort: gib kommado: +Elan-Eingabe z.B.: show ("standard") + { zeigt die Datei dieses Namens } + ?- + +Auf diese Weise können bequem Eumel-Kommandos gegeben werden. Die +Umschaltung vom Prolog- zum Eumelmonitor-Betrieb erfolgt durch die Tasten +{ESCAPE},{ESCAPE} und {RETURN}. Wie üblich ist das zuletzt verwendete +Kommando auch im Prolog-Dialog mit dem Escapekommando "{ESCAPE} k" +wiederzubekommen. Das Kommando "{ESCAPE} q" beendet den Dialog. +#page# +#on("u")#Ausprobieren der Prolog-Programmbeispiele:#off("u")# + +Zum Ausprobieren sind die Prologbeispiele "eq", "permute" und "mann" +beigefügt. + +Beispiel: ?- +Eingabe: [permute] {in eckigen Klammern!} +Antwort: 5 rules inserted. + ?- +Eingabe: marquise(X) +Antwort: beautiful marquise your beautiful eyes make me die of love +Eingabe: {Semicolon} +Antwort: your beautiful eyes beautiful marquise make me die of love + { usw } +Eingabe: {Return} +Antwort: ?- + +Jede #on("u")#Eingabe von Semicolon#off("u")# liefert als Antwort die nächste Permutation. Wenn +eine andere Taste gedrückt wird, bricht die Ausgabe weiterer Ergebnisse ab. + +#on("u")#Eingabe von Fragezeichen#off("u")# liefert neben der Angabe der benötigten +Rechenzeit eine Erklärung der letzten Antwort durch Ausgabe aller zu dieser +Antwort führenden Schlußfolgerungen. Dabei wird der Beweisbaum in Form einer +Einrückstruktur dargestellt. Die Einrückung stellt die Erklärungstiefe dar. + + +#on("u")#Benutzung von Prolog von Elan-Programmen aus#off("u")# + +Wenn man Prolog als Unterprogramm von Elan aus aufrufen will, geht man +folgendermaßen vor: + +1. Laden einer Wissensbasis, + die in einer Datei namens z.B."permute" bereitsteht: + + push ("bye"13""); + prolog ("permute"); + + +2. Abfragen an diese Wissensbasis: + + TEXT VAR query, answer; + query:= "marquise (X)"; + IF prolog ( query, answer) + THEN put (answer) + ELSE put ("NO") + FI; + +In diesem Anwendungsbeispiel liefert die Ausgabeanweisung 'put (answer)': + + beautiful marquise your beatiful eyes make me die of love + +#page# +#on("u")#Literatur:#off("u")# + + +1.) W.F.Clocksin, C.S.Mellish: + Programming in Prolog + Springer 1984 + +2.) M.H.van Emden: + An interpreting algorithm for prolog programs + in Implementations of Prolog, Ellis Herwood Ltd, 1984 + +3.) Alain Colmerauer: + Prolog in 10 Figures + Communications of the ACM December 1985 + +4.) J. Cohen: + Describing Prolog by its Interpretation and Compilation + Communications of the ACM December 1985 + +5.) Alain Colmerauer: + Les system q ou un formalisme pour alalyser et synthetiser des phrases + sur ordinateur. + Intern.Rep. 43, Departement d'informatique. Universite de Montreal + Sept. 1970 +#page# +(*************************************************************************) +(* *) +(* Elan-Prolog *) +(* *) +(* Programm-Beispiele: *) +(* *) +(****************** standard (nach Clocksin-Mellish) ********************) + +abolish (X) :- elan (abolish, X). +append ([], X, X) :- !. +append ([X|Y], Z, [X|W]) :- append (Y, Z, W). +atom (X) :- functor (X, Y, 0). +atomic (X) :- atom (X); integer (X). +consult (X) :- elan (consult, X). +end :- bye. +fail :- []. +findall (X, Y, Z) :- tell ("$$"), write ("("), findall (X,Y); + write (")"), told, see ("$$"), read (Z), + seen, elan (forget, "$$"). +findall (X, Y) :- call (Y), writeq (X), write (","), []. +integer (X) :- functor (X, Y, -1). +listing (X). +member (X, [X|Z]). +member (X, [Y|Z]) :- member (X, Z). +nl :- elan (line). +non var (X) :- var (X), !, []; . +not (X) :- call (X), !, []; . +notrace :- elan (trace, off). +reconsult (X) :- elan (reconsult, X). +repeat. +repeat :- repeat. +see (X) :- elan (sysin, X). +seen :- elan (sysin, ""). +tab (X) :- tab(X,1). +tab (X,Y) :- Y<=X, !, put (32), incr(Y), tab(X,Y);. +tell (X) :- elan (sysout, X). +told :- elan (sysout, ""). +trace :- elan (trace, on). +true. +< (X, Y) :- <= (X, Y), <> (X, Y). +> (X, Y) :- <= (Y, X). +>= (X, Y) :- < (Y, X). +#page# +(**************************** sum ***********************************) + +suc (0, 1). suc (1, 2). suc (2, 3). suc (3, 4). suc (4, 5). +suc (5, 6). suc (6, 7). suc (7, 8). suc (8, 9). +sum (0, X, X). +sum (X, Y, Z):- suc (V, X), sum (V, Y, W), suc (W, Z). +plus (X, [0,0], X):- !. +plus (X, Y, Z):- plus one (V, Y), plus (X, V, W), !, plus one (W, Z). +plus one ([X, Y], [V, W]):- suc (Y, W), X = V, !; + Y = 9, suc (X, V), W = 0. +treereverse (X,Y):- rev (X,Y), !; rev (Y,X), !. +rev ([], []). +rev ([X|Y], Z):- X <> [H|T], rev (Y, W), !, append (W, [X], Z); + rev (X, V), rev (Y, W), !, append (W, [V], Z). + +(**************************** permute ************************************) + +permute ([], []). +permute ([E|X], Z):- + permute (X, Y), insert (E, Y, Z). +insert (E, X, [E|X]). +insert (E, [F|X], [F|Y]):- + insert (E, X, Y). +marquise(RESULT):- + permute (["beautiful marquise", + "your beautiful eyes", + "make me", + "die", + "of love" + ], + RESULT). + +(**************************** puzzle ************************************) + + {Solution: 9,5,6,7,0,8,2} +puzzle:- repeat, permute ((9,8,7,6,5,2,0), SENDMORY), + write (SENDMORY), + puzzle (SENDMORY, SEND, MORE, MONEY), + elan (line), + write (SEND), write (+), + write (MORE), write (=), + write (MONEY). + +puzzle([S,E,N,D,O,R,Y], SEND, MORE, MONEY):- + SEND IS ((S * 10 + E) * 10 + N) * 10 + D, + MORE IS ((10 + O) * 10 + R) * 10 + E, + MONEY IS (((10 + O) * 10 + N) * 10 + E) * 10 + Y, + MONEY IS SEND + MORE. + +permute ([], []). +permute ([E|X], Z):- permute (X, Y), insert (E, Y, Z). + +insert (E, X, [E|X]). +insert (E, [F|X], [F|Y]):- insert (E, X, Y). + +repeat. +repeat:- repeat. +#page# +(**************************** prieks ***********************************) + +ist priek (bo priek). +ist priek (ki priek). +ist priek (bla priek). + +WER GNASELT WEN :- population (B), + member ([WEN, WER, _], B), + bedingungen (B). + +WER KNAUDERT WEN:- population (B), + member ([WER, _, WEN], B), + bedingungen (B). + +population (B):- sind prieks (U, V, W), + sind knauderarten (R, S, T), + B = [ [drausla puemfe, U, R], + [glessla puemfe, V, S], + [hapla puemfe, W, T] ]. + +sind prieks (X,Y,Z):- ist priek (G), + ist priek (H), H<>G, + ist priek (I), I<>G, I<>H, !, + permute ([G,H,I], [X,Y,Z]). + +sind knauderarten (X,Y,Z):- ist knauderart (G), + ist knauderart (H), H<>G, + ist knauderart (I), I<>G, I<>H, !, + permute ([G,H,I],[X,Y,Z]). + +ist knauderart (an). +ist knauderart (ab). +ist knauderart (ueber). + +bedingungen (B):- not member ([hapla puemfe,ki priek,_],B) , + not member ([hapla puemfe,_,ueber],B) , + not member ([drausla puemfe,bo priek,_],B) , + not member ([_,bo priek,ab],B) , + noch ne bedingung (B) , + weitere bedingungen (B) , !. + +weitere bedingungen (B):- not member([_,ki priek,ueber],B), + not member([_,bo priek,ueber],B) + ; + member([drausla puemfe,_,an],B). + +noch ne bedingung (B):- not member ([drausla puemfe,ki priek,_],B) + ; + not member ([glessla puemfe,_,ueber],B). + +permute ([], []). +permute (X, [Y|Z]):- delete (Y ,X, E), permute (E, Z). +delete (X, [X|Z], Z). +delete (X, [Y|Z], [Y|E]):- delete (X, Z, E). +member (X, [X|Z]). +member (X, [Y|Z]):- member (X, Z). +not member (X, []). +not member (X, [Y|Z]):- X <> Y, not member (X,Z). +#page# +(**************************** calc ************************************) + +{ CALC evaluates arithmetic expressions with store } + +calc:- eval ([], RS), write (result store), write (RS), nl. + +eval (SI, SO):- + read (CALC), nonvar (CALC), eval member (CALC, SI, SO). + +eval member (CALC, SI, SO):- + member (CALC, [stop,end,bye,eof]), SO=SI; + eval (CALC,I,SI,ST), write (I), eval (ST,SO); + write (error in), write (CALC), nl, eval (SI, SO). + +eval (I, I, S, S):- integer (I). +eval (N, I, S, S):- atom (N), eval atom (N, I, S). + +eval atom (N, I, S):- + member (N=I, S); + write ("error: Cell"), write (N), + write("not found in store. 0 substituted."), nl, I=0. + +eval ( L+R,I,SI,SO):- eval (L,J,SI,ST), eval (R,K,ST,SO), I IS J+K. +eval ( L-R,I,SI,SO):- eval (L,J,SI,ST), eval (R,K,ST,SO), I IS J-K. +eval ( L*R,I,SI,SO):- eval (L,J,SI,ST), eval (R,K,ST,SO), I IS J*K. +eval ( L/R,I,SI,SO):- eval (L,J,SI,ST), eval (R,K,ST,SO), I IS J/K. + +eval (N=O, I, SI, SO):- + atom (N), eval (O,I,SI,ST), eval repl (N,I,ST,SO). + +eval repl (N, I, [], [=(N,I)]). +eval repl (N, I, [=(N,_)|S], [=(N,I)|S]). +eval repl (N, I, [=(M,J)|SI], [=(M,J)|SO]):- eval repl (N, I, SI, SO). + diff --git a/doc/prozess/Anhang Prozess b/doc/prozess/Anhang Prozess new file mode 100644 index 0000000..8415268 --- /dev/null +++ b/doc/prozess/Anhang Prozess @@ -0,0 +1,92 @@ +limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (1)# +#headodd# +#center#gs-Prozess#right#% + +#end# +#headeven# +%#center#gs-Prozess + +#end# +#center#1 + +#center##on("b")#Anhang#off("b")# + +#center##on("b")#Bezugsquellenverzeichnis#off("b")# + + + - AKTRONIK + Elektronik-Großhandel + A. Kaup + Teichstraße 9 + 4401 Saerbeck + Tel.: 02574/8008 - 8009 + + + + - BICOS Computer GmbH + Werkering 6 + Postfach 1229 + 4800 Bielefeld 1 + Tel.: 0521/34011 + + + + - lattasoft + Eva Latta-Weber + Software-  und + Hardware-Systeme + Brehmstraße 7 + 4800 Bielefeld 1 + Tel.: 0521/38919 + + + + - Landesinstitut für Schule + und Weiterbildung + Paradieser Weg 64 + 4770 Soest + Tel.: 02921/683-1 + +#page# +#on("b")#Anhang#off("b")# + +#on("b")#Verzeichnis der Abbildungen#off("b")# + +Abb. 1: MUFI geöffnet +Abb. 2: Mögliche DIP-Schalter-Stellung beim MUFI +Abb. 3: Einbau des MUFIs in den Terminalkanal +Abb. 4: RS232-Adapter geöffnet +Abb. 5: Mögliche Jumperposition beim RS232-Adapter +Abb. 6: Auswahl der Interface-Anpassung +Abb. 7: Anschluß Leuchtdiodenanzeige -Kombikarte +Abb. 8: Pinbelegung auf der E/A-Karte +Abb. 9: Eingangsbildschirm ls-Prozess +Abb.10: Menubildschirm zum Oberbegriff 'Interface' +Abb.11: Information bei unkonfiguriertem System +Abb.12: Auswahl der Steckplatzart +Abb.13: Compact-Box: Belegung der Kanäle +Abb.14: Auswahl einer Interfacekarte +Abb.15: Kanalbelegung D/A-Karte (Einzelsteckplatz) +Abb.16: A/D-Karte: Angabe der Schalterstellung +Abb.17: A/D-Karte: Kanalbel./Spannungsber.(Bspl.) +Abb.18: Ausgabetest - Einblendung +Abb.19: Eingabetest - Einblendung +Abb.20: Beispiellochkarte +Abb.21: Aufbau eines Drehpotentiometers +Abb.22: Eingangsbildschirm ls-Prozess +Abb.23: Befehlsübersicht +Abb.24: Auswahl Ausgabebefehle +Abb.25: Auswahl Eingabebefehle +Abb.26: Auswahl Testbefehle +Abb.27: Auswahl 'Weitere Befehle' +Abb.28: Menubildschirm zum Oberbegriff 'Interface' +Abb.29: Menubildschirm zum Oberbegriff 'Programm' +Abb.30: Informationsauswahl zum EUMEL-Editor +Abb.31: Menubildschirm zum Oberbegriff 'Archiv' +Abb.32: Auswahl der Archiv-Formate +Abb.33: Auswahl der Zieltask + + + diff --git a/doc/prozess/Inhalt Prozess b/doc/prozess/Inhalt Prozess new file mode 100644 index 0000000..ab9616a --- /dev/null +++ b/doc/prozess/Inhalt Prozess @@ -0,0 +1,84 @@ +limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (1)# +#headodd# +#center#gs-Prozess#right#% + +#end# +#headeven# +%#center#gs-Prozess + +#end# +#center#1 + +#center##on("b")#Inhaltsverzeichnis#off("b")# + +1 Was kann gs-Prozess + +2 Allgemeines zur Prozeßdatenverarbeitung +2.1 Welche Hardware-Lösungen gibt es zur Zeit ? +2.2 Die besonderen Probleme unter EUMEL +2.3 Die Wahl des Interface-Systems + +3 Installation des Interface-Systems +3.1 Das MUFI der Firma BICOS als Adapter +3.1.1 Einstellung der DIP-Schalter am MUFI +3.1.2 Einbau des MUFIs in den Terminalkanal +3.1.3 Das MUFI an separater serieller Schnittstelle +3.2 Der RS232-Adapter der Firma AKTRONIK +3.3 Verbindung Adapter - Interface-System +3.4 Bereitstellung des Interface-Systems + +4 Installation von gs-Prozess +4.1 Voraussetzungen +4.2 Lieferumfang +4.3 Installation +4.4 Anmerkungen zur Erstinstallation + +5 Konfiguration von gs-Prozess +5.1 Kontrolle der Konfigurationen/Anschlüsse +5.2 Vorbereitungen für den Ein-/Ausgabetest +5.2.1 Anschluß einer Leuchtdiodenanzeige an die Kombikarte +5.2.2 Anschluß des Codekartenlesers (Drahtstück) +5.3 Konfiguration von gs-Prozess +5.3.1 Auswahl der Steckplatzart/Interfacekarte +5.3.2 Bedeutung der Kanalnummern +5.4 Aus- und Eingabetest +5.5 Mögliche Fehlerfälle + +6 Arbeiten mit gs-Prozess +6.1 Kleine Beispiele zur digitalen Ausgabe +6.1.1 Möglichkeit eines Programmabbruchs +6.1.2 Die "sonstigen" Befehle +6.1.3 Schreibweise für Bitmuster/Bitsymbole +6.1.4 Befehle für die digitale Ausgabe +6.1.5 Befehle für die analoge Ausgabe +6.2 Kleine Beispiele zur digitalen Eingabe +6.2.1 Befehle für die digitale Eingabe +6.2.2 Eingabetests +6.2.3 Befehle für die analoge Eingabe +6.3 Hinweise auf Aufgabenmaterial + +7 Beschreibung der Menufunktionen +7.1 Kurzhinweise zur Bedienung der Menus +7.2 Menufunktionen zum Oberbegriff 'Info' +7.3 Menufunktionen zum Oberbegriff 'Interface' +7.4 Menufunktionen zum Oberbegriff 'Programm' +7.5 Menufunktionen zum Oberbegriff 'Archiv' + +8 Detailbeschreibung der Basisbefehle und Tests + +9 Hinweise für den Systembetreuer/    Programmierer +9.1 Vergabe der Kanäle/Organisation des Tasksystems +9.2 Informationsprozeduren +9.3 Neufestlegung des Interfacekanals +9.4 Fixieren der Konfiguration +9.5 Mögliche Fehlerfälle +9.6 Weitere Möglichkeiten + +Anhang: Bezugsquellenverzeichnis + Verzeichnis der Abbildungen + + + + diff --git a/doc/prozess/gs-Prozess handbuch.impressum b/doc/prozess/gs-Prozess handbuch.impressum new file mode 100644 index 0000000..ca22b10 --- /dev/null +++ b/doc/prozess/gs-Prozess handbuch.impressum @@ -0,0 +1,104 @@ +____________________________________________________________________________ + + +#on("b")##on ("u")# +#center#Betriebssystem E U M E L +#off ("u")# + + +#center#gs-Prozess + + + + +#off("b")# +#center#Lizenzfreie Software der +#on ("b")# + +#center#Gesellschaft für Mathematik und Datenverarbeitung mbH, +#center#5205 Sankt Augustin + + +#off("b")# +#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für +#center#nichtkommerzielle Zwecke gestattet. + +#center#Gewährleistung und Haftung werden ausgeschlossen + + +____________________________________________________________________________ +#page# + +#free (4.0)##on("b")# +#center#gs-Prozess + + +#center#Benutzerhandbuch + + +#center#Version 1.0 + + +#off("b")##center#copyright +#center#Eva Latta-Weber +#center#Software- und Hardware-Systeme, 1988 +#center#ERGOS GmbH, 1990 +#page# +#block# +#center#____________________________________________________________________________ + + +Copyright:  ERGOS GmbH   März 1990 + + Alle Rechte vorbehalten. Insbesondere ist die Überführung in + maschinenlesbare Form sowie das Speichern in Informations­ + systemen, auch auszugsweise, nur mit schriftlicher Einwilligung + der ERGOS GmbH gestattet. + + +#center#____________________________________________________________________________ + +Es kann keine Gewähr übernommen werden, daß das Programm für eine +bestimmte Anwendung geeignet ist. Die Verantwortung dafür liegt beim +Anwender. + +Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrektheit und +Vollständigkeit der Angaben kann keine Gewähr übernommen werden. Das +Handbuch kann jederzeit ohne Ankündigung geändert werden. + +Texterstellung :  Dieser Text wurde mit der ERGOS-L3 Textverarbeitung + erstellt und aufbereitet und auf einem Kyocera Laser­ + drucker gedruckt. + + + + +#center#___________________________________________________________________________ + + + +Ergonomic Office Software GmbH + +Bergstr. 7 Telefon: (02241) 63075 +5200 Siegburg Teletex: 2627-2241413=ERGOS + Telefax: (02241) 63078 + + +#center#____________________________________________________________________________ + + + + + + + + + + + + + + + + + diff --git a/doc/prozess/gs-Prozess-2 b/doc/prozess/gs-Prozess-2 new file mode 100644 index 0000000..376143e --- /dev/null +++ b/doc/prozess/gs-Prozess-2 @@ -0,0 +1,255 @@ +limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (1)# +#headodd# +#center#gs-Prozess#right#% + +#end# +#headeven# +%#center#gs-Prozess + +#end# +#center#1 + +#on("b")#2  Allgemeines zur Prozeßdatenverarbeitung#off("b")# + +In diesem Kapitel erfahren Sie, warum unter EUMEL/ELAN die Prozeßdatenver­ +arbeitung bisher kaum Berücksichtigung gefunden hat und welche Probleme zu +überwinden waren. Es wird aufgezeigt, warum unter EUMEL/ELAN nicht jedes Inter­ +facesystem verwendet werden kann; außerdem werden die Gründe für die Wahl eines +bestimmten Interfacesystems genannt. + + +#on("b")#2.1  Welche Hardware-Lösungen gibt es zur Zeit ?#off("b")# + +Wie schon in Kapitel 1 erwähnt, ist zum Messen, Steuern und Regeln mit dem +Computer ein Hardware-Interface notwendig, über das der "Kontakt zur Außenwelt" +hergestellt wird. + + +#on("b")# + Computer <--------> Interface <--------> Modell +#off("b")# + + +Interfaces (zu deutsch etwas mißverständlich: Schnittstellen) verbinden innerhalb +eines Systems Teilsysteme und einzelne Funktionseinheiten miteinander. Dabei +werden z.B. #on("b")#Hardware-Schnittstellen#off("b")# (Um diese geht es vornehmlich in diesem +Kapitel), #on("b")#Hardware-Software-Schnittstellen#off("b")# (Nach Festlegung, welche Funktionen +eines Rechnersystems von der Hardware und welche von der Software übernommen +werden, erfolgt hierüber die Verknüpfung der beiden Komponenten), #on("b")#Software- +Schnittstellen#off("b")# (zwischen Programmoduln), #on("b")#Mensch-Maschine-Schnittstellen#off("b")# +(Benutzerschnittstellen - wie z.B. #on("b")#gs-DIALOG#off("b")#) unterschieden. + +Wenn wir im folgenden von 'Interface' reden, ist damit immer eine 'Hardware- +Schnittstelle' gemeint. + +Über ein solches Interface (eine Hardware-Schnittstelle) können an den Computer +externe Geräte/Modelle angeschlossen werden, die vom Computer aus gesteuert +werden. Dabei setzt das Interface die vergleichsweise schwachen Signale des +Computers in Ströme und Spannungen um, mit denen z.B. eine Lampe oder ein +Motor betrieben werden kann. Umgekehrt senden externe Geräte/Modelle über das +Interface Signale an den Computer, die von ihm ausgewertet werden. So müssen z.B. +Widerstandsveränderungen eines Temperaturfühlers oder die Stellung eines Schalters +in eine vom Computer erfaßbare Form umgewandelt werden. + +Inzwischen bieten verschiedene Hersteller (FISCHER, LEGO, AKTRONIK, PHYWE, +etc.) und Lehrmittelverlage (METZLER, CVK, etc.) eine Reihe von Lösungen an. +Leider sind die meisten Lösungen auf ganz spezielle Computertypen zugeschnitten +und somit nicht an anderen Computertypen verwendbar - außerdem unterscheiden +sich die verschiedenen Lösungen z.T. ganz erheblich im Leistungsumfang. + +Einzellösungen, insbesondere an den gängigen Homecomputern, gibt es schon seit +langem. Voraussetzung ist zumeist, daß der Computer über einen speziellen +Anschluß ('Userport' oder 'Joystick-Eingang') verfügt. Oder es werden Platinen +geliefert, die in spezielle Steckplätze (Slots) einzustecken sind, wo sie vom Computer +aus angesprochen werden können. + +Bei all diesen Lösungen konnten wir 'EUMELaner' nur neidvoll zuschauen. Der +Vorteil, den wir sonst so zu schätzen wissen, ein einheitliches Betriebssystem auf ganz +unterschiedlicher Hardware zur Verfügung zu haben, wird hier zum Nachteil. Eine +einheitliche Lösung schien zu Anfang völlig aussichtslos zu sein. + + +#on("b")#2.2  Die besonderen Probleme unter EUMEL#off("b")# + +Das Betriebssystem EUMEL gestattet es nicht, beliebig auf Hardwarekomponenten des +Rechners zuzugreifen - und das aus gutem Grund, denn sonst wäre ein reibungsloser +Multi-User-Betrieb nicht gewährleistet. Man kann aber den Zugriff auf neue Hard­ +warekomponenten im EUMEL-System etablieren. Allerdings ist das etwas aufwendiger +als in anderen Systemen, denn das sogenannte 'Shard', die 'Software-Hardware- +Schnittstelle', muß angepaßt werden. + +Unsere ersten "Gehversuche" mit der Prozeßdatenverarbeitung unter EUMEL haben +so angefangen. Es ist aber leicht einzusehen, daß dieser Weg nicht sinnvoll ist. Denn +dann müßten alle EUMEL-Shards (es gibt ja für jeden Rechnertyp mindestens eines) +entsprechend geändert werden, ggf. müßten für verschiedene Lösungen verschiedene +Versionen entwickelt werden - eine Aufgabe, die niemand bereit wäre zu überneh­ +men. + + +#on("b")#2.3  Die Wahl des Interface-Systems#off("b")# + +Unser Ziel war klar: Wir wollten ein gängiges, käuflich zu erwerbendes Hardware- +Interface möglichst universell an Computern verschiedener Hersteller unter dem +Betriebssystem EUMEL ansprechen können. + +Nach Sichtung der angebotenen Systeme kamen nur drei in die engere Wahl: das +LEGO-Interface, das FISCHER-Technik-Interface und das AKTRONIK-Interface (Soft­ +ware-kompatibel dazu ist das PHYWE-Interface). + +Bei der Auswahl hielten wir es für sinnvoll, die Empfehlung des Landesinstituts für +Schule und Weiterbildung in Soest zu berücksichtigen, in der folgende Anforderungen +an Interfaces formuliert sind: + + - 8 digitale Eingänge + - 8 digitale Ausgänge + - optional: analoge Ein- und Ausgabe. + +Allen gestellten Anforderungen wird nur das AKTRONIK-Interface gerecht. Das System +ist modular aufgebaut, je nach Anforderungen kann mit verschiedenen Steckkarten +gearbeitet werden. Es gibt eine "Kompaktlösung", bei der die wichtigsten Funktionen +bereitgestellt werden (8 digitale Eingänge, 8 digitale Ausgänge, 2 analoge Eingänge). +Darüber hinaus kann auch noch mit dem sog. 'Modul-Bus' gearbeitet werden, bei +dem gleichzeitig mehrere Steckkarten angesprochen werden können. Mit ent­ +sprechender Steckkarte ist auch die analoge Ausgabe möglich. + +Die beiden anderen Interfaces erfüllen die oben genannten Anforderungen nicht: Das +LEGO-Interface verfügt über nur 6 digitale Ausgänge und 2 digitale Eingänge; analoge +Ein- und Ausgabe ist gar nicht möglich. + +Das FISCHER-Technik-Inteface verfügt über 8 digitale Ausgänge und 8 digitale Ein­ +gänge. Das Interface verfügt auch über einen analogen Eingang - allerdings nicht +über einen Analog-Digital-Wandler-Baustein! Das bedeutet, daß der angeschlossene +Rechner die Auswertung der eingehenden Daten übernehmen muß - ein zeit­ +kritischer Prozeß, der in einem Multi-User-System nicht garantiert werden kann. Die +analoge Ausgabe ist grundsätzlich nicht möglich, das System ist in sich abgeschlossen +und kann sich ändernden Anforderungen ebensowenig angepaßt werden wie das +LEGO-Interface. + + +Wir entschieden uns also dafür, die weitere Entwicklung auf der Basis des +AKTRONIK-Interfaces zu betreiben. Es galt jedoch noch, dieses Interface mit dem +Computer zu verbinden - und das möglichst universell: möglichst unabhängig von der +verwendeten Computerhardware. + +Dieses Ziel ist nur dann zu erreichen, wenn man die 'Standardschittstellen' des +Computers berücksichtigt, die unter EUMEL problemlos ansprechbar sind: die +parallelen (Centronics) und seriellen (V24) Schnittstellen. Diese 'Standardschnitt­ +stellen' sind zwar nicht für den direkten Anschluß der Modelle/Interfaces geeignet, +über einen "Adapter" aber ist ein Anschluß möglich. + +Die Entscheidung fiel schnell gegen eine Verwendung der parallelen (Centronics) +Schnittstelle. Die meisten Computer verfügen nur über eine dieser Schnittstellen, die +zumeist auch schon durch den Drucker belegt ist. Außerdem handelt es sich dabei in +der Regel um eine unidirektionale Schnittstelle - d.h. die Daten können vom +Computer zum Endgerät (z.B. Drucker) gelangen, nicht aber vom Endgerät zum +Computer. Somit wären zwar Steuerungsvorgänge, nicht aber Meß- und Regelungs­ +vorgänge über die Schnittstelle möglich. + +Einige Hersteller nutzen die Datenleitungen, über die z.B. der Drucker dem Rechner +mitteilt, daß der interne Speicher voll bzw. das Papier zuende ist. Über diese Leitung +werden Daten seriell übertragen und vom Rechner ausgewertet. Unter EUMEL +scheidet diese Lösung aber aus, denn um hier eine sichere Auswertung zu gewähr­ +leisten, müßten Maschinenspracheprogramme eingebunden werden; das ist aber +unter EUMEL nicht möglich. + +Damit war festgelegt, daß die weitere Entwicklung auf der Basis des AKTRONIK-Inter­ +faces über die serielle Schnittstelle erfolgen sollte. Wie schon erwähnt, ist das Inter­ +face auf keinen Fall direkt an die serielle Schnittstelle anschließbar. Wie der Name +schon sagt, werden die Daten bei einer seriellen Schnittstelle seriell übertragen - um +Prozeßdatenverarbeitung zu betreiben, müssen die Daten aber parallel vorliegen. + +Notwendig ist also ein "Adapter", der einen Seriell-Parallel-/Parallel-Seriell-Wandler +beinhaltet, so daß die Verbindung zwischen Computer und Interface hergestellt +werden kann. + +Inzwischen sind uns hier zwei (käuflich zu erwerbende) Lösungen bekannt - der +"RS232-Adapter" der Firma AKTRONIK und das "MUFI" (Multifunktionales Interface) +der Firma BICOS: + +Das MUFI ist sicherlich der universeller verwendbare "Adapter" (leider aber auch die +kostspieligere Lösung). Einerseits kann es ebenso wie der "RS232-Adapter" an eine +separate serielle Schnittstelle angeschlossen werden, andererseits verfügt es über +einen zweiten - den eigentlich interessanten Betriebsmodus: Es kann nämlich auch +in den Terminalkanal eingebaut werden. + +Die Idee, die dahintersteckt, ist folgende: Das MUFI verfügt (neben der eigentlich +wichtigen bidirektionalen parallelen Schnittstelle) über einen (seriellen) Eingang und +einen (seriellen) Ausgang. So kann das MUFI einfach in eine Leitung zwischen +Computer und Terminal eingebaut werden. In ausgeschaltetem Zustand hat es +keinen Einfluß auf den Datenaustausch zwischen Rechner und Terminal - als ob es +gar nicht vorhanden wäre. In eingeschaltetem Zustand dagegen "horcht es den +Datenfluß zwischen Rechner und Terminal ab". Auf eine vereinbarte Parole +(Zeichenkombination) hin, "weiß es", daß die folgenden Daten nicht für das +Terminal, sondern eben für sich bestimmt sind. Diese, und nur diese Daten werden +aus dem Datenstrom vom MUFI "herausgefischt" und intern sachgerecht weiterver­ +arbeitet. Alle anderen Daten werden unbeeinflußt an das Terminal weitergeleitet, +damit ja nicht der reibungslose Betrieb gestört wird. Natürlich ist das MUFI ebenso in +der Lage, die gerade extern anliegenden Daten zu ermitteln und in den Datenstrom +zum Computer "einzuschleusen". + +Um diese Aufgaben bewältigen zu können, wurde das MUFI mit einem eigenen, +schnellen Mikroprozessor ausgestattet, der in der Lage ist, den Datenfluß zu +bewältigen. Zudem wurde versucht, das MUFI mit soviel Intelligenz (Firmware) +auszustatten, daß alle zeitkritischen Prozesse bei der Ansteuerung des Interface- +Systems vom MUFI selbst erledigt und die Daten vom MUFI so aufbereitet werden, +daß sie möglichst einfach weitergegeben und verarbeitet werden können. + +Durch die Beschränkung der Baud-Rate auf maximal 19200 ist die Verarbeitungs­ +geschwindigkeit allerdings auch beschränkt. Die rechnerisch maximale Ausgabetakt­ +rate von 320 Hz bei 19200 Baud und 160 Hz bei 9600 Baud wird von #on("b")#gs-Prozess#off("b")# auf +einem 80386-Rechner im Alleinbetrieb tatsächlich erreicht. Natürlich bedeuten +mehrere gleichzeitig betriebene MUFIs an einem Rechner Geschwindigkeitseinbußen. +Ebenso sinkt die Ausgabetaktrate bei Prozessoren mit geringerem Durchsatz (8088: +maximal 120 Hz). Für die Anwendungen in der Schule sind diese Geschwindigkeiten +aber hinreichend. + +Die Vorteile des MUFI für diejenigen, die EUMEL im Multi-User-Betrieb nutzen, liegen +dennoch klar auf der Hand: + + - Es werden keine weiteren seriellen Schnittstellen benötigt. (Die vorhandenen + sind sowieso schon weitgehend belegt. Gegebenenfalls würden zusätzliche + Kosten verursacht.) + + - Es sind keine weiteren Kabelverlegungen zwischen Rechner und Arbeitsplatz + notwendig, trotzdem befindet sich das MUFI direkt am Bildschirmarbeits­ + platz. + + - Das beim Anschluß an eine separate Schnittstelle notwendige, zeitauf­ + wendige Ansteuern des Interface-Kanals entfällt. + + +Arbeiten Sie an einem Einzelplatz-System (z.B. IBM-kompatibler Rechner nur mit +Monitor) so ist ein Betrieb des MUFIs im Terminal-Kanal nicht möglich. Hier bleibt +nur der Betrieb des Interface-Systems an einer separaten seriellen Schnittstelle. +Sinnvoll ist aber auch ein solcher Betrieb, wenn (zunächst) nur die Hardware für +einen Arbeitsplatz zur Verfügung steht. Das Interface kann dann nämlich von meh­ +reren Tasks abwechselnd angesprochen werden. + +Beim Anschluß an eine separate serielle Schnittstelle sind die Leistungen des MUFIs +und des RS232-Adapters gleichwertig. Da das abwechselnde Ansprechen einer +seriellen Schnittstelle und der Tastatur/des Monitors unter EUMEL relativ zeitauf­ +wendig ist, sind hier keine hohe Ausgabegeschwindigkeiten zu erwarten: bei einem +8088-Rechner ca. 40 Hz, bei Prozessoren mit höherem Durchsatz eben entsprechend +mehr. Dennoch ist das für die meisten Anwendungen in der Schule schnell genug. + +Für Spezialanwendungen ist auch die direkte Ansprache der Schnittstelle möglich. +Hierbei sind Ausgabetaktraten von 960 Hz bei 19200 Baud bzw. 480 Hz bei 9600 +Baud möglich. Für die schulische Praxis (in der Sekundarstufe I) ist diese "direkte +Ansprache" aber ungeeignet, da weitergehende Programmierkenntnisse erforderlich +sind. Zudem kann bei Programmierfehlern "die Task am Kanal hängenbleiben". +Genaueres dazu sehen Sie bitte im Kapitel 'Hinweise für den Systembetreuer/ +Programmierer'. + +Die Hardware-Konstellation stellt sich im Überblick also folgendermaßen dar: +#on("b")# + + Computer <---> Adapter <---> Interface <---> Modell + + (mit se- ('MUFI' (AKTRONIK) + rieller oder + Schnitt- 'RS232- + stelle) Adapter') +#off("b")# + diff --git a/doc/prozess/gs-Prozess-3 b/doc/prozess/gs-Prozess-3 new file mode 100644 index 0000000..3fae1bd --- /dev/null +++ b/doc/prozess/gs-Prozess-3 @@ -0,0 +1,346 @@ +limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (1)# +#headodd# +#center#gs-Prozess#right#% + +#end# +#headeven# +%#center#gs-Prozess + +#end# +#center#1 + +#on("b")#3  Installation des Interface-Systems#off("b")# + +In diesem Kapitel erfahren Sie, wie Sie Ihr Interface-System an den Rechner an­ +schließen und welche Einstellungen noch vorzunehmen sind. Für Details und weiter­ +gehende Informationen sehen Sie bitte in den Handbüchern / Begleitmaterialien der +Firmen BICOS bzw. AKTRONIK nach. + +Am Ende des Kapitels 2 haben wir festgestellt, daß das Interface-System über einen +Adapter mit dem Computer verbunden werden muß. An das Interface-System lassen +sich dann entsprechende Modelle anschließen: + +#on("b")# Computer <----> Adapter <----> Interface <----> Modell + + (mit se- ('MUFI' (AKTRONIK) + rieller oder + Schnitt- 'RS232- + stelle) Adapter') #off("b")# + +Wir möchten Ihnen zuerst erklären, wie Sie den jeweiligen Adapter mit dem +Computer verbinden und welche Einstellungen am Adapter vorzunehmen sind. An­ +schließend beschreiben wir, wie Sie das Interface-System an den Adapter anschlie­ +ßen. + +Wie schon in Kapitel 2 erwähnt, können Sie zwischen zwei Adaptern wählen - dem +MUFI der Firma BICOS und dem RS232-Adapter der Firma AKTRONIK. Letztge­ +nannter kann nur an einer separaten seriellen Schnittstelle betrieben werden, +während das MUFI zusätzlich auch in den Terminalkanal eingebaut werden kann. + + +#on("b")#3.1  Das MUFI der Firma BICOS als Adapter#off("b")# + +Für den Betrieb in einem Terminalkanal sollte das MUFI über eine sog. "Schnitt­ +stellen-Automatik" verfügen, die verhindert, daß das MUFI in ausgeschaltetem +Zustand oder mit abgezogenem Netzstecker den Datenfluß zwischen Rechner und +Terminal unterbricht. Diese sehr sinnvolle Automatik wird von BICOS #on("b")#nicht +standardmäßig#off("b")# eingebaut. Sie sollten bei eventuellen Bestellungen darauf achten. +Bevor Sie das MUFI in den Terminalkanal einbauen oder an eine separate serielle +Schnittstelle anschließen, ist noch die Einstellung der DIP-Schalter zu kontrollieren +bzw. eine Neueinstellung vorzunehmen. + + +#on("b")#3.1.1  Einstellung der DIP-Schalter am MUFI#off("b")# + +Versichern Sie sich, daß das MUFI noch nicht an das Netz angeschlossen ist. Öffnen +Sie dann das Gehäuse, indem Sie die vier Schrauben an der Unterseite des MUFIs +(direkt neben den Füßen) lösen. Heben Sie nun #on("b")##on("b")#vorsichtig#off("b")##off("b")# den hellen Deckel des +Gehäuses ab. Aber Achtung! Der Deckel bleibt über Kabel mit dem Fußteil ver­ +bunden! Legen Sie vorsichtig den Deckel neben das MUFI, so daß die Kabelver­ +bindungen nicht belastet werden. + + +---------------------------------------------------+ + | +-------+ +------------+ | + | | | | | +---------+ | + | +-------+ | | | DIP- | | + | +-------+ | | | Schalter| | +Rück- | | | | | +---------+ | Vorder- +seite | +-------+ | | +--------------+ | seite + | +-------+ | SCN68000 | | | | + | | | | | +--------------+ | + | +-------+ | | | + | +-------+ | | | + | | | | | | + | +-------+ +------------+ | + +---------------------------------------------------+ + + + +#center#Abb.1: MUFI geöffnet + + +Im Inneren des Fußteiles fällt Ihnen sofort der größte CHIP auf, der u.a. die +Bezeichnung 'SCN68000' trägt. Drehen Sie das MUFI so vor sich, daß an der linken +Seite dieses Chips die vier gleichen, mittelgroßen Chips zu liegen kommen. Dann +sehen Sie rechts vom großen Chip, ganz hinten im Gehäuse eine kleine Plastikbox +mit DIP-Schaltern, die die folgende Aufschrift trägt: + +#on("b")# + O N + 1 2 3 4 +#off("b")# + +Den durchsichtigen Deckel dieser kleinen Plastikbox müssen Sie nun öffnen, um die +Stellung der DIP-Schalter einsehen zu können. Dazu verwenden Sie am besten einen +Kugelschreiber oder einen kleinen Schraubendreher. Heben Sie damit den Deckel an +der rechten Seite leicht an, dann läßt sich der Deckel nach links herüberlegen. Weist +ein Schalter nach hinten (in dieser Lage des MUFIs von Ihrem Körper weg), so hat er +die Stellung 'ON', weist er nach vorn (zu Ihrem Körper hin), so hat er die Stellung +'OFF'. + + +Beispiel: + + +---------------------------------------+ + | +-----+ +-----+ +-----+ +-----+ | + | |+++++| | | | | | | | + | |+++++| | | | | | | | ON + | |+++++| | | | | | | | + | |+++++| | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | |+++++| |+++++| |+++++| | + | | | |+++++| |+++++| |+++++| | + | | | |+++++| |+++++| |+++++| | OFF + | | | |+++++| |+++++| |+++++| | + | +-----+ +-----+ +-----+ +-----+ | + +---------------------------------------+ + + 1 2 3 4 + +#center#Abb.2:  Mögliche DIP-Schalter-Stellung beim MUFI + + +Dabei haben die DIP-Schalter folgende Bedeutung: + +#on("b")# + 1 ON : Modulbusbetrieb + OFF : Parallelportbetrieb + + 2 ON : RTS/CTS Hardware Handshake + OFF : XON-/XOFF-Protokoll + + 3 ON : 9600 Baud + OFF : 19200 Baud + + 4 ON : Even Parity + OFF : No Parity + +#off("b")# +Wenn Sie das MUFI im Terminalkanal betreiben wollen, müssen Sie je nachdem, wie +Sie Ihr Terminal konfiguriert haben, die entsprechende Einstellung vornehmen. + +Betreiben Sie das Terminal mit einer Übertragungsrate von 19200 Baud, so sollten +Sie unbedingt mit XON/XOFF-Protokoll arbeiten - es sei denn, das Terminal unter­ +stützt RTS/CTS! In jedem Falle muß der DIP-Schalter 1 in die Stellung ON gebracht +werden (der Betrieb des Interface-Systems der Firma AKTRONIK wird hier "Modul­ +busbetrieb" genannt). + +Wenn Sie das MUFI an einer separaten seriellen Schnittstelle betreiben wollen, #on("b")#muß#off("b")# +der Datenaustausch mit dem RTS/CTS-Protokoll abgewickelt werden. Versichern Sie +sich, daß Ihr Kabel darauf ausgelegt ist! + +Nach dieser Einstellung der DIP-Schalter ist das MUFI betriebsbereit. Schrauben Sie +bitte den Gehäusedeckel mit den vier Schrauben wieder fest. + + +#on("b")#3.1.2  Einbau des MUFIs in den Terminalkanal#off("b")# + +Um das MUFI in den Terminalkanal einbauen zu können, müssen Sie zunächst die +Zuleitung vom Rechner zum Terminal am Terminal lösen. Auf der Rückseite des +MUFIs befinden sich zwei Stecker, die mit V24/1 und V24/2 bezeichnet sind. Ver­ +inden Sie nun das Kabel, was ursprünglich vom Computer zum Terminal führte, mit +dem MUFI, indem Sie es an den mit V24/2 gekennzeichneten Stecker anstecken. Sie +benötigen jetzt noch ein weiteres (kurzes) V24-Kabel, um das MUFI mit dem +Terminal zu verbinden. Es wird einerseits auf den mit V24/1 gekennzeichneten +Stecker am MUFI aufgesteckt; das andere Ende wird mit dem Terminal in gleicher +Weise verbunden, wie das ursprüngliche Kabel zwischen Rechner und Terminal. + + + +--------------------------+ + | +----------------------+ | + | | V24/1 V24/2 | | + | | | | | | + | +----|-----------|-----+ | + +------|-----------|-------+ + | | + | | + ZUM <-----+ +-----> ZUM + TERMINAL COMPUTER + + +#center#Abb.3: Einbau des MUFIs in den Terminalkanal + + +Beachten Sie bitte, daß die V24-Schnittstellen des MUFIs auf 8 Datenbits und 1 Stop­ +bit fest eingestellt sind - ggf. müssen Sie Ihre Terminalkonfiguration hieran anpassen. +Kontrollieren Sie aber in jedem Falle, ob die Konfiguration mit diesen Daten überein­ +stimmt! + +Koppeln Sie dazu die Task 'configurator' an Ihr Terminal (mit 'continue +("configurator") ') und geben Sie dann das Kommando 'configurate +'. Für alle vorhandenen Kanäle werden Sie nun nacheinander gefragt, +ob Sie eine Konfiguration vornehmen wollen. Bei den "interessanten Kanälen" ant­ +worten Sie mit 'ja' (). + +Wollen Sie sich nur die aktuelle Konfiguration ansehen, so beantworten Sie alle dann +gestellten Fragen zum Kanal mit 'ja' (), dann bleibt die aktuelle Einstellung +erhalten. Der Konfigurationsdialog ist im EUMEL-Systemhandbuch auf den Seiten 6 - +8 detailliert beschrieben. + +Die Verschaltung der V24-Kabel ist in der Bedienungsanweisung zum MUFI erläutert, +ggf. können Sie entsprechende Kabel von der Firma BICOS beziehen. + +Wenn alle Kabelverbindungen gesteckt sind, sollten Sie auf alle Fälle erst einmal #on("b")#bei +ausgeschaltetem MUFI#off("b")# prüfen, ob das Terminal sich noch bedienen läßt. Wenn das +Terminal keine Reaktion mehr zeigt, obwohl es vorher (ohne MUFI) reibungslos +funktioniert hat, dann haben Sie entweder ein MUFI ohne "Schnittstellen-Automatik" +vor sich (vergl. Sie dazu Kap. 3.1), oder an den Kabelverbindungen stimmt irgend­ +etwas nicht. In diesem Falle sollten Sie noch einmal alle Anschlüsse und eventuell +auch die interne Verschaltung der Kabel überprüfen. + + +#on("b")#3.1.3  Das MUFI an separater serieller Schnittstelle#off("b")# + +Wenn Sie das MUFI als Endgerät an einer separaten seriellen Schnittstelle betreiben, +dann stecken Sie das vom Computer kommende Kabel auf den mit V24/2 +bezeichneten Stecker an der Rückseite des MUFIs. Damit ein einwandfreier Betrieb +gewährleistet ist, sollten Sie einen sog. "Kurzschlußstecker" auf die dann freie +25polige D-Subminiatur-Buchse (V24/1) am MUFI aufstecken. Haben Sie eine solche +nicht zur Hand, können Sie zwei kleine Brücken einsetzen: Nehmen Sie dazu zwei +kleine Drahtstücke und verbinden Sie einmal Pin (Öffnung) 2 mit Pin 3 und außer­ +dem Pin 4 mit Pin 5. + +In der Task 'configurator' muß der Kanal, an dem das MUFI angeschlossen ist, auf +'transparent, 8 Bit, 1 Stopbit, RTS/CTS-Protokoll' eingestellt werden, weiterhin je nach +MUFI-DIP-Schalter-Stellung auf '9600' bzw. '19200 Baud' und 'no parity' bzw. 'even +parity'. + + +#on("b")#3.2  Der RS232-Adapter der Firma AKTRONIK#off("b")# + +Bevor Sie den Adapter an die serielle Schnittstelle anschließen, ist noch die einge­ +stellte Baudrate zu überprüfen bzw. eine Neueinstellung vorzunehmen. + +Öffnen Sie das Gehäuse des Adapters, indem Sie die vier Schrauben an der Unterseite +lösen. Drehen Sie den Adapter so vor sich, daß die 25polige D-Subminiatur-Buchse +von Ihrem Körper wegzeigt. Vorn rechts sind dann zwei parallele 8polige Pfosten­ +steckerleisten sichtbar. + +#center#25-pol. D-Subminiatur-Stecker + + +---------------+ + | | + +---+ +---+ + | +------+ | + | | | | + | | | | + | | | | + | | | | + | +------+ | + | +------+ | + | | | +-------+ | + | +------+ | | | + | +------+ +-------+ | + | | | +-------+ | + | +------+ | <-|---------Jumper-Leiste + | +-------+ | + +---+ +---+ + | Baudrate | + +---------------+ + + +#center#Abb.4:  RS232-Adapter geöffnet + + +Auf einem Paar steckt ein 'Jumper', mit dem die Baudrate eingestellt wird. +Gegebenenfalls ist dieser Jumper umzustecken. Anschließend schrauben Sie das +Gehäuse mit den vier entfernten Schrauben wieder zu. + + +---------+ + | o o | 300 + | o o | 600 + | o o | 1200 + | o o | 2400 + | o o | 4800 + | o o | 9600 + Jumper ---> | o o | 19200 + | o o | 38400 + +---------+ + Baudrate + + +#center#Abb.5:  Mögliche Jumperposition beim RS232-Adapter + + +Nun muß noch in der Task 'configurator' der entsprechende Kanal konfiguriert +werden. Koppeln Sie dazu die Task 'configurator' an Ihr Terminal (mit 'continue +("configurator") ') und geben Sie dann das Kommando 'configurate +'. Für alle vorhandenen Kanäle werden Sie nun nacheinander gefragt, +ob Sie eine Konfiguration vornehmen wollen. Beim vorgesehenen Kanal antworten Sie +mit 'ja' (). + +Wollen Sie sich nur die aktuelle Konfiguration ansehen, so beantworten Sie alle dann +gestellten Fragen zum Kanal mit 'ja' (), dann bleibt die aktuelle Einstellung +erhalten. Der Konfigurationsdialog ist im EUMEL-Systemhandbuch auf den Seiten 6 - +8 detailliert beschrieben. + +Folgende Konfigurationsmerkmale müssen eingestellt werden: + + transparent, 8 Bit, 2 Stopbit, no Parity, #on("b")#kein#off("b")# Protokoll + +Die Baudrate ist entsprechend der Jumper-Stellung einzustellen. + +Am Adapter ist ein Kabel mit 25poligem D-Subminiatur-Stecker bereits fest montiert. +Sollte der Stecker nicht an Ihren Rechner passen, so müßten Sie ein entsprechendes +Adapterkabel basteln oder kaufen. + + + +#on("b")#3.3  Verbindung Adapter - Interface-System#off("b")# + +Nachdem Sie nun den Adapter (MUFI oder RS232-Adapter) an den Rechner ange­ +schlossen haben, müssen Sie noch die Verbindung zum Interface-System herstellen. +Dabei ist es gleichgültig, ob Sie eine Compact-Box, einen Einzelsteckplatz oder einen +Mehrfachsteckplatz benutzen, denn alle diese Geräte verfügen über den gleichen +Anschlußstecker. Den RS232-Adapter können Sie direkt an das Interface-System +anschließen, denn er verfügt bereits über einen entsprechenden Stecker. + +Für das MUFI benötigen Sie ein Anschlußkabel, das auf der einen Seite einen +36poligen Centronics-Stecker und auf der anderen Seite einen 25poligen D-Sub­ +miniatur-Stecker besitzt (von der Firma BICOS zu beziehen). + + +#on("b")#3.4  Bereitstellung des Interface-Systems#off("b")# + +Sofern Sie eine Compact-Box angeschlossen haben, brauchen Sie nur noch das mitge­ +lieferte Netzteil mit der Compact-Box und dem Netz zu verbinden und die ent­ +sprechende Spannung laut beiliegender Bedienungsanweisung der Fa. AKTRONIK +einzustellen. + +Wenn Sie mit einem Einzelsteckplatz oder einem Mehrfachsteckplatz arbeiten, +müssen Sie zunächst noch eine Interface-Karte einstecken. Für einen anschließenden +Test des Systems (sehen Sie dazu Kapitel 5) empfiehlt es sich, eine Kombikarte oder +eine E/A-Karte zu verwenden. Nach dem Einstecken der Interface-Karte ist der Steck­ +platz noch mit dem Netzstecker an das Stromnetz anzuschließen, um eine +Spannungsversorgung zu gewährleisten. + + + + + + + diff --git a/doc/prozess/gs-Prozess-4 b/doc/prozess/gs-Prozess-4 new file mode 100644 index 0000000..e106df1 --- /dev/null +++ b/doc/prozess/gs-Prozess-4 @@ -0,0 +1,173 @@ +limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (1)# +#headodd# +#center#gs-Prozess#right#% + +#end# +#headeven# +%#center#gs-Prozess + +#end# +#center#1 + +#on("b")#4  Installation von gs-Prozess#off("b")# + + +Bevor Sie #on("b")#gs-Prozess#off("b")# auf Ihrem Computer benutzen können, müssen Sie das +Programm zunächst installieren. Wenn #on("b")#gs-Prozess#off("b")# auf Ihrem System schon zur +Verfügung steht, können Sie dieses Kapitel ruhig überspringen. + + + +#on("b")#4.1  Voraussetzungen#off("b")# + + +Um #on("b")#gs-Prozess#off("b")# auf Ihrem Computer betreiben zu können, muß das EUMEL- +Betriebssystem installiert sein. #on("b")#gs-Prozess#off("b")# setzt die Multi-User-Version voraus und ist +lauffähig ab Version 1.8.x. #on("b")#gs-Prozess#off("b")# setzt weiterhin voraus, daß auf Ihrem +Computer bereits das Programm #on("b")#gs-DIALOG#off("b")# (Version 1.1) installiert ist. + + + +#on("b")#4.2  Lieferumfang#off("b")# + + +#on("b")#gs-Prozess#off("b")# wird auf einer Diskette geliefert, die alle notwendigen Programme ent­ +hält (die Installation von #on("b")#gs-DIALOG#off("b")# wird dabei vorausgesetzt!). Um den Inhalt der +Diskette feststellen zu können, starten Sie Ihr System und bringen es dazu, daß 'gib +kommando:' erscheint. Dann legen Sie die Diskette ein und geben das Kommando: + + +#on("b")##center#archive("gs-Prozess");list(archive);release(archive) #off("b")# +#page# +Anschließend erscheint eine Übersicht der auf dem Archiv vorhandenen Programme. +Folgende Programme sollten sich in der Übersicht befinden: + + + "gs-Prozess 1 für MUFI im Terminalkanal" + "gs-Prozess 1 für MUFI als Endgerät" + "gs-Prozess 1 für AKTRONIK Adapter" + "gs-Prozess 2" + "gs-Prozess 3" + "gs-Prozess 4" + "gs-Prozess 5" + "gs-MENUKARTE:Prozess" + "gs-Prozess/gen" + + +Eventuell können noch weitere Namen auf der Diskette vorhanden sein. Wenn Sie den +Inhalt der Diskette kontrolliert haben und diese Programme auf der Diskette vor­ +handen sind, können Sie #on("b")#gs-Prozess#off("b")# installieren. + +Sollten Sie statt der Übersicht eine Fehlermeldung erhalten, überprüfen Sie bitte, ob +die Diskette das richtige Format besitzt oder ob Ihr Diskettenlaufwerk Probleme +macht. Sollten dagegen Programme fehlen, so reklamieren Sie die Diskette. + + +#on("b")#4.3  Installation#off("b")# + +#on("b")#gs-Prozess#off("b")# muß in einer Task installiert werden, in der bereits das Programm +#on("b")#gs-DIALOG#off("b")# zur Verfügung steht. Alle Söhne und Enkel der neuen Task können +anschließend mit #on("b")#gs-Prozess#off("b")# arbeiten. Richten Sie also eine Task als Sohn der Task +ein, in der auf Ihrem Computer bereits #on("b")#gs-DIALOG#off("b")# installiert ist. Wir nehmen hier +an, daß #on("b")#gs-DIALOG#off("b")# in der Task 'MENU' installiert ist und die neue Task den Namen +'PDV' erhalten soll. (Sie können für die Task auch einen beliebigen anderen Namen +wählen): + +#on("b")# + (Supervisor - Taste) + + --> gib supervisor kommando: + + begin ("PDV","MENU") + + --> gib kommando: + + +#off("b")# +(Arbeiten mehrere Personen mit dem Computer, dann ist es sinnvoll, diese Task vor +unbefugtem Zugriff durch ein Passwort zu schützen. Wie das gemacht wird, können +Sie in Ihrem EUMEL-Benutzerhandbuch erfahren.) + + +Legen Sie dann die Archivdiskette ein, auf der sich #on("b")#gs-Prozess#off("b")# befindet, und geben +Sie das folgende Kommando: + + +#on("b")# + archive("gs-Prozess") + + fetch("gs-Prozess/gen",archive) + + run + +#off("b")# + +Sie haben damit das Generatorprogramm gestartet. Bevor die Generierung allerdings +ausgeführt werden kann, müssen Sie dem System noch Angaben über den ver­ +wendeten Adapter machen. Die zur Verfügung stehenden Anpassungen werden Ihnen +zur Auswahl angeboten: + +--------------------------------------------------------+ + | Auswahl der Interface-Anpassung | + | Bitte gewünschte Anpassung ankreuzen! | + |--------------------------------------------------------| + | Auswahl  e i n e r  Datei durch Ankreuzen | + |--------------------------------------------------------| + |==> > gs-Prozess 1 für MUFI im Terminalkanal | + | > gs-Prozess 1 für MUFI als Endgerät | + | > gs-Prozess 1 für AKTRONIC-Adapter | + | | + +--------------------------------------------------------| + | Info:  Fertig:  Abbrechen:  | + +--------------------------------------------------------+ +#center#Abb.6:  Auswahl der Interface-Anpassung + + +Bringen Sie den Pfeil mit den Pfeiltasten vor die gewünschte Anpassung und drücken +Sie die -Taste. + +Haben Sie als Anpassung "gs-Prozess für AKTRONIK Adapter" oder "gs-Prozess für +MUFI als Endgerät" gewählt, so erscheint als nächstes die Aufforderung: + +#center##on("b")#'Gib Interface-Kanal:'#off("b")# + +Geben Sie hier die Kanalnummer der seriellen Schnittstelle ein, an der der Adapter +betrieben werden soll. + +Die Installation wird automatisch durchgeführt. Lassen Sie während des gesamten +Vorgangs die Archivdiskette eingelegt. Die Generierung ist beendet, wenn der +EUMEL-Eingangsbildschirm erscheint. Die Task, in der die Generierung stattfin­ +det, wird automatisch zur Managertask, das heißt, daß Söhne von ihr eingerichtet +werden können. + + +#on("b")#4.4  Anmerkungen zur Erstinstallation#off("b")# + +Mit der Installation der Software ist das Gesamtsystem allerdings noch nicht betriebs­ +bereit. Dazu fehlen #on("b")#gs-Prozess#off("b")# noch einige Informationen. Bisher ist #on("b")#gs-Prozess#off("b")# +nämlich nur bekannt, welchen Adapter Sie verwenden und ob Sie ihn im Terminal­ +kanal oder an einer separaten Schnittstelle betreiben wollen. + +Um das angeschlossene Interface-System sachgerecht ansteuern zu können, benötigt +#on("b")#gs-Prozess#off("b")# aber noch Informationen über die Hardware-Konstellation. Diese Mit­ +teilungen, die noch gemacht werden müssen, nennen wir "Konfiguration von +#on("b")#gs-Prozess#off("b")#". Wie diese Konfiguration vorgenommen wird und wie Sie anschließend +Ihr Interface-System testen, ist im Kapitel 5 detailliert beschrieben. + +#on("b")#gs-Prozess#off("b")# bietet Ihnen eine Reihe von Möglichkeiten, die vorhandene Hardware +möglichst effektiv zu nutzen. So ist es möglich, wenn Sie Ihre(n) Adapter an +separater/separaten Schnittstelle(n) betreiben, von verschiedenen Tasks aus auf +einen Adapter zuzugreifen. Gerade in der Anschaffungsphase, wenn noch nicht +genügend Hardware zur Verfügung steht, ist das eine sinnvolle/preiswerte Möglich­ +keit, von verschiedenen Arbeitsplätzen aus Prozeßdatenverarbeitung zu betreiben. + +Zu diesem Zeitpunkt würde es aber zu weit führen, hierzu Details zu erläutern. +Beschreibungen dieser Möglichkeiten finden Sie im Kapitel "Hinweise für den +Systembetreuer/ Programmierer". + +#on("b")# +Sie sollten sich zunächst darauf beschränken, ein Interface-System "zum +Laufen zu bringen". Verfahren Sie dazu bitte genau, wie im Kapitel 5 +beschrieben.#off("b")# + diff --git a/doc/prozess/gs-prozess-1 b/doc/prozess/gs-prozess-1 new file mode 100644 index 0000000..f6a3696 --- /dev/null +++ b/doc/prozess/gs-prozess-1 @@ -0,0 +1,99 @@ +limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (1)# +#headodd# +#center#gs-Prozess#right#% + +#end# +#headeven# +%#center#gs-Prozess + +#end# +#center#1 + +#on("b")#1  Was kann gs-Prozess#off("b")# + +#on("b")#gs-Prozess#off("b")# ist ein Programmsystem unter dem Betriebssystem EUMEL, mit dem ein +Anwendungsbereich erschlossen werden kann, der bisher in der Schule zumeist sehr +stiefmütterlich behandelt wurde: die Prozeßdatenverarbeitung - das Messen, Steuern +und Regeln mit dem Computer. + +Es wird dadurch möglich, externe Modelle/Geräte (z.B. eine Ampelanlage) zu steuern +oder von externen Meßfühlern (z.B. einem Temperaturfühler) oder Eingabeeinheiten +(z.B. einem Lochkartenleser) Daten aufzunehmen. Durch die Kombination der +beiden Vorgänge können sogar komplexe geregelte Systeme in Modellen nachgebildet +werden. + +Eigentlich ist eine solch stiefmütterliche Behandlung dieses Anwendungsbereiches +von Computern in der Schule gar nicht einzusehen, denn in der Forschung, im +Dienstleistungsbereich, im privaten Bereich und vor allem in der Produktion gibt es +eine Vielzahl von Anwendungen, z.B.: + + Meßdatenerfassung und -auswertung bei Experimenten, Wetterbeobachtung, + seismologische Untersuchungen, ..., Ampelsteuerungen, Verkehrsleitsysteme, ..., + Scannerkassen, Scheckkartenleser, Geldautomaten, ..., Waschmaschinen, + Heizungsanlagen, Modelleisenbahnen, ..., CNC-Maschinen, Universalhand­ + habungsautomaten (Roboter),... + +In den meisten Fällen werden Computer eingesetzt, die speziell für diesen +Anwendungsbereich entwickelt wurden. Insbesondere an die Verarbeitungsge­ +schwindigkeit solcher Systeme werden sehr hohe Anforderungen gestellt. Solche +Systeme sind für die schulische Verwendung viel zu teuer. Zumeist sind auch die in +der Realität ablaufenden Vorgänge so komplex, daß sie als Ganzes gar nicht im +Unterricht nachgebildet werden können. + +Das aber kann auch nicht Ziel einer Auseinandersetzung mit diesem Anwendungs­ +bereich in der Schule sein. Hier gilt es, unter didaktisch-methodischen Gesichts­ +punkten, Grundprinzipen der Prozeßdatenverarbeitung zu vermitteln und beispiel­ +hafte Anwendungen an Modellen zu erarbeiten und zu erproben. In einem zeitge­ +mäßen Informatikunterricht darf dieser wichtige Anwendungsbereich von Computern +nicht ausgespart bleiben. + +Bisher scheiterte das Messen, Steuern und Regeln mit dem Computer in der Schule +meistens daran, daß es keine standardisierten Software- und Hardware-Systeme und +auch keine geeigneten Modelle gab. Das aber hat sich inzwischen geändert. +Verschiedene Hersteller bieten Interface-Systeme und Modelle an, die gut verwendet +werden können. + +Auch #on("b")#gs-Prozess#off("b")# greift auf ein solches Interface-System zu, das aus mehreren +Einzelkomponenten besteht (mehr dazu in den folgenden Kapiteln). Das sind Geräte, +über die der Computer "Kontakt" mit den 'Endgeräten' (z.B. Modellen) aufnimmt: +Hier werden Ausgaben des Computers in "elektrische Impulse" umgesetzt, mit denen +Modelle angesprochen werden können (z.B. Lämpchen ein- und ausgeschaltet, +Motoren zu Drehungen nach links oder rechts veranlaßt werden können). Ein­ +gehende "Impulse" werden in "computerangemessene Form" umgewandelt und an +den Computer weitergegeben. + +Der Aufwand, der betrieben werden muß, um ein Interfacesystem sachgerecht anzu­ +steuern, ist erheblich. Es kostet einige Mühe und vor allem viel Zeit, um alle Details +des Interfacesystems und seiner Programmierung kennenzulernen, und es gehört +eine gehörige Portion Erfahrung und vor allem viel Geduld dazu, um Fehlfunktionen +zu analysieren und letztlich zu beheben. Das alles ist einem Anwender, dem es z.B. +darum geht, ein bestimmtes Modell anzusteuern, nicht zumutbar. + +Hier schafft nun #on("b")#gs-Prozess#off("b")# Abhilfe! #on("b")#gs-Prozess#off("b")# ist eingebettet in die komfortable +Benutzerschnittstelle #on("b")#gs-DIALOG#off("b")#, so daß der Einarbeitungsaufwand in das +Programmsystem gering und eine einfache Bedienung des Systems gewährleistet ist. + +Ähnlich wie bei #on("b")#gs-Herbert und Robbi#off("b")# wird eine komplette Programmier­ +umgebung zur Verfügung gestellt, die alle Funtionen enthält (Informationen, +Konfiguration des Systems, Erstellung und Ausführung von Programmen, Archiv­ +handling), die bei der Arbeit von Bedeutung sein können - natürlich jetzt auf das +Messen, Steuern und Regeln bezogen. Durch diese Programmierumgebung wird +selbst dem Computerneuling ermöglicht, einen einfachen, eingängigen Zugang zu +diesem Anwendungsbereich zu finden. + +#on("b")#gs-Prozess#off("b")# stellt einen Basisbefehlssatz (Eingabe-, Ausgabebefehle und Tests) zur +Verfügung, mit dessen Hilfe Lösungsalgorithmen aus diesem Anwendungsbereich +angemessen formuliert werden können. Dabei kann sich der Anwender ganz auf sein +Problem konzentrieren, da er sich um die spezifische Ansteuerung des Interfaces +nicht zu kümmern braucht - das erledigt #on("b")#gs-Prozess#off("b")#. + +Der Basisbefehlssatz besteht aus nur wenigen Befehlen, um das Erlernen und den +Umgang damit möglichst einfach zu gestalten. Andererseits ist der Befehlssatz so +umfangreich und universell, daß alle schulisch relevanten Problemstellungen aus +diesem Anwendungsbereich angemessen bearbeitet werden können. + + + + diff --git a/doc/prozess/gs-prozess-5 b/doc/prozess/gs-prozess-5 new file mode 100644 index 0000000..5c44f29 --- /dev/null +++ b/doc/prozess/gs-prozess-5 @@ -0,0 +1,819 @@ +limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (1)# +#headodd# +#center#gs-Prozess#right#% + +#end# +#headeven# +%#center#gs-Prozess + +#end# +#center#1 + +#on("b")#5  Konfiguration von gs-Prozess#off("b")# +#on("b")#    Test des Interface-Systems#off("b")# + +In diesem Kapitel erfahren Sie, wie Sie #on("b")#gs-Prozess#off("b")# entsprechend der angeschlossenen +Hardware konfigurieren müssen. Anschließend zeigen wir Ihnen, wie Sie Ihr Inter­ +face-System testen können. + +Wir gehen hier davon aus, daß die Hardware-Voraussetzungen erfüllt, das Interface- +System über einen Adapter (MUFI / RS232-Adapter) angeschlossen und #on("b")#gs-Prozess#off("b")# +auf dem Rechner installiert sind. + + +#on("b")#5.1  Kontrolle der Konfigurationen/Anschlüsse#off("b")# + +Bevor Sie mit der Arbeit beginnen, überzeugen Sie sich unbedingt (noch einmal) +davon, daß die Konfigurationen und die Steckverbindungen den Vorgaben ent­ +sprechen: + +- #on("b")#MUFI im Terminalkanal:#off("b")# + + Sind die beiden Kabel zum Rechner und zum Terminal an der Rückseite des + MUFIs korrekt aufgesteckt (sehen Sie Abb.3)? Haben Sie die notwendigen + Konfigurationen vorgenommen (Task 'configurator', MUFI-DIP-Schalter, Ter­ + minal)? Ist das Netzkabel des MUFIs mit dem Stromnetz verbunden? Ist das + Verbindungskabel zwischen MUFI und Interface-System an der Vorderseite des + MUFIs und am Interface-System (Compact-Box, Einzel- oder Mehrfachsteck­ + platz) aufgesteckt? +#page# +- #on("b")#MUFI als Endgerät:#off("b")# + + Ist das vom Computer kommende Kabel auf den mit V24/2 gekennzeichneten + Stecker aufgesteckt? Haben Sie auf den freien Stecker (V24/1) einen "Kurz­ + schlußstecker" aufgesteckt? Haben Sie ein Kabel verwendet, über welches das + RTS/CTS-Protokoll abgewickelt werden kann? Haben Sie den Kanal, an dem das + MUFI betrieben wird, den Anweisungen in Kapitel 3.1.3 entsprechend kon­ + figuriert? Sind die DIP-Schalter im MUFI entsprechend eingestellt? Ist das + Netzkabel des MUFIs mit dem Stromnetz verbunden? Ist das Verbindungskabel + zwischen MUFI und Interface-System an der Vorderseite des MUFIs und am + Interface-System (Compact-Box, Einzel- oder Mehrfachsteckplatz) aufgesteckt? + + +- #on("b")#RS232-Adapter:#off("b")# + + Ist das Schnittstellen-Kabel korrekt am Computer angeschlossen? Haben Sie den + Kanal, an dem der RS232-Adapter betrieben wird, den Anweisungen in Kapitel + 3.2 entsprechend konfiguriert? Ist der Jumper im RS232-Adapter korrekt aufge­ + steckt? Ist der RS232-Adapter an das Interface-System (Compact-Box, Einzel- + oder Mehrfachsteckplatz) angesteckt? Ist der 3polige Platinenstecker des + Adapters in die 12V-Spannungsversorgungs-Buchse des Interface-Systems + eingesteckt? + + +- #on("b")#Compact-Box#off("b")# + + Ist die Compact-Box an das zugehörige Netzgerät angeschlossen? Ist der Stecker + wirklich richtig herum eingesteckt? Ist das Netzteil mit dem Stromnetz ver­ + bunden? + +- #on("b")#Einzelsteckplatz#off("b")# + + Ist eine Kombi-Karte oder eine E/A-Karte eingesteckt? Ist das Netzkabel des + Steckplatz-Netzgerätes mit dem Stromnetz verbunden? +#page# +- #on("b")#Mehrfachsteckplatz#off("b")# + + Ist ein passendes Netzteil an den Mehrfachsteckplatz angeschlossen? Ist das + zugehörige Netzkabel mit dem Stromnetz verbunden? Ist eine Kombi- oder + E/A-Karte in einen Steckplatz eingesteckt? + + +#on("b")#5.2  Vorbereitungen für den Ein-/Ausgabetest#off("b")# + +Für den Ausgabetest sollte eine 8elementige Leuchtdiodenanzeige zur Verfügung +stehen, um am Interface-System die Ausgaben kontrollieren zu können. Sofern Sie +mit der Compact-Box arbeiten oder eine E/A-Karte verwenden, brauchen Sie sich +darum nicht weiter zu kümmern, denn in diese Systeme ist eine Leuchtdioden­ +anzeige integriert. Wenn Sie dagegen mit einer Kombikarte arbeiten, muß eine +gesonderte Anzeige (kann leicht selbst gebaut werden oder ist fertig zu kaufen bei der +Fa. AKTRONIK) angeschlossen werden. + +Für den Eingabetest reicht ein kleines Drahtstück, an dem zwei kleine Lötschuhe +angelötet sind - schön wäre es, wenn ein Codekarten-Leser zur Verfügung stünde. + + +#on("b")#5.2.1  Anschluß einer Leuchtdiodenanzeige an die Kombikarte#off("b")# + +Stecken Sie den 8poligen Platinenstecker, der an der Leuchtdiodenanzeige befestigt +ist, auf die mit "AUSG." gekennzeichnte Buchse der Kombikarte. Den Lötschuh des +einzelnen Drahtes an der Leuchtdiodenanzeige stecken Sie auf den Masse-Lötstift +direkt neben der "Ausgangs-Buchse" der Kombikarte (sehen Sie Abb. 7). Da die +Leuchtdiodenanzeige mit Spannung versorgt werden muß, müssen jetzt noch zwei +Kabel - wie in der Abb. 7 dargestellt (Kabel 1 und Kabel 2) - aufgesteckt werden. +#page# + + + + +---------------------------------------------------------------+ + | 4-7 o----------+ | + | +-+-----------+-+ | | + | | | O | | GMD o | | + | | | | | | Kabel 1 | + | | | | | | | + | v | | O | | | | + | | | | | | | + | E| | | | | | + | | | O | | | | + | +-+-------------+ ___________| | + | o -----------| | + | Ausg. | | + | +---------------+ O 0 | | + | | +-----------+ | 1 O | | + ---+---|-|---| | | O 2 | | + ---+---|-|---| | | 3 O | | + ---+---|-|---| | | O 4 | | + ---|---|-|---| | | 5 O | | + ---|---|-|---| | | O 6 | | + ---|---|-|---| | | 7 O | | + | | +-----------+ | | | + | +---------------+ | | +<-----------------o | Kabel 2 | + Zur Leuchtdiodenanzeige | | + | +---------------+ | | + | | O | O 0 | | + | | O | 1 O | | + | | O | O 2 | | + | | O | 3 O | | + | | O | O 4 | | + | | O | 5 O | | + | | O | O 6 | | + | | O | 7 O | | + | +---------------+ | | + | GMD o o +5V | | + | | | | + | +----------------------------+ | + | | + | +---------------+ | + | | O | + O | + | | O | O E2 | + | | O | GMD O | + | +---------------+ | + | | + | +---------------+ | + | | O | + O | + | | O | O E2 | + | | O | GMD O | + | +---------------+ | + | o o o o o o o o o o | + | | | | | | | | | | | | + | +-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+ | + | | | | + +----------+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+----------+ + | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | + +#center#Abb.7:  Anschluß Leuchtdiodenanzeige - Kombikarte + +#on("b")#ACHTUNG!#off("b")# Bei dieser Spannungversorgung auf der Kombikarte (+5V) darf #on("b")#auf +keinen Fall#off("b")# eine größere Last (z.B. Motor oder auch nur eine Glühbirne) ange­ +schlossen werden, da dadurch die Interfacekarte bzw. das Netzteil im Einzelsteck­ +platz beschädigt werden könnte. +#page# +Möchten Sie eine größere Last anschließen, so benötigen Sie ein stabilisiertes Netzteil +mit "ordentlich geglättetem" Gleichstrom. Die Masse (Minuspol) des Netztteils be­ +festigen Sie an dem Lötschuh (oder der davorliegenden Klemme), der zwischen den +beiden Lötstiften liegt, an denen in der Abb.7 das Kabel 1 befestigt ist. Den Pluspol +des Netzteiles verbinden Sie mit mit einem der Lötstifte (bzw. an der davorliegenden +Klemme), auf dem jetzt das Kabel 1 befestigt ist. Damit alle 8 Ausgänge mit Span­ +nung versorgt werden, müssen Sie auch hier ebenfalls eine Brücke zum zweiten +Lötschuh (oder der Klemme davor), an dem in der Zeichnung Kabel 1 befestigt ist, +anbringen. + +Da die Compact-Box ohnehin durch das Netzteil versorgt wird, kann es hier nicht zu +Komplikationen kommen. Wollen Sie eine größere Last an die E/A-Karte anschließen, +so benötigen Sie z.B. eine Relais-Box. + + + +#on("b")#5.2.2  Anschluß des Codekartenlesers (Drahtstück)#off("b")# + +Stecken Sie den 8poligen Platinenstecker, der am Codekartenleser befestigt ist, auf +die Eingangsbuchse an Ihrem Interface-System. Dann muß noch der 3polige +Platinenstecker, der ebenfalls am Codekartenleser befestigt ist, an die 12V-Span­ +nungsversorgungs-Buchse an Ihrem Interface-System aufgesteckt werden. + +haben Sie keinen Codekartenleser zur Hand, so reicht für den Eingabetest auch ein +kleines Kabelstück aus, an dessen Enden jeweils ein Lötschuh angelötet sein sollte. +Stecken Sie den einen Lötschuh auf einen +5V-Lötstift Ihres Interface-Systems. Das +andere Ende des Kabels wird zunächst noch nicht befestigt. + +Auf der Kombikarte sind die +5V-Lötstifte beschriftet und damit leicht zu finden. Wo +Sie einen +5V-Lötstift auf der E/A-Karte finden, können Sie der folgenden Abbildung +entnehmen: +#page# + Leuchtdiodenanzeige + | + +---------------------------------------+------------+ + | +---------------+ | | + | | O | O 0 V | +Digital- | | O | 1 O o o o o o o o o | +Ausgang | | O | O 2 | + | | O | 3 O | + | | O | O 4 | + | | O | 5 O | + | | O | O 6 | + | | O | 7 O | + | +---------------+ | + | +---------------+ | + | | O | O 0 | +Digital- | | O | 1 O | +Eingang | | O | O 2 | + | | O | 3 O | + | | O | O 4 | + | | O | 5 O | + | | O | O 6 | + | | O | 7 O | + | +---------------+ | + | +---------------+ | + | | O | O 0 | +Versorgungs- | | O | 1 O | +und | | O | O 2 | +Steuer- | | O | 3 O | +leitung | | O | O 4 | + | | O | 5 O | + | | O---5V------O 6 | + | | O | 7 O | + | +-------|-------+ | | + | | | | + | +---------------+ | + | | | + | GMD | + | | + | o o o o o o o o o o | + | | | | | | | | | | | | + | +-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+ | + | | | | + +----+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+---+ + | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | + + +#center#Abb.8:  Pinbelegung auf der E/A-Karte + + +#on("b")#5.3  Konfiguration von gs-Prozess#off("b")# + +Normalerweise kann in jeder Task, in der #on("b")#gs-Prozess#off("b")# zur Verfügung steht, die +Konfiguration vorgenommen werden (beachten Sie aber bitte die Bemerkungen im +Kapitel "Hinweise für den Systembetreuer/Programmierer"). + +Richten Sie eine Sohntask der Task ein, in der #on("b")#gs-Prozess#off("b")# installiert ist - in unserem +Fall soll das die Task 'PDV' sein. Die Sohntask soll den Namen 'pdvtest' erhalten: +#page# +#on("b")# + (Supervisor - Taste) +#off("b")# + --> gib supervisor kommando: +#on("b")# + begin ("pdvtest","PDV") +#off("b")# + --> gib kommando: +#on("b")# + pdv +#off("b")# + +Daraufhin erscheint der in Abb.9 dargestellte Menubildschirm. Über die Menupunkte +im dann sichtbaren Pull-Down-Menu können Sie diverse Informationen zu +#on("b")#gs-Prozess#off("b")# abrufen, auf die wir hier allerdings nicht weiter eingehen wollen. Statt­ +dessen drücken Sie bitte die 'Pfeiltaste rechts'. Sie gelangen so zum Menu unter dem +Oberbegriff "Interface" (Abb. 10). + + ++---------------------------------------------------------------------+ +| PDV:  Info Interface Programm Archiv | +|-------+------------------------+------------------------------------+ +| | u  Übersicht Befehle | | +| | --------------------- | | +| | a  Ausgabebefehle | | +| | e  Eingabebefehle | | +| | t  Testbefehle | | +| | w  Weitere Befehle | | +| | --------------------- | | +| | b  Bitmuster | | +| | s  Symbole/Zeichen | | +| | d  Digital-/Analogwerte| | +| +------------------------+ | +| | +| +----------------------------------------+ | +| | gs-Prozess | | +| | Version 1.0 | | +| | | | +| | Copyright Ρ 1988 bei Eva Latta-Weber, | | +| | Bielefeld | | +| +----------------------------------------+ | ++---------------------------------------------------------------------+ +|Info:/ Wahl: Ausführen: Verlassen:| ++---------------------------------------------------------------------+ + + + Abb.9:  Eingangsbildschirm #on("b")#gs-Prozess#off("b")# +#page# + ++-----------------------------------------------------------------------+ +| PDV:  Info Interface Programm Archiv | ++-------+-------------------+-------------------------------------------+ +| | i  Informationen | | +| | ---------------- | | +| | k  Konfigurieren | | +| | ---------------- | | +| | a  Ausgabetest | | +| | e  Eingabetest | | +| +-------------------+ | +| | +| | +| | ++---------------------------------------------------------------------- + +| Info:/ Wahl: Ausführen: Verlassen: | ++-----------------------------------------------------------------------+ + + #center#Abb.10:  Menubildschirm zum Oberbegriff 'Interface' + + +Über den ersten Menupunkt ("Informationen") kann die aktuelle Konfiguration des +Interfaces erfragt werden. Wenn Sie diesen Menupunkt aktivieren und es ist weder in +dieser Task noch in einer übergeordneten Task eine Konfiguration vorgenommen +worden, erhalten Sie die folgende Warnung: + + +----------------------------------------+ + | Interface ist noch nicht konfiguriert! | + +----------------------------------------+ +#center#Abb.11:  Information bei unkonfiguriertem System + + +Ist schon eine Konfiguration, z.B. in der Vatertask vorgenommen worden, so wird +Ihnen die aktuellen Einstellung angezeigt (s.u.). +#page# +#on("b")#5.3.1  Auswahl der Steckplatzart/Interfacekarte#off("b")# + +Da Sie in jedem Falle eine Konfiguration von #on("b")#gs-Prozess#off("b")# vornehmen sollen, +aktivieren Sie jetzt bitte den Menupunkt "Konfigurieren". Daraufhin erscheint die +folgende Auswahl: + +-----------------------------+ + | Auswahl der Steckplatzart | + | | + | c Compactbox | + | e Einzelsteckplatz | + | m Mehrfachsteckplatz | + | | + | Compact   Einzel   Mehrfach | + +-----------------------------+ + +#center#Abb.12:  Auswahl der Steckplatzart + + +Haben Sie eine Compact-Box angeschlossen, so ist die Konfiguration schnell erledigt: +Sie tippen die Taste . Daraufhin wird die komplette Konfiguration ausgeführt +und die Einstellung eingeblendet. + +------------------------------------+ + | Eingestellt: Compactbox | + | | + | Belegung der Kanäle: | + | | + | Kanal 1:   Analogeingang 1 (E1) | + | | + | Kanal 2:   Analogeingang 2 (E2) | + | | + | Kanal 3:   Digitaleingang | + | | + | Kanal 4:   Digitalausgang | + +------------------------------------+ + +#center#Abb.13:  Compact-Box: Belegung der Kanäle +#page# +Die Anzeige verschwindet, wenn Sie eine beliebige Taste tippen. + +Anders dagegen, wenn Sie zuvor dem System mitgeteilt haben, daß ein Einzelsteck­ +platz bzw. ein Mehrfachsteckplatz angeschlossen ist. In diesem Fall müssen Sie +#on("b")#gs-Prozess#off("b")# noch mitteilen, welche Steckkarten Sie verwenden. Dazu wird Ihnen die +folgende Auswahl angeboten: + + +----------------------------------+ + | Angabe der Interfacekarte: | + | | + | k  Kombikarte | + | e  E/A - Karte | + | d  D/A - Wandler - Karte | + | a  A/D - Wandler - Karte | + | 0  Keine Steckkarte | + | | + | Kombi  E/A  D/A  A/D  Keine | + +----------------------------------+ + + +#center#Abb.14:  Auswahl einer Interfacekarte + + +Wenn Sie eine Kombikarte, eine E/A-Karte oder eine D/A-Wandler-Karte verwenden, +ist durch die jeweilige Angabe der Einstellvorgang abgeschlossen. #on("b")#gs-Prozess#off("b")# teilt +Ihnen daraufhin - ähnlich wie bei der Compact-Box - jeweils die Belegung der Kanäle +mit. Bei Nutzung der D/A-Wandler-Karte wird zusätzlich der gültige Spannungs­ +bereich angezeigt. +#page# + + +------------------------------------------------------+ + | Einzelsteckplatz mit D/A - Karte: | + | | + | Belegung der Kanäle: | + | | + | Die Karte stellt einen Analogausgang zur Verfügung, | + | der auf zwei Arten angesprochen werden kann:        | + | | + | Kanal 1:    Spannungsbereich  -5 V  -  +5 V | + | | + | Kanal 2:    Spannungsbereich   0 V  -  +5 V | + | | + +------------------------------------------------------+ + +#center#Abb.15:  Kanalbelegung D/A-Karte (Einzelsteckplatz) + + +Haben Sie dagegen eine A/D-Wandler-Karte angegeben, so erfragt #on("b")#gs-Prozess#off("b")# noch +die Schalterstellung der DIP-Schalter auf der A/D-Wandler-Karte. Über diese Schalter­ +stellung kann der Spannungsbereich der Analogeingänge festgelegt werden. Das +erfolgt nach folgendem Prinzip: + +Das Spannungsintervall wird jeweils über 3 Schalter festgelegt. Für den Eingang 1 +stehen die Schalter 1, 2 und 3 zur Verfügung, für denn Eingang 2 die Schalter 4, 5 +und 6. Im folgenden werden wir die Einstellung für den Eingang 1 aufzeigen - für den +Eingang 2 ist mit den drei genannten Schaltern synonym zu verfahren. + +Steht Schalter 1 in der Position 'ON', so ist ein Spannungsintervall von 0V - 25V einge­ +stellt (Fall 1) - unabhängig von der Stellung der anderen beiden Schalter. Innerhalb +eines Schaltertripletts "dominiert" nämlich ein Schalter mit kleinerer Nummer über +den/die mit größerer Nummer. Ist Schalter 1 in Stellung 'OFF' und Schalter 2 in +Stellung 'ON', so ist ein Spannungsbereich von 0V - 2,5V eingestellt (Fall 2). Sind die +beiden ersten Schalter in der Position 'OFF' und nur der Schalter 3 in der Position +'ON', so ist ein Spannungsintervall von 0V - 0,25V eingestellt (Fall 3). +#page# +Eine besondere Bedeutung kommt noch den Schaltern 7 und 8 zu, denn sie beein­ +flussen noch die eben genannten Intervalle. Dabei ist überraschenderweise der +Schalter 7 für den Eingang 2 und der Schalter 8 für den Eingang 1 zuständig. Die drei +oben genannten Fälle gelten nämlich nur, wenn Schalter 8 in der Position 'OFF' steht. +In der Position 'ON' werden die durch das Schaltertriplett eingestellten Spannungs­ +intervalle dagegen symmmetrisch um 0V angelegt: im Fall 1 also der Bereich von +-12,5V - +12,5V, im Fall 2 von -1,25V - +1,25V und im Fall 3 von -0,125V - ++0,125V. + +----------------------------------------------------+ + | Angabe der Schalterstellungen auf der A/D - Karte: | + | | + | Bitte die aktuelle Schalterstellung eintragen: | + | | + | Es bedeutet: 1 - Schalterstellung "on" | + | 0 - Schalterstellung "off" | + | | + | Nummer: 12345678 | + | | + | Eingabe: 10010010 | + +----------------------------------------------------+ +#center#Abb.16:  A/D-Karte: Angabe der Schalterstellung + + +Der Spannungsbereich wird von #on("b")#gs-Prozess#off("b")# aus der Schalterstellung automatisch +ermittelt und neben den festgelegten Kanalnummer angezeigt. Die obige Schalter­ +stellung führt somit zu folgender Meldung: + + +----------------------------------------------------------------+ + | Einzelsteckplatz mit A/D - Karte: | + | | + | Zwei analoge Einträge stehen zur Vefügung: | + | | + | Kanal 1: (E1) Spannungsbereich 0.000 V  -  +25.000 V | + | | + | Kanal 2: (E2) Spannungsbereich -12.500 V  -  +12.500 V | + | | + +----------------------------------------------------------------+ +#center#Abb.17:  A/D-Karte: Kanalbel./Spannungsber.(Bspl.) +#page# +Während Sie bei Verwendung eines Einzelsteckplatzes nur einmal nach all diesen +Angaben gefragt werden, erfolgt die Abfrage bei einem Mehrfachsteckplatz viermal +hintereinander. Haben Sie einen Steckplatz nicht belegt, so tippen Sie bei der Angabe +der Interfacekarte die Taste <0> (keine Steckkarte). + + +#on("b")#5.3.2  Bedeutung der Kanalnummern#off("b")# + +Nachdem Sie #on("b")#gs-Prozess#off("b")# die Angaben zur Konfiguration (Steckplatzart/Interface­ +kartenart) mitgeteilt haben, teilt Ihnen das System jeweils die Kanalnummern mit. +Diese Nummern sollten Sie sich merken, denn wenn Sie mit dem von #on("b")#gs-Prozess#off("b")# zur +Verfügung gestellten Befehlen programmieren wollen, müssen Sie jeweils diese +Kanalnummern angeben. Fordern Sie von einem Kanal eine Aktion, die nicht ausge­ +führt werden kann/nicht sinnvoll ist, so kann Ihnen dadurch eine Fehlermeldung +zugestellt werden. + +Auf der Compact-Box bzw. der Kombikarte an einem Einzelsteckplatz ist die +Numerierung identisch: die beiden Analogeingänge haben die Kanalnummern 1 und +2, der Digitaleingang hat die Nummer 3 und der Digitalausgang die Nummer 4. + +Die E/A-Karte verfügt nur über je einen digitalen Eingang und digitalen Ausgang, die +über die Kanäle 1 und 2 angesprochen werden können. Damit nun aber auch +Programme, die für die Compact-Box bzw. eine Kombikarte geschrieben sind, auch +auf der E/A-Karte laufen, können diese beiden Kanäle auch unter der Kanalnummer +3 (Eingang) bzw. 4 (Ausgang) angesprochen werden. Natürlich ist ein solches +Programm nur dann auf der E/A-Karte lauffähig, wenn keine Analogeingänge ange­ +sprochen werden, denn die sind ja auf der E/A-Karte gar nicht vorhanden! + +Die Kanalnummern auf einem Mehrfachsteckplatz werden nach folgendem System +vergeben: Die Kanalnummern sind immer zweistellig. Über die erste Ziffer wird der +Steckplatz (1 - 4) identifiziert, über die zweite Ziffer der eigentliche Kanal auf der +Steckkarte. Steckt also z.B. in Steckplatz 3 eine Kombikarte (4 mögliche Kanäle) und +möchten Sie hier den Digitalausgang (Kanal 4) ansprechen, so muß als Kanal die +Nummer 34 angegeben werden. +#page# +Aber auch hier gibt es eine zusätzliche Vereinbarung: Der erste Steckplatz eines +Mehrfachsteckplatzes kann (zusätzlich) wie ein Einzelsteckplatz angesprochen +werden. Bei Belegung des ersten Steckplatzes mit einer Kombikarte, können Sie die +Karte also über die Kanalnummern 11, 12, 13 und 14 ansprechen und zusätzlich +über die Nummern 1, 2, 3 und 4. Der Sinn der dahintersteckt ist Ihnen sicher sofort +klar geworden: Dadurch kann ein Programm, das z.B. für die Compact-Box ge­ +schrieben wurde, ohne Änderung übernommen werden, wenn eine Kombikarte auf +Steckplatz 1 des Mehrfachsteckplatzes steckt etc.. + + +#on("b")#5.4  Aus- und Eingabetest#off("b")# + +Nun wird es spannend, denn Sie sollen jetzt testen, ob Sie mit Ihrem Interface-System +arbeiten können. Sofern Sie mit dem MUFI als Adapter arbeiten, schalten Sie das +MUFI mit dem Schalter an der Vorderseite ein. + +Wenn Sie das MUFI im Terminalkanal betreiben, kann das Einschalten dazu führen, +daß eine unsinnige Zeichenkette auf dem Bildschirm erscheint. Diese Zeichen +werden durch den "Einschaltknack" verursacht und haben eigentlich nichts zu +bedeuten. Allerdings läßt sich die Ausgabe auch nicht verhindern. Die Zeichen ver­ +schwinden bei der nächsten Menubedienung. + +Wenn Sie alle Hinweise in Kapitel 5.1 beachtet haben, müßte spätestens jetzt das +Interface-System betriebsbereit sein - gleichgültig, welchen Adapter und welche +Interface-Komponenten Sie verwenden. + +Aktivieren Sie nun den Menupunkt 'Ausgabetest', indem Sie z.B. die Taste +tippen. Wenn Sie eine Compact-Box angeschlossen haben, müßte die folgende Ein­ +blendung in Ihrem Menubildschirm erscheinen: +#page# + +-------------------------------------------------------------+ + | Ausgabetest | + | | + | Ausgabe an Kanal 4 (= Digitalausgang der Compact-Box) | + |-------------------------------------------------------------| + | | + | | + | | + | Ausgabewert: 129 | + | | + |-------------------------------------------------------------| + | Bitte einen Wert zwischen 0 und 255 eingeben! | + | | + +-------------------------------------------------------------+ +#center#Abb.18:  Ausgabetest - Einblendung + + +Eine nahezu identische Einblendung erhalten Sie, wenn Sie einen Einzelsteckplatz +mit Kombi- oder E/A-Karte angeschlossen haben. + +Da beim Ausgabetest nur die Ausgänge einer Karte angesprochen werden, ist ein +Ausgabetest an einer A/D-Wandler-Karte nicht möglich! An einer D/A-Wandler-Karte +kann zwar prinzipiell ein Ausgabetest erfolgen - ist aber nicht sinnvoll, da die zur +Kontrolle notwendige Leuchtdiodenanzeige hier nicht angeschlossen werden kann. + +Wenn Sie einen Mehrfachsteckplatz angeschlossen haben, werden Sie zuvor noch +gefragt, welchen Steckplatz Sie testen wollen. Bitte beachten Sie hier das im vorigen +Abschnitt Gesagte. Ansonsten ist auch hier die anschließende Einblendung nahezu +identisch. + +Zum Testen geben Sie jetzt einige Werte zwischen 0 und 255 ein. Nach jeder Eingabe +tippen Sie bitte die -Taste. Bei Eingabe der '0' müßten alle Leucht­ +dioden dunkel sein. Bei '1' dürfte nur die letzte Leuchtdiode (rechts) aufleuchten, +bei 128 nur die erste (links); bei 255 müßten alle 8 Leuchtdioden der Anzeige auf­ +leuchten. +#page# +Sollten wider Erwarten Fehler aufgetreten sein, lesen Sie bitte im Kapitel 5.5 nach. +Wenn alles wie beschrieben funktioniert hat, gehen Sie gleich zum Eingabetest über. +Verlassen Sie dazu den Ausgabetest durch die Tastenfolge und +aktivieren Sie anschließend den Menupunkt 'Eingabetest' indem Sie z.B. die Taste + tippen. + +Außer bei der E/A-Karte im Einzelsteckplatz werden Sie hier zusätzlich nach der +Nummer des Kanals gefragt, über den der Einlesetest erfolgen soll. Das liegt daran, +daß sich auf den meisten Interfacesystemen mehrere Eingänge befinden. Beim +Einzelsteckplatz werden die Auswahlmöglichkeiten vorgegeben; beim Mehrfachsteck­ +platz erfolgt eine freie Eingabe der Kanalnummern. + +Wenn Sie eine Compact-Box angeschlossen haben, müßte die folgende Einblendung +in Ihrem Menubildschirm erscheinen: + + +-------------------------------------------------------------+ + | Eingabetest | + | | + | Eingabe von Kanal 3 (= Digitaleingang der Compact-Box) | + | | + |-------------------------------------------------------------| + | | + | | + | Eingelesener Wert: 129 | + |-------------------------------------------------------------| + | | + +-------------------------------------------------------------+ + +#center#Abb.19:  Eingabetest - Einblendung + + +Wenn Sie den Codekartenleser am Digitaleingang angeschlossen haben und alles +korrekt funktioniert, müßte als eingelesener Wert die Zahl 255 erscheinen. Legen Sie +eine Lochkarte ein oder legen Sie einen Finger zwischen Beleuchtung und Licht­ +sensoren. Daraufhin müßte sich die Anzeige auf dem Bildschirm ändern. Nun +können Sie versuchen, durch Abdecken der Sensoren die bei der Ausgabe schon +angesprochenen Testwerte zu erhalten. +#page# +Wenn Sie über keinen Codekartenleser verfügen, so benutzen Sie jetzt bitte das kleine +Kabelstück, das Sie auf den +5V-Lötschuh aufgesteckt haben und dessen anderes +Ende bisher noch nirgendwo aufgesteckt ist. Berühren Sie nun mit diesem freien +Ende die Stifte, die im 8poligen Eingangs-Platinenstecker sichbar sind. Wird kein Pin +berührt, müßte auf dem Bildschirm der Wert '0' erscheinen. Berühren Sie einen der +Pins an der Seite, müßte der Wert '1', berühren Sie den an der anderen Seite, müßte +der Wert '128' erscheinen. Wenn Sie also nacheinander die Pins berühren, müßten +die Zahlenwerte 1, 2, 4, 8, 16, 32, 64, 128 erscheinen. + +Wenn sowohl Ausgabe- als auch Eingabetest korrekt abgewickelt werden konnten, +brauchen Sie das Kapitel 5.5 nicht zu lesen, denn das beschäftigt sich nur mit +Fehlern, die bisher aufgetreten sein könnten. Den Eingabetest verlassen Sie bitte +durch die Tastenfolge . + + +#on("b")#5.5  Mögliche Fehlerfälle#off("b")# + +#on("b")# +- Das MUFI wurde in den Terminalkanal eingebaut. Selbst beim vom Netz + getrennten MUFI ist kein Terminalbetrieb möglich: +#off("b")# + + --> Das neu eingefügte Kabel ist unzureichend oder falsch verdrahtet. Bitte + Hinweise im MUFI-Handbuch lesen bzw. Informationen von BICOS ein­ + holen. + + +#on("b")# +- Das MUFI wurde in den Terminalkanal eingebaut. Beim Einschalten des + MUFIs erscheinen unsinnige Zeichenketten auf dem Bildschirm bzw. das + Einschalten hat noch schwerwiegendere Folgen: #off("b")# + + --> Der "Einschaltknack" des MUFI "schlägt auf andere Systemkomponenten + durch". Sofern nur Zeichen auf dem Bildscchirm erscheinen, ist das weit­ + gehend unproblematisch - kann auch nicht beseitigt werden. Ansonsten + erst das MUFI, dann das Terminal bzw. den Rechner einschalten. Ggf. + Rücksprache mit BICOS. +#page# +#on("b")# +- Das MUFI wurde in den Terminalkanal eingebaut. Bei ausgeschaltetem + MUFI ist ein einwandfreier Terminalbetrieb möglich, bei einge­ + schaltetem MUFI reagiert das Terminal nicht mehr: +#off("b")# + + --> MUFI- und Terminalkonfiguration passen nicht zueinander (Baudrate, + Protokoll, Anzahl der Stopbits). Einstellungen am Terminal, in der Task + 'configurator' und die DIP-Schalter-Stellung im MUFI kontrollieren; ggf. + Neueinstellung. + + --> MUFI defekt - Rücksprache mit BICOS. + + +#on("b")# +- Beim Austest erscheint die Einblendung "Interface ist noch nicht + konfiguriert!": +#off("b")# + + --> #on("b")#gs-Prozess#off("b")# wurde noch nicht konfiguriert. Unter dem Oberbegriff 'Inter­ + face' den Menupunkt 'Konfigurieren' aktivieren und den Ausführungen in + Kapitel 5.3 folgend die Konfiguration vornehmen. + + --> Bei Betrieb des Interface Systems an separater serieller Schnittstelle werden + unbenannte Sohntasks eingerichtet (unter der eigenen Task bzw. unter + einer "zentralen Abwicklungstask"). Diese unbenannte Sohntask wurde + irrtümlich gelöscht. Abhilfe: Neukonfiguration vornehmen. #on("b")#*)#off("b")# + + --> Bei Betrieb des Interface-Systems an separater serieller Schnittstelle und + "zentraler Abwicklungstask" wurde in der "zentralen Abwicklungs-Task" + eine Neukonfiguration von #on("b")#gs-Prozess#off("b")# vorgenommen. Die dabei ent­ + standene unbenannte Sohntask wird von den "alten" Sohntasks nicht mehr + erkannt. Abhilfe: Alle Sohntasks, die auf die "zentrale Abwicklungstask" + zugreifen, löschen und neu einrichten. #on("b")#*)#off("b")# +#page# +#on("b")# +- Es erscheint die Fehlermeldung "Interface meldet sich nicht!": +#off("b")# + + --> Der angeschlossene Adapter ist ohne Spannungsversorgung. Netzstecker + des Adapters überprüfen. Beim MUFI den Schalter an der Vorderseite in + Stellung 'Ein' bringen. Beim RS232-Adapter den 3poligen Platinenstecker + in die 12V-Spannungsversorgungsbuchse am Interface-System einstecken. + + --> Es wurde bei der Installation von #on("b")#gs-Prozess#off("b")# eine falsche Interface- + Kanal-Nummer angegeben. Die Kanalnummer kann mit 'put(interface­ + kanal) ' erfragt werden. Kanalnummer überprüfen. Ggf. neue + Kanalnummer angeben. Dafür steht die Prozedur 'PROC interfacekanal + (INT CONST nummer)' zur Verfügung. + + --> Speziell beim MUFI: Das MUFI wurde zwischenzeitlich (versehentlich) + ausgeschaltet oder es kam zu einem "ungeregeltem Bedienungsabbruch" + z.B. durch Drücken der SV-Taste im laufenden Betrieb. Die interne Ein­ + stellung des MUFIs ist verändert. Abhilfe: Menupunkt verlassen, MUFI + ausschalten, einige Sekunden warten, MUFI anschalten, Menupunkt neu + anwählen. + + +#on("b")# +- Es erscheint die Fehlermeldung "Interface-Kanal ist belegt!: +#off("b")# + + --> Das Interface-System ist an einer separaten seriellen Schnittstelle ange­ + schlossen. Am Kanal wurden schon andere Geräte betrieben, die nicht + ordentlich abgemeldet wurden. Mit 'taskinfo (2) ' kann die + Belegung der Kanäle eingesehen werden. Ggf. erst ein Terminal an den + Kanal anschließen (Kanal umkonfigurieren!) und dort 'break + ' geben. Oder von einer privilegierten Task aus die ange­ + koppelte Task "abschießen". + + --> Das Interface-System ist an einer separaten seriellen Schnittstelle ange­ + schlossen. Eine andere Task greift bereits auf das Interface-System am + eingestellten Kanal zu. Benutzer bitten, den Kanal freizugeben. #on("b")#*)#off("b")# +#page# +#on("b")# +- Es erscheint die Fehlermeldung "Interface-Task ist besetzt!": +#off("b")# + + --> Das Interface-System ist an einer separaten seriellen Schnittstelle ange­ + schlossen. Die Kommunikation erfolgt über eine "zentrale Abwicklungs­ + task". Auf diese Task greift zur Zeit ein anderer Benutzer zu. Mit dem + anderen Benutzer verständigen und warten, bis die Task freigegeben wird. + #on("b")#*)#off("b")# + + +#on("b")# +- Es erschient die Fehlermeldung "An Kanal ... ist keine Digitaleingabe + (Digiatalausgabe, Analogeingabe, Analogausgabe) möglich!": +#off("b")# + + --> Laut Konfiguration ist die gewünschte Leistung am angegebenen Kanal auf + der angeschlossenen Interfacekarte nicht möglich. Kanal neu konfigurieren + oder anderen Kanal ansprechen bzw. Interface-Karte wechseln und neu + konfigurieren. + + +#on("b")# +- Es erschient die Fehlermeldung "Kanalnummer ... ist unzulässig!": +#off("b")# + + --> Es wurde eine - bezogen auf das angeschlossene Interface-System - un­ + sinnige Kanalnummer angegeben. Diese Fehlermeldung erscheint in jedem + Falle, wenn die Kanalnummer kleiner als 1 oder größer als 49 ist! Abhilfe: + korrekte Kanalnummer angeben. + + +#on("b")# +- Es erschient die Fehlermeldung "Interface kann nicht geöffnet werden!": +#off("b")# + + --> Interessanter Fehler! Bitte alle Details der Fehlersituation notieren und an + ERGOS einsenden! +#page# +#on("b")# +- Beim Austest erscheint zwar keine Fehlermeldung, aber die Leucht­ + diodenanzeige zeigt auf verschiedene Ausgabewerte keine Reaktion + (bleibt dunkel oder unsinnige fixe Anzeige): +#off("b")# + + --> Die angeschlossene Leuchtdiodenanzeige ist nicht korrekt angeschlossen. + Platinenstecker (Digitalausgang) überprüfen; Massekabel überprüfen; die + beiden Überbrückungskabel (Abb.7) überprüfen. + + --> Steckplatz/Compact-Box wird nicht mit Spannung versorgt. Netzkabel/An­ + schluß zum Netzteil überprüfen. + + --> Verbindungskabel Adapter - Interface-System nicht richtig aufgesteckt oder + intern falsch verdrahtet. + + +#on("b")# +- Beim Austest erscheinen verschiedene Ausgabemuster an den Leucht­ + dioden, die Muster sind aber nicht korrekt: +#off("b")# + + --> Kabel vom Adapter zum Interface ist falsch verdrahtet. + + --> Kabel in der Leuchtdiodenanzeige (Selbstbau ?) sind falsch verdrahtet. + + +#on("b")#*)#off("b")# Die hier genannten Fehlermeldungen sind bei der oben beschriebenen Erst­ + installation (noch) nicht möglich. Sie können erst auftreten, wenn weiter­ + gehende Installationen erfolgt sind (z.B. Installation einer "zentralen Abwick­ + lungs-Task" etc.). Zum Verständnis lesen Sie bitte das Kapitel "Hinweise für den + Systembetreuer/Programmierer". + + + + + + + + diff --git a/doc/prozess/gs-prozess-6 b/doc/prozess/gs-prozess-6 new file mode 100644 index 0000000..a3835cd --- /dev/null +++ b/doc/prozess/gs-prozess-6 @@ -0,0 +1,641 @@ +limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (1)# +#headodd# +#center#gs-Prozess#right#% + +#end# +#headeven# +%#center#gs-Prozess + +#end# +#center#1 + +#on("b")#6  Arbeiten mit gs-Prozess#off("b")# + +In diesem Kapitel werden wir Ihnen die Basisbefehle von #on("b")#gs-Prozess#off("b")# vorstellen und +erläutern, was die einzelnen Befehle bewirken. Dabei werden wir an einfachen +Beispielen aufzeigen, wie Sie mit #on("b")#gs-Prozess#off("b")# arbeiten können. + +Wir gehen hier davon aus, daß die Hardware-Voraussetzungen erfüllt, das Interface- +System angeschlossen und die Software (#on("b")#gs-Prozess#off("b")#) auf dem Rechner installiert +sind. Sie sollten #on("b")#gs-Prozess#off("b")# bereits konfiguriert und einen Ein- und Ausgabetest +durchgeführt haben. + +In unserer Beschreibung gehen wir weiterhin davon aus, daß als Interface-System +eine Compact-Box verwendet wird. Alle hier beschriebenen Beispiele gelten ganz +genauso für einen Einzelsteckplatz mit Kombikarte (hier müssen Sie nur zusätzlich +eine Leuchtdiodenanzeige anschließen - aber Sie wissen ja schon, wie das gemacht +wird.) Bei anderen Hardware-Konfigurationen ist darauf zu achten, daß ggf. andere +Kanalnummern anzugeben sind. + +Die Compact-Box verfügt - genau wie die Kombikarte - über zwei analoge Eingänge +(Kanal 1 und Kanal 2), über einen digitalen Eingang (Kanal 3) sowie über einen +digitalen Ausgang (Kanal 4). Wie Sie schon bei der Konfiguration von #on("b")#gs-Prozess#off("b")# +gesehen haben, haben Sie keinen Einfluß auf die Numerierung der Kanäle - die wird +vom #on("b")#gs-Prozess#off("b")# vorgegeben. Diese Kanalnummer müssen Sie kennen, wenn Sie das +System ansprechen (programmieren) wollen (ggf. können Sie die Kanalnummern +durch Aktivieren des Menupunktes 'Information' unter dem Oberbegriff 'Interface' +erfragen). + + +#on("b")#6.1  Kleine Beispiele zur digitalen Ausgabe#off("b")# + +Bei diesem Einführungsbeispiel wollen wir uns zunächst ausschließlich auf die +digitale Ausgabe beschränken. Wenn Sie die Compact-Box (oder eine E/A-Karte) +angeschlossen haben, benötigen Sie hierzu keine zusätzliche Hardware, ansonsten +schließen Sie bitte an Ihren digitalen Ausgang eine 8-elementige Leuchtdiodenanzeige +an. +#page# +Sie haben sicher schon an einer Autobahnbaustelle ein sogenanntes "Lauflicht" +gesehen. Es erscheint, als ob ein Licht über die aufgestellten Barken hinwegläuft. +Dadurch soll auf die Baustellenein- bzw. -ausfahrt hingewiesen werden. Dieser Effekt +wird dadurch erreicht, daß die Lampen, die an den Barken angebracht sind, nach­ +einander ein- und auch wieder ausgeschaltet werden. + +Wir wollen jetzt auf unserer 8-elementigen Leuchtdiodenanzeige ein solches Lauflicht +nachbilden. Dabei soll das "Licht von rechts nach links über die Anzeige wandern". + +Um das Programm zu schreiben, aktivieren Sie im #on("b")#gs-Prozess#off("b")#-Menu unter dem +Oberbegriff "Programm" den Menupunkt "Neu erstellen". Sie werden dann nach +einem Namen gefragt, den Sie der Programmdatei geben wollen. Tragen Sie hier +einen beliebigen Namen ein, und tippen Sie anschließend die -Taste. +Notieren Sie dann das folgende ELAN-Programm: + +#on("b")# + initialisiere interface; + REP + lauflichtdurchgang; + warte (2.0) + UNTIL abbruch gewuenscht PER. + + lauflichtdurchgang: + bitmuster ausgeben (4, "OOOOOOOI"); + bitmuster ausgeben (4, "OOOOOOIO"); + bitmuster ausgeben (4, "OOOOOIOO"); + bitmuster ausgeben (4, "OOOOIOOO"); + bitmuster ausgeben (4, "OOOIOOOO"); + bitmuster ausgeben (4, "OOIOOOOO"); + bitmuster ausgeben (4, "OIOOOOOO"); + bitmuster ausgeben (4, "IOOOOOOO") +#off("b")# + + +Wenn Sie das Programm fertiggeschrieben haben, verlassen Sie die Datei durch die +Tastenfolge . Sie gelangen wieder zum Menu und aktivieren jetzt den +Menupunkt "Starten". Daraufhin wird das Programm übersetzt und ausgeführt. +#page# +#on("b")#6.1.1  Möglichkeit eines Programmabbruchs#off("b")# + +Wir hoffen natürlich, daß das Programm genau die Ausgabe an der Leuchtdioden­ +anzeige erzeugt, die Sie erwartet haben. + +Als Ausgangsbedingung der Schleife haben wir den Testbefehl 'abbruch gewuenscht' +verwendet. Dieser Befehl wird von #on("b")#gs-Prozess#off("b")# zur Verfügung gestellt. Durch den +Testbefehl wird überprüft, ab zwischenzeitlich die Tastenkombination +eingegeben wurde. Ist das bei unserem Programm der Fall, so wird die Schleife +('regulär') beendet. + +Aber bitte etwas Geduld: Das Programm wird nicht sofort nach Eingabe der Tasten­ +folge "abgebrochen". Hat nämlich gerade ein neuer 'lauflichtdurchgang' begonnen, +so wird das Refinement natürlich erst vollständig abgearbeitet. Erst dann wird +geprüft, ob die Tastenfolge zwischenzeitlich eingegeben wurde. + +Sollten Sie einmal in einer Situation sein, in der Sie ein Programm tatsächlich +abbrechen müssen, so ist das (in den meisten Fällen) über die Tastenfolge + möglich. Diese Tastenkombination sollten Sie sich für "Notfälle" +merken. Vielleicht probieren Sie sie gleich an unserem Beispiel aus. + + +#on("b")#6.1.2  Die "sonstigen" Befehle#off("b")# + +Gehen wir zunächst auf die beiden Befehle 'initialisiere interface' und 'warte' sowie +auf den Testbefehl 'abbruch gewuenscht ein: + +#on("b")# +PROC initialisiere interface +#off("b")# + + Jedes Programm zur Prozeßdatenverarbeitung, das auf das Interface-System + zugreift, sollte mit diesem Befehl beginnen. Durch diesen Befehl wird das System + in einen definierten Anfangszustand versetzt; systeminterne Variablen werden + initialisiert, so daß vom Programm aus darauf zugegriffen werden kann. +#page# +#on("b")# +PROC warte (REAL CONST wert) +PROC warte (INT CONST wert) +#off("b")# + + Der Befehl 'warte' ähnelt dem Ihnen sicher bekannten Befehl 'pause'. Allerdings + wird hier als Parameter (INT oder REAL) die Wartezeit in Sekunden angegeben - + bei 'pause' dagegen die Anzahl der Zehntelsekunden. Der eigentliche Unterschied + besteht aber darin, daß 'warte' im Gegensatz zu 'pause' ein "Nothalt" - d.h. die + Tastenkombination , die wir im vorigen Kapitel beschrieben haben + - registriert. Aus diesem Grunde sollte in Prozeßdatenverarbeitungsprogrammen + mit 'warte' statt mit 'pause' gearbeitet werden. + + +#on("b")# +BOOL PROC abbruch gewuenscht +#off("b")# + + Die Prozedur liefert den Wert 'TRUE', wenn zwischenzeitlich die Tasten­ + kombination eingegeben wurde, sonst den Wert 'FALSE'. + + +#on("b")#6.1.3  Schreibweise für Bitmuster/Bitsymbole#off("b")# + +Beim Befehl 'bitmuster ausgeben', wird eine Zeichenkette, die aus 8 Zeichen besteht, +übergeben - das sog. Bitmsuster. In unserem Falle kommen hier nur die Zeichen 'I' +und 'O' vor. Ihnen ist sicher die Bedeutung sofort klar gewesen: + + 'I' bedeutet, daß an der entsprechenden Position ein High-Pegel (5V) angelegt + werden soll; 'O' bedeutet, daß an der entsprechenden Position ein Low- + Pegel (0V) angelegt werden soll. + +So werden über den ersten Befehl im Refinement 'lauflichtdurchgang' alle Leucht­ +dioden ausgeschaltet, nur die Leuchtdiode ganz rechts wird angeschaltet. Über den +zweiten Befehl wird diese wieder ausgeschaltet und dafür aber die zweite von rechts +eingeschaltet usw. +#page# +Neben den Zeichen 'I' und 'O' dürfen auch die Zeichen 'X' und 'T' in der über­ +gebenen Zeichenkette auftauchen. Um die Bedeutung zu verstehen, muß man +wissen, daß #on("b")#gs-Prozess#off("b")# den jeweils letzten Zustand des digitalen Ausgangs speichert +(durch 'initialisiere interface' werden alle Ausgänge auf 'O' gesetzt). + + 'X' bedeutet, daß an der entsprechenden Position der zuletzt dagewesene + Zustand erhalten bleibt, d.h. durch diese Ausgabe nicht beeinflußt wird. + + 'T' bedeutet, daß an der entsprechenden Position der zuletzt dagewesene + Zustand "umgekehrt" wird. Lag zuletzt ein Low-Pegel (O) an, so wird + daraus ein High-Pegel (I) und umgekehrt. + +Sie können sich nun sicher sofort erklären, was das folgende Programm bewirkt: + + +#on("b")# + initialisiere interface; + bitmuster ausgeben (4, "OIOIOIOI"); + REP + bitmuster ausgeben (4, "TTTTTTTT"); + warte (1) + UNTIL abbruch gewuenscht PER +#off("b")# + + +Durch den ersten Befehl 'bitmuster ausgeben' wird jede zweite Leuchtdiode ange­ +schaltet, die anderen werden ausgeschaltet. Durch den zweiten Befehl in der Schleife +wird nun jeweils jeder Zustand in "das Gegenteil umgekehrt", so daß ein Blinklicht +entsteht, bei dem abwechselnd einmal die einen vier, dann die anderen vier Leucht­ +dioden aufleuchten - und das jeweils für eine Sekunde. + + +#on("b")#6.1.4  Befehle für die digitale Ausgabe#off("b")# + +Einen Befehl, mit dem der digitale Ausgang des Interfaces angesprochen werden +kann, haben Sie schon in Kapitel 6.1 kennengelernt: +#page# +#on("b")# +PROC bitmuster ausgeben (INT CONST kanal, + TEXT CONST zeichenkette) +#off("b")# + +Über den ersten Parameter wird der Kanal angegeben, über den der digitale Ausgang +angesprochen werden kann; bei uns ist das der Kanal 4 auf der Compact-Box. Über +den zweiten Parameter wird das sogenannte Bitmuster übergeben; ein Text, der aus +genau 8 Zeichen besteht. Dabei dürfen die Zeichen "I, O, X und T verwendet werden +(sehen Sie dazu auch Kapitel 6.1.3). + +#on("b")#gs-Prozess#off("b")# stellt noch zwei weitere Befehle für die digitale Ausgabe zur Verfügung. +Um die Wirkungsweise der Befehle zu verdeutlichen, hier das erste Beispiel (das +Lauflicht) in einer zweiten Version: + +#on("b")# + initialisiere interface; + REP + lauflichtdurchgang; + warte (2.0) + UNTIL abbruch gewuenscht PER. + + lauflichtdurchgang: + INT VAR zeiger; + FOR zeiger FROM 0 UPTO 7 REP + schalte aktuelle leichtdiode an; + schalte vorgaenger aus + PER. + + schalte aktuelle leuchtdiode an: + bitsymbol ausgeben (4, zeiger, "I"). + + schalte vorgaenger aus: + IF zeiger = 0 + THEN bitsymbol ausgeben (4, 7, "O") + ELSE bitsymbol ausgeben (4, zeiger - 1, "O") + FI. +#off("b")# + +#on("b")# +PROC bitsymbol ausgeben (INT CONST kanal, bitnummer, + TEXT CONST zeichen) +#off("b")# +#page# +Während durch den Befehl 'bitmuster ausgeben' auf alle 8 Ausgänge gleichzeitig +Einfluß genommen werden kann, wird mit dem Befehl 'bitsymbol ausgeben' gezielt +nur genau einer der 8 Ausgänge, d.h. eines der 8 Bits manipuliert. Welcher Ausgang / +welches Bit manipuliert werden soll, wird über den zweiten Parameter festgelegt: hier +kann einer der Werte 0...7 angegeben werden (Beachten Sie die Numerierung der +Ausgänge (!)). + +Als dritter Parameter wird ein Text übergeben, der aus genau einem Zeichen +bestehen muß. Ebenso wie beim Befehl 'bitmuster ausgeben' sind hier die Zeichen I, +O, X und T zulässig. Sie haben hier auch die gleiche Bedeutung. + +Mit dem dritten Ausgabebefehl für den digitalen Ausgang können wir das Beispiel +noch in einer dritten Version notieren: + +#on("b")# + initialisiere interface; + REP + lauflichtdurchgang; + warte (2.0) + UNTIL abbruch gewuenscht PER. + + lauflichtdurchgang: + INT VAR wert :: 1; + REP + dezimalwert ausgeben (4, wert); + wert := 2 * wert + UNTIL wert > 128 PER. +#off("b")# + +#on("b")# +PROC dezimalwert ausgeben (INT CONST kanal, wert) +#off("b")# + +'wert' kann Werte zwischen 0 und 255 annehmen. Das zugehörige Bitmuster wird +dann am angegebenen Kanal ausgegeben. Anhand dieses Befehls wird Ihnen sicher +auch klar, warum gerade die oben beschriebene Numerierung der Bits gewählt +wurde. +#page# +#on("b")#6.1.5  Befehle für die analoge Ausgabe#off("b")# + +Neben der 'digitalen' Ausgabe ist auch eine 'analoge' Ausgabe möglich. Allerdings +wollen wir die Beschreibung der Befehle an dieser Stelle sehr kurz halten, denn eine +"analoge" Ausgabe ist nur möglich, wenn Sie eine D/A-Karte besitzen. + +Auf der D/A-Karte steht nur ein physikalischer Ausgabekanal zur Verfügung, der von +#on("b")#gs-Prozess#off("b")# jedoch über zwei Kanalnummern angesprochen werden kann. + +Über den Ausgabekanal 1 können Spannungswerte zwischen -5V und +5V aus­ +gegeben werden, über den Ausgabekanal 2 Spannungswerte zwischen 0V und +5V. + +Dafür stellt #on("b")#gs-Prozess#off("b")# zwei Befehle bereit: + +#on("b")# +PROC spannungswert ausgeben (INT CONST kanal, + REAL CONST wert) +#off("b")# + +'wert' kann, in Abhängigkeit vom angegebenen Kanal, Werte zwischen -5.0 und +5.0 +(bei Kanal 1) bzw. 0.0 und +5.0 (bei Kanal 2) annehmen. Bei dem Versuch, Werte +außerhalb dieser Grenzen anzugeben, erhalten Sie die Fehlermeldung "Der +Spannungswert ... ist nicht zulässig!". + + +#on("b")# +PROC wert an analogausgang ausgeben (INT CONST kanal, wert) +#off("b")# + +Für 'wert' kann eine Zahl zwischen 0 und 255 angegeben werden. Dabei wird 0 auf +den kleinstmöglichen Spannungswert am jeweilgen Kanal (bei Kanal 1 also auf -5V, +bei Kanal 2 auf 0V) und 255 auf den größtmöglichen Spannungswert am jeweilgen +Kanal (bei beiden Kanälen auf +5V) abgebildet. Das Intervall zwischen kleinst- und +größtmöglichem Spannungswert wird in 255 gleichgroße Teilintervalle eingeteilt. Es +wird nun die Spannung ausgegeben, die der Intervallnummer entspricht. +Anmerkung: Dieser Befehl hat nur einen "geringen praktischen Nutzwert"; er dient + vornehmlich dazu, den Wandlungsprozeß zu verdeutlichen. +#page# +#on("b")#6.2  Kleine Beispiele zur digitalen Eingabe#off("b")# + +Für die im folgenden beschriebenen kleinen Beispiele benötigen Sie einen Code­ +kartenleser und einige Codekarten (können auch von der Fa. AKTRONIK bezogen +werden). Der Anschluß des Codekartenlesers an Ihr Interface-System ist denkbar +einfach. Stecken Sie den 8poligen Platinenstecker des Codekartenlesers in die Buchse +des Digitaleinganges der Steckkarte bzw. der Compact-Box und den 3poligen +Platinenstecker in die passende Spannungsversorgungsbuchse (12V) am Steckplatz +bzw. auf der Compact-Box - fertig! Bei eingeschalteter Betriebsspannung müßte nun +der Codekartenleser beleuchtet sein. + +Auf den Lochkarten sind bis zu 8 Löcher eingestanzt. Dabei können bestimmte +Löcher (Bits) für die Erfassung definierter Merkmale verwendet werden. Dazu kann +eine Karte in bestimmte Bereiche aufgeteilt werden. + +In unserem kleinen Beispiel stellen wir uns vor, daß eine (Modell-)Sparkasse zwei +Filialen hat. Sie hat an Ihre "Kunden" Codekarten verteilt. Die Filialen sind durch +Farben gekennzeichnet. Die oberen (höchstwertigen) zwei Bits der Karte sollen diese +Farbe kodiert enthalten, damit auch der "Sparkassen-Computer" die Farbe schnell +ermitteln kann. Die Karte soll folgenden Aufbau haben: + + +---------------------------------+ + | O o o O o o O | + | | | + | Farbbits| Kundennummer | + | | | + | | | + | | | + | | + +---------------------------------+ + + +#center#Abb.20 Beispiellochkarte +#page# +Bit 7 sei für rote, Bit 6 für grüne Farbe gesetzt, d.h. gelocht. Wie wollen jetzt ein +Programm erstellen, das auf Eingabe einer Karte deren Farbe und den durch die +ersten 6 Bits bestimmten Wert (Kundennummer) ausgibt: + +#on("b")# + initialisiere interface; + REP + erfasse lochkarte + UNTIL abbruch gewuenscht PER. + + erfasse lochkarte: + warte bis karte im leser; + gib farbe aus; + gib kundennummer aus; + warte bis keine karte im leser. + + warte bis karte im leser: + put ("Bitte eine Codekarte einlegen!"); line; + WHILE NOT alles abgedunkelt REP + tue nichts + END REP; + WHILE alles abgedunkelt REP + tue nichts + END REP; + warte (1). + + warte bis keine karte im leser: + put ("Bitte die Karte entnehmen!"); + REP + tue nichts + UNTIL alles beleuchtet PER. + + alles abgedunkelt: + bitmuster (3) = "OOOOOOOO". + + alles beleuchtet: + bitmuster (3) = "IIIIIIII". + + gib farbe aus: + IF bitsymbol (3, 7) = "I" + THEN put ("rote Karte"); line + ELSE put ("grüne Karte");line + FI; +#page# + gib kundennummer aus: + INT VAR kundennummer :: 0, bitnummer; + FOR bitnummer FROM 0 UPTO 5 REP + registriere gesetztes bit + PER; + put ("Kundennummer:"); put (kundennummer): line. + + registriere gesetztes bit: + IF bit ist gesetzt (3, bitnummer) + THEN kundennummer INCR (2 ** bitnummer) + FI. + + +#off("b")# + (Hinweis: Es handelt sich hier um ein Beispielprogramm, an dem diverse + Befehle erläutert werden sollen - die Programmierung ist nicht + optimal! Im Refinement 'warte bis karte im leser' ist es z.B. + günstiger, solange einzulesen, bis der eingelesene Wert "stabil" ist. + Auch das Refinement 'registriere gesetztes bit' würde man so nicht + programmieren, sondern nach einem Einlesevorgang (Bitmuster) + über Textoperationen aus dem Bitmuster die 'kundennummer' + ermitteln...). + +Bevor wir Ihnen die Funktionsweise der von #on("b")#gs-Prozess#off("b")# bereitgestellten Prozeduren +im Detail erläutern, möchten wir Ihnen noch ein paar kurze Erläuterungen zum +obigen Programm geben. + +Besondere Aufmerksamkeit sollten Sie den Refinements 'warte bis karte im leser' und +'warte bis keine karte im leser' schenken. Im erstgenannten Refinement ist sicherzu­ +stellen, daß das Einschieben der Karte (erst muß alles abgedunkelt werden - dann +müssen einige Positionen beleuchtet sein) registriert wird. Um Fehlauswertungen der +Karte zu vermeiden (z.B. beim Verkanten einer Karte) wird zur Sicherheit vor der +Auswertung eine Sekunde gewartet. Am Ende des Lesevorgangs soll sichergestellt +werden, daß die Karte auch entnommen worden ist (alle Positionen wieder beleuchtet +sind). +#page# +Wir prüfen im Refinement 'gib farbe aus' nur das 7. Bit (sehen Sie die Erklärung zu +'bitsymbol'). Ist das Bit gesetzt (die Karte hier gelocht), so identifizieren wir die Farbe +Rot, sonst Grün. Natürlich ist es möglich, mit 2 "Farbbits" vier Farben zu ver­ +schlüsseln: z.B. Rot, wenn nur Bit 7 gesetzt ist; Grün, wenn nur Bit 6 gesetzt ist; Blau, +wenn Bit 7 und Bit 6 gesetzt sind; Gelb, wenn weder Bit 7 noch Bit 6 gesetzt sind. +Dadurch wird der Auswertalgorithmus aber etwas aufwendiger. Vielleicht probieren +Sie es nacher einmal. + +Die Prozedur 'tue nichts' wird schon von #on("b")#gs-Prozess#off("b")# bereitgestellt. Es wird keine +Aktion ausgeführt - jedoch überprüft, ob zwischenzeitlich die Tastenfolge + ("Notbremse") eingegeben wurde. Es empfiehlt sich, diese Prozedur +gerade in Schleifenrümpfen einzusetzten, damit die Möglichkeit besteht, bei einer +"Endlosschleife" einen Abbruch herbeizuführen (sonst "hängt" die Task ggf. am +Interfacekanal)! + + +#on("b")#6.2.1  Befehle für die digitale Eingabe#off("b")# + +In Kapitel 6.1.4 haben Sie die Befehle für die digitale Ausgabe kennengelernt, die +Ihnen #on("b")#gs-Prozess#off("b")# zur Verfügung stellt. Zu jedem dieser drei Befehle gibt es das +"Gegenstück" auch als Eingabebefehl. Alle Eingabebefehle sind als werteliefernde +Prozeduren (Funktionen) ausgelegt. + +In den Refinements 'alles abgedunkelt' und 'alles beleuchtet' benutzen wir den +Befehl: + +#on("b")# +TEXT PROC bitmuster (INT CONST kanal) +#off("b")# + +Über den Parameter wird der Kanal angegeben, über den der digitale Eingang ange­ +sprochen werden kann; bei uns ist das der Kanal 3 auf der Compact-Box. Die +Prozedur liefert einen Text, der aus acht Zeichen besteht. Dabei können nur die +Zeichen "I und "O" auftreten (sehen Sie dazu auch Kapitel 6.1.3). +#page# +Die beiden gerade genannten Refinements hätten aber auch so notiert werden +können: + +#on("b")# + alles abgedunkelt: + dezimalwert (3) = 0. + + alles beleuchtet: + dezimalwert (3) = 255. +#off("b")# + +#on("b")# +INT PROC dezimalwert (INT CONST kanal) +#off("b")# + +Über den Parameter wird der Kanal angegeben, über den der digitale Eingang ange­ +sprochen werden kann; bei uns ist das wieder der Kanal 3 auf der Compact-Box. Die +Prozedur liefert einen Integer-Wert zwischen 0 und 255 (sehen Sie dazu auch unter +'dezimalwert ausgeben' im Kapitel 6.1.4). + +Den dritten Eingabebefehl für den Digitaleingang, den #on("b")#gs-Prozess#off("b")# bereitstellt, finden +Sie im Refinement 'gib farbe aus': + +#on("b")# +TEXT PROC bitsymbol (INT CONST kanal, bitnummer) +#off("b")# + +Wie schon bei den anderen beiden Eingabebefehlen wird hier über den ersten +Parameter der Eingabekanal festgelegt; bei uns auf der Compact-Box ist das wieder +der Kanal 3. Über den zweiten Parameter wird die Nummer des Bits angegeben, +dessen Wert ermittelt werden soll. Ist das betreffende Bit gesetzt, so liefert die +Prozedur das Zeichen "I", sonst das Zeichen "O" (sehen Sie dazu auch das Kapitel +6.1.3 'Schreibweise für Bitmuster/Bitsymbole'). + + +#on("b")#6.2.2  Eingabetests#off("b")# + +Neben diesen drei Eingabebefehlen stellt #on("b")#gs-Prozess#off("b")# noch zwei Testbefehle zur +Verfügung, die man häufig gut verwenden kann. Auf einen greifen wir schon im +Refinement 'registriere gesetztes bit' zurück: +#page# +#on("b")# +BOOL PROC bit ist gesetzt (INT CONST kanal, bitnummer) +#off("b")# + +Die Parameter sind die gleichen wie beim Befehl 'bitsymbol'. Zunächst liest die +Prozedur die aktuelle Einstellung am angegebenen Digitaleingang ('kanal') ein und +untersucht dann das Bit mit der angegebenen Bitnummer (0, ..., 7). Die Prozedur +liefert den Wert 'TRUE', wenn das Bit mit der entsprechenden Bitnummer gesetzt ist +(die Prozedur bitsymbol' mit gleichen Parametern also den Wert "I" liefern würde), +sonst 'FALSE' (die Prozedur bitsymbol' mit gleichen Parametern also den Wert "O" +liefern würde). + +Den zweiten Testbefehl haben wir im obigen Programm noch nicht verwendet. Wir +könnten damit aber auch die Refinements 'alles abgedunkelt' und 'alles beleuchtet' +folgendermaßen notieren: + +#on("b")# + alles abgedunkelt: + bitmuster gleich (3, "OOOOOOOO"). + + alles beleuchtet: + bitmuster gleich (3, "IIIIIIII"). +#off("b")# + + +#on("b")# +BOOL PROC bitmuster gleich (INT CONST kanal, + TEXT CONST vorgabe) +#off("b")# + +Wie bereits zuvor wird über den ersten Parameter der Kanal angegeben, über den der +Digitaleingang angesprochen werden kann. Zunächst liest die Prozedur am ange­ +gebenen Kanal die aktuelle Einstellung ein und vergleicht es mit der 'vorgabe'. Der +eigentliche Vorteil der Prozedur liegt darin, daß bei der Beschreibung der 'vorgabe' +neben den Zeichen "I" und "O" auch das Zeichen "X" verwendet werden darf. z.B. +"IOXXXXX". Entspricht das eingelesene Bitmuster der 'vorgabe', so liefert die Prozedur +den Wert 'TRUE', sonst den Wert 'FALSE'. In gerade genannten Beispiel liefert die +Prozedur also immer dann 'TRUE', wenn eine Karte mit der Markierung für Rot +eingeschoben wurde - gleichgültig, welche Kundennummer eingestanzt ist. +#page# +#on("b")#6.2.3  Befehle für die analoge Eingabe#off("b")# + +Die analoge Eingabe möchten wir Ihnen an einem ganz einfachen Beispiel vor Augen +führen. Sie brauchen dazu nur ein ganz normales Drehpotentiometer (ca. 5kOhm), +das Sie in jedem Elektronik-Fachgeschäft für wenig Geld erhalten können. Ein +solches Drehpotentiometer verfügt über drei Anschlüsse. Wenn man sich den inneren +Aufbau vor Augen führt, ist die Belegung der drei Anschlüsse auch recht einsichtig. + + + siehe Physikbuch!! + + + +#on("b")##center#Abb.21 Aufbau eines Drehpotentiometers#off("b")# + +Löten Sie ggf. auf die drei Anschlüsse je einen Lötschuh, um eine einfache Steckver­ +bindung zur Kombikarte/Compact-Box herstellen zu können. Wichtig ist vor allem, +daß der mittlere Anschluß am Drehpotentiometer auf den mittleren Stecksockel am +Analogeingang auf der Kombikarte/Compact-Box aufgesteckt wird. Die beiden +anderen Anschlüsse können können Sie beliebig auf die beiden dann noch freien +Lötstifte (+ und �) des gleichen Analogeingangs aufstecken. + +Starten Sie dann das folgende Programm: + +#on("b")# + initialisiere interface; + page; + REP + notiere potentiometerwert + UNTIL abbruch gewuenscht PER. + + notiere potentiometerwert: + put (wert von analogeingang (1)); + line. +#off("b")# +#page# +Nach dem Start des Programms müßten auf dem Bildschirm untereinander immer +wieder die gleiche Zahl (ein Wert zwischen 0 und 255) auftauchen. Wenn Sie dann +am Potentiometer drehen, müßten sich auch die Werte auf dem Bildschirm ändern. + +Sie hätten das Refinement 'notiere potentiometerwert' auch folgendermaßen notieren +können: + +#on("b")# + notiere potentiometerwert: + put (spannungswert (1)); + line. +#off("b")# + +Statt Wert zwischen 0 und 255 zu erhalten, müßten Sie jetzt Werte zwischen 0.0 und +5.0 erhalten. + + +#on("b")# +REAL PROC spannungswert (INT CONST kanal) +#off("b")# + +Über den Parameter wird der Kanal angegeben, über den der analoge Eingang ange­ +sprochen werden kann; bei uns ist das der Kanal 1 (oder 2) auf der Kombikarte/ +Compact-Box. Auf der Kombikarte/Compact-Box können nur Spannungswerte +zwischen 0.0V und 5.0V eingelesen werden. Auf der A/D-Karte kann der Bereich für +die einzulesenden Sapnnungwerte durch die Schalterstellung auf der Karte eingestellt +werden (Sehen Sie dazu auch Kapitel 5.3.1). + + +#on("b")# +REAL PROC wert von analogeingang (INT CONST kanal) +#off("b")# + +Über den Parameter wird der Kanal angegeben, über den der analoge Eingang ange­ +sprochen werden kann; bei uns ist das der Kanal 1 (oder 2) auf der Kombikarte/ +Compact-Box. Geliefert werden Werte zwischen 0 und 255. + +Tatsächlich wird aber ein Spannungswert vom Analogeingang eingelesen. Dieser +Spannungswert wird vom Analog-Digital-Wandler auf der Karte nach folgendem +Verfahren gewandelt: +#page# +Dem größtmöglichen Spannungswert an diesem Eingang wird der Wert 255, dem +kleinstmöglichen der Wert 0 zugeordnet. Das Intervall zwischen dem kleinst- und +größtmöglichen Spannungswert wird in 255 gleichgroße Teilintervalle eingeteilt. Es +wird nun die Nummer des Intervalls geliefert, in das die eingelesene Spannung fällt. +Kleinst- und größtmögliche Spannungswerte sind abhängig von der aktuellen Steck­ +karte, Interface-Konfiguration). + + +#on("b")#6.3  Hinweise auf Aufgabenmaterial#off("b")# + +Eine Fülle von Beispielanwendungen sind beschrieben in: + + Landesinstitut für Schule und Weiterbildung (Hrsg.), Materialien zur Lehrerfort­ + bildung in Nordrhein-Westfalen, Heft 2, Neue Technologien - Informations­ + technologische Inhalte im Wahlpflichtunterricht der Klassen 9/10, 2. über­ + arbeitete Auflage 1987 + diff --git a/doc/prozess/gs-prozess-7 b/doc/prozess/gs-prozess-7 new file mode 100644 index 0000000..db3b9d1 --- /dev/null +++ b/doc/prozess/gs-prozess-7 @@ -0,0 +1,1121 @@ +limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (1)# +#headodd# +#center#gs-Prozess#right#% + +#end# +#headeven# +%#center#gs-Prozess + +#end# +#center#1 + +#on("b")#7  Beschreibung der Menufunktionen#off("b")# + +Nach Aufruf meldet sich #on("b")#gs-Prozess#off("b")# zunächst mit dem #on("b")#gs-DIALOG#off("b")#-Emblem. Kurze +Zeit später erscheint das folgende Menu auf dem Bildschirm: + ++---------------------------------------------------------------------+ +| PDV:  Info Interface Programm Archiv | +|-------+------------------------+------------------------------------+ +| | u  Übersicht Befehle | | +| | --------------------- | | +| | a  Ausgabebefehle | | +| | e  Eingabebefehle | | +| | t  Testbefehle | | +| | w  Weitere Befehle | | +| | --------------------- | | +| | b  Bitmuster | | +| | s  Symbole/Zeichen | | +| | d  Digital-/Analogwerte| | +| +------------------------+ | +| | +| +----------------------------------------+ | +| | gs-Prozess | | +| | Version 1.0 | | +| | | | +| | Copyright Ρ 1988 bei Eva Latta-Weber, | | +| | Bielefeld | | +| +----------------------------------------+ | ++---------------------------------------------------------------------+ +|Info:/ Wahl: Ausführen: Verlassen:| ++---------------------------------------------------------------------+ + +#center#Abb.22:  Eingangsbildschirm #on("b")#gs-Prozess#off("b")# + + +Bevor wir Ihnen die Bedeutung der einzelnen Menupunkte erklären, geben wir erst +noch einige grundsätzliche Hinweise zur Bedienung des Menusystems für diejenigen +Leser, die im Umgang mit Menus unter #on("b")#gs-DIALOG#off("b")# nicht geübt sind. +#page# +#on("b")#7.1  Kurzhinweise zur Bedienung der Menus#off("b")# + +Die Bedienung des Menus ist sehr einfach. Eine ausführliche Beschreibung dazu +finden Sie in den Unterlagen zum Programmsystem #on("b")#gs-DIALOG#off("b")#. An dieser Stelle +sollen nur die wesentlichen Bedienungsvorgänge beschrieben werden. + +- Mit der Tastenfolge können Sie sich Informationen zur Bedienung + des Menusystems in das Menu einblenden lassen. + +- Mit den Pfeiltasten und können Sie zwischen den "Ober­ + begriffen" in der Kopfzeile wählen. Der aktuelle Oberbegriff ist jeweils invers + dargestellt. Das ausgeklappte 'Pull-Down-Menu' bezieht sich auf diesen invers + dargestellten Oberbegriff. + +- Mit den Pfeiltasten und können Sie zwischen den Menu­ + funktionen wählen, die Ihnen im aktuellen Pull-Down-Menu zur Auswahl ange­ + boten werden. Die aktuell angewählte Menufunktion wird jeweils invers darge­ + stellt. Die Trennlinien, die in einigen Pull-Down-Menus sichtbar sind, dienen nur + der optischen Untergliederung; sie können nicht angewählt werden und werden + deshalb automatisch übersprungen. Die einzelnen Menupunkte sind "zyklisch + miteinander verknüpft", das heißt, man gelangt vom untersten Menupunkt + wieder zum obersten und umgekehrt. Menupunkte, vor denen ein Minuszeichen + steht ('-'), sind (zur Zeit) nicht aktivierbar; auch sie können nicht angewählt + werden und werden einfach übersprungen. + +- Durch Tippen der Fragezeichentaste () können Sie sich jeweils zur + aktuellen Menufunktion (invers im Pull-Down-Menu) Informationen in das + Menu einblenden lassen. + +- Um eine Menufunktion ausführen zu lassen, bewegen Sie sich mit den Pfeiltasten + auf die gewünschte Menufunktion im aktuellen Pull-Down-Menu und tippen + dann die -Taste. Steht vor dem gewünschten Menupunkt ein +#page# + einzelner Buchstabe oder eine Ziffer, so kann durch Tippen der entsprechenden + Taste diese Menufunktion dadurch direkt aufgerufen werden. Sobald eine Menu­ + funktion aufgerufen worden ist, erscheint davor ein Stern ('*'). Daraus können + Sie entnehmen, daß das System bereits den Auftrag ausführt. + +- An verschiedenen Stellen werden Fragen an Sie gerichtet, die Sie mit 'ja' oder + 'nein' beantworten müssen. Tippen Sie dazu entsprechend der Entscheidung die + Taste (für 'ja') bzw. (für 'nein'). + +- Werden Ihnen vom Menu aus Dateinamen zur Auswahl angeboten, so können Sie + den auf dem Bildschirm sichtbaren Pfeil vor den gewünschten Namen + positionieren. Mit den Tasten oder können Sie den Namen + ankreuzen. Ist die Auswahl mehrerer Dateinamen möglich, so können Sie den + Vorgang wiederholen. Mit den Tasten oder können Sie auch + ein Kreuz vor einem Namen wieder löschen. Daneben gibt es noch einige Ta­ + stenfunktionen, die für die Bedienung recht hilfreich sein können. Tippen Sie + während der Auswahl die Fragezeichentaste (), so werden Ihnen alle + Bedienungsmöglichkeiten auf dem Bildschirm angezeigt. Eine Auswahl, in der + mehrere Dateien angekreuzt werden dürfen, wird durch die Tastenfolge + verlassen. Anschließend wird die eingestellte Operation mit den + angekreuzten Dateien ausgeführt. Sind Sie versehentlich in eine solche Auswahl + gelangt, so können Sie den Vorgang durch die Tastenkombination + abbrechen. + +- An einigen Stellen werden Sie aufgefordert, eine Eingabe zu machen (z.B. einen + Dateinamen einzugeben). Wird Ihnen hier ein Vorschlag gemacht, den Sie + akzeptieren, so brauchen Sie zur Bestätigung nur die -Taste zu + tippen. Gefällt Ihnen der Vorschlag nicht oder wird Ihnen kein Vorschlag ge­ + macht, so machen Sie bitte die gewünschte Eingabe. Zum Schreiben stehen + Ihnen alle aus dem Editor bekannten Funktionen zur Verfügung. Mit der Taste + können Sie Buchstaben löschen, mit einfügen. Die +#page# + Eingabe wird durch Tippen der -Taste abgeschlossen. Ist der von + Ihnen gewünschte Name schon in Ihrer Task vorhanden und steht in der Fußzeile + der Hinweis 'Zeigen: ', dann können Sie sich auch alle vor­ + handenen Namen zur Auswahl anbieten lassen und durch Ankreuzen den beab­ + sichtigten Namen auswählen. + +- Ihnen können auch mehrere Alternativen angeboten werden, zwischen denen Sie + wählen müssen. In der untersten Zeile eines solchen Kastens, in denen Ihnen die + Alternativen auf dem Bildschirm eingeblendet werden, sind die Möglichkeiten + aufgeführt, die darüber beschrieben sind. Mit den Pfeiltasten können sie die + Markierung auf die gewünschte Alternative positionieren und dann durch die + -Taste zur Ausführung bringen. (Manchmal ist das auch durch + Tippen der den Alternativen vorangestellten Buchstaben oder Ziffern möglich). + +- Durch die Tastenfolge kann das Menu insgesamt verlassen + werden. Damit das nicht versehentlich geschieht, wird jeweils die Frage gestellt, + ob Sie das Menu tatsächlich verlassen wollen. Diese Frage beantworten Sie bitte je + nach Wunsch mit 'ja' oder 'nein' durch Tippen der Tasten bzw. . + + +#on("b")#7.2  Menufunktionen zum Oberbegriff 'Info'#off("b")# + +Das auf dem Bildschirm sichtbare Pull-Down-Menu ist oben abgebildet. + +#on("b")#u   Übersicht Befehle#off("b")# + +Mit dieser Funktion können Sie sich eine Übersicht der Befehle, die Ihnen +#on("b")#gs-Prozess#off("b")# zur Verfügung stellt, in den aktuellen Bildschirm einblenden lassen: +#page# +#free(2.0)# + +------------------------------------------------------------+ + | Ausgabebefehle: Eingabebefehle: | + | | + | dezimalwert ausgeben dezimalwert | + | bitmuster ausgeben bitmuster | + | bitsymbol ausgeben bitsymbol | + | spannungswert ausgeben spannungswert | + | wert an analogausgang ausgeben wert von analogeingang | + | | + | | + | Testbefehle: Weitere Befehle: | + | | + | bitmuster gleich initialisiere interface | + | bit ist gesetzt warte | + | | + +------------------------------------------------------------+ +#center#Abb.23:  Befehlsübersicht + + Es werden 'Eingabebefehle', 'Ausgabebefehle' und 'Testbefehle' unterschieden. + Darüberhinaus werden 'Weitere Befehle' angegeben. Eine ausführliche + Beschreibung der einzelnen Befehle ist unter den gleichnamigen Menupunkten + abrufbar. + + +#on("b")#a   Ausgabebefehle#off("b")# + + Mit dieser Funktion können Sie sich die zur Verfügung stehenden Ausgabe­ + befehle detailliert erläutern lassen. Zuerst gelangen Sie in eine Auswahl, von + der aus zu jedem einzelnen Ausgabebefehl eine Informationstafel abgerufen + werden kann: +#page# +#free(2.0)# + +-------------------------------------+ + | Ausgabebefehle: | + | | + | 1  dezimalwert ausgeben | + | | + | 2  bitmuster ausgeben | + | 3  bitsymbol ausgeben | + | | + | 4  spannungswert ausgeben | + | 5  wert an analogausgang ausgeben | + | | + | z  Zurück in das Menu | + | | + | 1   2   3   4   5   z | + +-------------------------------------+ + +#center#Abb.24:  Auswahl Ausgabebefehle + + Auf jeder Informationstafel ist ein kleines Beispiel zur Verwendung des Befehls + angegeben, das auch erläutert wird. Anschließend wird ausführlich auf die + Parameter der Befehle eingegangen (Datentyp, Wertebereich, etc.). Aus den + einzelnen Informationstafeln gelangen Sie immer wieder zur Auswahl zurück. + Wird die Auswahl selbst verlassen, gelangen Sie zurück ins Ausgangsmenu. + + +#on("b")#e   Eingabebefehle#off("b")# + + Mit dieser Funktion können Sie sich die zur Verfügung stehenden Eingabe­ + befehle detailliert erläutern lassen. Zuerst gelangen Sie in eine Auswahl, von + der aus zu jedem einzelnen Eingabebefehl eine Informationstafel abgerufen + werden kann: +#page# +#free(1.0)# + +------------------------------+ + | Eingabebefehle: | + | | + | 1  dezimalwert | + | | + | 2  bitmuster | + | 3  bitsymbol | + | | + | 4  spannungswert | + | 5  wert von analogeingang | + | | + | z  Zurück in das Menu | + | | + | 1   2   3   4   5   z | + +------------------------------+ + + +#center#Abb.25:  Auswahl Eingabebefehle + + Auf jeder Informationstafel ist ein kleines Beispiel zur Verwendung des Befehls + angegeben, das auch erläutert wird. Anschließend wird ausführlich auf die + Parameter der Befehle (Datentyp, Wertebereich, etc.) und die Werte, die + geliefert werden, eingegangen. + + Aus den einzelnen Informationstafeln gelangen Sie immer wieder zur Auswahl + zurück. Wird die Auswahl selbst verlassen, gelangen Sie zurück ins Ausgangs­ + menu. + + +#on("b")#t   Testbefehle#off("b")# + + Mit dieser Funktion können Sie sich die zur Verfügung stehenden Testbefehle + detailliert erläutern lassen. Zuerst gelangen Sie in eine Auswahl, von der aus zu + jedem einzelnen Testbefehl eine Informationstafel abgerufen werden kann: +#page# + +------------------------+ + | Testbefehle: | + | | + | 1  bitmuster gleich | + | 2  bit ist gesetzt | + | | + | z  Zurück in das Menu | + | | + | 1   2   z | + +------------------------+ + +#center#Abb.26:  Auswahl Testbefehle + + Auf jeder Informationstafel ist ein kleines Beispiel zur Verwendung des Befehls + angegeben, das auch erläutert wird. Anschließend wird ausführlich auf die + Parameter der Befehle (Datentyp, Wertebereich, etc.) und die Werte, die ge­ + liefert werden, eingegangen. + Aus den einzelnen Informationstafeln gelangen Sie immer wieder zur Auswahl + zurück. Wird die Auswahl selbst verlassen, gelangen Sie zurück ins Ausgangs­ + menu. + + +#on("b")#w   Weitere Befehle#off("b")# + + Hier werden noch weitere zur Verfügung stehende Befehle erläutert, die für die + Programmierung ganz hilfreich sind. Zuerst gelangen Sie in eine Auswahl, von + der aus zu jedem Befehl eine Informationstafel abgerufen werden kann: + + + +----------------------------+ + | Weitere Befehle: | + | | + | 1  initialisiere interface | + | 2  warte | + | | + | z  Zurück in das Menu | + | | + | 1   2   z | + +----------------------------+ + +#center#Abb.27:  Auswahl 'Weitere Befehle' +#page# + Aus den einzelnen Informationstafeln gelangen Sie immer wieder zur Auswahl + zurück. Wird die Auswahl selbst verlassen, gelangen Sie zurück ins Ausgangs­ + menu. + + +#on("b")#b   Bitmuster#off("b")# + + Nach Aufruf dieser Funktion wird der Aufbau der Bitmuster erläutert, die als + Parameter übergeben oder auch von Prozeduren geliefert werden. + + Insbesondere wird auf die Numerierung der einzelnen Bits eingegangen. + + +#on("b")#s   Symbole/Zeichen#off("b")# + + Nach Aufruf der Funktion werden die Zeichen erläutert, die bei der Be­ + schreibung von Bitmustern und Bitsymbolen Verwendung finden. + + +#on("b")#d   Digital-/Analogwerte#off("b")# + + Bei den beiden Befehlen 'wert an analogausgang ausgeben' und 'wert von + analogeingang', wird ein Wert zwischen 0 und 255 als Parameter übergeben + bzw. von der Prozedur geliefert. Am Analogausgang wird aber eine Spannung + ausgegeben bzw. eingelesen. Hier wird erläutert, wie die Spannungswerte + innerhalb der Prozeduren gewandelt werden. + + +#on("b")#7.3  Menufunktionen zum Oberbegriff 'Interface'#off("b")# + +Über die Menufunktionen unter diesem Oberbegriff nehmen Sie die Konfiguration +von #on("b")#gs-Prozess#off("b")# vor. Ebenso ist von hier aus ein Test des Interface-Systems möglich. +#page# + ++-----------------------------------------------------------------------+ +| PDV:  Info Interface Programm Archiv | ++-------+-------------------+-------------------------------------------+ +| | i  Informationen | | +| | ---------------- | | +| | k  Konfigurieren | | +| | ---------------- | | +| | a  Ausgabetest | | +| | e  Eingabetest | | +| +-------------------+ | +| | +| | +| | ++---------------------------------------------------------------------- + +| Info:/ Wahl: Ausführen: Verlassen: | ++-----------------------------------------------------------------------+ + +#center#Abb.28:  Menubildschirm zum Oberbegriff 'Interface' + + +#on("b")#i   Informationen#off("b")# + + Mit dieser Menufunktion können Sie sich zu jedem Zeitpunkt die aktuell + eingestellte Konfiguration von #on("b")#gs-Prozess#off("b")# anzeigen lassen. Sie können er­ + sehen, welches Interface-System eingestellt ist, wie die Kanäle belegt und + numeriert sind (sehen Sie das Beispiel in Abb.13). + + Ist eine Compact-Box oder ein Einzelsteckplatz eingestellt, erhalten Sie die + Informationen direkt eingeblendet. Ist dagegen ein Mehrfachsteckplatz einge­ + stellt, gelangen Sie in eine Auswahl. Von hier aus können Sie Informationen zu + jedem einzelnen Steckplatz getrennt abrufen. + + Fehlerfälle: + - Wurde #on("b")#gs-Prozess#off("b")# bisher noch nicht konfiguriert, so erhalten Sie eine + Warnung (sehen Sie Abb.11). In diesem Falle ist zunächst eine Konfigura­ + tion von #on("b")#gs-Prozess#off("b")# vorzunehmen (sehen Sie die Beschreibung zur + nächsten Menufunktion). +#page# +#on("b")#k   Konfigurieren#off("b")# + + Mit dieser Menufunktion können Sie #on("b")#gs-Prozess#off("b")# auf das aktuell angeschlos­ + sene Interface-System einstellen. Dazu haben Sie verschiedene Angaben zu + machen. + + Zunächst wird Ihnen eine Auswahl der Steckplatzart angeboten (sehen Sie + dazu Abb.12). Hier können Sie zur Zeit zwischen Compact-Box, Einzelsteck­ + platz und Mehrfachsteckplatz wählen. + + Ist eine Compact-Box angeschlossen, ist mit der hier gemachten Angabe die + Konfiguration abgeschlossen; die aktuelle Kanalbelegung wird Ihnen dann nur + noch zur Information eingeblendet. + + Bei Einzel- und Mehrfachsteckplatz haben Sie noch anzugeben, welche Inter­ + facekarte eingesteckt ist. Beim Einzelsteckplatz ist diese Angabe nur einmal zu + machen, beim Mehrfachsteckplatz halt mehrfach. Hierzu wird Ihnen aber + ebenfalls eine Auswahl angeboten (sehen Sie Abb.14). Nach jeder vorge­ + nommenen Einstellung wird Ihnen zur Information die Kanalbelegung mitge­ + teilt. Sofern Sie eine A/D-Karte verwenden, wird noch die Schalterstellung auf + der Karte erfragt, denn daraus kann #on("b")#gs-Prozess#off("b")# die eingestellte Eingangsem­ + pfindlichkeit ermitteln. + + +#on("b")#a   Ausgabetest#off("b")# + + Mit dieser Menufunktion können Sie auf einfache Weise testen, ob Ihr Inter­ + face-System korrekte Ausgaben erzeugt. Nach Aktivieren der Menufunktion + erhalten Sie die Möglichkeit, Ausgabewerte einzutragen (sehen Sie Abb.18). + Jede Eintragung ist durch abzuschließen. + + Für den Ausgabetest sollte eine Leuchtdiodenanzeige zur Verfügung stehen, um + die Ausgaben am Interface kontrollieren zu können. Für detailliertere Informa­ + tionen lesen Sie bitte unbedingt Kapitel 5. +#page# + Fehlerfälle: + - Interface meldet sich nicht! + Abhilfe: Überprüfen, ob der Adapter ordnungsgemäß angeschlossen + und eingeschlatet ist (sehen Sie Kapitel 5). Wenn ein MUFI + verwendet wird, MUFI aus- und nach kurzer Pause wieder + einschalten. Noch einmal den Ausgabetest versuchen. + - Interface-Kanal belegt! + (Kann nur beim Betrieb von MUFI als Endgerät oder bei RS232-Adapter + auftreten!) + Abhilfe: Feststellen, welche Task an den Interface-Kanal gekoppelt ist + ('taskinfo (2) ') und diese dann abmelden + ('break' oder 'end'). Die Nummer des Interfacekanals kann + mit dem Kommando 'put (interfacekanal) ' + erfragt werden. + - Sehen Sie bitte die detaillierte Fehlerliste in Kapitel 5.5. + + +#on("b")#e   Eingabetest#off("b")# + + Mit dieser Menufunktion können Sie auf einfache Weise testen, ob über Ihr + Interface-System korrekte Eingaben möglich sind. Nach Aktivieren der Menu­ + funktion erhalten Sie die Möglichkeit, am Interface angelegte Eingabewerte + abzulesen (sehen Sie Abb.19). + + Für den Eingabetest sollte ein Codekartenleser oder zumindest ein kurzer + Draht zur Verfügung stehen. Für detailliertere Informationen lesen Sie bitte + unbedingt Kapitel 5. + + Fehlerfälle: + - Interface meldet sich nicht! + Abhilfe: Überprüfen, ob der Adapter ordnungsgemäß angeschlossen + und eingeschlatet ist (sehen Sie Kapitel 5). Wenn ein MUFI + verwendet wird, MUFI aus- und nach kurzer Pause wieder + einschalten. Noch einmal den Ausgabetest versuchen. +#page# + - Interface-Kanal belegt! + (Kann nur beim Betrieb von MUFI als Endgerät oder bei RS232-Adapter + auftreten!) + Abhilfe: Feststellen, welche Task an den Interface-Kanal gekoppelt ist + ('taskinfo (2) ') und diese dann abmelden + ('break' oder 'end'). Die Nummer des Interfacekanals kann + mit dem Kommando 'put (interfacekanal) ' + erfragt werden. + - Sehen Sie bitte die detaillierte Fehlerliste in Kapitel 5.5. + + +#on("b")#7.4  Menufunktionen zum Oberbegriff 'Programm'#off("b")# + + ++-------------------------------------------------------------------------+ +| PDV:  Info Interface Programm Archiv | +|---------------------+---------------------+-----------------------------| +| | n  Neu erstellen | | +| | a  Ansehen/Ändern | | +| | | | +| | s  Starten | | +| | w  Wiederholen | | +| | | | +| | v  Verzeichnis | | +| | | | +| | l  Löschen | | +| | d  Drucken | | +| | | | +| | k  Kopieren | | +| | u  Umbenennen | | +| +---------------------+ | +|-------------------------------------------------------------------------| +| Info:/ Wahl: Ausführen: Verlassen: | ++-------------------------------------------------------------------------+ + +#center#Abb.29:  Menubildschirm zum Oberbegriff 'Programm' +#page# +#on("b")#n   Neu erstellen#off("b")# + + Mit dieser Funktion können Sie eine neue Programmdatei anlegen und be­ + schreiben. + + Sie werden zunächst nach einem Namen für die #on("b")#neue#off("b")# Programmdatei gefragt. + Geben Sie einen beliebigen Namen (#on("b")#ohne Anführungszeichen (!)#off("b")#) ein und + schließen Sie die Eingabe durch ab. Daraufhin wird Ihnen auf + dem Bildschirm eine neue Datei zum beschreiben angeboten. + + Sollte schon eine Programmdatei mit diesem Namen in der Task vorhanden + sein, so werden Sie darauf aufmerksam gemacht. + + Sie können sich während des Schreibens die wichtigsten Tastenfunktionen des + Editors einblenden lassen. Tippen Sie dazu die Tastenfolge . Es + erscheint dann das folgende Angebot aus dem Sie auswählen können: + + + +------------------------------------------------+ + | Der EUMEL - Editor | + | | + | b ... Beschreibung desEditors | + | w ... Wichtige Tasten | + | p ... Positionieren der Schreibmarke | + | k ... Korrigieren im Text (Einfügen/Löschen) | + | m ... Markierte Textpassagen bearbeiten | + | l ... Lernen im Editor | + | a ... Anweisungen im Editor (Kommandodialog) | + | | + | z ... Zurück in den Schreibmodus | + | | + | b   w   p   k   m   l   a   z | + | | + +------------------------------------------------+ + +#center#Abb.30:  Informationsauswahl zum EUMEL-Editor +#page# + Fehlerfälle: + - Eine Datei mit dem vorgeschlagenen Namen existiert schon. + + +#on("b")#a   Ansehen/Ändern#off("b")# + + Mit dieser Funktion können Sie sich Dateien, die schon in Ihrer Task + existieren, ansehen oder auch verändern. + + Sie werden zunächst gefragt, ob Sie #on("b")#die zuletzt bearbeitete Programmdatei#off("b")# + ansehen bzw. verändern möchten (sofern Sie schon vorher mit #on("b")#gs-Prozess#off("b")# in + der Task gearbeitet haben). + + Bejahen Sie diese Frage, dann wird Ihnen diese Programmdatei zur Be­ + arbeitung angeboten. Verneinen Sie die Frage dagegen, so gelangen Sie in die + 'Auswahl' (d.h es werden Ihnen alle Programmdateien in der Task zur Auswahl + angeboten). Nachdem Sie einen der Namen angekreuzt haben, wird Ihnen die + ausgewählte Programmdatei zur Bearbeitung auf dem Bildschirm angebo­ + ten. + + Fehlerfälle: + - In der Task existiert noch keine Programmdatei. + + +#on("b")#s   Starten#off("b")# + + Mit dieser Menufunktion können Sie eine Programmdatei übersetzen und + ausführen lassen. + + Sie werden zunächst gefragt, ob #on("b")#das zuletzt bearbeitete Programm#off("b")# ausgeführt + werden soll. Bejahen Sie die Frage, so wird dieses Programm gestartet; ver­ + neinen Sie die Frage dagegen, so gelangen Sie in die 'Auswahl'. Nach An­ + kreuzen des gewünschten Programmnamens wird das ausgewählte Programm + ausgeführt. +#page# + Sind im Programm noch Fehler enthalten, so werden das Programm und die + Fehlermeldungen gleichzeitig auf dem Bildschirm dargestellt (Paralleleditor) + und zur Korrektur angeboten. Für die Programmkorrektur stehen ebenfalls alle + Editorfunktionen zur Verfügung. + + Sollte Ihnen beim Programmieren ein Fehler unterlaufen sein (z.B. eine + Endlosschleife), so kann mit der Tastenfolge der Programmlauf + abgebrochen werden ("Notbremse"). + + +#on("b")##on("b")#w   Wiederholen#off("b")# + + Mit dieser Funktion können Sie den Ablauf des zuletzt ausgeführten + Programms wiederholen, ohne daß das Programm neu übersetzt wird. + + Beachten Sie aber bitte, daß Veränderungen am Programmtext, die seit dem + letzten Prtogrammlauf vorgenommen wurden, #on("b")#nicht#off("b")# berücksichtigt werden; + dazu muß das Programm erneut mit der Menufunktion 's Starten' übersetzt + werden. + + Ist die Wiederholung eines Programmlaufs nicht möglich, so erfolgt ein Hin­ + weis darauf. + + +#on("b")#v   Verzeichnis#off("b")# + + Mit dieser Funktion können Sie sich einen Überblick über die in Ihrer Task + vorhandenen Programmdateien verschaffen. + + Nach Aufruf dieser Funktion wird eine Liste der Programmdateien auf dem + Bildschirm ausgegeben, die sich in Ihrer Task befinden. Da die Liste selbst + eine Datei ist, kann Sie mit der Tastenkombination verlassen + werden - hierauf wird auch in der Kopfzeile der Datei hingewiesen. Falls nicht + alle Namen auf den Bildschirm passen, können Sie das Fenster mit + und verschieben. +#page# +#on("b")#l   Löschen#off("b")# + + Mit dieser Funktion können Sie Programmdateien, die Sie nicht mehr + benötigen, die unnötig Platz belegen, löschen. Aber Vorsicht! Die Programm­ + dateien verschwinden durch diese Funktion unwiederbringlich! + + Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in + Ihrer Task befinden, zur Auswahl angeboten. Hier können Sie die gewünschten + Namen ankreuzen. Die Auswahl wird dann durch die Tastenfolge + verlassen. + + Für jede einzelne Programmdatei wird noch einmal zur Sicherheit gefragt, ob + sie auch tatsächlich gelöscht werden soll. Zur Bestätigung tippen Sie bitte die + Taste ('ja') - zur Verhinderung ('nein'). + + Fehlerfälle: + - In der Task exsitiert noch keine Programmdatei. + + +#on("b")#d   Drucken#off("b")# + + Mit dieser Funktion können Sie Programmdateien über einen angeschlossenen + Drucker ausgeben lassen. + + Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in + Ihrer Task befinden, zur Auswahl angeboten. Hier können Sie die gewünschten + Namen ankreuzen. Die Auswahl wird dann durch die Tastenfolge + verlassen. + + Die angekreuzten Programmdateien werden anschließend zum Drucker ge­ + schickt. Der Vorgang wird auf dem Bildschirm protokolliert. +#page# + Fehlerfälle: + - In der Task existiert noch keine Programmdatei. + - Der Drucker ist nicht funktionsbereit. + - Der Drucker wird nicht über die Task 'PRINTER' betrieben. + - Auf Ihrem System werden die Druckkosten abgerechnet. Sie müssen sich + mit einer Codenummer identifizieren. + + +#on("b")#k   Kopieren#off("b")# + + Mit dieser Funktion können Sie sich eine Kopie einer bereits in der Task + vorhandenen Programmdatei anlegen. Das ist z.B. dann sinnvoll, wenn Sie sich + einen bestimmten 'Stand' aufbewahren wollen oder wenn Sie ein Programm + schreiben wollen, das einem bereits vorhandenen ähnelt. + + Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in + Ihrer Task befinden, zur Auswahl angeboten. Nach Ankreuzen eines Namens + wird die Auswahl automatisch verlassen. + + Anschließend wird der angekreuzte Name angezeigt und der Name für die + Kopie erfragt. Es muß ein Name eingetragen werden, der in dieser Task noch + nicht für eine Programmdatei vergeben wurde; ansonsten erfolgt ein Hinweis + darauf und es wird nicht kopiert! + + Da man aber oft für die Kopie einen ähnlichen Namen wie für das Original + wählt, wird der 'alte' Name vorgeschlagen. Aus genannten Gründen muß er + aber verändert werden. Sie können diesen Namen mit den üblichen Editier­ + funktionen verändern oder mit löschen und ganz neu + eingeben. Sie sparen aber eine Menge Tipparbeit, wenn Sie einen langen + Namen nur an einer Stelle ändern wollen. + + Fehlerfälle: + - Eine Programmdatei mit dem gewünschten Namen existiert bereits in der + Task. +#page# +#on("b")#u   Umbenennen#off("b")# + + Mit dieser Funktion können Sie einer bereits vorhandenen Programmdatei + einen neuen Namen geben. + + Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in + Ihrer Task befinden, zur Auswahl angeboten. Nach Ankreuzen eines Namens + wird die Auswahl automatisch verlassen. + + Anschließend wird dieser Name angezeigt und der zukünftige Name für die + Programmdatei erfragt. Es muß ein Name eingetragen werden, der in dieser + Task noch nicht für eine Programmdatei vergeben wurde - ansonsten erfolgt + ein Hinweis darauf und die Programmdatei wird nicht umbenannt! + + Da man aber oft den 'neuen' Namen in Anlehnung an den 'alten' Namen + wählt, wird der 'alte' Name vorgeschlagen. Aus genannten Gründen muß er + aber verändert werden. Sie können diesen Namen mit den üblichen Editier­ + funktionen verändern oder mit löschen und ganz neu + eingeben. Sie sparen aber eine Menge Tipparbeit, wenn Sie einen langen + Namen nur an einer Stelle ändern wollen. + + Fehlerfälle: + - Eine Programmdatei mit dem gewünschten Namen existiert bereits in der + Task. +#page# +#on("b")#7.5  Menufunktionen zum Oberbegriff 'Archiv'#off("b")# + + ++-----------------------------------------------------------------------+ +| PDV:  Info Interface Programm Archiv | +|------------------+------------------------+---------------------------| +| | r  Reservieren | | +| | -  Neue Diskette | | +| | | | +| | -  Schreiben | | +| | -  Checken | | +| | -  Kombination | | +| | -  Holen/Lesen | | +| | -  Löschen | | +| | | | +| | -  Verzeichnis | | +| | -  Drucken | | +| | | +---------------------+ | +| | i  Initialisieren | | Dateiaustausch mit:| | +| | z  Zieltask einstellen | | Archiv | | +| +------------------------+ | Archivname: | | +| | __________ | | +| +---------------------+ | +|-----------------------------------------------------------------------| +| Info:/ Wahl: Ausführen: Verlassen: | ++-----------------------------------------------------------------------+ + +#center#Abb.31:  Menubildschirm zum Oberbegriff 'Archiv' + + +In diesem Kapitel werden alle die Menufunktionen beschrieben, die Ihnen unter dem +Oberbegriff 'Archiv' im Menu angeboten werden. Mit den Funktionen in diesem Menu +können Sie aber nicht nur Dateien auf dem Archiv behandeln, sondern auch in +anderen Tasks im Multi-User-System oder über das EUMEL-Netz sogar auf anderen +Rechnern! + +Wenn Sie dieses Pull-Down-Menu gerade aufgeschlagen haben, sind nicht alle Funk­ +tionen aktivierbar! Um weitere Funktionen zu aktivieren, muß erst einer der aktivier­ +baren Menupunkte gewählt werden. +#page# +#on("b")#r   Reservieren#off("b")# (des Archivlaufwerks) + + Im EUMEL-Multi-User-System haben normalerweise mehrere Personen das + Zugriffsrecht auf das Archivlaufwerk. Allerdings muß der Zugriff so geregelt + werden, daß sich die Beteiligten dabei nicht gegenseitig "in die Quere + kommen". Ein Zugriff auf das Archivlaufwerk erfordert zunächst eine An­ + meldung. Ist diese Anmeldung erfolgt, kann von den anderen Beteiligten so + lange nicht mehr auf das Laufwerk zugegriffen werden, bis es wieder freige­ + geben worden ist. + + Diese Anmeldung des Archivlaufwerkes erfolgt über die Menufunktion 'r Reser­ + vieren'. Greift bereits eine andere Task auf das Laufwerk zu, so erhalten Sie + darüber einen Hinweis auf dem Bildschirm. Ansonsten wird an Sie die Frage + gestellt, ob die Diskette eingelegt und das Laufwerk geschlossen ist. + + Erst zu diesem Zeitpunkt ist sichergestellt, daß Sie den alleinigen Zugriff auf + das Laufwerk haben. Deshalb sollten Sie, wenn Sie mit mehreren Personen am + Computer arbeiten, erst zum Zeitpunkt der Fragestellung die Diskette ins + Laufwerk einlegen. + + Nachdem Sie die Diskette eingelegt und die Frage bejaht haben, ermittelt das + System selbständig den Namen der eingelegten Diskette, zeigt den Namen auf + dem Bildschirm (im kleinen Kasten unten) an und aktiviert die anderen + Menupunkte des Pull-Down-Menus. + + Beim Verlassen des Pull-Down-Menus, wenn eine andere Zieltask eingestellt + wird oder wenn das Menu gänzlich verlassen wird, wird die Reservierung + automatisch aufgehoben! +#page# + Fehlerfälle: + - Das Laufwerk ist von einer anderen Task belegt. + - Die Diskette ist falsch eingelegt oder das Laufwerk ist nicht richtig ge­ + schlossen. + - Die Diskette ist nicht formatiert bzw. initialisiert. + - Die Diskette kann nicht gelesen werden (keine EUMEL-Diskette, Diskette + hat ein falsches Format, Diskette ist verschmutzt...). + + +#on("b")#n   Neue Diskette#off("b")# (anmelden) + + Der Dateiaustausch mit einer Diskette ist nur dann möglich, wenn der im + System eingestellte Diskettenname (auf dem Bildschirm im kleinen Kasten + unten sichtbar) mit dem tatsächlichen Namen der Diskette übereinstimmt. + Nach einem Diskettenwechsel ist das aber in der Regel nicht mehr der Fall. + Greift man dann auf die neu eingelegte Diskette zu, so erscheint die Fehlermel­ + dung: 'Falscher Archivname! Bitte neue Diskette anmelden!'. + + Das Anmelden einer neuen Diskette - ohne einen neuen Reservierungsvorgang + - wird durch diese Menufunktion ermöglicht. Nach Aktivieren dieses Menu­ + punktes wird der Name der eingelegten Diskette ermittelt, im System eingestellt + und auf dem Bildschirm angezeigt. + + Im Gegensatz zur Menufunktion 'r Reservieren' greift das System ohne Anfrage + an den Benutzer auf das Archivlaufwerk zu (die Reservierung bleibt ja + bestehen). Ist das Archivlaufwerk reserviert, so ist die Neuanmeldung einer + Diskette über diese Menufunktion weniger zeitaufwendig. + + Fehlerfälle: + - wie unter 'r Reservieren'. +#page# +#on("b")#s   Schreiben#off("b")# (Kopieren) + + Alle Dateien der eigenen Task werden zur Auswahl angeboten. Wenn Sie die + Auswahl durch die Tastenfolge verlassen, überprüft das System + zunächst, ob die Dateien in der eingestellten Zieltask schon vorhanden sind. Ist + das der Fall, wird erfragt, ob die dort vorhandenen Dateien überschrieben, d.h. + gelöscht werden dürfen (s.u.). Anschließend werden alle angekreuzten Dateien + in der Reihenfolge, in der Sie sie angekreuzt haben, in die eingestellte Zieltask + kopiert. Der Vorgang wird auf dem Bildschirm protokolliert. Die Original­ + dateien in der eigenen Task bleiben dabei erhalten. + + Wenn in der Zieltask schon eine Datei existiert, die den gleichen Namen hat + wie eine Datei, die Sie dorthin kopieren möchten, so wird angefragt, ob die + vorher schon existierende Datei überschrieben (gelöscht!) werden soll. Bejahen + Sie diese Frage, so wird die bereits in der Zieltask existierende Datei (un­ + wiederbringlich) gelöscht und die gewünschte Datei dorthin transportiert. Ein + Überschreiben aus Versehen ist nicht möglich, wenn Sie die an Sie gestellte + Frage sorgfältig beantworten. + + Verneinen Sie die Frage, so wird die Datei auch nicht hinübertransportiert! Sie + können die Datei aber umbenennen (Menufunktion 'u Umbenennen' unter + den Oberbegriffen 'Landschaft'/Arbeitsfeld' bzw. 'Programm') und an­ + schließend mit anderem Namen hinüberschreiben. + + Beachten Sie, daß beim Überschreiben einer Datei auf einer Archivdiskette der + Speicherplatz der alten (überschriebenen) Version im allgemeinen nicht + wiederverwendet werden kann. In einem solchen Fall könnte die Diskette voll + geschrieben werden, obwohl eigentlich genügend Platz vorhanden wäre. Zur + Optimierung wird deshalb zuerst überprüft, ob die angekreuzten Dateien + schon in der Zieltask vorhanden sind und löscht diese, wenn Sie Ihr Einver­ + ständnis geben. Erst anschließend werden die Dateien insgesamt kopiert. +#page# + Normalerweise ist als Zieltask das Archivlaufwerk der eigenen Station einge­ + stellt. Mit der Menufunktion 'z Zieltask einstellen' kann diese Einstellung aber + verändert werden. + + Fehlerfälle: + - Die Diskette ist falsch eingelegt oder beschädigt. + - Die Diskette kann nicht beschrieben werden (Schreibfehler). + - Die Diskette ist voll. + - Sehen Sie auch unter 'r Reservieren' + 'z Zieltask einstellen'. + + +#on("b")#c   Checken#off("b")# + + Diese Menufunktion kann nur ausgeführt werden, wenn der Dateiaustausch + mit einem Archiv(manager) erfolgt - ansonsten ist diese Menufunktion auch + nicht aktivierbar. Die Menufunktion dient dazu, auf Diskette geschriebene + Dateien auf Lesefehler hin zu prüfen. Es empfiehlt sich, diese Prüfroutine auf + neu auf die Diskette geschriebene Dateien anzuwenden. Sehen Sie dazu auch + 'k Kombination'. + + Alle Dateien der eingestellten Zieltask (Archiv) werden zur Auswahl angeboten. + Wenn Sie die Auswahl durch die Tastenfolge verlassen, werden + alle angekreuzten Dateien in der Reihenfolge, in der Sie sie angekreuzt haben, + "gecheckt", d.h. auf Lesefehler hin überprüft. Der Vorgang wird auf dem Bild­ + schirm protokolliert. + + Fehlerfälle: + - Lesefehler auf dem Archiv. + - Sehen Sie auch unter 'r Reservieren'. + +#page# +#on("b")#k   Kombination#off("b")# + + Diese Menufunktion ist eine Kombination aus den beiden Menufunktionen 's + Schreiben' und 'c Checken' (Sehen Sie weitere Informationen auch dort!). + + Alle Dateien der eigenen Task werden zur Auswahl angeboten. Wenn Sie die + Auswahl durch die Tastenfolge verlassen, werden alle ange­ + kreuzten Dateien in der Reihenfolge, in der Sie sie angekreuzt haben, in die + eingestellte Zieltask kopiert (gegebenenfalls müssen bereits vorhandene + Dateien gleichen Namens in der Zieltask gelöscht werden). Anschließend + werden alle Dateien, die gerade geschrieben wurden, gecheckt, d.h. auf Lese­ + fehler hin untersucht. Beide Vorgänge werden auf dem Bildschirm + protokolliert. + + Da die 'Check' - Operation nur bei Archivmanagern zulässig ist, ist diese Menu­ + funktionen ebenfalls nur bei Archivmanagern aktivierbar. Zur Erläuterung + sehen Sie bitte auch unter 'z Zieltask einstellen'. + + +#on("b")#h   Holen/Lesen#off("b")# + + Die Menufunktion dient dazu, Dateien, die bereits auf einer Archivdiskette oder + in einer anderen Task existieren, in die eigene Task zu kopieren. + + Alle Dateien der eingestellten Zieltask werden zur Auswahl angeboten. An­ + schließend werden Kopien der angekreuzten Dateien in der Reihenfolge des + Ankreuzens in die eigene Task geholt. Das Original in der Zieltask bleibt dabei + unverändert! Der Vorgang wird auf dem Bildschirm protokolliert. + + Sind in der eigenen Task schon Dateien mit gleichem Namen vorhanden, so + wird gefragt, ob die 'alten' Dateien überschrieben (gelöscht) werden dürfen. + Nur wenn Sie zustimmen, werden die in Ihrer Task existierenden Dateien + (unwiederbringlich!) gelöscht und Kopien der gleichnamigen Dateien aus der + Zieltask angefertigt. +#page# + Stimmen Sie dem Löschvorgang nicht zu, dann bleiben die bisherigen Dateien + in Ihrer Task erhalten - die Dateien aus der Zieltask werden dann aber auch + nicht in Ihre Task kopiert! Um dennoch die Kopien zu erhalten, können Sie die + namensgleichen Dateien in Ihrer Task umbenennen und dann erst die Dateien + aus der anderen Task anfordern. + + Normalerweise werden die Dateien vom Archiv der eigenen Station geholt. Mit + dem Menupunkt 'z Zieltask einstellen' kann diese Einstellung verändert + werden. + + Fehlerfälle: + - Lesefehler auf dem Archiv. + - Sehen Sie auch unter 'r Reservieren' + 's Schreiben' + 'z Zieltask einstellen'. + + +#on("b")#l   Löschen#off("b")# + + Die Menufunktion dient dazu, Dateien in der Zieltask (unwiederbringlich!) zu + löschen. Dazu werden alle Dateien der eingestellten Zieltask zur Auswahl ange­ + boten. Anschließend werden die angekreuzten Dateien in der Reihenfolge ihres + Ankreuzens gelöscht. Zur Sicherheit muß noch einmal für jede einzelne Datei + bestätigt werden, daß sie auch tatsächlich gelöscht werden soll. + + Beachten Sie, daß beim Löschen einer Datei auf einer Archivdiskette der + Speicherplatz im allgemeinen nicht wieder verwendet werden kann. In einem + solchen Fall könnte die Diskette voll geschrieben werden, obwohl eigentlich + genügend Platz vorhanden wäre. Diese Probleme treten bei anderen Tasks, die + keine Archivmanager sind, nicht auf, da deren Speicherplatz intelligenter + verwaltet wird. +#page# + Normalerweise ist als Zieltask das Archiv der eigenen Station eingestellt. Mit + dem Menupunkt 'z Zieltask einstellen' kann diese Einstellung verändert + werden. + + Fehlerfälle: + - Sehen Sie auch unter 'r Reservieren' + 's Schreiben' + 'z Zieltask einstellen'. + + +#on("b")#v   Verzeichnis#off("b")# + + Mit dieser Menufunktion können Sie sich einen Überblick über die in der + Zieltask (z.B. auf dem Archiv) vorhandenen Dateien verschaffen. + + Nach Aufruf der Funktion wird eine Liste der Dateien auf dem Bildschirm + ausgegeben, die sich in der Zieltask (z.B. auf dem Archiv) befinden. Ist die + Zieltask ein Archiv(manager), so wird auch angezeigt, wieviel Platz auf der + Diskette belegt ist. Da die Liste selbst eine Datei ist, kann sie mit der Tasten­ + kombination verlassen werden. Falls nicht alle Dateinamen auf + den Bildschirm passen, können Sie das Fenster mit und + verschieben. + + Fehlerfälle: + - Sehen Sie unter 'z Zieltask einstellen'. + + +#on("b")#d   Drucken#off("b")# + + Das Verzeichnis der Dateien in der Zieltask, das man mit der Menufunktion 'v + Verzeichnis' auf dem Bildschirm angezeigt bekommt, kann mit dieser Menu­ + funktion ausgedruckt werden. +#page# + Zur Sicherheit wird angefragt, ob wirklich ein solches Dateiverzeichnis der + Zieltask gedruckt werden soll. Bejaht man die Frage, so wird ein Dateiver­ + zeichnis erstellt und zum Drucker geschickt. + + Fehlerfälle: + - Der Drucker ist nicht funktionsbereit. + - Der Drucker wird nicht über die Task 'PRINTER' betrieben. + - Auf Ihrem System werden die Druckkosten abgerechnet. Sie müssen sich + mit einer Codenummer identifizieren. + + +#on("b")#i  Initialisieren#off("b")# + + Diese Menufunktion gestattet es, frische Disketten zu formatieren, zu + initialisieren bzw. beschriebene Disketten vollständig zu löschen und ggf. dabei + umzubenennen. Bei Aufruf dieser Menufunktion wird - sofern noch nicht + geschehen - das Archivlaufwerk automatisch reserviert. + + Wenn Sie eine fabrikneue Diskette aus der Verpackung nehmen, müssen Sie + diese zunächst #on("b")#formatieren#off("b")#. Dabei wird die Diskette auf ein festgelegtes + physikalisches Format eingestellt. Ohne daß diese Operation vorausgegangen + ist, kann eine Diskette weder beschrieben noch gelesen werden. + + Prinzipiell braucht eine Diskette nur ein einziges Mal formatiert zu werden. Sie + können Sie jedoch jederzeit wieder formatieren - z.B. wenn Sie Disketten ha­ + ben, von denen Sie nicht genau wissen, für welche Zwecke sie zuvor verwendet + wurden. + + Wenn Sie diese Menufunktion aktivieren, werden Sie so zunächst gefragt, ob Sie + die Diskette auch formatieren wollen. Bejahen Sie die Frage, so werden Ihnen + mehrere Formate zur Auswahl angeboten: +#page# + +----------------------------------+ + | Formatieren einer Diskette | + | | + | Dies sind die möglichen Formate: | + | | + | 1 .... 40 Spur - 360 KB | + | 2 .... 80 Spur - 720 KB | + | 3 .... 5 1/4" - 1,2 MB | + | 4 .... 3 1/2" - 1,4 MB | + | s .... Standard - Format | + | | + | | + | 1   2   3   4   s | + +----------------------------------+ + +#center#Abb.32:  Auswahl der Archiv-Formate + + Erkundigen Sie sich bei Ihrem Händler, welches Format Sie bei Ihrem Rechner + und den von Ihnen verwendeten Disketten einstellen müssen. Manche Rechner + unterstützen diese Operation innerhalb des EUMEL-Systems auch gar nicht, + das Formatieren muß dann irgendwie anders außerhalb des EUMEL-Systems + geschehen. + + Wenn Sie die Formatierung abgeschlossen oder auch übersprungen haben, + beginnt die eigentliche Initialisierung der Diskette. Dabei wird als erstes der + Archivname auf die Diskette geschrieben. Alle alten Daten, die sich ggf. auf der + Diskette befinden, werden bei diesem Vorgang unwiederbringlich (!) gelöscht. + + Zur Sicherheit überprüft das System in jedem Falle, ob es sich um eine EUMEL + - Diskette handelt, und erfragt Ihr Einverständnis, ob die Diskette wirklich + initialisiert werden soll. Geben Sie hierzu Ihr Einverständnis, dann wird noch + der (neue) Archivname erfragt. Hatte die Diskette schon einen Namen, dann + wird dieser zum Überschreiben angeboten. Wollen Sie den alten Archivnamen + beibehalten, so brauchen Sie nur die -Taste zu tippen, ansonsten + können Sie den Namen auch zuvor verändern oder einen ganz neuen Namen + hinschreiben. Anhand des ausgegebenen Namens können Sie auch über­ + prüfen, ob Sie die richtige Diskette eingelegt haben. +#page# + Das Initialisieren funktioniert natürlich nur, wenn Sie als Zieltask einen + Archivmanager eingestellt haben - ansonsten ist diese Menufunktion gesperrt + (nicht aktivierbar!). + + Fehlerfälle: + - Formatieren ist nicht auf dem System möglich. + - Sehen Sie auch unter 'r Reservieren' + 'z Zieltask einstellen'. + + +#on("b")#z   Zieltask einstellen#off("b")# + + Mit dieser Menufunktion können Sie festlegen, mit welcher Zieltask Sie + kommunizieren, d.h. z.B. Dateien austauschen möchten. Normalerweise ist hier + das Archiv am eigenen Rechner eingestellt. Das wird auch nach Aufklappen des + Pull-Down-Menus im Kasten unten angezeigt. + + Diese Menufunktion kann im Unterricht z.B. dazu genutzt werden, um fertig­ + gestellte Hausaufgaben in eine bestimmte Task zu schicken (Vatertask) oder um + von dort z.B. vorgefertigte Landschaften oder/und Programme abzuholen. + + Sie können aber auch eine andere Task einstellen (z.B. die Vatertask oder die + Task 'PUBLIC'), um mit diesen Dateien auszutauschen oder um sich auch nur + einen Überblick über die dort vorhandenen Dateien zu verschaffen. Wenn Sie + mit Ihrem Rechner in ein EUMEL-Netz integriert sind, können Sie auch auf + Tasks anderer Rechner zugreifen oder auch Disketten von Laufwerken anderer + Rechner einlesen (z.B. wenn Sie Disketten anderer Formate haben, die von + Ihrem Rechner nicht gelesen werden können). + + Dabei werden zwei Anforderungen an die Zieltask gestellt: Sie muß existieren + und bereit für den Dateiaustausch sein, d.h es muß eine Managertask sein, auf + die Sie Zugriff haben. Versuchen Sie auf andere Tasks zuzugreifen, so erhalten + Sie entsprechende (Fehler-)Meldungen. +#page# + Zu beachten ist noch, daß es im EUMEL-System verschiedene Arten von + Managertasks gibt - Archivmanager und normale Dateimanager. Der Unter­ + schied besteht darin, daß ein Archivmanager vom Benutzer vor dem Zugriff + reserviert werden muß - anschließend hat nur dieser Benutzer (bis zur Aufgabe + der Reservierung) ein Zugriffsrecht auf den Manager. Normale Dateimanager + können dagegen von mehreren Benutzern in beliebiger Reihenfolge ange­ + sprochen werden. + + Ein Archivmanager kann auch auf bestimmte Diskettenformate spezialisert sein + (z.B. auf das Lesen von DOS-Disketten). Manche Rechner haben auch mehrere + Archivmanager für verschiedene Laufwerke etc. Durch Einstellen unterschied­ + licher Archivmanager können Sie dann auf verschiedenen Laufwerken + archivieren. + + Nach Aktivieren dieses Menupunktes werden Ihnen die folgenden Alternativen + angeboten: + + + +-----------------------------------------+ + | Dateiaustausch gewünscht mit: | + | | + | a ...   Archiv (Eigene Station) | + | | + | v ...   Vatertask | + | | + | p ...   'PUBLIC' (Eigene Station) | + | | + | s ...   Sonstige Task | + | | + | Archiv   Vatertask   PUBLIC   Sonstige | + +-----------------------------------------+ + +#center#Abb.33:  Auswahl der Zieltask + + Da der Dateiaustausch mit dem Standardarchiv der eigenen Station (Task: + 'ARCHIVE'), mit der Vatertask und der Task 'PUBLIC' recht häufig in Anspruch + genommen wird, sind diese drei Optionen unter den Alternativen direkt ange­ +#page# + geben. Entscheiden Sie sich für eine dieser drei Tasks, so nimmt das System + alle notwendigen Einstellungen vor. Möchten Sie dagegen in Kontakt mit einer + anderen Task treten, so wählen Sie die Alternative 's ... Sonstige Task'. In + diesem Falle haben Sie noch 3 Angaben zu machen: + + - Zunächst werden Sie nach dem Namen der Zieltask gefragt. Geben Sie den + Namen der Zieltask - ohne Anführungsstriche (!) - ein und schließen Sie + die Eingabe mit der -Taste ab. (Den ausgegebenen Namen der + z.Z. eingestellten Task können Sie dabei verändern bzw. überschreiben.) + + - Dann wird die Nummer der Station im EUMEL-Netz erfragt, auf der sich + die Zieltask befindet. Die Nummer Ihrer Station wird als Vorschlag ausge­ + geben. Wollen Sie mit einer Task auf Ihrem Rechner kommunizieren, so + brauchen Sie diesen Vorschlag nur durch Drücken der -Taste + bestätigen - ansonsten tragen Sie zuvor die entsprechende Stationsnummer + ein. Ist Ihr Rechner nicht in ein EUMEL-Netz integriert, so wird die + Stationsnummer 0 (Null) ausgegeben. Bitte bestätigen Sie diese Stations­ + nummer durch Tippen der -Taste. + + - Zum Abschluß müssen Sie noch angeben, ob die eingestellte Zieltask ein + Archivmanager ist oder nicht. + + Das System versucht dann den Kontakt herzustellen. Je nachdem, welche + Einstellung Sie vorgenommen haben, sind bestimmte Funktionen innerhalb + des Menus nicht aktivierbar. Das System läßt nur die Funktionen zu, die + aufgrund Ihrer Einstellungen zulässig sind. + + Im Kasten unten auf dem Bildschirm wird jeweils angezeigt, welche Zieltask + eingestellt ist. Erscheint in diesem Kasten auch ein Hinweis auf den Archiv­ + namen, so haben Sie einen Archivmanager eingestellt. Ist dagegen vor dem + Namen der Zieltask noch eine Zahl und ein Schrägstrich angegeben, so haben + Sie eine Zieltask auf einem anderen Rechner eingestellt. +#page# + Bedenken Sie, daß Operationen mit Tasks auf anderen Stationen länger an­ + dauern können - werden Sie nicht ungeduldig! + + Sie können die Einstellung der Zieltask jederzeit wieder verändern! + + Fehlerfälle: + - Die eingestellte Zieltask existiert nicht. + - Die eingestellte Zieltask existiert zwar, ist aber nicht empfangsbereit, d.h. + ein Zugriff von Ihrer Task aus ist nicht möglich! + - Das Netz ist nicht funktionsbereit (Collector-Task fehlt). + - Die Kommunikation war nicht erfolgreich. + - Die gewünschte Operation kann mit der eingestellten Zieltask nicht ausge­ + führt werden (Zieltask ist z.B. gar kein Archivmanager - Sie aber ver­ + suchen, das Laufwerk zu reservieren). + diff --git a/doc/prozess/gs-prozess-8 b/doc/prozess/gs-prozess-8 new file mode 100644 index 0000000..c36ccc9 --- /dev/null +++ b/doc/prozess/gs-prozess-8 @@ -0,0 +1,377 @@ +limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (1)# +#headodd# +#center#gs-Prozess#right#% + +#end# +#headeven# +%#center#gs-Prozess + +#end# +#center#1 + +#on("b")#8  Detailbeschreibung der Basisbefehle und Tests#off("b")# + + +#on("b")# +BOOL PROC abbruch gewuenscht +#off("b")# + + - erfragt, ob inzwischen durch einen Basisbefehl die Tastenfolge + im Eingabestrom registriert worden ist. Ist das der Fall, liefert die Prozedur + den Wert 'TRUE', sonst 'FALSE'. + + +#on("b")# +BOOL PROC bit ist gesetzt (INT CONST kanal, bitnummer) +#off("b")# + + - untersucht, ob inzwischen die Tastenfolge eingegeben wurde. + Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung + "Programm-Abbruch durch !". + - registriert, ob inzwischen die Tastenfolge eingegeben wurde. + - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")# + 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "Kanalnummer ... ist unzulässig!". + - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Ein­ + gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "An Kanal ... ist keine Digital-Eingabe möglich!". + - untersucht, ob die angegebene Bitnummer zulässig ist (0 #on("b")#<#off("b")# 'bitnummer' #on("b")#<#off("b")# + 7). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehlermeldung "Bit­ + nummer ... ist nicht zulässig!". + - liest den aktuell anliegenden Wert am angegebenen Kanal. + - liefert den Wert 'TRUE', wenn in der binären Darstellung das Bit mit der + angegebenen Bitnummer gesetzt ist ("I"), sonst den Wert 'FALSE'. + +#on("b")# +TEXT PROC bitmuster (INT CONST kanal) +#off("b")# + + - untersucht, ob inzwischen die Tastenfolge eingegeben wurde. + Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung + "Programm-Abbruch durch !". +#page# + - registriert, ob inzwischen die Tastenfolge eingegeben wurde. + - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")# + 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "Kanalnummer ... ist unzulässig!". + - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Ein­ + gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "An Kanal ... ist keine Digital-Eingabe möglich!". + - liest den aktuell anliegenden Wert am angegebenen Kanal ein und wandelt + ihn in die binäre Darstellung. + - liefert einen Text der Länge 8, bestehend aus den Zeichen "I" und/oder "O". + + +#on("b")# +PROC bitmuster ausgeben (INT CONST kanal, + TEXT CONST bitmuster) +#off("b")# + + - untersucht, ob inzwischen die Tastenfolge eingegeben wurde. + Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung + "Programm-Abbruch durch !". + - registriert, ob inzwischen die Tastenfolge eingegeben wurde. + - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")# + 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "Kanalnummer ... ist unzulässig!". + - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Aus­ + gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "An Kanal ... ist keine Digital-Ausgabe möglich!". + - untersucht die übergebene Zeichenkette (bitmuster) auf korrekte Länge (8 + Zeichen). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehlermeldung + "Das Bitmuster ... hat eine unzulässige Länge!". + - überprüft die in der übergebenen Zeichenkette (bitmuster) vorkommenden + Symbole auf ihre Zulässigkeit ("I", "O", "X", "T"). Taucht ein unzulässiges + Symbol auf, erfolgt ein Abbruch mit der Fehlermeldung "... ist ein unzu­ + lässiges Bitsymbol in ...!". +#page# + - aus dem am angegebenen Kanal zuletzt ausgegeben Wert und der über­ + gebenen Zeichenkette (bitmuster) wird der auszugebende Dezimalwert er­ + mittelt. Dieser Dezimalwert wird am angegebenen Kanal ausgegeben. Dabei + bedeuten "I", daß das betreffende Bit gesetzt wird,  "O", daß das betreffende + Bit nicht gesetzt wird,  "X", daß das betreffende Bit gegenüber der zuvor + erfolgten Ausgabe am gleichen Kanal nicht verändert wird und   "T", daß das + betreffende Bit gegenüber der zuvor erfolgten Ausgabe am gleichen Kanal + invertiert wird. + + +#on("b")# +BOOL PROC bitmuster gleich (INT CONST kanal, + TEXT CONST vergleichsmuster) +#off("b")# + + - untersucht, ob inzwischen die Tastenfolge eingegeben wurde. + Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung + "Programm-Abbruch durch !". + - registriert, ob inzwischen die Tastenfolge eingegeben wurde. + - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")# + 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "Kanalnummer ... ist unzulässig!". + - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Ein­ + gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "An Kanal ... ist keine Digital-Eingabe möglich!". + - untersucht die übergebene Zeichenkette (bitmuster) auf korrekte Länge (8 + Zeichen). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehlermeldung + "Das Bitmuster ... hat eine unzulässige Länge!". + - überprüft die im 'vergleichsmuster' vorkommenden Symbole auf ihre Zu­ + lässigkeit ("I", "O", "X"). Taucht ein unzulässiges Symbol auf, erfolgt ein + Abbruch mit der Fehlermeldung "... ist ein unzulässiges Bitsymbol in ...!". + - liest den aktuell anliegenden Wert am angegebenen Kanal ein und wandelt + ihn in die binäre Darstellung. + - überprüft, ob das eingelesene Bitmuster zum 'vergleichsmuster' "paßt". Ist + das der Fall, wird der Wert 'TRUE' geliefert, sonst der Wert 'FALSE'. +#page# +#on("b")# +TEXT PROC bitsymbol (INT CONST kanal, bitnummer) +#off("b")# + + - untersucht, ob inzwischen die Tastenfolge eingegeben wurde. + Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung + "Programm-Abbruch durch !". + - registriert, ob inzwischen die Tastenfolge eingegeben wurde. + - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")# + 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "Kanalnummer ... ist unzulässig!". + - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Ein­ + gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "An Kanal ... ist keine Digital-Eingabe möglich!". + - untersucht, ob die angegebene Bitnummer zulässig ist (0 #on("b")#<#off("b")# 'bitnummer' #on("b")#<#off("b")# + 7). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehlermeldung "Bit­ + nummer ... ist nicht zulässig!". + - liest den aktuell anliegenden Wert am angegebenen Kanal ein und wandelt + ihn in die binäre Darstellung. + - liefert einen Text der Länge 1, nämlich "I" oder "O". + + +#on("b")# +PROC bitsymbol ausgeben (INT CONST kanalnummer, bitnummer, + TEXT CONST bitsymbol) +#off("b")# + + - untersucht, ob inzwischen die Tastenfolge eingegeben wurde. + Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung + "Programm-Abbruch durch !". + - registriert, ob inzwischen die Tastenfolge eingegeben wurde. + - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")# + 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "Kanalnummer ... ist unzulässig!". + - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Aus­ + gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "An Kanal ... ist keine Digital-Ausgabe möglich!". +#page# + - untersucht, ob die angegebene Bitnummer zulässig ist (0 #on("b")#<#off("b")# 'bitnummer' #on("b")#<#off("b")# + 7). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehlermeldung "Bit­ + nummer ... ist nicht zulässig!". + - überprüft das übergebene Bitsymbol auf Zulässigkeit ("I", "O", "X", "T"). + Taucht ein unzulässiges Symbol auf oder besteht das Bitsymbol aus mehr als + einem Zeichen, erfolgt ein Abbruch mit der Fehlermeldung "... ist ein unzu­ + lässiges Bitsymbol!". + - ermittelt aus dem am angegebenen Kanal zuletzt ausgegeben Wert und der + übergebenen Bitnummer/dem übergebenen Bitsymbol den auszugebende + Dezimalwert. Dieser Dezimalwert wird am angegebenen Kanal ausgegeben. + Dabei bedeuten "I", daß das betreffende Bit gesetzt wird,  "O", daß das be­ + treffende Bit nicht gesetzt wird,  "X", daß das betreffende Bit gegenüber der + zuvor erfolgten Ausgabe am gleichen Kanal nicht verändert wird und  "T", daß + das betreffende Bit gegenüber der zuvor erfolgten Ausgabe am gleichen Kanal + invertiert wird. + + +#on("b")# +INT PROC dezimalwert (INT CONST kanal) +#off("b")# + + - untersucht, ob inzwischen die Tastenfolge eingegeben wurde. + Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung + "Programm-Abbruch durch !". + - registriert, ob inzwischen die Tastenfolge eingegeben wurde. + - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")# + 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "Kanalnummer ... ist unzulässig!". + - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Ein­ + gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "An Kanal ... ist keine Digital-Eingabe möglich!". + - liest den aktuell anliegenden Wert am angegebenen Kanal ein. + - liefert einen INT-Wert mit  0 #on("b")#<#off("b")# 'wert' #on("b")#<#off("b")# 255. +#page# +#on("b")# +PROC dezimalwert ausgeben (INT CONST kanal, wert) +#off("b")# + + - untersucht, ob inzwischen die Tastenfolge eingegeben wurde. + Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung + "Programm-Abbruch durch !". + - registriert, ob inzwischen die Tastenfolge eingegeben wurde. + - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")# + 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "Kanalnummer ... ist unzulässig!". + - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Aus­ + gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "An Kanal ... ist keine Digital-Ausgabe möglich!". + - ermittelt den auszugebenden Wert durch die Rechnung +#on("b")# +#center#ausgabe = wert MOD 256, +#off("b")# + und gibt diesen am angegebenen Kanal aus. + + +#on("b")# +PROC initialisiere interface +#off("b")# + + - untersucht, ob inzwischen die Tastenfolge eingegeben wurde. + Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung + "Programm-Abbruch durch !". + - registriert, ob inzwischen die Tastenfolge eingegeben wurde. + - untersucht, ob das Programm korrekt (mit 'run pdv') gestartet wurde. Ist das + nicht der Fall, erfolgt ein Abbruch mit der Fehlermeldung "PDV-Programme + müssen mit 'run pdv' gestartet werden!". Dieser Fehler kann nicht auftreten, + wenn die Programme vom #on("b")#gs-Prozess#off("b")#-Menu gestartet werden! + - An jeden Digitalausgang des angeschlossenen Interface-Systems wird der Wert + '0', an jeden Analogausgang eine "Nullspannung" angelegt (d.h. alles wird + "ausgeschaltet"). Die internen Variablen werden dabei initialisiert. +#page# +#on("b")# +PROC spannungswert (INT CONST kanal) +#off("b")# + + - untersucht, ob inzwischen die Tastenfolge eingegeben wurde. + Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung + "Programm-Abbruch durch !". + - registriert, ob inzwischen die Tastenfolge eingegeben wurde. + - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")# + 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "Kanalnummer ... ist unzulässig!". + - untersucht, ob am angegebenen Kanal laut Konfiguration eine analoge Ein­ + gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "An Kanal ... ist keine Analog-Eingabe möglich!". + - ermittelt die laut Konfiguration aktuelle Obergrenze (u max) und Untergrenze + (u min) des Spannungsbereiches am angegebenen Analogeingang. + - liest den aktuell anliegenden Wert (0 #on("b")#<#off("b")# 'wert' #on("b")#<#off("b")# 255) am angegebenen + Kanal ein und wandelt ihn nach folgender Rechnung: + +#on("b")# + real(wert) * (u max - u min) + lieferwert = ---------------------------- + u min + 255.0 + +#off("b")# + - liefert einen REAL-Wert mit  u min #on("b")#<#off("b")# 'lieferwert' #on("b")#<#off("b")# u max, gerundet auf drei + Nachkommastellen. + + +#on("b")# +PROC spannungswert ausgeben (INT CONST kanal, + REAL CONST spannung) +#off("b")# + + - untersucht, ob inzwischen die Tastenfolge eingegeben wurde. + Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung + "Programm-Abbruch durch !". + - registriert, ob inzwischen die Tastenfolge eingegeben wurde. + - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")# + 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "Kanalnummer ... ist unzulässig!". +#page# + - untersucht, ob am angegebenen Kanal laut Konfiguration eine analoge Aus­ + gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "An Kanal ... ist keine Analog-Ausgabe möglich!". + - ermittelt die laut Konfiguration aktuelle Obergrenze (u max) und Untergrenze + (u min) des Spannungsbereiches am angegebenen Analogausgang und prüft, + ob  u min #on("b")#<#off("b")# 'spannung' #on("b")#<#off("b")# u max. Ist das nicht der Fall, erfolgt ein Abbruch + mit der Fehlermeldung 'Der Spannungswert ... ist nicht zulässig!". + - wandelt die angegebene 'spannung' nach der Rechnung: + +#on("b")# + (wert - u min) * 255.0 + ausgabewert = int ( ---------------------- + 0.5 ) + u max - u min + +#off("b")# + - gibt den ermittelten 'ausgabewert' am angegebenen Kanal aus. + + +#on("b")# +REAL PROC temperatur (REAL CONST spannungswert) +#off("b")# + + - errechnet aus dem Spannungswert, der vom Temperaturfühler eingelesen + wurde, der Thermometerkonstanten und der Minimaltemperatur die + Temperatur in �C. + - liefert einen REAL-Wert (die Temperatur in �C). + So nur anwendbar auf den Temperaturfühler der Fa. AKTRONIK! + + +#on("b")# +PROC tue nichts +#off("b")# + + - untersucht, ob inzwischen die Tastenfolge eingegeben wurde. + Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung + "Programm-Abbruch durch !". + - registriert, ob inzwischen die Tastenfolge eingegeben wurde. +#page# +#on("b")# +PROC warte (INT CONST sekunden) +#off("b")# + + - untersucht, ob inzwischen die Tastenfolge eingegeben wurde. + Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung + "Programm-Abbruch durch !". + - registriert, ob inzwischen die Tastenfolge eingegeben wurde. + - wirkt sonst wie 'pause (sekunden * 10)'. + + +#on("b")# +PROC warte (REAL CONST sekunden) +#off("b")# + + - untersucht, ob inzwischen die Tastenfolge eingegeben wurde. + Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung + "Programm-Abbruch durch !". + - registriert, ob inzwischen die Tastenfolge eingegeben wurde. + - wirkt sonst wie 'pause (int (sekunden * 10.0 + 0.5))'. + + +#on("b")# +PROC wert an analogausgang ausgeben (INT CONST kanal, wert) +#off("b")# + + - untersucht, ob inzwischen die Tastenfolge eingegeben wurde. + Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung + "Programm-Abbruch durch !". + - registriert, ob inzwischen die Tastenfolge eingegeben wurde. + - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")# + 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "Kanalnummer ... ist unzulässig!". + - untersucht, ob am angegebenen Kanal laut Konfiguration eine analoge Aus­ + gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "An Kanal ... ist keine Analog-Ausgabe möglich!". + - ermittelt den auszugebenden Wert durch die Rechnung + +#on("b")# +#center#ausgabe = wert MOD 256, + +#off("b")# + und gibt diesen Wert am angegebenen Kanal aus. Die am Analogausgang + auszugebende Spannung wird vom D/A-Wandler des Interface-Systems er­ + mittelt. +#page# +#on("b")# +INT PROC wert von analogeingang (INT CONST kanal) +#off("b")# + + - untersucht, ob inzwischen die Tastenfolge eingegeben wurde. + Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung + "Programm-Abbruch durch !". + - registriert, ob inzwischen die Tastenfolge eingegeben wurde. + - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")# + 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "Kanalnummer ... ist unzulässig!". + - untersucht, ob am angegebenen Kanal laut Konfiguration eine analoge Ein­ + gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­ + meldung "An Kanal ... ist keine Analog-Eingabe möglich!". + - liefert den vom A/D-Wandler des Interface-Systems gelieferten Wert mit 0 #on("b")#<#off("b")# + 'lieferwert' #on("b")#<#off("b")# 255. + diff --git a/doc/prozess/gs-prozess-9 b/doc/prozess/gs-prozess-9 new file mode 100644 index 0000000..6551b01 --- /dev/null +++ b/doc/prozess/gs-prozess-9 @@ -0,0 +1,477 @@ +limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (1)# +#headodd# +#center#gs-Prozess#right#% + +#end# +#headeven# +%#center#gs-Prozess + +#end# +#center#1 + +#on("b")#9  Hinweise für den Systembetreuer/   Programmierer#off("b")# + +Sie haben wahrscheinlich bisher - ausschließlich zu Testzwecken - mit nur einem +Interface-System gearbeitet. In diesem Kapitel möchten wir Ihnen Vorschläge +machen, wie Sie Ihr Tasksystem organisieren können, um möglichst effektiv und +störungsfrei mit der vorhandenen Hardware zu arbeiten. + +Neben den Möglichkeiten der Organisation des Systems werden wir Ihnen zeigen, wie +Sie eine einmal vorgenommene Konfiguration/Organisation "fixieren", d.h. schützen +können. + +Im letzten Teil dieses Kapitels werden wir für den #on("b")#routinierten(!) Programmierer#off("b")#, +Möglichkeiten aufzeigen, wie man, unter weitgehender Umgehung von #on("b")#gs-Prozess#off("b")#, +Programme für spezielle Anwendungen entwickeln kann. Schon an dieser Stelle sei +ausdrücklich gesagt, daß dabei alle "Sicherheiten", die #on("b")#gs-Prozess#off("b")# normalerweise +bietet, nicht (mehr) vorhanden sind. + + +#on("b")#9.1  Vergabe der Kanäle/Organisation des Tasksystems#off("b")# + +Zur optimalen Organisation Ihres Systems sollten Sie wissen, in welcher Task die +Konfiguration sinnvollerweise vorzunehmen ist. Da die Aspekte sehr vielfältig sind, +werden wir verschiedene Situationen beschreiben. Lesen Sie die Ausführungen zu der +Situation, die der Ihren am ehesten entspricht. + + +#on("b")# +1) Es stehen mehrere MUFIs als Adapter zur Verfügung. Alle MUFIs sollen + im Terminalkanal betrieben werden. Die Arbeitsplätze sind alle mit + dem gleichen Interfacesystem ausgestattet. +#off("b")# +#page# + Sie sind hervorragend ausgestattet. Die Organisation und Konfiguration des + Systems ist sehr einfach: + + Es ist sinnvoll, die Konfiguration von #on("b")#gs-Prozess#off("b")# in der Task vorzunehmen, in + der Sie #on("b")#gs-Prozess#off("b")# installiert haben. Das hat den Vorteil, daß alle Sohntasks, + die sich anschließend anmelden, diese Konfiguration "erben". + + Bei dieser Ausstattung ist es sinnvoll die Konfiguration zu "fixieren", um irrtüm­ + lichen oder "böswilligen" Umkonfigurationen vorzubeugen. Sehen Sie dazu + Kapitel 9.4. + + +#on("b")# +2) Es stehen mehrere MUFIs als Adapter zur Verfügung. Alle MUFIs sollen + im Terminalkanal betrieben werden. Die Arbeitsplätze sind aber mit + verschiedenen Interface-Systemen ausgestattet. +#off("b")# + + Wenn die Bestückung der einzelnen Arbeitsplätze ständig wechselt, ist es nicht + sinnvoll, eine generelle Konfiguration vorzugeben. Teilen Sie jedem Anwender + mit, daß er selbst für die Konfiguration seines Systems zuständig ist. Er sollte bei + jedem Neuankoppeln seiner Task zumindest die Konfiguration überprüfen und + ggf. den Vorgaben entsprechend eine Anpassung vornehmen. Es ist nicht sinn­ + voll, die jeweilige Konfiguration zu fixieren. + + Wenn Sie zwar unterschiedliche Interface-Systeme verwenden, aber die Inter­ + face-Systeme einzelnen MUFIs eindeutig zuordnen können, lohnt es sich schon, + eine Konfiguration des Systems vorzugeben. + + Richten Sie zu diesem Zwecke so viele Tasks ein, wie Sie unterschiedliche + Interface-Systeme zur Verfügung haben, und ordnen Sie jedem Interface-System + eindeutig je eine Task zu. Die Namen der Tasks sollten Sie so wählen, daß sofort + ersichtlich ist, welchem Interface-System sie zugeordnet ist. + + Nehmen Sie in jeder Task eine Konfiguration von #on("b")#gs-Prozess#off("b")# entsprechend + dem zugeordneten Interface-System vor. +#page# + Auch hier ist es sinnvoll, die vorgenommenen Konfigurationen zu "fixieren", um + irrtümlichen oder "böswilligen" Umkonfigurationen vorzubeugen. Sehen Sie + dazu Kapitel 9.4. + + Die Anwender sollten sich später jeweils als Sohntask der Task anmelden, die + sich dem an ihrem Arbeitsplatz vorhandenen Interface-System eindeutig zu­ + ordnen läßt. + + +#on("b")# +3) Es steht nur ein MUFI als Adapter zur Verfügung. Das MUFI soll im + Terminalkanal betrieben werden. +#off("b")# + + Je nachdem, ob Sie eine feste Hardware am MUFI betreiben oder nicht, sollten + Sie sich an den beiden zuvor beschriebenen Fällen orientieren. + + +#on("b")# +4) Es steht nur ein RS232-Adapter oder ein MUFI, das als Endgerät an + einer separaten Schnittstelle betrieben werden soll, zur Verfügung. Es + soll nur von einem Arbeitsplatz/einer Task aus mit dem angeschlos­ + senen Interface-System gearbeitet werden. +#off("b")# + + Nehmen Sie die Installation/Konfiguration wie unter 5) beschrieben vor. + Arbeiten Sie nur in der Task, in der Sie die Konfiguration vorgenommen haben. + + +#on("b")# +5) Es steht nur ein Adapter zur Verfügung. Sie wollen aber die Möglichkeit + schaffen, daß von verschiedenen Tasks abwechselnd darauf zugegriffen + werden kann. +#off("b")# + + Es ist gleichgültig, ob Sie ein MUFI oder einen RS232-Adapter verwenden - sie + sollten den Adapter an einer separaten seriellen Schnittstelle betreiben. +#page# + Auch wenn Sie ein MUFI besitzen, kann es vorteilhaft sein, das MUFI nicht im + Terminalkanal, sondern an einer separaten Schnittstelle zu betreiben: + + Beim Betrieb im Terminalkanal kann nämlich nur die Task mit dem MUFI + kommunizieren, die an das Terminal gekoppelt ist, in dessen Zuleitung das + MUFI eingebaut ist. Das wird hier zum Nachteil, denn wenn eine andere Task + auf das Interface-System zugreifen möchte, muß erst die alte Task abgekoppelt + und die neue an das Terminal mit dem MUFI angekoppelt werden. + + Der Betrieb an einer separaten Schnittstelle bietet hier wahrscheinlich viel­ + fältigere Möglichkeiten, wenngleich Sie dadurch auch Geschwindigkeitsein­ + bußen hinnehmen müssen. + + #on("b")#gs-Prozess#off("b")# bietet Ihnen bei Betrieb eines Adapters an einer separaten seriellen + Schnittstelle nämlich die Möglichkeit, abwechselnd von verschiedenen Tasks auf + den Adapter und das angeschlossene Interface-System zugreifen zu können. + + Teilen Sie bei der Installation (automatischen Generierung) von #on("b")#gs-Prozess#off("b")# + dem System gleich mit, daß Sie Ihren Adapter (ob nun MUFI oder + RS232-Adapter) an einer separaten seriellen Schnittstelle betreiben wollen. + Schon bei dieser Installation werden Sie nach der Kanalnummer gefragt. + + Wir gehen hier davon aus, daß Sie immer mit dem gleichen Interface-System an + diesem Adapter arbeiten werden. In diesem Falle empfiehlt es sich, gleich in der + Task, in der Sie die Installation vorgenommen haben, auch die Konfiguration + von #on("b")#gs-Prozess#off("b")# vorzunehmen und die Konfiguration zu "fixieren". Durch die + Konfiguration in dieser Task, "erben" alle Sohntasks, die anschließend ange­ + meldet werden, diese Konfiguration. + + Wenn Sie sich mit 'taskinfo ' einen Katalog ausgeben lassen, + werden Sie feststellen, daß eine weitere Task als unbenannter Sohn ("-") Ihrer + Task eingerichtet worden ist. Sie haben nämlich Ihre Task zu einer "zentralen + Abwicklungstask" gemacht - genauer gesagt die unbenannte Sohntask. +#page# + Wenn Sie aus Ihrer Task, in der Sie die Konfiguration vorgenommen haben, mit + dem Interface-System kommunizieren, erfolgt der Zugriff über diese unbe­ + nannte Sohntask! + + Sie schaffen dadurch aber zusätzlich die Möglichkeit, daß mehrere Sohntasks - + natürlich abwechselnd - über diese "zentrale Abwicklungstask" mit dem Inter­ + face-System kommunizieren. Selbstverständlich setzt der Zugriff auf das Inter­ + face-System eine Absprache zwischen den Beteiligten voraus! + + + Gerade in der Aufbauphase, wenn erst wenige Geräte zur Verfügung stehen, ist + das eine Möglichkeit, von verschiedenen Arbeitsplätzen aus mit nur einem Adap­ + ter/Interface-System Prozeßdatenverarbeitung zu betreiben. + + +#on("b")# +6) Sie wollen mehrere Adapter an separaten seriellen Schnittstellen + betreiben. +#off("b")# + + In diesem Falle ist es sinnvoll - bevor Sie eine Konfiguration vornehmen - gleich + nach der Installation von #on("b")#gs-Prozess#off("b")# für jeden einzelnen Adapter eine Sohntask + unter der Task einzurichten, in der #on("b")#gs-Prozess#off("b")# installiert ist. Jede dieser Sohn­ + tasks koppeln Sie mit einem festen Kanal, an dem ein Adapter/Interface-System + angeschlossen ist. + + Sie brauchen dazu #on("b")#gs-Prozess#off("b")# nicht mehrfach zu installieren; wir haben für + diesen Fall vorgesorgt. Für die Kopplung der Tasks an die einzelnen Kanäle steht + die Prozedur 'PROC interfacekanal (INT CONST kanalnummer)' zur Verfügung. + Geben Sie also in einer Task z.B. das Kommando 'interfacekanal (5) + ', so wird von dieser Task aus das Interface-System am Kanal 5 + angesprochen. + + Über die Prozedur 'INT PROC interfacekanal' können Sie sich in jeder Task + informieren, über welchen Kanal die Kommunikation mit dem Interface-System + abgewickelt wird: z.B. mit 'put (interfacekanal) '. +#page# + Ihnen ist sicher klar, daß es auch hier sinnvoll ist, den Namen der jeweiligen + Task so zu wählen, daß daraus sofort der betreffende Interfacekanal ablesbar + ist. + + In jeder so an einen Kanal gekoppelten Task sollten Sie die Konfiguration von + #on("b")#gs-Prozess#off("b")# vornehmen und ggf. "fixieren". Jede solche Task richtet auto­ + matisch eine unbenannte Sohntask ("-") ein, die sich wie eine "zentrale Ab­ + wicklungstask" verhält. Wenn Sie also aus Ihrer Task oder aus neu einge­ + richteten Sohntasks mit dem Interface-System kommunizieren, so erfolgt das + über die "zentrale Abwicklungstask". + + +#on("b")#9.2  Informationsprozeduren#off("b")# + +Zur Information stehen dem Systembetreuer drei wichtige Prozeduren zur Verfügung: + +#on("b")# +TEXT PROC adapterart +#off("b")# + +Hiermit können Sie in Erfahrung bringen, welche Interfaceanpassung z.Z. in der +aktuellen Task insertiert ist: MUFI im Terminalkanal, MUFI als Endgerät oder +AKTRONIK-Adapter (RS232-Adapter). + + +#on("b")# +INT PROC interfacekanal +#off("b")# + +Hiermit können Sie in Erfahrung bringen, über welchen Kanal z.Z. mit dem Inter­ +face-System aus der Task kommuniziert wird. Die Prozedur steht allerdings nur dann +zur Verfügung, wenn das Interface-System an einer separaten Schnittstelle betrieben +wird - sonst erscheint der Hinweis 'FEHLER: unbekanntes Kommando'. + +Es gibt noch einen Befehl, mit dem Sie sich über den Zustand des Interface-Systems +informieren können: +#page# +#on("b")# +PROC oeffne interface (INT VAR testwert) +#off("b")# + +Die Prozedur versucht, die aktuelle Betriebsart einzustellen. Anschließend erhalten +Sie eine 'Erfolgsauskunft'. Dabei bedeuten: + + 0 - alles okay + -1 - Interface ist noch nicht konfiguriert + -2 - Interface-Task ist besetzt + -3 - Interfacekanal ist belegt + -4 - Interface meldet sich nicht + -5 - Interface kann nicht geöffnet werden + +Ist der Adapter an einer separaten Schnittstelle angeschlossen, so arbeitet der Befehl +über die "zentrale Abwicklungstask". Als Antwort können alle genannten Codes auftre­ +ten; beim MUFI im Terminalkanal allerdings nur die Codes 0, -1 und -4. Die oben +genannten Fehlermeldungen sind detailliert in Kapitel 5.5 erläutert. + +Sie sollten anschließend #on("b")#unbedingt#off("b")# das Kommando 'schliesse interface' geben: Eine +eventuell durch 'oeffne interface' vollzogene Betriebsartumstellung wird dadurch +rückgängig gemacht. + + + +#on("b")#9.3  Neufestlegung des Interfacekanals#off("b")# + +Wenn Sie mit MUFI(s) im Terminalkanal arbeiten, spielen Kanalnummern für das +Ansprechen des/der MUFIs keine Rolle. Das jeweilige MUFI kann in diesem Falle +nämlich immer nur von der Task aus angesprochen werden, die an das Terminal +gekoppelt ist, in dessen Zuleitung das MUFI eingebaut wurde. + +Wenn Sie Adapter (MUFI oder RS232-Adapter) an separaten seriellen Schnittstellen +betreiben, so legen Sie schon bei der Installation von #on("b")#gs-Prozess#off("b")# den Kanal fest, +über den die Task mit dem Interface-System kommuniziert. Wie wir schon oben be­ +schrieben haben, können Sie den Interface-Kanal mit der Prozedur 'PROC interface­ +kanal (INT CONST kanalnummer)' neu festlegen. Beachten Sie dabei aber bitte +folgendes: +#page# +Wenn Sie in einer Task #on("b")#gs-Prozess#off("b")# konfigurieren und zuvor entschieden haben, daß +der Adapter an einer separaten Schnittstelle betrieben wird, so wird automatisch eine +unbenannte Sohntask ("-") eingerichtet. Diese Sohntask wird zur "zentralen Abwick­ +lungstask". Wenn Sie nun aus der Task, in der Sie die Konfiguration vorgenommen +haben, oder aus einer Sohntask dieser Task, die anschließend eingerichtet wird, mit +dem Interface-System kommunizieren, so erfolgt diese Kommunikation über diese +unbenannte Sohntask. Daher wählten wir die Bezeichnung "zentrale Abwicklungs­ +task". + +Da die "zentrale Abwicklungstask" den "Zustand der Vatertask" in dem Augenblick +erbt, in dem Sie eingerichtet wird, würde eine später erfolgende Neufestlegung des +Interfacekanals nicht von Ihr registriert und damit auch nicht wirksam. + +#on("b")#Es ist unbedingt notwendig#off("b")#, in der Task, in der Sie eine Neufestlegung des Interface- +Kanals vornehmen, #on("b")#gs-Prozess#off("b")# auch neu zu konfigurieren! Bei der Neukonfiguration +wird nämlich die unbenannte Sohntask gelöscht und neu eingerichtet. + +(Das hier beschriebene Phänomen ist Ihnen wahrscheinlich schon aus der +PRINTER-Task bekannt). + +Hinsichtlich der Sicherheit des Systems hat dieses Vorgehen aber einen Vorteil: wenn +in den "zugänglichen Sohntask", die über eine "zentrale Abwicklungstask" mit dem +Interface-System kommunizieren eine Neueinstellung des Interface-Kanals vorge­ +nommen wird, so bleibt diese unwirksam (solange in der Sohntask nicht umkonfigu­ +riert wird - was sich aber verhindern läßt! Sehen Sie dazu das folgende Kapitel!). + + +#on("b")#9.4  Fixieren der Konfiguration#off("b")# + +Prinzipiell kann in jeder Task, in der #on("b")#gs-Prozess#off("b")# zur Verfügung steht, die Konfigura­ +tion (von #on("b")#gs-Prozess#off("b")#) vorgenommen werden. Gerade von unerfahrenen Anwendern +könnte aber irrtümlich eine Umkonfiguration vorgenommen werden. Aber nicht nur +das: auch erfahrene Anwender könnten "böswillig" die Konfiguration verändern. Aus +diesem Grunde ist es ggf. sinnvoll, eine vorgenommene Konfiguration zu fixieren +(schützen). +#page# +Dazu steht die Prozedur 'PROC pdv konfiguration zugelassen (BOOL CONST ent­ +scheidung)' zur Verfügung. Mit dem Kommando 'pdv konfiguration zugelassen +(FALSE) ' sperren Sie in der aktuellen Task und in allen Sohntasks, die +sich #on("b")#anschließend#off("b")# unter dieser Task anmelden, den Menupunkt 'k Konfigurieren' +unter dem Oberbegriff 'Interface'. + +Sofern nötig, können Sie diese Sperre mit dem Kommando 'pdv konfiguration zuge­ +lassen (TRUE) ' wieder aufheben, #on("b")#allerdings nur in der Task, in der Sie +auch die Sperre gesetzt haben#off("b")#, denn #on("b")#gs-Prozess#off("b")# merkt sich diesen Tasknamen! +Wenn Sie also ein Password auf diese Task legen, und damit anderen den Zugang +verwehren, kann auch eine "böswilligie Umkonfiguration" verhindert werden. + + +#on("b")#9.5  Mögliche Fehlerfälle#off("b")# + +Wenn Fehlermeldungen auftreten, so finden Sie Fehlerbeschreibungen und Möglich­ +keiten zur Abhilfe im Kapitel 5.5 beschrieben. Auf einen Fehlerzustand möchten wir +Sie hier noch besonders hinweisen: + +#on("b")#Interfacekanal ist belegt!#off("b")# + + Über den angegebenen Kanal greift schon eine andere Task auf das angeschlos­ + sene Interface-System zu. Vielleicht wurde der betreffende Kanal auch zuvor für + andere Zwecke verwendet - anschließend hat der Benutzer den Kanal nicht + ordentlich freigegeben. Geben Sie in der 'gib kommmando'-Ebene den Befehl + 'taskinfo (2) '. In der Spalte mit der Überschrift 'CHAN' müßte jetzt + irgendwo die Kanalnummer auftauchen. Steht die Kanalnummer bei einem Sohn + der Task 'SUPERVISOR', so liegt der letztgenannte Fall vor, sonst der erstge­ + nannte. + + Abhilfe: Schließen Sie Ihr Interface-System an einen anderen Kanal an oder + bitten Sie den betreffenden Anwender, den Kanal freizugeben. + Ist das nicht möglich, so kann aus einer Systemtask das Kommando + 'end (canal (kanalnummer))' ' gegeben werden. Statt + 'kanalnummer' ist natürlich die tatsächliche Nummer (z.B. '4') + anzugeben. +#page# +#on("b")#9.6  Weitere Möglichkeiten#off("b")# + +Ihnen ist sicher aufgefallen, daß wir uns bemüht haben, einen sinnvollen Kompro­ +miß zwischen Sicherheit in der Handhabung und Geschwindigkeit des Systems zu +finden. In Zweifelsfällen haben wir uns eher zugunsten der Sicherheit entschieden. + +Sicher werden Sie inzwischen bemerkt haben, daß die Kommunikation mit einem +Adapter (MUFI oder RS232-Adapter) an einer separaten seriellen Schnittstelle recht +zeitaufwendig ist. + +Prinzipiell standen uns bei der Konzeption zwei Möglichkeiten zur Verfügung: Ent­ +weder wir gestalten jeden Basisbefehl so, daß wir uns zu Beginn der Ausführung +jeweils direkt an den betreffenden Kanal ankoppeln und am Ende der Ausführung +des Befehls wieder abkoppeln - oder wir richten eine "zentrale Abwicklungstask" ein +und nutzen die Intertaskkommunikation des EUMELs. Wir haben uns nach diversen +Tests für die zweite Variante entschieden: Einmal zeigte sich, daß dieses Verfahren +weit weniger zeitaufwendig ist als das ständige An- und Abkoppeln an den Interface- +Kanal. Zum anderen konnten wir so die Möglichkeit schaffen, über diese "zentrale +Abwicklungstask" den abwechselnden, koordinierten Zugriff mehrerer Tasks auf ein +Interface-System zu realiseren. + +Wenn Sie nun aber spezielle Anwendungen schreiben wollen, für die die Geschwin­ +digkeit beim Ansprechen des Interface-Systems an einer separaten Schnittstelle nicht +ausreicht, so möchten wir Ihnen hier noch eine Möglichkeit aufzeigen, dieses +Problem zu bewältigen. + +Auch an dieser Stelle sei noch einmal ausdrücklich darauf hingewiesen, daß Sie bei +dieser Programmiermöglichkeit auf alle Sicherheiten, die Ihnen #on("b")#gs-Prozess#off("b")# bietet, +verzichten müssen. Deshalb sollten Sie diesen Weg nur beschreiten, wenn Sie ein +hinlängliches Maß an Programmierroutine besitzen! Die zur Verfügung stehenden +Befehle und die Besonderheiten möchten wir Ihnen an einem kleinen Beispiel­ +programm aufzeigen: +#page# +#on("b")# + LET ausgabekanal = 4, + eingabekanal = 3; + + INT VAR test, eingabewert; + INT VAR terminalkanal :: channel (myself); + schliesse interface; + continue (interfacekanal); + oeffne interface direkt (test); + IF test < 0 + THEN continue (terminalkanal); + errorstop ("Funktionsfehler Interface-System") + FI; + initialisiere interface direkt; + eigentliches programm; + schliesse interface direkt; + continue (terminalkanal). + + eigentliches programm: + direkt ausgeben (ausgabekanal, 3); + eingabewert := direkteingabe (eingabekanal). +#off("b")# + +Wenn Sie ein solches Programm geschrieben haben, starten Sie es bitte mit dem +Befehl 'run pdv' oder aus dem Menusystem heraus mit der Menufunktion 's Starten'. +(Bei 'run' kann der Befehl 'schliesse interface' gestrichen werden!). + +Für die eigentliche Programmierung des Interface-Systems stehen Ihnen nur zwei +Befehle zur Verfügung: + +#on("b")# +PROC direkt ausgeben (INT CONST kanal, wert) +#off("b")# + + - ermittelt den auszugebenden Wert durch die Rechnung + +#on("b")##center#ausgabe = wert MOD 256#off("b")# + + und gibt diesen am Ausgabekanal aus. + + Der Befehl ähnelt dem Befehl 'dezimalwert ausgeben' - hat aber im Gegensatz + dazu keinerlei "Fehlerfänger": so werden Sie z.B. nicht darauf aufmerksam + gemacht, wenn der angegebene Kanal gar kein Ausgang ist, etc.) +#page# +#on("b")# +INT PROC direkteingabe (INT CONST kanal) +#off("b")# + + - liest den aktuell anliegenden Wert am angegebenen Kanal ein. + - liefert einen INT-Wert mit 0 � 'wert' � 255. + + Der Befehl ähnelt dem Befehl 'dezimalwert' - hat aber im Gegensatz dazu + ebenfalls keinerlei "Fehlerfänger"! + + +Das obige Programm beginnt mit dem Befehl 'schliesse interface'. Sicher kommt es +Ihnen sonderbar vor, daß zu Beginn des Programms das Interface geschlossen wird, +wo wir es doch eigentlich "öffnen" müßten. Ihnen wird die Funktion aber sofort klar, +wenn Sie sich die Situation vor Augen führen: + +Als Sie #on("b")#gs-Prozess#off("b")# in Ihrer Task konfiguriert haben, und festlegten, daß der Adapter +an einer separaten Schnittstelle "hängt", richtete #on("b")#gs-Prozess#off("b")# automatisch eine +unbenannte Sohntask ("-") als "zentrale Abwicklungstask" ein, die durch das +Kommando 'run pdv' bzw. durch die Menufunktion 's Starten' an den Interfacekanal +gekoppelt wird. Der Befehl 'schliesse interface' koppelt die Task "-" wieder vom Inter­ +face-Kanal ab, so daß Sie direkt darauf zugreifen können. Außerdem werden die +internen Einstellungen im Adapter wieder in Ausgangsstellung gebracht. + +Mit der Prozedur 'PROC oeffne interface direkt (INT VAR testwert)' sprechen Sie das +Interface neu an. Dabei wird ein angeschlossener Adapter automatisch auf Betriebs­ +bereitschaft getestet und dann auf den Betrieb an einer separaten seriellen Schnitt­ +stelle umgestellt (nur beim MUFI). + +Über 'testwert' erhalten Sie eine Rückmeldung. Dabei haben die gelieferten 'test­ +werte' folgende Bedeutung: + + 0 - Interface betriebsbereit + -4 - Interface #on("b")#nicht#off("b")# betriebsbereit + (Interface meldet sich nicht) +#page# +Der Befehl 'initialisiere interface direkt' wirkt ähnlich wie der schon oben be­ +schriebene Befehl 'initialisiere interface', jedoch #on("b")#nicht#off("b")# über den "Umweg zentrale +Abwicklungstask" - sondern halt 'direkt' am Interface-Kanal. Einzige Aufgabe hier: +Alle Ausgabe-Kanäle auf Wert '0' bzw. Nullspannung setzen. + +Durch das abschließende 'schliesse interface direkt' bringen Sie ein angeschlossenes +MUFI wieder in die "Ausgangsstellung". + +Beachten Sie bei der Programmierung bitte unbedingt, daß Sie ständig zwischen dem +Kanal, an dem Sie arbeiten (Terminal) und dem Interfacekanal hin- und herschalten +(müssen), wenn Ein- oder Ausgaben auf dem Terminal erfolgen sollen. Die direkte +Programmierung lohnt sich demnach nur, wenn aufeinanderfolgende Aktionen am +Interfacekanal durchgeführt werden (z.B. Schrittmotorsteuerungen etc.). + +Treten Programmfehler auf, während Sie an den Interfacekanal gekoppelt sind, +haben Sie keine Chance, von Ihrem Terminalkanal aus auf das Interface zuzugreifen +- denn das "hängt am Interfacekanal" (z.B. bei "Programmabsturz" oder Endlos­ +schleife). + +Bei Ihrer Programmierung sollten Sie diesem Fall vorbeugen (disable stop - enable +stop). Ansonsten müßten Sie aus einer Systemtask den Kanal "abschießen". Geben +Sie dazu in einer Systemtask z.B. das Kommando 'end (canal (5)) ', +wenn das Interface-System über den Kanal 5 angesprochen wird. + diff --git a/doc/system/systemhandbuch.1 b/doc/system/systemhandbuch.1 new file mode 100644 index 0000000..a8f53bb --- /dev/null +++ b/doc/system/systemhandbuch.1 @@ -0,0 +1,1685 @@ +____________________________________________________________________________ + + +#on("b")##on ("u")# +#center#Betriebssystem E U M E L +#off ("u")# + + +#center#Systemhandbuch + + + + +#off("b")# +#center#Lizenzfreie Software der +#on ("b")# + +#center#Gesellschaft für Mathematik und Datenverarbeitung mbH, +#center#5205 Sankt Augustin + + +#off("b")# +#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für +#center#nichtkommerzielle Zwecke gestattet. + +#center#Gewährleistung und Haftung werden ausgeschlossen + + +____________________________________________________________________________ +#page# +#start(5.1,1.5)# +#free(4.0)# +#center#EUMEL + + +#center#Systemhandbuch + + + + + + + + + +#center#copyright ERGOS GmbH, 1990 + + +#page# +#block# + +Copyright: ERGOS GmbH April 1990 + + Alle Rechte vorbehalten. Insbesondere ist die Überführung in + maschinenlesbare Form sowie das Speichern in Informations­ + systemen, auch auszugsweise, nur mit schriftlicher Einwilligung + der ERGOS GmbH gestattet. + + + +-----------------------------------------------------+ + + + + + + + +Autoren : Jochen Liedtke + Dietmar Heinrichs + Rainer Hahn + Christian Szymanski + Thomas Müller + +Texterstellung : Dieser Text wurde mit der ERGOS-EUMEL Textverarbeitung erstellt + und aufbereitet und auf einem Kyocera Laserdrucker ge­ + druckt. +#page# + + + + + + + + +----------------------------------------------+ + + + + +#page# + +#start(2.5,1.5)# +#pageblock# +#block# +#headeven# + +%#center#EUMEL-Systemhandbuch + + +#end# +#headodd# + +#center#Einführung#right#% + + +#end# + +#ib(9)#Einführung#ie(9)# + +Der größte Teil dieses Systemhandbuchs ist für Anwender geschrieben, die tiefer in +das EUMEL-System einsteigen und evtl. Systemergänzungen oder Systemänderun­ +gen programmieren wollen. Der erste Teil ist allerdings für alle interessant, die ein +EUMEL-System verwenden, selbst für Anfänger, die ihr System zum ersten Mal in +Betrieb nehmen wollen. Entsprechend der verschiedenen Adressatenkreise unter­ +scheiden sich die einzelnen Kapitel stark in der Beschreibungsart. Deshalb: + +#on("b")##on("i")#Sind Sie EUMEL-Neuling?#off("b")##off("i")# + + Dann sollten Sie #on("b")##on("i")#vor#off("b")##off("i")# dem Einschalten Ihres Systems die Einführung des Kapi­ + tels "System einrichten" lesen. Dort werden keine weiteren Kenntnisse voraus­ + gesetzt. Danach sollten Sie erst einmal durch praktisches Arbeiten mit Hilfe des + Benutzerhandbuchs etwas mit dem System vertraut werden. + + +#on("b")##on("i")#Haben Sie schon einige Zeit mit dem EUMEL gearbeitet?#off("b")##off("i")# +#on("b")##on("i")#Sind Sie mit dem System einigermaßen vertraut?#off("b")##off("i")# + + Dann lesen Sie den kompletten Teil 1 ("System einrichten") dieses Systemhand­ + buchs. + Das Lesen der folgenden Kapitel ist für den einfachen Betrieb des EUMEL- + Systems nicht erforderlich. Sie setzen auch intime Kenntnis des Systems auf + dem Niveau des Benutzerhandbuchs voraus und würden Anfänger leicht verwir­ + ren. + + +#on("b")##on("i")#Haben Sie Probleme mit Ihrer Hardware?#off("b")##off("i")# + + #on("i")#Wenn Sie nichts von Hardware verstehen, wenden Sie sich an einen Fachmann!#off("i")# + + Wenn Sie ein gewisses Grundwissen über Hardware haben, dann lesen Sie Teil 2 + ("Hardware und ihre Steuerung"). In diesem Kapitel sollten Sie "3. Kanä­ + le und Konfigurierung" erst einmal auslassen. + + +#on("b")##on("i")#Wollen Sie tiefer in das Betriebssystem einsteigen?#off("b")##off("i")# +#on("b")##on("i")#Haben Sie EUMEL-Erfahrung?#off("b")##off("i")# +#on("b")##on("i")#Haben Sie Programmiererfahrung?#off("b")##off("i")# + + Dann lesen Sie im Systemhandbuch alles, was Ihnen interessant erscheint. +#page# +#headeven# + +%#center#EUMEL-Systemhandbuch + + +#end# +#headodd# + +#center#1. System einrichten#right#% + + +#end# + +#ib(9)#1. #ib#System einrichten#ie##ie(9)# + +#ib(9)#1.1. Einführung#ie(9)# + +#ib(9)#Wie Ihr System aufgebaut ist#ie(9)# + +Der kleinstmögliche EUMEL-Rechner besteht aus einem #ib#Rechnerkern#ie# und einem Ter­ +minal: + + + Rechnerkern Terminal 1 + + + #on("i")#Anmerkung: In manchen Fällen ist das Terminal hardwaremäßig in den Rechner + integriert. Trotzdem fassen wir diese physische Einheit dann als + zwei logisch getrennte Komponenten auf, nämlich Rechnerkern + und Terminal!#off("i")# + +Wie man sieht, hat das #ib#Terminal#ie# die Nummer 1. Das bedeutet, daß es über Kanal 1 mit +dem Rechnerkern verbunden ist. Das EUMEL-System kennt 16 solche #ib#Kanäle#ie#, wobei es +von der konkreten Hardware abhängt, welche Kanäle wirklich vorhanden sind und +welche Geräte man daran anschließen kann. (Allerdings ist der Kanal 1 als Verbindung +zum Terminal 1 immer vorhanden.) + +In den meisten Fällen wird auch ein #ib#Drucker#ie# angeschlossen sein. Die genaue An­ +schlußart ist wieder von der konkret verwendeten Hardware abhängig. Nehmen wir an, +er sei an Kanal 4 angeschlossen: + + + + Rechnerkern Terminal 1 + + Drucker (Kanal 4) + + + +Man sieht also, daß Lücken bei der Verwendung der Kanäle auftreten dürfen. Bei +Multi-User-Systemen können, sofern die entsprechenden Schnittstellen vorhanden +sind, weitere Terminals und andere Geräte (z.B. #ib#Plotter#ie#) angeschlossen werden: + + + + Rechnerkern Terminal 1 + + Terminal 2 + + Plotter (Kanal 3) + + Drucker (Kanal 4) + + Terminal 5 + + Terminal 6 + + + + + +#ib(9)#1.2. Wie Sie die EUMEL-Software erhalten und + installieren#ie(9)# + + + +Betriebssystem : EUMEL (Version 1.8) +Hardware : IBM-PC/AT, IBM-PC/XT und Kompatible +SHard-Version : 4.9 und 5.0 + +Erforderliche Disketten + + - EUMEL-Generierungsdiskette : "SETUP-EUMEL AT" (bzw. "SETUP- + EUMEL XT") + - EUMEL-Systemdisketten : "HG0" und "HG1" (EUMEL0-Maschine + und Hintergrund) evtl. auch nur eine 1,2 + MB Hintergrunddiskette + +Die Diskette "SETUP-EUMEL" ist ein kleines EUMEL-System zur Installation des Be­ +triebssystems EUMEL auf einem AT/XT kompatiblen Rechner. Auf diesem System +laufen Programme ab, die im Dialog mit dem Benutzer das Einrichten einer oder +mehrerer EUMEL-Partitionen ermöglichen. +#on("b")#Diese Diskette darf nicht schreibgeschützt sein!#off("b")# + +Beim Einrichten einer EUMEL-Partition wird nach Prüfung der Festplatte durch +"SETUP-EUMEL" der hardwarenahe Teil des EUMEL-Systems, 'SHard' (Software/ +Hardware-Interface), auf die Festplatte geschrieben. + +Die Hintergrunddisketten beinhalten das eigentliche Betriebssystem EUMEL (den +Systemkern (EUMEL-0-Maschine)) und die darauf aufbauenden Systemteile (Hinter­ +grund)). + + +Leistungen des SETUP EUMEL + +Wenn Sie bereits ein Betriebssystem auf Ihrer Festplatte installiert haben, müssen Sie +darauf achten, daß noch ausreichend Platz für ein EUMEL-System übrig ist. Die Min­ +destgröße einer Partition für ein EUMEL-System beträgt ca. 1MB, die maximale Größe +ist vom benutzten Systemkern abhängig: der in der Version 1.8.6 M+ verwendete +Systemkern u186+ \#1523 erlaubt eine maximale Größe von 128 MB. Andere, ältere +EUMEL Versionen erlauben nur eine Partitionsgröße von 16 MB. Aus Kompatibilitäts­ +gründen stellt das Installationsprogramm eine Kontrollfrage bei Überschreiten der 16 +MB Grenze. + +Soll neben EUMEL auch eine MS-DOS Partition auf der Festplatte sein, muß, da +MS-DOS standardmäßig die gesamte Festplatte belegt, dieses System gesichert, mit +dem MS-DOS-Kommando 'fdisk' (o.ä.) die Partition gelöscht und entsprechend kleiner +neu eingerichtet werden. Sie können auch bei der EUMEL-Installation alle bereits +bestehenden Systeme löschen; dazu bietet Ihnen der SETUP-EUMEL die Option +'Löschen der gesamten Partitionstabelle' an. Dabei gehen jedoch alle Daten auf der +Festplatte verloren. Achten Sie also darauf, daß sie alle Daten vorher gesichert haben! + +Um nun die Partitionierung für Ihr EUMEL-System vorzunehmen, legen Sie die Diskette +"SETUP-EUMEL" ohne Schreibschutzmarke in das Start-Laufwerk. Sollten Sie ein Gerät +mit zwei Laufwerken besitzen, dann ist es das Laufwerk A:. (Bei Unklarheiten im Benut­ +zerhandbuch des Herstellers nachsehen.) + +Schalten Sie nun den Rechner ein bzw. betätigen Sie den Tastatur-RESET, wenn Ihr +Gerät bereits eingeschaltet ist (meistens mit dem gleichzeitigen Druck der Tasten +CTRL, ALT und DEL). + +Der SETUP-EUMEL gibt zunächst folgende SHard-Meldung aus: + ++--------------------------------------------+ +i i +i Setup-SHard für EUMEL auf IBM PC/AT, V 4.8 i +i Copyright (C) 1989 ERGOS GmbH, Siegburg i +i i ++--------------------------------------------+ + +Warten Sie beim Hochfahren des SETUP-EUMELs, bis Ihnen nach einem Zwischen­ +bildschirm ("SETUP-EUMEL für Modul-SHard") eine Partitionstabelle angezeigt wird. +Dieser können Sie entnehmen, ob bereits Partitionen auf der Festplatte eingerichtet +und wie diese spezifiziert sind. + +Angezeigt werden neben Größe, Start- und Endspur der einzelnen Partitionen auch +eine Typ-Nummer. Für EUMEL-Partitionen werden in aufsteigender Reihenfolge die +Typ-Nummern 69 bis 72, für MS-DOS je nach Größe der eingerichteten Partition die +Nummern 1 oder 4 vergeben. Außerdem wird die gerade aktive Partition durch einen +entsprechenden Eintrag in der Tabelle kenntlich gemacht. "Aktiv" ist die Partition, die +nach dem nächsten Einschalten des Rechners bzw. nach dem nächsten Tastatur- +RESET gestartet würde. + + +Sie sehen zusätzlich ein Menü mit folgenden zur Auswahl stehenden Funktionen: + ++------------------------------------------------------------+ +i i +i - EUMEL-Partition einrichten 1 i +i - erneuern (Neuer SHard) 2 i +i - aktivieren 3 i +i - löschen 4 i +i - Partitionstabelle löschen 5 i +i - SHard-Konfiguration anzeigen 6 i +i - SHard konfigurieren 7 i +i - SHardmodule laden oder löschen 8 i +i - SETUP-EUMEL beenden 0 i +i i ++------------------------------------------------------------+ + +#on("i")##on("u")#EUMEL - Partition einrichten #off("u")##off("i")# + +Eine neue EUMEL-Partition wird gemäß den im weiteren erfragten Angaben eingerich­ +tet. In die Partition wird ein SHard geschrieben, dessen Konfiguration die gelieferte +Grundkonfiguration oder die von Ihnen eingestellte ist (s. Partitionieren der Festplatte, +Seite 3). + + +#on("i")##on("u")#EUMEL - Partition erneuern (Neuer SHARD)#off("u")##off("i")# + +In eine bereits vorhandene Partition wird ein SHard in der eingestellten Konfiguration +geschrieben. Der bis dahin vorhandene SHard wird überschrieben. Die Möglichkeit +besteht jedoch nur, wenn die Partition mit einem SETUP-EUMEL eingerichtet worden +ist. + +Erneuern bedeutet, nur den SHard #on("u")#auszutauschen#off("u")# auf einer Partition, die schon einen +fertigen EUMEL enthält, ohne daß man dabei den EUMEL löscht. Das ist dann sinnvoll, +wenn man eine neue Version des SHard benutzen möchte oder den SHard aus ir­ +gendwelchen Gründen (z.B. Streamer gekauft) um einen oder mehrere Module erwei­ +tern will. + +Diese Aktion kann nur durchgeführt werden, wenn bereits ein SHard mit der Versions­ +nummer 4.x in dieser Partion vorhanden ist. Ältere (Version 2.7, 2.8 etc.) können #on("u")#nicht#off("u")# +ersetzt werden. + + +#on("i")##on("u")#EUMEL - Partition aktivieren#off("u")##off("i")# + +Eine Partition wird ausgewählt und aktiv gesetzt, d.h. beim nächsten Start des Re­ +chners wird das System, das auf dieser Partition steht, hochgefahren. + + +#on("i")##on("u")#EUMEL - Partition löschen #off("u")##off("i")# + +Hierbei wird ein Eintrag aus der Partitionstabelle entfernt. Die EUMEL-Partition wird +nicht wirklich gelöscht, d.h. wenn man nach dem Löschen den Plattenbereich noch +nicht anderweitig verwendet hat, kann das EUMEL-System auf dieser Partition durch +ein "EUMEL-Partition einrichten" auf genau demselben Plattenbereich (Start-/Endzy­ +linder) wieder hergestellt werden. + + +#on("i")##on("u")#Partitionstabelle löschen#off("u")##off("i")# + +Dies ist eine sehr gefährliche Option ! +Es werden hiermit #on("u")##on("b")#alle#off("b")##off("u")# Partitionen auf der Platte gelöscht (nicht nur die von EUMEL). +Auch hier gilt zwar, daß die Partitionen selbst an sich unangetastet bleiben und wie­ +derhergestellt werden könnten, aber dies ist bei anderen Betriebssystemen oft nicht +möglich. Also #on("u")#VORSICHT#off("u")#. + + +#on("i")##on("u")#SHard-Konfiguration anzeigen #off("u")##off("i")# + +Die Module des SHard, der bereitgestellt ist, um auf die Platte geschrieben zu werden, +werden angezeigt. Es werden alle definierten Kanäle angezeigt und zu jeder Kanal­ +nummer der assoziierte Modulname. Aufgelistet ist die zuletzt mit dem SETUP-EUMEL +zusammengestellte Konfiguration. + + +#on("i")##on("u")#SHard konfigurieren #off("i")##off("u")# + +Zusammenstellen von einer SHardbasis und SHardmodulen zu einem neuen SHard, +um eine neue Partition einzurichten oder den SHard einer bestehenden Partition zu +ersetzen. +ACHTUNG: Bitte diesen Menuepunkt nicht experimentell benutzen! Eine Anleitung + zum Thema Module etc. wird separat erscheinen. +#page# +#on("i")##on("u")#SHardmodule laden oder löschen #off("u")##off("i")# + +Hiermit können neue Module oder neue Versionen von Modulen in den SETUP-EUMEL +geladen werden oder nicht mehr benötigte Module gelöscht werden. Die neuen Modu­ +le werden von einer EUMEL-Archivdiskette gelesen, deren Name zuvor eingegeben +werden muß. +ACHTUNG: Bitte diesen Menüpunkt nicht experimentell benutzen! Eine Anleitung + zum Thema Module etc. wird separat erscheinen. + + +#on("i")##on("u")#SETUP-EUMEL beenden #off("u")##off("i")# + +SETUP-Programm ordnungsgemäß beenden. +ENDE-Meldung abwarten! + + + + +Die eigentliche Partitionierung beginnt nun, indem Sie Menü-Punkt 1 "EUMEL-Partition +einrichten" anwählen. (Punkt 1 wird Ihnen nur dann #on("b")#nicht#off("b")# angeboten, wenn die Fest­ +platte bereits vollständig belegt ist. Sichern Sie dann das alte System und löschen eine +oder alle Partitionen.) Die Kontrollabfrage "Neue EUMEL-Partition einrichten? (j/n)" +beantworten Sie entsprechend mit "j". + +Beim Generieren einer EUMEL-Partition werden Angaben zu Größe und Startzylinder +abgefragt. Dafür werden Vorgaben gemacht, die Sie bestätigen, indem Sie die +-Taste betätigen, oder die Sie überschreiben können. Die abschließende +Abfrage "Sind die Partitionsangaben korrekt?" fordert Sie zur Überprüfung Ihrer Einga­ +ben auf. + +Nach der Eingabe und der Überprüfung der Sektoren erscheint eine Meldung wie z.B.: + ++--------------------------------------------------+ +i i +i Ich habe keine schlechten Sektoren gefunden i +i SHard wird auf die Partition geschrieben i +i Bitte betätigen Sie eine Taste! i +i i ++--------------------------------------------------+ + +oder + ++--------------------------------------------------+ +i i +i Ich habe 2 schlechte Sektoren gefunden i +i SHard wird auf die Partition geschrieben i +i Bitte betätigen Sie eine Taste! i +i i ++--------------------------------------------------+ + +Danach gelangen Sie wieder in das Generierungsmenü. Wählen Sie "0" für "SETUP- +EUMEL beenden". Über eine Sicherheitsfrage verlassen Sie nun den ersten Teil der +Installation. Warten Sie #on("b")#unbedingt#off("b")#, bis auf dem Bildschirm die Meldung "ENDE" er­ +scheint, bevor Sie die Diskette "SETUP EUMEL" aus dem Laufwerk nehmen. + + + +Installieren eines EUMEL-Hintergrundes + +Im nächsten Schritt wird auf ihrer Festplatte das vollständige EUMEL-System instal­ +liert. + +Bitte betätigen Sie den Tastatur-Reset an Ihrem Rechner (oder die Tasten CTRL, ALT +und DEL oder den AUS-/EIN-Schalter). + +Auf dem Bildschirm erscheint die folgende Meldung: + ++--------------------------------------------------------------------------+ +i i +i SHard für EUMEL auf IBM PC,AT,XT, V 4.7 i +i Copyright (c) 1985, 86, 87, 88, 89 Martin Schönbeck Beratungen GmbH, i +i Spenge i +i Ladevorgang kann durch Tastendruck unterbrochen werden i +i Habe leider keine EUMEL-0-Maschine gefunden i +i Ladevorgang unterbrochen, drücken Sie eine Taste um fortzufahren. i +i i ++--------------------------------------------------------------------------+ + +Legen Sie nun die erste Hintergrunddiskette (HG0) in das Laufwerk ein und betätigen +Sie eine Taste. Der Systemkern wird geladen und es erscheinen Angaben zu HG-, +RAM-, und Pufferkapazität sowie zu den angeschlossenen Kanälen, diesmal jedoch +bezogen auf die Festplatten-Partition. Warten Sie nun, bis die Meldung "HG ungültig" +kommt. Drücken Sie anschließend eine beliebige Taste. +Falls Sie in ein bereits bestehendes EUMEL-System einen neuen Urlader einspielen +wollen, lesen Sie bitte den Abschnitt "Installation eines neuen Urladers". + +#page# +#free(1.0)# +Ein Menü bietet Ihnen dann folgende Auswahl: + ++-----------------------------------------+ +i i +i (1) Systemstart i +i (2) Hintergrund vom Archiv laden i +i (3) Hardwaretest i +i (4) neuen Urlader vom Archiv laden i +i i ++-----------------------------------------+ + +Wählen Sie Menü-Punkt (2) "Hintergrund vom Archiv laden" und bestätigen Sie die +Abfrage "Alten HG überschreiben?" mit "j". + +Das Laden des Hintergrundes kann einige Minuten in Anspruch nehmen. Sie werden +mit der Meldung "Nächstes HG-Archiv eingelegt? (j/n)" zum Einlegen der Folgedisket­ +te(n) aufgefordert, was Sie anschließend mit der Eingabe von "j" quittieren. + +Es können bei beschädigten Disketten Lesefehler auftreten; dann gibt das System eine +der Meldungen 'Harter Lesefehler' bzw. 'Softerror' aus. Bei letzterem könnte der ent­ +sprechende Sektor nach mehrmaligem Versuch noch gelesen werden. Bei einem +harten Lesefehler können Sie die Diskette nicht verwenden. Bitte benachrichtigen Sie +die Firma, von der Sie die Disketten erhalten haben. + +Wenn der Hintergrund eingelesen ist, erscheint die Aufforderung 'fertig, bitte RESET'. +#on("b")#Vergessen Sie nicht#off("b")#, vor der Betätigung des Tastatur-RESET die Hintergrunddiskette +aus dem Diskettenlaufwerk zu entfernen. + +Wenn Sie während des Hochfahrens keine Taste drücken, dann startet der Lader durch +und das EUMEL-System meldet sich mit einer Tabelle von Geräteanpassungen: + ++--------------------------------------------------------------------------+ +i i +i psi transparent pc.1.25 pc.2.25 i +i pc.3.25 pc.1.24 pc.2.24 pc.3.24 i +i psi25 tandberg.2244s DEC.VT100.ascii DEC.VT100 i +i DEC.VT220.ascii DEC.VT220.german FT10/20.german FT10/20.ascii i +i ampex210.ascii ampex210.german ampex220.german ampex232 i +i Wyse.WY50.ascii Wyse.WY50.german Wyse.WY60.german i +i Wyse.WY120.german i +i i +i Kanal 1 (j/n) i +i i ++--------------------------------------------------------------------------+ + +Da unterschiedliche Tastaturen auch unterschiedliche Tastenbelegungen haben, ist es +notwendig, mit Hilfe der Konfigurationstabelle Ihre Tastatur und Ihren Bildschirm an +das EUMEL-System anzupassen. Dafür bietet Ihnen das System "Kanäle" an. #on("u")#Kanal 1#off("u")# +entspricht dem Haupt-Terminal des Rechners, #on("u")#muß also auf jeden Fall konfiguriert +werden#off("u")#. Beantworten Sie also die Frage "Kanal 1 (j/n)" mit "j". +Das EUMEL-System funktioniert auch, wenn Sie zunächst nur Kanal 1 mit der Anpas­ +sung konfigurieren, die Ihrem Gerätetyp entspricht. Wenn Ihr Rechner eine AT-Tastatur +hat, ist die korrekte Konfiguration "pc.1"; die Konfigurationen "pc.2" und "pc.3" decken +die meisten der Rechner ab, deren Tastenbelegung von der Standard-AT Tastatur +geringfügig abweicht. Die Erweiterung ".24" bzw. ".25" gibt die Anzahl der Bildschirm­ +zeilen wieder. Standardmäßig sind im SHard 24 Zeilen eingestellt. + +Weitere Kanäle zum Anschluß von Druckern oder weiteren Terminals können jederzeit +bei Bedarf vorgenommen werden (EUMEL Systemhandbuch Teil 1). +Die Anfrage nach der Konfiguration weiterer Kanäle kann deshalb verneint werden. Die +Abfrage 'koennen unbenutzte Geraetetypen geloescht werden (j/n)' beantworten Sie +einstweilen mit 'n'. Anschließend werden noch Datum und Uhrzeit abgefragt. Damit ist +das Erstinstallationsprogramm abgeschlossen und es erscheint die Meldung 'mainten­ +ance :'. Geben Sie an dieser Stelle (nacheinander) ein. Sie haben damit +die Task 'configurator' ordnungsgemäß verlassen. Erst damit ist sichergestellt, daß die +eingestellte Konfiguration wirksam wird. + + +Installation eines neuen Urladers + +Wenn Sie den alten Urlader mit einem neuen (z.B. protected mode) überschreiben +wollen, starten Sie das EUMEL-System zunächst neu. Sobald die Meldung + + #on("b")#Ladevorgang kann durch Tastendruck unterbrochen werden#off("b")# + +erscheint, drücken Sie eine beliebige Taste (z.B. ENTER). Auf dem Bildschirm er­ +scheint nun zusätzlich die Meldung + + #on("b")#Ladevorgang unterbrochen, drücken Sie eine Taste um fortzufahren#off("b")# +#page# +Legen Sie nun die Diskette mit dem neuen Urlader in das Bootlaufwerk und drücken +Sie wieder eine beliebige Taste. Danach werden folgende Meldungen auf dem Bild­ +schirm ausgegeben: + ++-----------------------------------------------------+ +i i +i EUMEL wird von Diskette geladen i +i i +i i +i E U M E L - Vortest i +i i +i Terminals: 1 .... i +i RAM-Groesse (gesamt): .... kB i +i Pufferbereich: .... kB i +i Hintergrund-Speicher .... kB i +i i +i Speichertest: ********** i +i i ++-----------------------------------------------------+ + +In der Zeit, in der die Sternchen des Speichertests erscheinen, drücken Sie bitte wieder +die ENTER-Taste. Nach dem Speichertest erscheint dann folgendes Menü: + ++-----------------------------------------------------+ +i i +i (1) Systemstart i +i (2) neuen Hintergrund vom Archiv laden i +i (3) Hardwaretest i +i (4) neuen Urlader vom Archiv laden i +i i ++-----------------------------------------------------+ + +Wählen Sie Menüpunkt 4 und auf dem Bildschirm erscheinen die folgenden Zeilen: + +#box("-0.1","0.0","8.0","1.0")# + \# xxx + fertig, bitte RESET + +wobei hinter dem \#-Zeichen die übertragenen Blöcke des neuen Urladers gezählt +werden. + +Anschließend entfernen Sie bitte die Urladerdiskette aus dem Laufwerk und drücken +den RESET-Schalter Ihres Rechners. Das EUMEL-Betriebssystem wird nun mit dem +neuen Urlader gestartet. + + +Tastenbelegung: + +EUMEL-Zeichen: Taste auf dem IBM-PC/AT + + MARK : +--------+ + i bild i (oder Pfeil nach oben) + +--------+ + + RUBIN : +--------+ + i Einfüg i + +--------+ + + RUBOUT : +--------+ + i Lösch i + +--------+ + + TAB : +--------+ + i <= => i + +--------+ + + HOP : +--------+ + i Pos 1 i + +--------+ + + ESC : +------------+ + i Eing Lösch i + +------------+ + + SV : +------------+ +-------+ + i CTRL g i oder i F1 i + +------------+ +-------+ + +Bemerkung: Die CTRL-Taste kann auch mit STRG bezeichnet sein. + +Sollte die Tastaturbelegung noch nicht die EUMEL-spezifischen Tasten (HOP, MARK, +SV, RUBIN, RUBOUT) an den entsprechenden Orten anbieten, können Sie durch +Ankoppeln der Task "configurator" und Absetzen des Befehls "configurate" die Tastatu­ +ren (auch für zusätzlich angeschlossene Terminals) kanalweise umkonfigurieren. Nähe­ +res entnehmen Sie bitte dem Systemhandbuch, S.6ff. + + +Zusatzprogramme + +Nachdem das System vollständig installiert ist, kann noch typspezifische Software +eingespielt werden. Diese befindet sich auf der Diskette 'EUMEL-Archiv "AT" (bzw. +"XT")'. Der folgende Ablauf skizziert schon das Prinzip jeder Arbeit in einem EUMEL- +System: Task ankoppeln mit 'continue("taskname")' bzw. 'begin("taskname")', Eingabe +von Kommandos wie 'edit', 'run' oder 'generate shutup dialog manager', abschließend +Task abkoppeln durch . Eine ausführliche Beschreibung finden Sie in +den EUMEL-Handbüchern. +#page# +Wenn Sie nach Einstellen des Kanals 1 die Task 'configurator' verlassen haben, befin­ +den Sie Sich auf Supervisor-Ebene. Um die auf der Diskette befindlichen Programme +an der richtigen Stelle zu übersetzen, sind folgende Schritte notwendig: + +Drücken Sie die -Taste (F1). Damit landen Sie im Supervisor-Menü, dem +Systemverteiler. Mit und Eingabe des Tasknamens 'SYSUR' (auf Groß­ +schreibung achten!) holen Sie die Task 'SYSUR' an das Terminal. Diese Task meldet +sich mit 'maintenance:'. Da Sie mit einem Mehrbenutzersystem arbeiten, müssen Sie +das Diskettenlaufwerk zunächst für sich reservieren: 'archive("AT")'. Erst dann können +Sie Dateien von der Diskette holen: 'fetch("AT install",archive)' und das Installations­ +programm ausführen: 'run'. Der weitere Ablauf erfordert keine Eingriffe. + +Nach Ablauf der Programme sollten Sie schließlich eine besondere Task zum Abschal­ +ten einrichten. Dazu müssen Sie nocheinmal die Task 'SYSUR' an den Bildschirm +holen und dort das durch die Zusatzsoftware (u.a.) neu hinzugewonnene Kommando +'generate shutup dialog manager' geben. Nach Absetzen des Kommandos können Sie +'SYSUR' durch wieder verlassen. + +Um menügesteuert das Betriebssystem abzuschalten oder einen Partitionswechsel +vorzunehmen, steht Ihnen die Task 'shutup dialog' zur Verfügung. Bei Ausführung des +Supervisor-Kommandos 'continue("shutup dialog")' wird Ihnen die aktuelle Partitions­ +tabelle angezeigt, so wie Sie diese bereits bei der Generierung kennengelernt haben, +d.h. mit Angabe von Größe, Start- und Endzylinder der eingerichteten Partitionen. Sie +können dann eine beliebige Partition menugesteuert auswählen und starten oder das +Betriebssystem kontrolliert abschalten (sog. 'shutup'). Dabei wird der aktuelle System­ +zustand automatisch gesichert. + + +Archivformate bei ATs und Kompatiblen mit zwei Diskettenlauf­ +werken: + +Standardmäßig ist der Archivkanal 31 an das Laufwerk 'A:' gebunden, das eine Kapazi­ +tät von 1,2 Megabyte besitzt. Ist jedoch bei Ihrem Gerät ein zweites Diskettenlaufwerk, +z.B. mit einer Kapazität von 360 Kilobyte eingebaut, dann können Sie auf dieses Lauf­ +werk über den Kanal 30 zugreifen. + +Dazu richten Sie unter 'SYSUR' eine Task ein, die Sie z.B. 'ARCHIVE 360' benennen. +Geben Sie in dieser Task das Kommando 'archive manager (30)'; dann können Sie von +jeder Benutzertask das Archiv mit dem Kommando 'archive ("Archivname",/ "ARCHIVE +360")' anmelden. Der Zugriff auf eine Diskette in diesem Laufwerk geschieht z.B. über +'list(/"ARCHIVE 360")' oder 'save ("Dateiname",/"ARCHIVE 360")'. Eine andere Möglich­ +keit ist ein 3,5" Laufwerk. + + + +Die einzelnen Schritte der Installation im Überblick: + + + 1. Die Diskette 'SETUP-EUMEL' in das Laufwerk stecken. + + 2. Rechner einschalten oder Tastatur-RESET + + 3. EUMEL-Partition einrichten. + + 4. Generierung beenden und auf 'ENDE'-Meldung warten. + + 5. Diskette 'SETUP-EUMEL AT (XT)' entnehmen. + + 6. Tastatur-RESET. + + 7. Die Meldung 'Leider keine EUMEL-0-Maschine gefunden' abwarten. + + 8. Hintergrunddiskette ('HG0') einlegen und Taste drücken. + + 9. Nach der Meldung 'HG-ungültig' eine Taste betätigen, um in den Startdialog zu + gelangen. + + 10. Menupunkt 2 anwählen: Neuen Hintergrund vom Archiv laden. Hintergrunddis­ + kette einlegen und 'Alten HG überschreiben?' mit "j" quittieren. Folgedisketten + einlegen, sobald entsprechende Meldung ("weiterer Archivträger eingelegt?") + erscheint, und "j" eingeben. + + 11. Hintergrunddiskette entnehmen und anschließend Tastatur-RESET ausführen. + + 12. Kanal 1 konfigurieren. + + + +#ib(9)#1.3. Ausführliche Beschreibung#ie(9)# + + +#ib##ib(9)#System laden#ie##ie(9)# + + +Wie Sie in der Installationsanleitung lesen konnten, geht man beim Systemstart durch +Eingabe eines Zeichens während des Vortests in das Startmenü und wählt dort "Hin­ +tergrund vom Archiv laden" an. Falls der zu ladende Hintergrund sich über mehrere +Archiv-Disketten erstreckt, werden die folgenden sukzessive angefordert. + + + + +#ib##ib(9)#System sichern#ie##ie(9)# + + +Der aktuelle eigene Hintergrund läßt sich (mit allen Tasks und allen Dateien) durch das +Kommando + + #ib#save system#ie# + +auf Archivdisketten sichern. Dabei wird der Systemzustand zunächst über einen Fix­ +punkt gesichert. Anschließend werden #on("b")##on("i")#formatierte#off("i")##off("b")# Disketten angefordert. Der Hinter­ +grund wird komprimiert gesichert, d.h. nur die belegten Blöcke werden auf das Archiv +geschrieben. + +#on("i")#Anmerkung: Diese Prozedur kann nur von privilegierten Tasks (Nachfahren von + "SYSUR"), wie dem OPERATOR, aufgerufen werden. + Vor dem Aufruf von 'save system' sollten Sie genügend Disketten for­ + matiert haben (Überprüfen Sie mit 'storage info', wieviele Disketten Sie + benötigen, um den gesammten Hintergrund darauf zu schreiben). #off("i")# + + + + +#ib(9)#System gegen Unbefugte schützen#ie(9)# + + +Falls der Benutzerkreis eines Multi-User-Systems nicht "gutartig" ist, sollte man verhin­ +dern, daß jeder Benutzer des Systems Zugang zu #ib#privilegierten Operationen#ie# hat, wie +Löschen anderer Tasks, Konfiguration ändern und System sichern. + +Dies erreichen Sie dadurch, daß Sie #on("b")#alle#off("b")# privilegierten Tasks, das sind 'SYSUR' und alle +Söhne, Enkel usw. von 'SYSUR', durch #ib#Paßworte#ie# schützen. Damit wird der Zugang zu +diesen Tasks nur möglich, wenn man das entsprechende Paßwort eingibt. Man de­ +finiert solche #on("i")##on("b")##ib#Task-Paßworte#ie##off("i")##off("b")#, indem man die zu schützende Task mit Hilfe des Super­ +visor-Kommandos "continue" an ein Terminal holt und dann das Kommando + + #ib#task password#ie# ("simsalabim") + +gibt. Dabei ist "simsalabim" nur ein Beispiel. Bitte verwenden Sie ein anderes Paß­ +wort! Da die Eigenschaft, privilegiert zu sein, nur davon abhängt, im "SYSUR"-Zweig +(und nicht im normalen "UR"-Zweig) des Systems zu sein, könnte sich ein gewitzter +Anwender die Privilegierung einfach erschleichen, indem er eine neue Sohntask von +"SYSUR" einrichtet. Um auch diese Möglichkeit zu unterbinden, sollte man in #on("b")#jeder#off("b")# +Task des SYSUR-Zweiges ebenfalls ein #on("i")##on("b")#"begin"-Paßwort#off("i")##off("b")# definieren. Das geschieht mit +dem Kommando + + #ib#begin password#ie# ("simsalabim") + +Bei der Wahl der Paßworte sollte man folgendes bedenken: + + - Ein zu kurzes oder offensichtliches Paßwort (beispielsweise der Name des + Systemverwalters) wird von "Hackern" schnell herausgefunden. + + - Oft werden Paßworte bekannt, weil irgendwo ein Zettel mit den Paßworten + herumliegt. + + - Der Paßwortschutz ist hart. Wenn man sein Paßwort vergessen hat, gibt es + keinen Zugang mehr zu der geschützten Task. + + + +Beschreibung der Paßwortprozeduren: + +#ib#task password#ie# + PROC task password (TEXT CONST password) + Zweck: Einstellen eines Paßwortes für eine Task im Monitor. + +#ib#begin password#ie# + PROC begin password (TEXT CONST password) + Zweck: Verhindert das unberechtigte Einrichten einer Sohn-Task. + Anmerkung: Das 'begin password' vererbt sich auf die später erzeugten Sohn- + Tasks. + +#ib#family password#ie# + PROC family password (TEXT CONST password) + Zweck: Setzt oder ändert das Paßwort derjenigen Familienmitglieder, die kein + Paßwort oder das gleiche Paßwort wie die aufrufende Task haben. + Zu einer Familie gehören die Task in der man sich befindet und die ihr + untergeordneten Tasks. + Bsp.: Das Kommando 'family password ("EUMEL")' wird in SYSUR + gegeben. Dadurch wird das SYSUR-Paßwort und die Paßworte + der entsprechenden Tasks unter SYSUR auf "EUMEL" gesetzt. + + + +#ib##ib(9)#Konfiguration#ie##ie(9)# + +Die #ib#Konfiguration#ie# läuft über die Task "#ib#configurator#ie#" ab. Diese Task müssen Sie also für +die hier aufgeführten Operationen durch das Supervisor-Kommando "continue" an­ +koppeln (Dabei wird das Paßwort überprüft, falls die Task geschützt wurde). + +#on("i")#Anmerkung: Man kann die Task "configurator" löschen und dann neu (als Sohn, En­ + kel,... von SYSUR) wieder einrichten. Danach holt man die Konfigura­ + tionsdatei (z.B. von std.devices) und gibt das Kommando "#ib#configuration + manager#ie#".#off("i")# + + +Der in der Einführung unter "Wie Sie die Konfiguration einstellen" beschriebene Konfi­ +gurationsdialog läßt sich vermittels des Kommandos + + #ib#configurate#ie# + +aufrufen. Dabei wird für jeden angewählten Kanal die bis jetzt gültige Einstellung als +Vorschlag mit ausgegeben. Die Einstellung aller Kanäle, die nicht angesprochen wer­ +den, bleibt unverändert. + +Im Menü werden die Namen aller Dateien mit #ib#Gerätetabellen#ie# aufgeführt, die in der +Task enthalten sind. Daraus folgt, daß nur noch die bei der letzten Konfigurierung +benutzten Typen aufgeführt werden, wenn vorher auf die Frage "Koennen unbenutzte +Geraetetypen geloescht werden (j/n)?" mit "j" geantwortet wurde. Löschen Sie also +nicht alle unbenutzten Gerätetypen, wenn Sie sie später evtl. nochmal bruachen (siehe +auch "Teil 2, 3. Kanäle und Konfigurierung"). + +Im Konfigurationsdialog kann folgendes eingestellt werden: + + #ib#Typ#ie# Es werden alle vorhandenen Gerätetabellen durchgegangen, bis + eine davon ausgewählt wurde. Diese manchmal etwas langwierige + Arbeit kann man durch Eingabe des Zeichens ESC abkürzen: + Danach kann man den Typnamen direkt eingeben. #on("i")#Das funktioniert + aber nur vernünftig, wenn das eigene Arbeitsterminal bereits richtig + konfiguriert worden ist!#off("i")# + + #ib#Baudrate#ie# (nur für V.24-Kanäle von Bedeutung) Es werden alle einstellbaren + Baudraten durchgegangen, bis eine davon ausgewählt wurde. Das + sind die Werte 50, 75, 110, 134.5, 150, 300, 600, 1200, 1800, 2400, + 3600, 4800, 7200, 9600, 19200, 38400 Baud. + + #ib#Bits#ie# (nur für V.24-Kanäle von Bedeutung) Es werden die einstellbaren + Zeichengrößen durchgegangen, d.h. 7 oder 8 Bit pro Zeichen. + + #ib#Parität#ie# (nur für V.24-Kanäle von Bedeutung) Möglich sind die Einstellun­ + gen 'no', 'even' und 'odd'. + + #ib#Stopbits#ie# (nur für V.24-Kanäle von Bedeutung) Stopbits geben die Pause + zwischen zwei aufeinanderfolgenden Zeichen an. Möglich sind 1 + oder 2 Stopbits. + + + #ib#Protokoll#ie# Terminals u.ä. werden üblicherweise ohne Protokoll angeschlossen. + Bei langsamen Geräten wie Druckern bzw. Plottern oder aber bei + Rechnerkopplungen bzw. Netzen kann der Empfänger nicht immer + so schnell Zeichen annehmen wie sie von der Gegenstation gesen­ + det werden. In diesem Fall kann man das #ib#XON/XOFF-#ie# oder das + #ib#RTS/CTS-Protokoll#ie# einstellen. + #on("b")#BEACHTE: Sender und Empfänger müssen auf das gleiche Proto­ + koll eingestellt sein.#off("b")# + + Manchmal müssen auch Terminals mit Protokoll angeschlossen + werden. Üblicherweise wählt man dann aber ein rein ausgabe­ + seitiges Protokoll, damit SV den EUMEL auf jeden Fall erreicht. + Es gibt folgende Protokolle: + + #ib#XON/XOFF-Protokoll#ie#: + Rechner und Gerät steuern die Sendungen jeweils über + XON/XOFF-Zeichen. + #ib#RTS/CTS-Protokoll#ie#: + Rechner und Gerät steuern ihre Sendungen jeweils über + RTS/CTS- Leitungen. + #ib#XON/XOFF-ausgabeseitig#ie#: + Das angeschlossene Gerät steuert die Ausgabe über + XON/XOFF.Eingaben zum Rechner unterliegen keinem + Protokoll. + #ib#RTS/CTS-ausgabeseitig#ie#: + Das angeschlossene Gerät steuert die Ausgabe über + RTS/CTS. Eingaben zum Rechner unterliegen keinem + Protokoll. + #ib#XON/XOFF-eingabeseitig#ie#: + Der EUMEL-Rechner steuert die angeschlossenen + Geräte durch XON/XOFF. Die Ausgaben zum Gerät + unterliegen keinem Protokoll. + #ib#RTS/CTS-eingabeseitig#ie#: + Der EUMEL-Rechner steuert die angeschlossenen + Geräte durch RTS/CTS. Die Ausgaben zum Gerät unter­ + liegen keinem Protokoll. + + #ib#Puffer#ie# Terminals und alle Ausgabegeräte (Drucker u.ä.) haben standard­ + mäßig die normalen "kleinen" Eingabepuffer im System zugeord­ + net. Bei Rechner-Rechner-Kopplungen, DFÜ oder Netzen kann ein + "großer" #ib#Eingabepuffer#ie# von 512 Byte notwendig werden. Dement­ + sprechend sind #ib#Großpuffer#ie# nur beim Schnittstellentyp 'transparent' + möglich. + +Im #ib#Konfigurationsdialog#ie# werden bei jedem Kanal nur die dort vorhandenen Möglich­ +keiten angeboten. Dabei wird die vorherige Einstellung immer als erste angeboten. So +kann man sich verhältnismäßig einfach "durchtasten". + +Die Fragen des #ib#Konfigurationsdialog#ie#s werden nach folgendem Schema gestellt: + +#linefeed(1.18)# + erfrage ("Kanal") ; + erfrage ("Typ") ; + IF dieses ist ein v24 kanal + THEN IF baudrate einstellbar + THEN erfrage ("Baudrate") + FI ; + IF zeichengroesse einstellbar + THEN erfrage ("Bits") + FI ; + IF parität einstellbar + THEN erfrage ("Parität") + FI ; + IF stopbits einstellbar + THEN erfrage ("Stopbits") + FI ; + FI ; + erfrage ("Protokoll") ; + IF typ ist tranparent + THEN erfrage ("Puffer") + FI. + +#linefeed(1.0)# +Will man seine eingestellte #ib#Konfiguration sichern#ie#, reicht es, alle Dateien der Task +"#ib#configurator#ie#" auf ein Archiv zu schreiben. Diese Konfiguration kann man dann bei +einem neuen Hintergrund einfach vom Archiv laden. Um die Konfigurierung dann auch +auszuführen, gibt man das Kommando "setup". + + + + +#ib##ib(9)#Druckersoftware einrichten#ie##ie(9)# + + + +Das Standardarchive "std.printer" enthält einige Druckeranpassungen für die Ansteu­ +erung diverser Druckertypen. Soll einer dieser Druckertypen an das EUMEL-System +angeschlossen werden, so muß zuerst eine Task "#ib#PRINTER#ie#" (als Sohntask von +"SYSUR" mit dem Supervisorkommando) vorhanden sein bzw. durch + + + begin ("PRINTER", "SYSUR") + + +eingerichtet werden. In dieser Task müssen dann die folgenden Schritte vollzogen +werden: + +- Anmelden des Archivs: + + archive ("std.printer") + + +- Holen der Druckeranpassung vom Archiv: + + fetch ("druckertyp.inserter", archive) + + +- Insertieren der Druckeranpassung: + + insert ("druckertyp.inserter") + + + +Beispiel: + archive ("std.printer") + fetch ("laser.inserter", archive); + check off; + insert ("laser.inserter") + + +Nach Beendigung der Kompilierung finden Sie sich in einem Menü wieder, daß Ihnen +die Auswahl Ihres Drucker-Herstellers durch die Eingabe der vor dem Firmennamen +stehenden Zahl erlaubt. Diese Eingabe schicken Sie mit RETURN ab. Da Hersteller +mitunter verschiedene Modelle mit verschiedenen Funktionen anbieten, ist es nötig, +daß Sie Ihr Modell auswählen. Auch diese Eingabe wird durch RETURN abgeschickt. +Nachdem Sie die Nummer des gewünschten Druckers eingegeben haben, erfolgt noch +einmal eine Sicherheitsabfrage, ob dieser Drucker installiert werden soll. + +Neben den speziell zu dem gewählten Drucker passenden Fragen (z.B. NLQ-Modus +standardmäßig) ist es erforderlich, den Kanal einzugeben, an dem der Drucker ange­ +schlossen ist (z.B. Kanal 15 für eine parallele Schnittstelle). + +Wenn die Generierung beendet ist, muß in allen bestehenden Tasks - insbesondere in +der Task 'PUBLIC' - die Fonttabelle mit dem fonttable-Kommando eingestellt werden. +Mit dem Kommando + + + print ("dateiname") + + +wird dann eine Datei ausgedruckt. + +Befindet sich keine passende Druckeranpassung für den anzuschließenden Drucker­ +typ auf dem Standardarchiv "std.printer", so sollte die Druckeranpassung "printer.std" +benutzt werden. Diese Druckeranpassung ist eine universelle Druckeranpassung für +alle Drucker, die mit ASCII-Code 13 ein 'Carriage Return' (d.h. Bewegung des Druck­ +kopfes an den linken Rand) und mit ASCII-Code 10 eine Zeilenschaltung von 1/6 Zoll +vornehmen. Mit ihr kann dann in einem Schrifttyp (entweder 10 oder 12 Zeichen pro +Zoll, je nachdem welche Fonttabelle eingestellt ist) gedruckt werden. So erhält man +wenigstens eine Minimalansteuerung des Druckers. Für eine bessere Ansteuerung des +Drucker muß ein Programm geschrieben werden, das das Druckertreiber-Interface +erfüllt (siehe Teil 6 "Der EUMEL-Drucker") und eine Fonttabelle erstellt (siehe Teil 7 "Der +Fontspeicher") werden. +#page# +#headeven# + +%#center#EUMEL-Systemhandbuch + + +#end# +#headodd# + +#center#2. Hardware und ihre Steuerung#right#% + + +#end# + + +#ib(9)#2. Hardware und ihre Steuerung#ie(9)# + + + + +#ib(9)#2.1. Vorwort#ie(9)# + + +Die #ib#Hardware#ie# eines jeden EUMEL-Systems läßt sich in #ib#Rechnerkern#ie# und Peripherie +einteilen. + + +a) Der #ib#Rechnerkern#ie# + + +In der Regel wird der Rechnerkern aus folgenden Komponenten bestehen: + + - #ib#CPU#ie# + - #ib#Vordergrundspeicher#ie# (oft als RAM bezeichnet) + - #ib#Hintergrundspeicher#ie# (Floppy, Harddisk, oder auch RAM/ROM) + +Alle Daten, Dateien und Programme werden auf dem Hintergrundspeicher abgelegt. +Der benötigte Platz wird dabei dynamisch nach Bedarf zugewiesen. Jeder Zugriff auf +Daten, die sich auf dem Hintergrundspeicher befinden, muß über den Vordergrund­ +speicher erfolgen. Zu diesem Zweck verlagert das EUMEL-System automatisch alle +aktuell benötigten Daten in den Vordergrundspeicher. Das erfolgt nach dem Prinzip +des #ib#Demand-Paging#ie# (s. Benutzerhandbuch Kap. 1). Die CPU führt die aktiven Pro­ +gramme (unter Benutzung des Speichers) aus. Dabei bearbeitet sie reihum alle re­ +chenwilligen Prozesse. +Die drei Komponenten des Rechnerkerns werden vollständig vom EUMEL-Betriebs­ +system verwaltet und miteinander verknüpft, so daß der Anwender sich in der Regel +darum weder kümmern muß noch kann. Ausgenommen davon sind allerdings die +Diagnose von Hardwarefehlern und Überlegungen zur Systemleistung. + + +b) Die #ib#Peripherie#ie# + + +Alle anderen Geräte oder Gerätekomponenten gehören aus der Sicht des EUMEL- +Systems zur Peripherie. Wesentliches Kennzeichen ist, daß sie über Kanäle mit dem +Rechnerkern verbunden sind und von dort aus durch System- und Anwender­ +programm gesteuert werden können. Angeschlossen werden können u.a. + + - #ib#Terminal#ie#s + - #ib#Drucker#ie# und #ib#Plotter#ie# + - andere #ib#Rechner#ie# bzw. #ib#Rechnernetze#ie# + - #ib#Archivgerät#ie#e (z.B. Floppy-Laufwerke) + +In der Regel hat jedes EUMEL-System mindestens ein #ib#Terminal#ie# und #ib#Archivlaufwerk#ie#. +Auch wenn dieses "Terminal 1" und das Floppy-Laufwerk baulich in den Rechner +integiert sind, gehören sie logisch zur Peripherie. Die entsprechenden Kanäle sind +dann allerdings Teil des Rechners und brauchen den Anwender nicht zu interessie­ +ren. Die beiden wesentlichen anderen Kanaltypen sind: + + - #ib#serielle Schnittstelle#ie#n (#ib#V.24#ie#) + - #ib#Parallelschnittstellen#ie# + +Beide führen "echt" aus dem Rechner heraus und sind u.U. hardwaremäßig für den +Anwender von Bedeutung. Normalerweise sollte zwar der Lieferant der EUMEL- +Hardware für die Verkabelung und den Anschluß peripherer Geräte sorgen, aber +Kenntnisse können in Fehlersituationen (z.B. Kabelbruch), bei Umkonfigurierungen +und bei Kombinationen verschiedener Geräte helfen. + + + + +#ib(9)#2.2. #ib#Hardware-Test#ie##ie(9)# + + + +Der EUMEL-Hardware-Test ist ein rechnerunabhängiger Test und kann demzufolge +nicht so viel überprüfen wie Testprogramme, die genau auf eine entsprechende Hard­ +ware zugeschnitten sind. Trotzdem sollten die meisten Hardware-Fehler schon mit +dem EUMEL-#ib#Hardware-Test#ie# gefunden werden. + +Bei jedem Systemstart wird der "#ib#Vortest#ie#" durchgeführt. Nachdem er Terminals, Spei­ +cher und Hintergrund angezeigt hat, testet er einmal den Hauptspeicher. Danach wird +das eigentliche EUMEL-System gestartet. + + +Durch Eingabe eines beliebigen Zeichens während des Vortests (Speichertest: +*********) kommt man in den ausführlichen #ib#Start-Dialog#ie#. Dort wird u.a. auch die +Möglichkeit "Hardware-Test" angeboten. Wählt man diese an, werden die verfügbaren +Tests als Menü aufgelistet. Bei jedem EUMEL-System stehen folgende Testmöglichkei­ +ten zur Verfügung: + + (1) #ib#Speichertest#ie# + (2) #ib#Kanaltest#ie# + (3) #ib#Hintergrundtest#ie# + (4) #ib#Archivtest#ie# + +Alle Tests sind dabei Dauertests, d.h. sie beginnen nach jedem Durchlauf von neu­ +em, können aber durch abgebrochen werden. + + + + + +#ib##ib(9)#Speichertest#ie##ie(9)# + + +Der #ib#Speichertest#ie# soll den Vordergrundspeicher (#ib#RAM#ie#) des Rechners untersuchen. +Gerade #ib#Speicherfehler#ie# tendieren aber dazu, nur sporadisch aufzutreten oder wär­ +meabhängig zu sein. Deshalb sollte der Test bei Verdacht auf Speicherfehler längere +Zeit (einige Stunden) laufen. Leider können auch dann nicht alle Fehler aufgedeckt +werden, z.B. nicht solche, die nur in ganz speziellen Situationen entstehen, wie Spei­ +cherzugriff mit gleichzeitig anlaufendem Floppymotor und Zeichenausgabe. Generell +gilt hier (wie für jeden Test), daß das Nichtvorhandensein von Fehlern nie Vollkommen +sicher nachgewiesen werden kann. + +Der Speichertest teilt den Speicher in drei verschiedene Bereiche auf: + + 0 : adresse MOD 3 = 0 + 1 : adresse MOD 3 = 1 + 2 : adresse MOD 3 = 2 + +Der freie Speicher wird nach folgendem Algorithmus geprüft: + + schreibe (1, OLOLOLOL) ; out ("*") ; + schreibe (2, OLOLOLOL) ; out ("*") ; + schreibe (0, LOLOLOLO) ; out ("*") ; + pruefe (1, OLOLOLOL) ; out ("*") ; + schreibe (1, LOLOLOLO) ; out ("*") ; + pruefe (2, OLOLOLOL) ; out ("*") ; + pruefe (0, LOLOLOLO) ; out ("*") ; + pruefe (1, LOLOLOLO) ; out ("*") ; + schreibe (0, OLOLOLOL) ; out ("*") ; + pruefe (0, OLOLOLOL) ; out ("*") ; + schreibe (2, LOLOLOLO) ; out ("*") ; + pruefe (2, LOLOLOLO) ; out ("*") . + + +Dabei werden durch 'PROC schreibe (INT CONST bereich, BYTE CONST muster)' alle +Bytes des entsprechenden Bereichs mit dem angegebenen Muster geladen. 'PROC +pruefe (INT CONST bereich, BYTE CONST soll)' überprüft entsprechend alle Bytes des +Bereichs darauf, ob sie das Sollmuster enthalten. + +Findet der Speichertest Fehler, können u.a. folgende Ursachen vorliegen: + + - Ein Speicherchip ist defekt. + + - Die Versorgungsspannung für den Speicher (meistens +5V) ist zu niedrig, + d.h. das Netzteil ist nicht richtig eingestellt bzw. defekt. (Das kann insbeson­ + dere dann entstehen, wenn ein Rechner so "hochgerüstet" wurde, daß das + Netzteil nachgeregelt werden müßte.) + + - Die Kontakte der Speicherkarten sind locker oder oxidiert. + + - Die Speicheransteuerung ist defekt. + + + + + +#ib##ib(9)#Kanaltest#ie##ie(9)# + + +Beim #ib#Kanaltest#ie# werden fortlaufend auf allen #ib#Terminalkanälen#ie# (außer auf Terminal 1) +die jeweiligen Kanalnummern in der Form "Kanal: n" ausgegeben. Jedes Eingabe­ +zeichen wird in dezimaler Verschlüssung unter Angabe der Kanalnummer auf dem +Terminal 1 gemeldet. + +Mit Hilfe dieses Tests können u.a. Kabel und Geräteeinstellungen überprüft werden. +Mögliche Fehlerursachen: + + - falsche #ib#Baudrate#ie# eingestellt + + Symptome: Bei Aus- und Eingabe werden vollkommen unsinnige Zeichen + angeliefert. + Abhilfe: Baudrate am Endgerät oder am Rechner richtig einstellen. + + - falsche #ib#Parität#ie# eingestellt + + Symptome: Einige Zeichen werden richtig übertragen, andere verfälscht. In + einigen Fällen können auch alle Zeichen falsch übertragen wer­ + den. + Abhilfe: Parität am Endgerät oder am Rechner richtig einstellen. + + - falsches #ib#Kabel#ie# (z.B. Sende- und Empfangsleitungen fälschlich gekreuzt bzw. + nicht gekreuzt, Kabel ohne Flußkontrolle an Schnittstelle mit + Flußkontrolle, V.24-Kabel an Parallelschnittstelle oder umge­ + kehrt): + + Symptome: Keine Ausgabe, keine Eingabe oder andauernder Strom von + "Schrottzeichen". + Abhilfe: richtiges Kabel nehmen oder Kabel korrigieren. + + - defektes Kabel (Kabelbruch, defekter Stecker o.ä.) + + Symptome: beliebig. + Testmöglichkeit: Kabel wechseln. + + - defektes #ib#Endgerät#ie# + + Symptome: beliebig. + Testmöglichkeit: Anderes Gerät mit gleicher Einstellung (Baudrate, Parität + usw.) anschließen. + + - defekte #ib#Schnittstelle#ie# im Rechner + + Symptome: beliebig + Testmöglichkeit: Endgerät mit gleichem Kabel an eine andere Schnittstelle + am Rechner anschließen (dazu evtl. die Geräteparameter + wie Baudrate anpassen). + + + + + +#ib##ib(9)#Hintergrundtest#ie(9)##ie# + + +Zur Überprüfung des #ib#Hintergrund#ie#es werden drei Tests angeboten: + + (1) #ib#Lesetest#ie# + (2) #ib#Lese-/Schreibtest#ie# + (3) #ib#Positioniertest#ie# + + +Der #ib##on("i")##on("b")#Lesetest#off("i")##off("b")##ie# prüft, ob alle für EUMEL verfügbaren Blöcke auf der Platte bzw. Floppy +lesbar sind. Dabei wird der Blockinhalt nicht inspiziert. Sowohl behebbare (soft) als +auch harte #ib#Lesefehler#ie# werden gemeldet. Der Bediener kann einen Korrekturversuch +durch Rückschreiben veranlassen. Bei einem #ib#Soft-Error#ie# (Block konnte nach mehreren +Versuchen doch gelesen werden) wird der gelesene Block neu geschrieben. Der Fehler +kann jetzt ohne negative Folgen behoben sein, bei defekter Hardware aber auch zu +Folgefehlern führen. +Als Korrekturversuch bei harten Fehlern wird ein mit 'FFFD' gefüllter Block geschrie­ +ben. Wird ein solcher Block später vom EUMEL gelesen und als Code angesehen, führt +das zur Fehlermeldung "#ib#code block unreadable#ie#". Wird FFFD als INT angesehen, liefert +es den Wert -3, bei REAL oder TEXT können keine Vorhersagen gemacht werden. + + +Bei dem #ib##on("i")##on("b")#Schreib-/Lesetest#off("i")##off("b")##ie# wird jeder Block mit mehreren Bitmustern beschrieben und +zur Kontrolle wieder gelesen. Der alte Inhalt wird vor dem Test gesichert und nachher +wieder in den Block geschrieben. + + #on("b")#Achtung: Normalerweise zerstört der Test den EUMEL-Hintergrund nicht. Bei + defekter Platte können allerdings Blöcke durch mißlungenes Rück­ + schreiben zerstört werden. #off("b")# + + +Der #ib##on("i")##on("b")#Positioniertest#off("i")##off("b")##ie# arbeitet ähnlich wie die Leseprüfung. Allerdings wird in der Reihen­ +folge 0, 1, 0, 2, 0, 3, ... gelesen, so daß die Platte für jeden Lesevorgang positionieren +muß. + + #on("b")#Achtung: Wegen der harten Plattenbelastung sollte dieser Test nicht zu lange + laufen.#off("b")# + + + + + +#ib##ib(9)#Archivtest#ie##ie(9)# + + +Der Archivtest arbeitet ähnlich wie der Hintergrundtest - allerdings auf dem Archiv. Er +kann sowohl zur Überprüfung von Archiv-Datenträgern (#ib#Lesetest#ie#) als auch zum Test +des #ib#Archivlaufwerks#ie# benutzt werden. + + + + + +#ib(9)#2.3. #ib#Serielle Geräteschnittstelle#ie##ie(9)# + + +#ib##ib(9)#Pinbelegung und Kabel#ie(9)##ie# + + +#on("b")##on("i")#Anmerkung: Dieses Kapitel ist nur für solche Anwender von Bedeutung, die sich selbst + mit der Verkabelung ihrer Geräte befassen.#off("i")##off("b")# + +Im folgenden werden die wichtigsten Leitungen der offiziellen #ib#V.24-Schnittstelle#ie# (#ib#seriel­ +le Schnittstelle#ie# zum Anschluß von Terminals, Druckern, Fremdrechnern u.ä.) beschrie­ +ben: + + Pin Betriebsrichtung Bedeutung + + 2 out Sendedaten + 3 in Empfangsdaten + + 4 out Sendeaufforderung (RTS) + 5 in Empfangsbereitschaft (CTS) + + 7 Signalerde + + 8 in Gegenstation bereit (DCD) + + 20 out eigene Station bereit (DTR) + + +Dabei dient das Paar (2,3) zur Übertragung der Daten, mit Hilfe von (4,5) ist #ib#Flußkon­ +trolle#ie# möglich (z.B. kann ein Drucker damit Sendungen vom Rechner "verlangsamen"). +Das Paar (8,20) wird bei manchen Geräten und Rechnern benutzt, um festzustellen, ob +die Gegenstation eingeschaltet ist. + + +Die meisten Rechner haben die gleiche #ib#Pinbelegung#ie# wie oben aufgeführt. Die Kabel +müssen dann die folgenden #ib#Pin#ie#s verbinden: + + +Rechner 2 3 4 5 7 8 20 Vollständige Verbindung mit Flußkontrolle. + +Gerät 2 3 4 5 7 8 20 + + +Rechner 2 3 4 5 7 Reicht für die meisten Anschlüsse mit Flußkontrol­ + le, z.B. Rechnerkopplung. +Gerät 2 3 4 5 7 + + +Rechner 2 3 5 7 Reicht für die meisten Drucker, Flußkontrolle nur + einseitig vom Drucker zum Rechner. +Gerät 2 3 4 7 + + +Rechner 2 3 7 Reicht meistens für Terminals, Flußkontrolle ist + dabei überflüssig. +Gerät 2 3 7 + + +Rechner 2 3 4 5 7 Manchmal für Terminals. Rechnerseitig wird Fluß­ + kontrolle durch die Brücke 4-5 simuliert. +Gerät 2 3 7 + + +Bei manchen Rechnern werden die notwendigen paarweisen Vertauschungen schon +im Rechner durchgeführt. Es ergibt sich entsprechend: + + +Rechner 2 3 4 5 7 8 20 Vollständige Verbindung mit Flußkontrolle. + +Gerät 2 3 4 5 7 8 20 + + +Rechner 2 3 4 5 7 Einfacher Anschluß mit Flußkontrolle. + +Gerät 2 3 4 5 7 + + +Rechner 2 3 4 7 Drucker, einseitige Flußkontrolle. + +Gerät 2 3 4 7 + + +Rechner 2 3 7 Terminal. + +Gerät 2 3 7 + + +Rechner 2 3 4 5 7 Terminal mit simulierter Flußkontrolle. + +Gerät 2 3 7 + + + + + + + +#ib(9)#2.4. #ib#Kanäle#ie# und #ib#Konfigurierung#ie##ie(9)# + + + +Im EUMEL-System dienen #ib#Kanäle#ie# zur Kommunikation mit der Außenwelt, d.h. Kanäle +sind Verbindungen vom Rechner zu peripheren Geräten wie Terminals, Drucker, Plotter +und Archiv. Kanäle können für zeichen- und #ib#blockorientierte Ein-/Ausgabe#ie# verwendet +werden. Ein Kanal heißt #ub##ib#privilegiert#ie(1,"er Kanal")##ue#, wenn er nur von privilegierten Systemtasks (Nach­ +kommen des Supervisors) benutzt werden kann. + +#ib#Kanalaufteilung#ie#: + + Kanal Bedeutung + + 1 zeichenorientiert, blockorientiert + Dieser Kanal muß mit einem Terminal verbunden sein, da + über ihn der Systemstart erfolgt. + 2-16 zeichenorientiert, blockorientiert + Diese Kanäle werden für weitere Terminals, Drucker, Plot­ + ter, Rechnerkopplung usw. verwandt. + + 15-23 blockorientiert + + 24-30 blockorientiert, privilegiert + + 31 blockorientiert, privilegiert + Dieser Kanal ist der #ib#Standardkanal des Archivsystems#ie#, d.h. + üblicherweise wird darüber die Archivfloppy angesprochen. + + 32 blockorientiert, privilegiert + Dieses ist ein #ib#interner Kanal#ie#, an den kein externes Gerät + angeschlossen werden kann. Er wird zur Konfigurierung + der anderen Kanäle benutzt. + +Der Supervisor des EUMEL-Systems verwaltet die Kanäle. Jeder Task ist dabei kein +oder genau ein Kanal zugeordnet. Entsprechend ist jedem Kanal keine oder genau +eine Task zugeordnet. Solche Zuordnungen können von außen durch den Benutzer +(nur bei interaktiven Kanälen) über die SV-Kommandos bzw. Prozeduraufrufe 'conti­ +nue' und 'break' (s. Kap. 5) verändert werden. In jedem Fall überprüft der Supervisor +die Zugriffsberechtigung. + + + + + +#ib##ib(9)#Zeichenorientierte Ein-/Ausgabe#ie##ie(9)# + + +Zeichenorientierte Ein-/Ausgabe kann auf den Kanälen 1 bis 16 benutzt werden. Dafür +stehen die Basisoperationen + + PROC #ib#out#ie# (TEXT CONST text) + PROC #ib#outsubtext#ie# (TEXT CONST source, + INT CNST from) + PROC outsubtext (TEXT CONST source, + INT CONST from, to)9 + PROC #ib#cursor#ie# (INT CONST x, y) + PROC #ib#inchar#ie# (TEXT VAR char) + TEXT PROC #ib#incharety#ie# + TEXT PROC incharety (INT CONST time limit) + PROC #ib#get cursor#ie# (INT VAR x, y) + +und alle darauf aufbauenden Operationen (wie 'put', 'get', 'putline', 'getline' usw.) zur +Verfügung. Diese Kanäle sind 'konfigurierbar' (s.u.) und erlauben den Anruf des +Systems durch den Benutzer von außen (SV-Taste). In der Regel werden die Kanäle 1 +bis 16 für Terminals, Drucker, Plotter und andere zeichenorientierte Anschlüsse be­ +nutzt. +Wenn ein Kanal zum Anschluß eines Terminals verwendet wird, müssen die #ib#Standard- +Steuerzeichen#ie# des EUMEL-Systems (s. Benutzerhandbuch Programmierung, Kap. 3 +"Der Editor", "5.2.4. Der EUMEL-Zeichensatz") auf jedem Terminal die gleiche Semantik +haben. Das heißt beispielsweise, daß der Code ""2"" auf jedem Terminal bei Ausgabe +den Cursor um eine Stelle nach rechts verschiebt. Da Datenendgeräte in dieser Hin­ +sicht aber faktisch keiner Norm gehorchen, müssen die EUMEL-Codes in der Regel in +#ib#terminalspezifische Codes#ie# umgesetzt werden. Diese Umsetzregeln kann man bei der +Konfigurierung (s.u.) festlegen. Für die meisten Terminaltypen werden allerdings +fertige Konfigurationssätze mit dem EUMEL-System zusammen ausgeliefert, die man +bei der Einrichtung des Systems (s. Kap. 1 Installationsanleitung) interaktiv anwählen +kann. + + + + +#ib##ib(9)#Blockorientierte Ein-/Ausgabe#ie##ie(9)# + + +Blockorientiere Ein-/Ausgabe kann auf den Kanälen 1 bis 32 benutzt werden. Dafür +stehen die Operationen + + PROC #ib#control#ie# (INT CONST code1, code2, code3, + INT VAR return code) + PROC #ib#blockout#ie# (DATASPACE CONST ds, + INT CONST page nr, code1, code2, INT VAR return code) + PROC #ib#blockout#ie# (ROW 256 INT CONST block, + INT CONST code1, code2, INT VAR return code) + PROC #ib#blockin#ie# (DATASPACE VAR ds, + INT CONST page nr, code1, code2, INT VAR return code) + PROC #ib#blockin#ie# (ROW 256 INT VAR block, + INT CONST code1, code2, INT VAR return code) + +zur Verfügung. Näheres findet man in Kap. 4.5 dieses Systemhandbuchs. + + + + + +#ib##ib(9)#Konfigurierung von Kanal 1 bis 15#ie(9)##ie# + + + +Alle #ib#zeichenorientierten Kanäle#ie# können (mittels Block I/O auf Kanal 32) konfiguriert +werden. Dabei werden im wesentlichen #ib#Umsetzregeln#ie# für Ein- und Ausgabe definiert, +die den Zweck haben, + + - bei der Ausgabe den EUMEL Zeichensatz auf den Zeichensatz des ange­ + schlossenen Geräts abzubilden und + + - bei der Eingabe die gerätespezifischen Zeichen auf den EUMEL Zeichensatz + abzubilden. + +So ist eine geräteunabhängige Programmierung möglich. + +Mit Hilfe der Prozedur '#ib#link#ie#' kann man einen der Kanäle 1 bis 16 auf einen bestimm­ +ten Typ setzen. Immer vorhanden sind die Typen: + +"#ib#transparent#ie#": Keine Codeumsetzungen (für Drucker usw.) und +"#ib#psi#ie#" : Keine Codeumsetzungen, jedoch folgende Sonderfunktionen: +#free(1.0)# + Code Funktion + 7 (CTLg) SV + 17 (CTLq) Stop + 23 (CTLw) Weiter + +Weitere Typen müssen in Form eines DATASPACE, die nach den Gerätetypen benannt +sind, in der Task vorliegen, in der das Kommando 'link' gegeben wird. + +Neue Terminaltypen können mit den Prozeduren 'new type', 'enter outcode', 'enter +incode' usw. definiert werden. Im einzelnen stehen folgende Prozeduren zur Verfü­ +gung: + + +#ib#link#ie# + PROC link (INT CONST channel, TEXT CONST type) + Zweck: Der angegebene Kanal (1 bis 16) wird auf den angegebenen Typ konfi­ + guriert. + Hinweis: Die Prozedur 'link' hat die angegebene Wirkung nur, wenn + die Task an Kanal 32 hängt, der nur für Söhne des + SUPERVISOR zugänglich ist ('continue (32)'). + +#ib#y size#ie# + PROC y size (INT CONST channel, new size, INT VAR old size) + Zweck: Einstellmöglichkeiten für verschiedene Bildschirmgrößen. Diese Proze­ + dur wirkt nur auf Kanal 32. 'channel' gibt dabei den zu konfigurierenden + Kanal an. + +#ib#new type#ie# + PROC new type (TEXT CONST typ) + Zweck: Eröffnet einen neuen Kanaltyp mit dem Namen 'typ'. Die folgenden + Aufrufe von 'enter outcode', 'enter incode' usw. beziehen sich dann auf + diesen Typ. + +#ib#enter outcode#ie# + PROC enter outcode (INT CONST eumelcode, zielcode) + Zweck: Legt fest, daß der Code 'eumelcode' bei Ausgabe auf dem Terminaltyp + in 'zielcode' gewandelt werden soll. + + PROC enter outcode (INT CONST eumelcode, TEXT CONST zeichen) + Zweck: Wirkt wie 'enter outcode (eumelcode, code (zeichen))'. + + PROC enter outcode (INT CONST eumelcode, zeit, TEXT CONST seq) + Zweck: Hiermit wird festgelegt, daß der Code 'eumelcode' als Mehrzeichenfolge + 'seq' ausgegeben werden soll. Jedesmal, wenn diese Folge ausgegeben + wurde, verzögert das System die Ausgabe des nächsten Zeichens um + mindestens 'zeit' Millisekunden. Dies wird z.B. von den meisten Termi­ + nals gefordert, wenn sie die Funktion 'Löschen Bildschirm' ausführen + sollen. + +#ib#enter incode#ie# + PROC enter incode (INT CONST eumelcode, TEXT CONST seq) + Zweck: Es wird festgelegt, daß eine Eingabezeichenfolge 'seq' an das System + als ein (!) Zeichen mit dem Code 'eumelcode' weitergegeben werden + soll. Die ganze Sequenz muß dabei innerhalb von ca. 40 Millisekunden + eintreffen, andernfalls werden die Zeichen einzeln gemeldet. Diese + Logik ist erforderlich, um auch Terminals anzuschließen, die z.B. Cursor­ + tasten als ESC-Sequenzen melden. Ohne die Zeitüberwachung würde + das Betätigen der ESC-Taste sonst die Eingabe blockieren, bis die Folge + 'seq' vollständig ist. + Folgende Eumelcodes sind für die Sondertasten (SV usw.) anzugeben: + + 17 : STOP + 23 : WEITER + 7 : SV + + Weitere Codes ('HOP',...) sind im Benutzerhandbuch Programmierung + (5 - 29, Der EUMEL-Zeichensatz) angegeben. + + #on("i")#Hinweis: Liefert die SV-Taste eines Terminals von sich aus schon Code + 7, so ist dennoch 'enter incode (7, ""7"")' anzugeben. Entspre­ + chendes gilt für die zwei anderen "Ereignistasten" STOP und + WEITER. Bei allen anderen Tasten brauchen jedoch nur echte + Umcodierungen vermerkt zu werden.#off("i")# + + +#ib#cursor logic#ie# + PROC cursor logic (INT CONST offset, modus, TEXT CONST pre, mid, post) + Zweck: Es wird festgelegt, daß der EUMEL-Code 6 (Cursorposition) mit den + folgenden beiden Zeichen, deren Codes y und x seien, + + bei modus = 255 als + pre + code (offset+y) + mid + code (offset+x) + post + und bei modus = 1 als + pre + text (offset+y) + mid + text (offset+x) + post + + ausgegeben wird. + Hinweis: 'offset' ist üblicherweise 32 (manchmal 0) und + mid = post = "". + +#ib#cursor logic#ie# + PROC cursor logic (INT CONST dist, TEXT CONST pre, mid, post) + Zweck: Diese Prozedur wird von den Konfigurationsdateien alter Versionen + benutzt. + +#ib#ansi cursor#ie# + PROC ansi cursor (TEXT CONST pre, mid, post) + Zweck: Diese Prozedur ist anstelle von 'cursor logic' zu verwenden, wenn die + Cursor-Positionierungen bei dem Terminal so erfolgt, wie im Ansi- + Standard definiert wird. + +#ib#elbit cursor#ie# + PROC elbit cursor + Zweck: Diese Prozedur ist bei Elbit-Terminals anstelle von 'cursor logic' zu + verwenden. + + + + + + +#ib##ib(9)#Konfigurations-Manager#ie##ie(9)# + + +Wenn das System gestartet wird, weiß der Urlader noch nicht, welche #ib#Terminaltypen#ie# +an welchen Kanälen hängen. (Der Vortest kann deshalb auch nicht bildschirmorien­ +tiert arbeiten). + +Falls eine Task 'configurator' im System ist, schickt der SUPERVISOR dieser eine Start­ +sendung zu. Diese Task kann daraufhin die nötigen Konfigurierkommandos ('link',...) +ausführen. + +Ansonsten ist 'configurator' ein normaler Fontmanager, der die Fonttabellen verwaltet +(siehe Kap. 7). Deshalb sollte im System immer eine Task 'configurator' existieren und +nach Möglichkeit immer im 'wait' stehen. Man kann ihn also auch mit 'continue' an ein +Terminal holen und dann wie üblich Kommandos geben. + +#ib#configurate#ie# + PROC configurate + Zweck: Führt den Konfigurationsdialog und anschließendes 'setup' durch. + +#ib#setup#ie# + PROC setup + Zweck: Alle Kanäle werden gemäß der im letzten Konfigurationsdialog bestimm­ + ten Werte konfiguriert (wird automatisch bei jedem Systemstart durch­ + geführt). + +#ib#configuration manager#ie# + PROC configuration manager + Zweck: Durch Aufruf dieser Prozedur wird die Task zu einem Konfigurations­ + manager. Man kann also die Task "configurator" löschen, neu als + Systemtask einrichten und mit diesem Kommando wieder etablieren. + BEACHTE: - Die Task muß 'configurator' heißen. + - Alle Terminalanpassungen gehen beim Löschen verloren, d.h. + man sollte sie vorher sichern! + + +#on("i")#Hinweis: Es passieren, daß eine Task schon Ausgaben macht, bevor der Kanal + konfiguriert ist (z.B. wenn ein 'shutup' bei aktiver Netz-Kommunikation + durchgeführt wurde).#off("i")# + diff --git a/doc/system/systemhandbuch.2 b/doc/system/systemhandbuch.2 new file mode 100644 index 0000000..c4772f0 --- /dev/null +++ b/doc/system/systemhandbuch.2 @@ -0,0 +1,1351 @@ +#start(2.5,1.5)# +#pageblock# +#block# +#page (35)# +#headeven# + +%#center#EUMEL-Systemhandbuch + + +#end# +#headodd# + +#center#3. ELAN-Programme#right#% + + +#end# + + +#ib(9)#3. #ib#ELAN-Programme#ie##ie(9)# + + + + +#ib(9)#3.1. #ib#Wertebereich#ie#e und #ib#Speicherbedarf#ie##ie(9)# + + +#ib#INT-Objekte#ie# + + +Jedes #ib#Datenobjekt#ie# vom Typ INT belegt im Speicher 2 Bytes. Mögliche INT-Werte sind +die ganzen Zahlen von -32768 bis +32767 einschließlich. + + + + +#ib#REAL-Objekte#ie# + + +Jedes Datenobjekt vom Typ REAL belegt im Speicher 8 Bytes. + +REALs haben eine 13-stellige #ib#Mantisse#ie#, die im Rechner dezimal geführt wird. (Das +heißt, bei Konversionen zwischen interner und TEXT-Darstellung treten keine Run­ +dungsfehler auf.) Der Wertebereich wird durch folgende Eckwerte abgelegt: + + 9.999999999999e+126 größter REAL-Wert + 0.000000000001 kleinster positiver REAL-Wert mit x + 1.0 > 1.0 + 9.999999999999e-126 kleinster positiver REAL-Wert > 0.0 + -9.999999999999e-126 größter negativer REAL-Wert + -9.999999999999e+126 kleinster REAL-Wert + + + + + +#ib#BOOL-Objekte#ie# + + +Jedes Datenobjekt vom Typ BOOL belegt im Speicher 2 Bytes. + + + + + +#ib#TEXT-Objekte#ie# + + +Jedes Datenobjekt vom Typ TEXT besteht aus einem festen Teil von 16 Bytes und +möglicherweise aus einem flexiblen Teil auf dem #on("i")##on("b")##ib#Heap#ie##off("i")##off("b")#. Im festen Teil werden #ib#Texte bis +zur Länge von 13 Zeichen#ie# untergebracht. Wenn eine TEXT-Variable einen Wert mit +mehr als 13 Zeichen Länge annimmt, werden alle Zeichen auf dem Heap unterge­ +bracht. Genauer ergibt sich folgendes Bild: + + kurzer Text (LENGTH <= 13): + + Heap-Link 2 Bytes + Textlänge 1 Byte + Text 13 Bytes + + langer Text (LENGTH > 13): + + Heap-Link 2 Bytes + 255 1 Byte + Länge 2 Bytes + ungenutzt 11 Bytes + +Wenn eine Variable einmal Platz auf dem Heap bekommen hat, behält sie diesen +vorbeugend auch dann, wenn sie wieder einen kurzen Text als Wert erhält. So muß +wahrscheinlich kein neuer Platz auf dem Heap zugewiesen werden, wenn sie wieder +länger wird. Das gilt allerdings nur bis zur nächsten #ib#Garbage Collection#ie# auf den +TEXT-Heap, denn dabei werden alle Heap-Container minimal gemacht bzw. gelöscht, +wenn sie nicht mehr benötigt werden. Der Platz auf dem Heap wird in Vielfachen von +16 Bytes vergeben. In Fremddatenräumen wird in jedem #ib#Container#ie# neben dem eigent­ +lichen Text auch die Containerlänge untergebracht. + +Beispiele: TEXT-Länge Speicherbedarf (Byte) + + 0 16 + 13 16 + 14 32 + 15 48 + 30 48 + 31 64 + 46 64 + 47 80 + 62 80 + + +Die Heapgröße eines Fremddatenraums berechnet sich als: + + 1024 * 1024 - 520 = 1048056 - stat Bytes + +'stat' ist dabei die statistische Größe der Datenstruktur, die dem Datenraum aufgeprägt +wurde. Bei einem BOUND ROW 1000 TEXT ergibt sich also eine Heapgröße von + + 1048056 - (1000 * 16) = 1032056 Bytes. + + + + + + +#ib#ROW- und STRUCT-Objekte#ie# + + +Bei der Berechnung des Speicherbedarfs von #ib#STRUCT#ie#s und #ib#ROW#ie#s muß man beden­ +ken, daß längere Datenobjekte ausgerichtet werden. Und zwar werden alle Objekte, die +mindestens die Länge eines REAL-Objektes haben, auf durch 8 teilbare Speichera­ +dressen ausgerichtet. Man bedenke, daß bei ROWs alle Elemente entsprechend ihres +Elementtyps ausgerichtet sind. + +Beispiele: Länge (Byte) + + ROW 2 BOOL 4 + ROW 4 INT 8 + ROW 5 INT 16 + ROW 2 STRUCT (INT, BOOL) 4 + ROW 100 STRUCT (INT,INT) 400 + ROW 100 STRUCT (INT,REAL) 1600 + ROW 100 STRUCT (INT,INT,INT,INT,REAL) 1600 + ROW 100 STRUCT (REAL, REAL) 1600 + ROW 100 STRUCT (INT,TEXT) 2400 + ROW 100 STRUCT (INT,INT,INT,INT,TEXT) 2400 + ROW 100 STRUCT (INT,TEXT,INT,TEXT) 4800 + ROW 100 STRUCT (INT,INT,TEXT,TEXT) 4000 + ROW 100 ROW 3 INT 600 + ROW 100 ROW 4 INT 800 + ROW 100 ROW 5 INT 1600 +aber: + ROW 500 INT 1000 + +#on("i")#Anmerkung: Bei der #ib#Speichervergabe#ie# der einfachen Variablen und Konstanten eines + Programms spielen Verluste aufgrund von Ausrichtungen in der Regel + keine Rolle. Der ELAN-Compiler optimiert dabei soweit möglich.#off("i")# +#page# +#headeven# + +%#center#EUMEL-Systemhandbuch + + +#end# +#headodd# + +#center#4. Standardpakete für Systemprogrammierer#right#% + + +#end# + + +#ib(9)#4. #ib#Standardpakete für + Systemprogrammierer#ie(9)##ie# + + +#ib(9)#4.1. #ib#Fehlerbehandlung#ie##ie(9)# + + +Übersicht + + +#on("italics")# + Fehler treten auf, wenn ein Programm eine gewünschte Leistung + nicht erbringen kann. Solche Situationen müssen von System- + Programmen kontrolliert behandelt werden. Die folgenden Aus­ + führungen sind somit nur für diejenigen interessant, die "Sy­ + stem"-Programme schreiben wollen.#off("italics")# + +#ib#Fehler#ie# treten in Operationen auf, wenn diese eine geforderte Leistung nicht erbringen +können (z.B. das Drucken einer nicht vorhandenen Datei). Da folgende Anweisungen +aber davon ausgehen, daß die gewünschten Leistungen erbracht wurden, ist es nicht +sinnvoll, die Operation weiter auszuführen. Wir sprechen vom #ib#Abbruch einer Operation#ie#, +wenn nach einem Fehler keine Anweisungen mehr ausgeführt werden, sondern die +Operation verlassen wird. Im EUMEL-System kann durch folgende drei Maßnahmen +ein Abbruch verursacht werden: + +- Aufruf der Prozedur '#ib#errorstop#ie#': + Die Operation wird mit einer Fehlermeldung abgebrochen, die man dem Aufruf von + 'errorstop' als Parameter beifügt werden kann. + +- Aufruf der Prozedur '#ib#stop#ie#': + Die Operation wird abgebrochen. Wirkt wie 'errorstop' mit der Meldung "stop". + +- Umschalten in den Supervisor: + Durch Betätigen der Taste SV und Eingabe des Kommandos '#ib#halt#ie#'. Die laufende + Operation wird abgebrochen. Wirkt wie ein 'errorstop', der von "außen" in das + Programm induziert wird. + +Da alle drei Maßnahmen zum Abbruch führen können und somit eine anormale (vor­ +zeitige) Beendigung eines Programms bewirken, werden sie im folgenden zusammen­ +fassend als #ib#Fehler#ie# bezeichnet. + +Für solche Fehler bietet das EUMEL-System die Möglichkeit, den Abbruch zu unter­ +drücken. Dies kann notwendig werden, wenn + +a) bestimmte Fehlerfälle vom aufrufenden Programm selbst behandelt werden sollen. + Beispiel: + + Der EUMEL-Editor wird aufgerufen, um eine Datei zu bearbeiten. Er versucht als + erstes, die Datei zu assoziieren. Existiert die Datei nicht, wird die Prozedur + (z.B. 'old'), mit der die Datei angemeldet werden soll, normalerweise mit der Feh­ + lermeldung ' "datei" gibt es nicht' abgebrochen. Diesen Fehlerzustand fängt der + Editor jedoch ab und versucht, eine neue Datei einzurichten (Anmerkung: In Wirk­ + lichkeit fragt der Editor natürlich vor der Assoziierung mit 'exists' ab, ob die Datei + existiert). + +b) eine Operation die Kontrolle auf jeden Fall behalten soll. + + Dies ist z.B. beim Monitor notwendig. Gleich welche Fehler vom Monitor gerufene + Programme produzieren, der Monitor muß in der Lage sein, die weitere Bearbei­ + tung zu ermöglichen. + +c) eine Operation nicht unterbrechbar sein darf. + + Beispielsweise dürfen Programm(teil)e, die Daten transportieren, nicht unterbro­ + chen werden, da sonst ein Verlust dieser Daten eintreten könnte. + + + +#ib(9)##ib#Fehlerbehandlung#ie# und #ib#Fängerebenen#ie##ie(9)# + + +Der Aufruf einer der Prozeduren + + #ib#errorstop#ie# + #ib#stop#ie# + #ib#halt#ie# + +(wobei letztere vom Supervisor gegeben werden muß) werden zusammenfassend als +#ib#Fehler#ie# bezeichnet. Bei einem Fehler wird ein #ib#Fehlerzustand#ie# gesetzt. Im Fehlerzustand +merkt sich das EUMEL-System, daß ein Fehler vorliegt. Die Prozeduren + + #ib#enable stop#ie# + #ib#disable stop#ie# + +bestimmen, ob Operationen im Fehlerzustand weiter bearbeitet oder abgebrochen +werden. Beispiel: + + + INT VAR x; + get (x); + ... + disable stop; + x := x * x; + ... + + +Hier wird mit 'disable stop' verhindert, daß ein Abbruch beispielsweise durch 'INT- +Ueberlauf' auftreten kann. Die Anweisungen nach 'x * x' werden also weiter bearbei­ +tet. + +Welchen Wert hat aber nun die Variable 'x', nachdem der Fehler auftrat? Offensicht­ +lich war die den Fehler auslösende Operation '*' nicht in der Lage, den richtigen Wert +zu errechnen. #ib#Abgebrochene Operationen#ie# liefern in der Regel keinen Wert. Dadurch ist +der Wert von 'x' in unserem Beispiel nach einem Fehler bei '*' undefiniert. Es ist nun +ersichtlich, daß mit der Anwendung der 'disable stop'-Prozedur äußerst vorsichtig zu +verfahren ist, weil u.U. Werte verloren gehen können bzw. mit unerwarteten Werten +weitergerechnet wird. + +Damit Programmierer erfahren können, ob ein Fehler aufgetreten ist, gibt es die Infor­ +mations-Prozedur + + #ib#is error#ie# + +über den Fehlerzustand. Die Prozedur liefert den Wert TRUE, wenn ein Fehler vorliegt, +andernfalls FALSE. Die Prozedur + + #ib#clear error#ie# + +"löscht" den Fehlerzustand, d.h. anschließende Abfragen mit 'is error' liefern FALSE. +(Die "richtige" Reaktion auf den Fehler muß ein Programmierer natürlich selbst be­ +stimmen). + +Beispiel: + + + INT VAR x; + get (x); + ... + disable stop; + x := x * x; + IF is error + THEN put ("'x'-Wert zu groß"); + x := 0; + clear error + FI; + ... + + +Leider würden jetzt aber auch alle folgenden Anweisungen bei eventuellen Fehlern +nicht abgebrochen, also auch in Situationen, in denen ein Abbruch erwünscht ist, um +#ib#Programmierfehler#ie# zu erkennen. Deshalb können durch + + #ib#enable stop#ie# + +Abbrüche wieder zugelassen werden. Wenn wir jetzt also schreiben: + + + INT VAR x; + get (x); + ... + disable stop; + x := x * x; + IF is error + THEN put ("'x'-wert zu gross"); + x := 0; + clear error + FI; + enable stop; + ... + + +dann würden - wie gewünscht - eventuelle Fehler in den Anweisungen nach 'enable +stop' zu einem Abbruch führen. + +Nicht mit '#ib#clear error#ie#' gelöschte Fehler führen bei '#ib#enable stop#ie#' ebenfalls zu einem +Abbruch. In dem Programmteil + + + ... + disable stop; + x := x * x; + enable stop; + ... + + +würde der eventuell auftretender Fehler 'INT Ueberlauf' nicht abgefangen, sondern nur +verzögert wirksam, weil er nicht mit 'clear error' gelöscht wurde. + +Für die Behandlung von Fehlern durch Benutzer gibt es Prozeduren, die eine adäquate +Reaktion auf den Fehler erlauben. Mit + + #ib#error message#ie# + +können Sie auf die erste Fehlermeldung (eines 'error stop') nach dem letzen 'clear +error' zugreifen (d.h. Folgefehler verändern nicht die Originalmeldung). Die Prozedur + + #ib#error code#ie# + +liefert den #ib#Fehlercode#ie#, der bei der Prozedur 'errorstop' zusätzlich zum #ib#Fehlertext#ie# +angegeben werden kann. + + #ib#error line#ie# + +liefert die Zeilennummer des zuletzt aufgetretenen Fehlers. Mit + + #ib#put error#ie# + +kann eine noch anstehende Fehlermeldung ausgegeben werden. Beispiel: + + + INT VAR x; + get (x); + ... + disable stop; + x := x * x; + IF is error + THEN IF error message = "INT-Ueberlauf" + THEN put ("'x'-wert zu gross"); + ELSE put error + FI; + clear error + FI; + enable stop; + ... + + +Tritt ein Fehler auf, so wird die den Fehler auslösende Operation entweder abgebro­ +chen oder "normal" weiter bearbeitet, je nachdem, ob 'enable stop' oder 'disable stop' +gesetzt ist. Auf jeden Fall wird der #ib#Fehlerzustand#ie# an die aufrufende Operation weiter­ +gemeldet, die wiederum abgebrochen oder weiterbearbeitet werden kann usw. Die +#ib#Weitermeldung#ie# eines Fehlers kann auch über mehrere Stufen erfolgen, solange bis der +Fehler gelöscht wird. Andererseits gilt 'enable/ disable stop' nicht nur für die aktuelle +Operation, sondern auch für gerufene Operationen ("Vererbung"). Die gerufenen Ope­ +rationen können allerdings 'enable/disable stop' neu festlegen. Beispiel: + + + PROC a: PROC b: PROC c: + ... ... ROW 10 INT VAR x; + disable stop; enable stop; ... + b; ... INT VAR i :: 4711; + IF is error c; x [i] := ...; + THEN ... ... ... + clear error END PROC b END PROC c + FI; + enable stop + END PROC a; + + +In der Prozedur 'a' wird die Prozedur 'b' aufgerufen. Diese ruft wiederum eine Prozedur +'c' auf. Für die Prozedur 'c' gilt nun der Zustand 'enable stop' der Prozedur 'b' (#ib#Verer­ +bung von 'enable stop'#ie#). Tritt jetzt in 'c' der Subskriptions-Fehler auf, wird 'c' abgebro­ +chen. Die Wirkung der fehlerauslösenden Operation ist nicht definiert. + +Da aber auch die Prozedur 'b' im 'enable stop' Zustand ist, wird auch die Prozedur 'b' +abgebrochen. Der Fehler bleibt jedoch erhalten, wird also weitergemeldet. Dies wirkt +sich so aus, daß die Anweisung 'c' nicht ausgeführt wird. Da die Prozedur 'a' 'disable +stop' gesetzt hat, werden die auf den Aufruf von 'b' folgenden Anweisungen durchlau­ +fen und somit durch 'clear error' der Fehler gelöscht. In diesem Beispiel "fängt" die +Prozedur 'a' Fehler auf, die in den Prozeduren 'b' und 'c' entstehen können. + +Ein solcher #ib#Fänger#ie# wird durch zwei Prozeduren konstruiert. Der eigentliche Fänger +(hier: Prozedur 'a') ruft eine ausführende Prozedur (hier: 'b') im 'disable stop'-Zustand +auf. Die gerufene Prozedur setzt sofort 'enable stop' und führt dann die eigentlichen +Aktionen aus. So wird die gerufene Prozedur abgebrochen (kann also im Fehlerfall +nicht zuviel Schaden anrichten). Der Abbruch führt bis zur Fängerprozedur ('a') hinter +den Aufruf der gerufenen Prozedur ('b'). Nach Löschung eventuell auftretender Fehler +ist somit sichergestellt, daß der Fänger immer weiterarbeiten kann. + + + +#ib(9)#Wichtiger Hinweis#ie(9)# + + + + 1. #on("italics")##on("bold")#Da im 'disable stop'-Zustand kein Fehler zum Abbruch führt, kann + eine Operation in diesem Zustand auch nicht durch 'halt' abge­ + brochen werden. Einerseits ist das für manche Systemteile wün­ + schenswert, andererseits können Operationen, die auf Grund von + Programmierfehlern nicht terminieren (Endlosschleifen), nicht + unter Kontrolle gebracht werden. Also Vorsicht! (Letztes Mittel: + Task löschen)#off("italics")##off("bold")# + + 2. #on("i")##on("b")#Es ist nicht (!) garantiert, daß im Fehlerzustand aufgerufene + Prozeduren ihre normale Wirkung haben. Garantiert ist dies je­ + doch für alle Prozeduren und Operatoren, die in diesem Kapi­ + tel aufgeführt werden.#off("i")##off("b")# + +#on("italics")##on("bold")#Merke: Fehler sind im EUMEL-System Aufrufe der Prozeduren 'errorstop', + 'stop' oder das Betätigen der SV Taste und dem Supervisor- + Kommando 'halt'. Ein Fehler gilt solange, bis er mit Hilfe der + Prozedur 'clear error' gelöscht wurde. Die Prozeduren 'enable/ + disable stop' steuern die Abarbeitung der Operationen im Fehler­ + fall. Gilt für eine Operation 'enable stop', wird die Operation + abgebrochen, d.h. die restlichen Anweisungen der Operation + nach der Fehler auslösenden Anweisung werden nicht durchlau­ + fen. Ist 'disable stop' gesetzt, werden die restlichen Operationen + weiterhin abgearbeitet. 'enable/disable stop' gilt für alle - auch + indirekt - aufgerufenen Operationen ("Vererbung"), es sei denn, in + den gerufenen Operationen wird ein erneutes 'enable/disable + stop' gesetzt. Über die Aufrufkette werden ggf. auch die Fehler + zurück gemeldet.#off("italics")##off("bold")# + + + #on("italics")##on("bold")#Eine Fänger-Ebene ist eine Prozedur, die 'disable stop' setzt und + dann andere Operationen aufruft. Nach jedem dieser Aufrufe + kann eine Fehlerbehandlung mit 'clear error' durchgeführt wer­ + den. Damit ist gewährleistet, daß Fehler immer von der Fänger- + Ebene "aufgefangen" und entsprechend behandelt werden.#off("italics")##off("bold")# + + + +#ib(9)##ib#Prozeduren zur Fehlerbehandlung#ie##ie(9)# + + +#ib#clear error#ie# + PROC clear error + Zweck: Löscht den Fehlerzustand. 'is error' liefert anschließend wieder FALSE. + 'error message', 'error code' und 'error line' werden nicht gelöscht. + +#ib#disable stop#ie# + PROC disable stop + Zweck: Unterbindet den Abbruch in aufgerufenen Operationen. 'disable stop' + gilt für die Prozedur, in der sie aufgerufen wird und in allen folgenden + gerufenen Prozeduren, es sei denn, sie wird durch 'enable stop' außer + Kraft gesetzt. Wird die Operation verlassen, in der 'disable stop' aufge­ + rufen wurde, wird der "alte" Zustand wiederhergestellt, der vor dem + Aufruf der Operation galt. 'disable stop' kann weiterhin in einer aufge­ + rufenen Operation durch den Aufruf von 'enable stop' in dieser und den + folgenden Operationen außer Kraft gesetzt werden. + +#ib#enable stop#ie# + PROC enable stop + Zweck: Setzt die Wirkung eines Aufrufs von 'disable stop' zurück. Fehler ('error­ + stop', 'stop' oder 'halt') in der aktuellen Operation oder den folgenden + aufgerufenen Operationen führen zum Abbruch. Bisher nicht gelöschte + Fehler (siehe 'clear error') führen sofort zum Abbruch. + +#ib#error code#ie##--goalpage ("fehlercodes")# + INT PROC error code + Zweck: Liefert den durch 'errorstop' gesetzten #ib#Fehlercode#ie#. Beispiel: + + PROC test: + enable stop; + error stop (110, "Dies ist mein Abbruch!"); + END PROC test; + + ... + disable stop; + test; + put (error code); (* liefert 110 *) + clear error; + enable stop + + +#ib#error line#ie# + INT PROC error line + Zweck: Liefert die Zeilennummmer des Fehlers (Voraussetzung : Die Überset­ + zung erfolgt im 'checkon-Modus). + +#ib#error message#ie# + TEXT PROC error message + Zweck: Liefert die Fehlermeldung als Text. Anhand dieser Meldung kann ent­ + schieden werden, welcher Fehler vorliegt. + Hinweis: Eine Fehlermeldung "" (also: 'error stop ("")') führt zum Fehlerabbruch + mit der Bedeutung "Fehlermeldung wurde bereits ausgegeben". Dem­ + entsprechend erfolgt bei der Fehlermeldung 'niltext' keine Reaktion bei + 'put error'. + +#ib#errorstop#ie# + PROC error stop (TEXT CONST message) + Zweck: Bricht ab und setzt die Zeilennummer (wenn man sich im 'checkon'- + Modus befindet), in der der Fehler aufgetreten ist, sowie den Text 'mes­ + sage'. Der Abbruch kann mit 'disable stop' unterbunden werden. 'error­ + stop' hat keine Wirkung, wenn ein noch nicht gelöschter Fehler vorliegt. + Zu einer Fehlermeldung "" siehe auch die Prozedur 'error message'. Als + 'error-code' wird 0 gesetzt. + + + PROC error stop (INT CONST code, TEXT CONST message) + Zweck: Analog obiger 'errorstop'-Prozedur, aber mit Angabe des Fehlercodes, + der durch die Prozedur 'error code' in einer Fängerebene erfragt wer­ + den kann. + +#ib#is error#ie# + BOOL PROC is error + Zweck: Informationsprozedur auf das Vorhandensein eines Fehlers. + +#ib#put error#ie# + PROC put error + Zweck: Gibt die durch 'errorstop' gesetzte Fehlermeldung aus, falls ein Fehler + noch nicht gelöscht ist (siehe auch: 'error message'). + + + + +#ib##ib(9)#Fehlercode#ie#s#ie(9)# + + +Einige Fehlercodes sind bereits belegt: + + 0 kein Fehlercode spezifiziert (Standardwert) + 1 'halt' vom Terminal + 2 Stack-Ueberlauf + 3 Heap-Ueberlauf + 4 INT-Ueberlauf + 5 DIV durch 0 + 6 REAL-Ueberlauf + 7 TEXT-Ueberlauf + 8 zu viele DATASPACEs + 9 Ueberlauf bei Subskription + 10 Unterlauf bei Subskription + 11 falscher DATASPACE-Zugriff + 12 INT nicht initialisiert + 13 REAL nicht initialisiert + 14 TEXT nicht initialisiert + 15 nicht implementiert + 16 Block unlesbar + 17 Codefehler + 100 Syntax-Fehler beim Übersetzen + + + + + +#ib(9)#4.2. #ib#THESAURUS#ie##ie(9)# + + + +Ein #ib#Thesaurus#ie# ist ein #ib#Namensverzeichnis#ie#, das bis zu 200 Namen beinhalten kann. +Dabei muß jeder Namen mindestens ein Zeichen und darf höchstens 100 Zeichen lang +sein. Steuerzeichen (code < 32) sind in Namen nicht erlaubt. + +Ein Thesaurus ordnet jedem eingetragenen Namen einen Index zwischen 1 und 200 +(einschließlich) zu. Diese Indizes bieten dem Anwender die Möglichkeit, Thesauri zur +Verwaltung benannter Objekte zu verwenden. (Der Zugriff erfolgt dann über den Index +eines Namens in einem Thesaurus). So werden Thesauri u.a. von der Dateiverwaltung +benutzt. Sie bilden die Grundlage der ALL- und SOME-Operatoren. + + + + +#ib(9)#Grundoperationen#ie(9)# + + +#ib#CONTAINS#ie# + BOOL OP CONTAINS (THESAURUS CONST t, TEXT CONST name) + Zweck: Liefert genau dann TRUE, wenn 't' den Namen 'name' enthält. Falls + 'name=""' oder 'LENGTH name > 100', wird FALSE geliefert. + +#ib#delete#ie# + PROC delete (THESAURUS VAR t, TEXT CONST name, INT VAR index) + Zweck: Falls der Name 'name' im Thesaurus 't' enthalten ist, wird er dort ge­ + löscht. In 'index' wird dann sein alter Index geliefert, unter dem er im + Thesaurus eingetragen war. Ist der Name nicht im Thesaurus enthalten, + wird 0 als Index geliefert. + + PROC delete (THESAURUS VAR t, INT CONST index) + Zweck: Der Eintrag mit dem angegebenen Index wird aus dem Thesaurus 't' + gelöscht. + +#ib#empty thesaurus#ie# + THESAURUS PROC empty thesaurus + Zweck: Für Initialisierungszwecke wird ein leerer Thesaurus geliefert. + +#ib#get#ie# + PROC get (THESAURUS CONST t, TEXT VAR name, INT VAR index) + Zweck: Liefert den "nächsten" Eintrag aus dem Thesaurus 't'. "Nächster" heißt + hier, der kleinste vorhandene mit einem Index größer als 'index'. Dabei + wird in 'name' der Name und in 'index' der Index des Eintrags geliefert. + D.h. 'index' wird automatisch weitergeschaltet. Den ersten Eintrag erhält + man entsprechend durch Aufruf mit 'index=0'. Nach dem letzten Ein­ + trag wird 'name=""' und 'index=0' geliefert. Beispiel: + + + TEXT VAR name; + INT VAR index := 0 ; + get (thesaurus, name, index) ; + WHILE index > 0 REP + putline (name) ; + get (thesaurus, name, index) + PER + + +#ib#highest entry#ie# + INT PROC highest entry (THESAURUS CONST t) + Zweck: Liefert den höchsten belegten Index des Thesaurus 't'. + Achtung: Das ist nicht die Anzahl der vorhandenen Namen, da durch + Löschungen Lücken entstanden sein können. + +#ib#insert#ie# + PROC insert (THESAURUS VAR t, TEXT CONST name, INT VAR index) + Zweck: Der Name 'name' wird als zusätzlicher Eintrag in den Thesaurus 't' + eingetragen und der dafür vergebene Index geliefert. Falls der Thesau­ + rus schon voll ist und der Name nicht mehr eingetragen werden kann, + wird 0 als Index geliefert. + Achtung: Mehrfacheintragungen sind möglich. Wenn man diese verhin­ + dern will, muß man entsprechend vermittels + + + IF NOT t CONTAINS name + THEN insert (t, name, index) + FI + + + eintragen. + Fehlerfall: + * Name unzulaessig + + PROC insert (THESAURUS VAR t, TEXT CONST name) + Zweck: s.o. Allerdings wird der Index des Namens nicht geliefert. Ein Thesau­ + rusüberlauf wird entsprechend als 'errorstop' gemeldet. + Fehlerfälle: + * Name unzulaessig + * THESAURUS-Ueberlauf + +#ib#link#ie# + INT PROC link (THESAURUS CONST t, TEXT CONST name) + Zweck: Liefert den Index des Namens 'name' im Thesaurus 't'. Falls der Name + nicht enthalten ist, wird 0 geliefert. Ist der Name mehrfach im Thesau­ + rus enthalten, ist nicht definiert, welcher der möglichen Indizes geliefert + wird. + +#ib#name#ie# + TEXT PROC name (THESAURUS CONST t, INT CONST index) + Zweck: Liefert den Namen des Eintrags mit dem Index 'index' aus dem The­ + saurus 't'. Falls kein solcher Eintrag im Thesaurus enthalten ist, wird + Niltext geliefert. + +#ib#rename#ie# + PROC rename (THESAURUS VAR t, TEXT CONST old, new) + Zweck: Ändert im Thesaurus 't' einen Eintrag mit dem alten Namen 'old' in 'new' + um. Falls 'old' nicht im Thesaurus enthalten ist, wird keine Leistung + erbracht. Falls 'old' mehrfach in 't' enthalten ist, ist nicht definiert, wel­ + cher der möglichen Einträge geändert wird. + Fehlerfall: + * Name unzulaessig + + PROC rename (THESAURUS VAR t, INT CONST index, TEXT CONST new) + Zweck: Ändert im Thesaurus 't' den Namen des durch 'index' identifizierten + Eintrags in 'new'. + Fehlerfall: + * Name unzulaessig + +#ib#THESAURUS#ie# + TYPE THESAURUS + Zweck: Bezeichnet Thesaurus-Datenobjekte + +:= + OP := (THESAURUS VAR dest, THESAURUS CONST source) + Zweck: Zuweisung + + + + + + +#ib(9)#Verknüpfungsoperationen#ie(9)# + +Das Paket '#ib#nameset#ie#' bietet die Möglichkeit, Operationen nicht nur auf einzelnen Datei­ +en, sondern auf (geordneten) Mengen ablaufen zu lassen: + +#ib#ALL#ie# + THESAURUS OP ALL (TASK CONST task) + Zweck: Liefert einen Thesaurus, der alle Dateinamen der angegebenen Task + enthält. + + THESAURUS OP ALL (TEXT CONST file name) + Zweck: Liefert einen Thesaurus, der die in der angegebenen Datei vorhande­ + nen Namen (jede Zeile ein Name) enthält. + +#ib#all#ie# + THESAURUS PROC all + Zweck: Liefert einen Thesaurus, der alle Dateinamen der eigenen Task enthält. + Entspricht 'ALL myself'. + +#ib#LIKE#ie# + THESAURUS OP LIKE (THESAURUS CONST thesaurus, TEXT CONST muster) + Zweck: Alle im Thesaurus enthaltenen Dateien, die dem 'muster' entsprechen + sind im Ergebnisthesaurus enthalten. + (Die Syntax von 'muster' findet man bei der Beschreibung des Pattern- + Matching) + +#ib#SOME#ie# + THESAURUS OP SOME (THESAURUS CONST thesaurus) + Zweck: Bietet den angegebenen Thesaurus im EUMEL-Editor zum Ändern an. + Es können nicht erwünschte Namen gestrichen werden. + + THESAURUS OP SOME (TASK CONST task) + Zweck: Aufruf von: SOME ALL task. + + THESAURUS OP SOME (TEXT CONST file name) + Zweck: Aufruf von: SOME ALL filename. + +#ib#FILLBY#ie# + OP FILLBY (THESAURUS VAR thesaurus, FILE VAR file) + Zweck: Schreibt 'file' in den Thesaurus. Dabei werden Zeilen, die schon im + Thesaurus sind, nicht mehr in den Thesaurus geschrieben. Jede Zeile + kommt im Thesaurus also nur einmal vor. + + OP FILLBY (FILE VAR file, THESAURUS CONST thesaurus) + Zweck: Schreibt den Thesaurus in die Datei 'file'. + + OP FILLBY (TEXT CONST filename, + THESAURUS CONST thesaurus) + Zweck: Richtet eine Datei mit dem Namen 'filename' ein und schreibt den The­ + saurus in die Datei. + ++ + THESAURUS OP + (THESAURUS CONST left, right) + Zweck: Liefert die Vereinigungsmenge von 'left' und 'right'. + Achtung: Die Vereinigungsmenge enthält keine Namen mehrfach. + + THESAURUS OP + (THESAURUS CONST left, TEXT CONST right) + Zweck: Fügt dem Thesaurus 'right' zu, wenn 'right' noch nicht im Thesaurus + enthalten ist. + +- + THESAURUS OP - (THESAURUS CONST left, right) + Zweck: Liefert die Differenzmenge. Achtung: Die Differenzmenge enthält keine + Namen mehrfach. + + THESAURUS OP - (THESAURUS CONST left, TEXT CONST right) + Zweck: Nimmt den Namen 'right' aus dem Thesaurus. + +/ + THESAURUS OP / (THESAURUS CONST left, right) + Zweck: Liefert die Schnittmenge + Achtung: Die Schnittmenge enthält keine Namen mehrfach. + +#ib#do#ie# + PROC do (PROC (TEXT CONST) operate, THESAURUS CONST thesaurus) + Zweck: Ruft 'operate' nacheinander mit allen im Thesaurus enthaltenen Namen + auf. + + PROC do (PROC (TEXT CONST, TASK CONST) operate, + THESAURUS CONST thesaurus, TASK CONST task) + Zweck: s.o. + +#ib#erase#ie# + PROC erase (THESAURUS CONST thesaurus) + Zweck: Löscht alle aufgeführten Dateien in der Vater-Task. + + PROC erase (THESAURUS CONST thesaurus, TASK CONST manager) + Zweck: Löscht alle aufgeführten Dateien in der Task 'manager'. + +#ib#fetch#ie# + PROC fetch (THESAURUS CONST thesaurus) + Zweck: Holt alle aufgeführten Dateien vom Vater. + + PROC fetch (THESAURUS CONST thesaurus, TASK CONST manager) + Zweck: Holt alle aufgeführten Dateien vom 'manager'. + +#ib#fetch all#ie# + PROC fetch all (TASK CONST manager) + Zweck: Holt alle Dateien vom 'manager'. Diese Prozedur entspricht dem Aufruf + der Prozedur 'fetch (ALL manager, manager)'. + + PROC fetch all + Zweck: Aufruf der Prozedur 'fetch all (father)'. + +#ib#forget#ie# + PROC forget (THESAURUS CONST thesaurus) + Zweck: Löscht alle aufgeführten Dateien in der Benutzer-Task. + +#ib#insert#ie# + PROC insert (THESAURUS CONST thesaurus) + Zweck: Insertiert alle aufgeführten Dateien in der Benutzer-Task. + +#ib#remainder#ie# + PROC remainder + Zweck: Liefert nach einem 'errorstop' die noch nicht bearbeiteten Dateien. + Beispiel: + 'save all (archive)' + kann dazu führen, daß nicht alle Dateien auf das Archiv geschrie­ + ben werden können. Fehlermeldung: + '"....." kann nicht geschrieben werden (Archiv voll)' + Nachdem man eine neue Floppy ins Archivlaufwerk gelegt hat, + kann man mit + 'save (remainder, archive)' + den Rest der Dateien auf der Floppy sichern. + +#ib#save#ie# + PROC save (THESAURUS CONST thesaurus) + Zweck: Schickt alle aufgeführten Dateien zur Vater-Task. + + PROC save (THESAURUS CONST thesaurus, TASK CONST manager) + Zweck: s.o. + +#ib#save all#ie# + PROC save all (TASK CONST manager) + Zweck: Schickt alle eigenen Dateien zum 'manager'. Diese Prozedur entspricht + dem Aufruf der Prozedur 'save (ALL myself, manager)'. + + PROC save all + Zweck: Aufruf der Prozedur 'save all (father)'. + + +Beispiele: + + save (ALL myself) + forget (ALL myself) + forget (all) + fetch (SOME father) + fetch (ALL father - ALL myself) + insert (ALL "gen datei") + save (ALL myself - ALL archive, archive) + + + + +#ib(9)#4.3. #ib#Kommandos und Dialog#ie(9)##ie# + + + +#ib##ib(9)#Kommandodialog#ie##ie(9)# + + +Das Paket "#ib#command dialogue#ie#" dient zur zentralen Steuerung und einfachen Durch­ +führung von #ib#Kommando-Dialog#ie#en wie + + "datei" loeschen (j/n)? + +Er wird von allen Systemteilen verwandt, die einen Kommandodialog mit dem Benut­ +zer aufnehmen. Anwenderprozeduren mit ähnlichen Problemen sollten genauso damit +arbeiten. + +Der Kommandodialog kann zentral aus- und eingeschaltet werden. + + + +#ib#command dialogue#ie# + BOOL PROC command dialogue + Zweck: Liefert den aktuellen Zustand des Kommandodialogs: + TRUE - Dialog soll geführt werden! + FALSE - Dialog soll nicht geführt werden! + + PROC command dialogue (BOOL CONST status) + Zweck: Schaltet den Kommandodialog ein ('status' = TRUE) oder aus ('status' + = FALSE). Der alte Zustand wird überschrieben. Soll später wieder in + den alten Zustand zurückgeschaltet werden, muß er vorher erfragt und + gesichert werden. + +#ib#yes#ie# + BOOL PROC yes (TEXT CONST question) + Zweck: a) Kommandodialog soll geführt werden (command dialogue = TRUE) + Der übergebene Fragetext wird durch " (j/n)?" ergänzt auf dem Ter­ + minal ausgegeben. Als Antwort wird eine der Tasten , , + , , , akzeptiert; jede andere Eingabe führt zu + einem akustischen Signal und der Fragewiederholung. Das Resultat + der Prozedur ist + TRUE bei bejahender Antwort (j,J,y,Y) + FALSE bei verneinender Antwort (n,N) + b) Kommandodialog soll nicht geführt werden (command dialogue = + FALSE) + Keine Aktion, das Resultat ist TRUE. + +#ib#no#ie# + BOOL PROC no (TEXT CONST question) + Zweck: a) Kommandodialog soll geführt werden (command dialogue = TRUE) + Frage und Antwort wie bei 'yes'. Das Resultat ist + TRUE bei verneinender Antwort (n,N) + FALSE bei bejahender Antwort (j,J,y,Y) + b) Kommandodialog soll nicht geführt werden (command dialogue = + FALSE) + Keine Aktion, das Resultat ist FALSE. + +#ib#say#ie# + PROC say (TEXT CONST message) + Zweck: IF command dialogue THEN out (text) FI + +#ib#last param#ie# + TEXT PROC last param + Zweck: Liefert den zuletzt gesetzten Parameter-Text (siehe folgende Proze­ + dur). Falls 'command dialogue' = TRUE und die 'param position' > 0 + ist, wird der Parametertext als Standardparameter an der angegebenen + x-Position eine Zeile höher in der Form ("...") ausgegeben. Diese Proze­ + dur wird von den parameterlosen Kommandos bzw. Prozeduren wie + 'edit', 'run' usw. verwandt, um mit dem Standardparameter weiterzuar­ + beiten. + + PROC last param (TEXT CONST new) + Zweck: Setzt 'last param' auf 'new'. (Das Setzen muß explizit durchgeführt + werden und geschieht nicht implizit durch den 'command handler'. 'Last + param' wird beispielsweise von den einparametrigen Prozeduren 'edit' + und 'run' gesetzt. + +#ib#param position#ie# + PROC param position (INT CONST x) + Zweck: Setzt die Echoposition für 'last param'. Bei x=0 wird ein Echo unter­ + drückt. + +#ib#std#ie# + TEXT PROC std + Zweck: Liefert wie 'last param' den zuletzt gesetzten Parameter. Im Gegensatz + dazu wird der Parameter aber nicht ausgegeben. + + + + + +#ib##ib(9)#Kommandoverarbeitung#ie##ie(9)# + + +Das Paket '#ib#command handler#ie#' stellt Prozeduren zur #ib#Kommandoanalyse#ie# und zum +Führen des kompletten Kommandodialogs zur Verfügung. + + +#ib#get command#ie# + PROC get command (TEXT CONST dialogue text, TEXT VAR command line) + Zweck: Falls eine Fehlermeldung aussteht, ('is error' liefert TRUE), wird sie über + 'put error' ausgegeben und der Fehlerzustand zurückgesetzt. Der 'dialo­ + gue text' wird als Dialogaufforderung ausgegeben und der Benutzer + kann eine Kommandozeile eingeben. Die letzte Kommandozeile wird + ihm dabei automatisch (zum Ändern) angeboten, wenn vorher eine + Fehlermeldung anstand. Der Benutzer kann dies ebenfalls erreichen, + wenn er zu Beginn gibt. Die Kommandozeile wird dem Auf­ + rufer in der Variablen 'command line' geliefert. + + PROC get command (TEXT CONST dialogue text) + Zweck: s.o. Allerdings wird eine interne Kommandozeile des Pakets 'command + handler' als 'command line' verwandt. Dadurch wird es möglich, alle + Spuren einer Kommandoeingabe durch 'cover tracks' zu beseitigen. + +#ib#analyze command#ie# + PROC analyze command (TEXT CONST command list, command line, + INT CONST permitted type, + INT VAR command index, number of params, + TEXT VAR param 1, param 2) + Zweck: Die übergebene Kommandozeile ('command line') wird anhand der + übergebenen 'command list' analysiert. Sie ist ein TEXT, der aus einer + Folge von Kommandospezifikationen besteht. Jede hat die Form + K:I.P + + K Kommandotext, Prozedurname nach ELAN-Syntax + I Hauptindex, Form eines INT-Denoters + P Parameterspezifikation, eine Folge der Ziffern 0, 1 und 2. + + Beispiele: + - 'edit:15.012' + Das Kommando 'edit' wird in drei verschieden parametrisierten + Formen spezifiziert: + edit mit 0 Parameter erhält Index 15 + edit mit 1 Parameter erhält Index 16 + edit mit 2 Parametern erhält Index 17 + + - 'fetch:18.1' + Das Kommando 'fetch' wird in einer Form spezifiert: + fetch mit 1 Parameter erhält Index 18 + + Die Analyse erfolgt gemäß ELAN-Syntaxregeln. Dabei sind als Para­ + meter Denoter vom Typ TEXT und vom übergebenen ' permitted type' + zugelassen. Diese Typen werden wie beim Scanner (s. Benutzerhand­ + buch Programmierung Kap. 5.6) angegeben: + + 1 tag + 2 bold + 3 number + 4 text + 5 operator + 6 delimiter + + Falls das Kommando in der Kommandoliste gefunden wird (und die + Syntax in Ordnung ist), wird der entsprechende 'command index' zu­ + rückgemeldet. Die Parameter werden (falls vorhanden) in 'param 1' und + 'param 2' abgelegt. Undefinierte oder nicht vorhandene Parameter + werden als Niltext geliefert. Wenn ein Kommando vorhanden ist, die + Anzahl der Parameter aber nicht stimmt, wird der negative Hauptindex + geliefert. Ist es vollkommen unbekannt oder ist die Eingabe zu komplex + (mehrere Kommandos, Ausdrücke oder komplexere ELAN-Statements), + wird 0 geliefert. Der Anwender kann in solchen Fällen die Analyse mit + einer anderen Kommandoliste fortsetzen, das Kommando dem ELAN- + Compiler übergeben oder eine Fehlermeldung auslösen (s. 'command + error'). + + PROC analyze command (TEXT CONST command list, + INT CONST permitted type, + INT VAR command index, number of params, + TEXT VAR param 1, param 2) + Zweck: s.o. Allerdings wird die interne Kommandozeile des Pakets 'command + handler' als 'command line' verwandt. + +#ib#command error#ie# + PROC command error + Zweck: Falls bei der Kommandoanalyse ein Fehler gefunden wurde, führt er + nicht zum 'errorstop', sondern wird nur hinterlegt. (Soll das Kommando + dem Compiler übergeben werden, liegt ja evt. überhaupt kein Fehler + vor.) Diese hinterlegte Meldung kann mit 'command error' als 'errorstop' + gegeben werden. Mögliche Meldungen: + "ungueltiger name" + ") fehlt" + "( fehlt" + "Parameter ist kein TEXT ("fehlt)" + "Kommando zu schwierig" + +#ib#cover tracks#ie# + PROC cover tracks + Zweck: Die Spuren der letzten Kommandoanalyse werden gelöscht. Das dient + u.a. dazu, daß später eingerichtete Sohntasks keine Relikte des Kom­ + mandos mehr auf dem Textheap vorfinden und evtl. mittels nicht initiali­ + sierter TEXT VARs herausfinden können. Vollständig können die Spuren + aber nur dann gelöscht werden, wenn für die Kommandoanalyse die + 'get command'- und 'analyze command'-Prozeduren benutzt wurden, + die auf der internen Kommandozeile des Pakets 'command handler' + arbeiten. + +#ib#do command#ie# + PROC do command + Zweck: Die interne Kommandozeile des Pakets 'command handler' wird dem + ELAN-Compiler zur Ausführung übergeben. + + + + + +#ib(9)#Beispiele zur Kommandoverarbeitung#ie(9)# + + +#ib##ub#Kleiner Monitor#ue##ie# + + +LET command list = "otto:1.12emil:3.012hugo:6.0" ; + +LET number = 3 , + text = 4 ; + +INT VAR command index, params ; +TEXT VAR param 1, param 2 ; + +PROC monitor : + + disable stop ; + command dialogue (TRUE) ; + REP get command ("gib kleines kommando:") ; + analyze command (command list, text, + command index, params, + param 1, param 2) ; + execute command + PER + +ENDPROC monitor ; + +PROC execute command : + + enable stop ; + SELECT command index OF + CASE 1 : otto (param 1) + CASE 2 : otto (param 1, param 2) + CASE 3 : emil + CASE 4 : emil (param 1) + CASE 5 : emil (param 1, param 2) + CASE 6 : hugo + OTHERWISE do command line + END SELECT + +ENDPROC execute command ; + + + +#ib(9)##ub#Steuerkommando-Analyse#ue##ie(9)# + + +PROC command (TEXT CONST command text) : + + disable stop ; + command dialoge (FALSE) ; + analyze command (command list, command text, number, + command index, params, param 1, param 2) ; + execute command ; + IF is error + THEN put error ; + clear error + FI + +ENDPROC command ; + +PROC execute command : + + enable stop ; + SELECT command index OF + CASE .... + OTHERWISE IF command index = 0 + THEN errorstop ("unbekanntes Kommando") ELSE command error + FI + END SELECT + +ENDPROC execute command ; + + + + + +#ib(9)#4.4. Verschiedenes#ie(9)# + + +#ib(9)##ib#SESSION#ie(9)##ie# + + +Mit Hilfe von 'session' kann man feststellen, ob das System neu gestartet wurde. Dabei +spielt es keine Rolle, ob es korrekt ('shutup') abgeschaltet wurde, oder ob es sich um +einen "RERUN" handelt. + +#ib#session#ie# + INT PROC session + Zweck: Liefert eine "Sitzungsnummer". Diese wird automatisch bei jedem + Systemstart erhöht. + +Beispiel: + + + REP + INT VAR old session := session ; + WHILE session = old session REP pause (100) PER ; + putline ("Neuer Systemstart") + PER. + + + + +#ib(9)##ib#INITFLAG#ie##ie(9)# + + +Im Multi-User-System ist es oft notwendig, Pakete beim Einrichten einer neuen Task in +dieser neu zu initialisieren. Das muß z.B. bei der Dateiverwaltung gemacht werden, da +die neue Task ja nicht die Dateien des Vaters erbt. Mit Hilfe von INITFLAG-Objekten +kann man zu diesem Zweck feststellen, ob ein Paket #on("b")##on("i")#in dieser Task#off("b")##off("i")# schon initialisiert +wurde. + + +#ib#INITFLAG#ie# + TYPE INITFLAG + Zweck: Erlaubt die Deklaration entsprechender Flaggen. + +:= + OP := (INITFLAG VAR flag, BOOL CONST flagtrue) + Zweck: Erlaubt die Initialisierung von INITFLAGs + +#ib#initialized#ie# + BOOL PROC initialized (INITFLAG VAR flag) + Zweck: Wenn die Flagge in der Task A auf TRUE oder FALSE gesetzt wurde, + dann liefert sie beim ersten Aufruf den entsprechenden Wert, danach + immer TRUE (in der Task A!). + Beim Einrichten von Söhnen wird die Flagge in den Sohntasks automa­ + tisch auf FALSE gesetzt. So wird erreicht, daß diese Prozedur in den neu + eingerichteten Söhnen und Enkeltasks genau beim ersten Aufruf FALSE + liefert. + + +Beispiel: + + PACKET stack DEFINES push, pop: + + INITFLAG VAR in this task := FALSE ; + INT VAR stack pointer ; + ROW 1000 INT VAR stack ; + + PROC push (INT CONST value) : + + initialize stack if necessary ; + .... + + ENDPROC push ; + + PROC pop (INT VAR value) : + + initialize stack if necessary ; + .... + + ENDPROC pop ;. + + initialize stack if necessary : + IF NOT initialized (in this task) + THEN stack pointer := 1 + FI . + + ENDPACKET stack + + + + + +#ib(9)##ib#Bit-Handling#ie##ie(9)# + + +Die #ib#Bit-Operationen#ie# arbeiten auf INT-Objekten. Sie können z.B. für die Systempro­ +grammierung benutzt werden, wenn es um Bitmasken u.ä. geht. + +Ein INT besteht aus 16 Bits. Dabei hat das niederwertigste die Nummer 0, das höch­ +stwertige die Nummer 15. + + +#ib#AND#ie# + INT OP AND (INT CONST left, right) + Zweck: Bitweise UND-Verknüpfung von 'left' mit 'right'. + +#ib#OR#ie# + INT OP OR (INT CONST left, right) + Zweck: Bitweise ODER-Verknüpfung von 'left' mit 'right'. + +#ib#XOR#ie# + INT OP XOR (INT CONST left, right) + Zweck: Bitweise EXCLUSIV-ODER-Verknüpfung von 'left' mit 'right'. + +#ib#bit#ie# + BOOL PROC bit (INT CONST bits, bit no) + Zweck: Liefert TRUE genau dann, wenn das Bit mit der Nummer 'bit no' in dem + INT 'bits' gesetzt ist. + +#ib#set bit#ie# + PROC set bit (INT VAR bits, INT CONST bit no) + Zweck: Das Bit mit der Nummer 'bit no' wird in 'bits' auf 1 gesetzt. + +#ib#reset bit#ie# + PROC reset bit (INT VAR bits, INT CONST bit no) + Zweck: Das Bit mit der Nummer 'bit no' wird in 'bits' auf 0 gesetzt. + +#ib#rotate#ie# + PROC rotate (INT VAR bits, INT CONST number of bits) + Zweck: Bits können mit dieser Prozedur zyklisch geschiftet werden. + Bsp.: rotate (1,1) ---> 2 + rotate (1,2) ---> 4 + rotate (1,-3) ---> 16384 + rotate (16384,3) ---> 1 + +#ib#lowest set#ie# + INT PROC lowest set (INT CONST bits) + Zweck: Liefert die Nummer des niederwertigsten 1-Bits in 'bits'. Ist kein Bit auf 1 + gesetzt, wird -1 geliefert. + +#ib#lowest reset#ie# + INT PROC lowest reset (INT CONST bits) + Zweck: Liefert die Nummer des niederwertigsten 0-Bits in 'bits'. Ist kein Bit auf 0 + gesetzt, wird -1 geliefert. + + + + + +#ib(9)#4.5. #ib#Blockorientierte Ein-/Ausgabe#ie##ie(9)# + + + +Die blockorientierte Ein-/Ausgabe dient dazu, Datenraumseiten (#ib#Blöcke#ie#) oder Teile +davon über die #ib#Kanäle#ie# zu transferieren. Sie wird vom System u.a. beim Archivzugriff +und bei der Konfigurierung der Kanäle eingesetzt. + +Die Wirkung der blockorientierten Ein-/Ausgabeoperationen kann dabei kanal- und +rechnerspezifisch unterschiedlich sein. +Auf dem Archivkanal (31) und allen anderen Block-IO-Kanälen werden bei +'code 1 = 0' die normalen Blocklese- bzw. -schreiboperationen durchgeführt. 'code 2' +gibt dabei die Blocknummer an. Andere (positive) Werte von 'code 1' sind zur Zeit +nicht offiziell definiert. Negative Werte können vom SHard für Spezialaufgaben verge­ +ben werden. + + + +#ib#blockin#ie# + PROC blockin (DATASPACE VAR ds, INT CONST page nr, code1, code2, + INT VAR return code) + Zweck: Die Seite 'page nr' des Datenraums 'ds' wird "eingelesen". Die Opera­ + tion kann durch 'code1' und 'code2' näher gesteuert werden. + + PROC blockin (ROW 256 INT VAR block, INT CONST code1, code2, + INT VAR return code) + Zweck: Wie oben, nur wird der Block direkt als Datenstruktur übergeben. + +#ib#blockout#ie# + PROC blockout (DATASPACE CONST ds, INT CONST page nr, + code1, code2, INT VAR return code) + Zweck: Die Seite 'page nr' des Datenraums 'ds' wird "ausgegeben". Die Opera­ + tion kann durch 'code1' und 'code2' näher gesteuert werden. + + PROC blockout (ROW 256 INT CONST block, INT CONST code1, code2, + INT VAR return code) + Zweck: Wie oben, nur wird der Block als Datenstruktur übergeben. + +#ib#control#ie# + PROC control (INT CONST code1, code2, code3, INT VAR return code) + Zweck: Diese Prozedur dient zur Kanalsteuerung. + +#ib#ds pages#ie# + INT PROC ds pages (DATASPACE CONST ds) + Zweck: Liefert die Anzahl der belegten Seiten eines Datenraums. (Jede Seite ist + 512 Byte groß.) + +#ib#next ds page#ie# + INT PROC next ds page (DATASPACE CONST ds, INT CONST page nr) + Zweck: Liefert die Nummer der nächsten (von 'page nr' an gerechneten) Seite + des Datenraums. Die erste belegte Seite erhält man durch + + next ds page (ds, -1) + + #on ("b")#Achtung: Die Seitennummern müssen nicht lückenlos sein.#off ("b")# + diff --git a/doc/system/systemhandbuch.3 b/doc/system/systemhandbuch.3 new file mode 100644 index 0000000..3c0a482 --- /dev/null +++ b/doc/system/systemhandbuch.3 @@ -0,0 +1,1366 @@ +#start(2.5,1.5)# +#pageblock# +#block# +#page (63)# +#headeven# + +%#center#EUMEL-Systemhandbuch + + +#end# +#headodd# + +#center#5. Supervisor, Tasks und Systemsteuerung#right#% + + +#end# + +#ib(9)#5. #ib#Supervisor#ie#, #ib#Tasks#ie# und + #ib#Systemsteuerung#ie##ie(9)# + + + +#ib(9)#5.1. #ib#Tasks#ie##ie(9)# + + + +#ib(9)#Der Datentyp #ib#TASK#ie##ie(9)# + + +Benannte Tasks werden innerhalb eines Rechners vollständig und eindeutig über ihren +Namen identifiziert. Eine weitere Möglichkeit der Identifikation besteht in der Verwen­ +dung von Datenobjekten vom Typ TASK. Beispiel: + + TASK VAR plotter := task ("PLOTTER 1") + +Die Taskvariable 'plotter' bezeichnet jetzt die Task im System, die augenblicklich den +Namen "PLOTTER 1" hat. Nun sind #ib#Taskvariablen#ie# auch unter Berücksichtigung der Zeit +und nicht nur im aktuellen Systemzustand eindeutig. Der Programmierer braucht sich +also keine Sorgen darüber zu machen, daß seine Taskvariable irgendwann einmal eine +"falsche" Task (nach Löschen von "PLOTTER 1" neu eingerichtete gleichen oder ande­ +ren Namens) identifiziert. Wenn die Task "PLOTTER 1" gelöscht worden ist, bezeichnet +'plotter' keine gültige Task mehr. + +#ib#Unbenannte Tasks#ie# haben alle den Pseudonamen "-". Sie können nur über Taskvari­ +ablen angesprochen werden. + +Der #ib#Task-Katalog#ie# wird vom Supervisor geführt; andere Tasks können sich Kopien +dieses Katalogs besorgen. Einige Prozeduren arbeiten auf dieser taskeigenen Kopie, +ohne diese automatisch auf den neuesten Stand zu bringen (Effizienzgründe). Das +muß bei Bedarf explizit geschehen. + + +#ib#TASK#ie# + TYPE TASK + Zweck: Interner Taskbezeichner + +:= + OP := (TASK VAR dest, TASK CONST source) + Zweck: Zuweisung von internen Taskbezeichnern + += + BOOL OP = (TASK CONST left, right) + Zweck: Gleichheitsabfrage + +< + BOOL OP < (TASK CONST left, right) + Zweck: Überprüft, ob die Task 'left' ein Sohn, Enkel, Urenkel, ... der Task 'right' + ist. + +/ + TASK OP / (TEXT CONST task name) + Zweck: Liefert die Task des angegebenen Namens, falls sie existiert. Der eigene + Katalog wird automatisch aktualisiert (identisch mit der + PROC task (TEXT CONST task name). + Fehlerfall: + * ... gibt es nicht + + TASK OP / (INT CONST station number, TEXT CONST name) + Zweck: Liefert die Task des angegebenen Namen von der Station mit der ange­ + gebenen Nummer. + +#ib#access#ie# + PROC access (TASK CONST task) + Zweck: Aktualisiert den eigenen Taskkatalog, falls 'task' nicht darin enthalten ist. + +#ib#access catalogue#ie# + PROC access catalogue + Zweck: Aktualisiert den eigenen Taskkatalog, indem die neueste Fassung vom + Supervisor geholt wird. Die Prozeduren 'father', 'son', 'brother' arbeiten + dann auf dieser neuen Fassung. + +#ib#archive#ie# + TASK PROC archive + Zweck: Liefert den internen Taskbezeichner der aktuellen Task mit Namen + "ARCHIVE". Diese Prozedur dient zum schnellen und bequemen An­ + sprechen der Archivtask. + +#ib#brother#ie# + TASK PROC brother (TASK CONST task) + Zweck: Liefert den nächsten Bruder von 'task'. Falls kein Bruder existiert, wird + 'niltask' geliefert. Aktualisiert den eigenen Katalog nicht automatisch! + +#ib#canal#ie# + TASK PROC canal (INT CONST channel number) + Zweck: Diese Prozedur zeigt an, welche Command-Analyser-Task an einem + bestimmten Kanal hängt. + +#ib#exists#ie# + BOOL PROC exists (TASK CONST task) + Zweck: Falls 'task' auf der eigenen Station liegt, informiert diese Prozedur, ob + die angegebene 'task' noch existiert. Der eigene Taskkatalog wird dabei + aktualisiert. + Wenn abgefragt werden soll, ob 'task' auf einer anderen Station liegt, + muß die Prozedur 'name (task) <> "" ' verwendet werden. + Achtung: Diese Prozedur taugt nicht dazu, zu erfragen, ob eine Task + mit bestimmtem Namen im System exisiert. + + exists (task ("hugo")) + + Falls die Task "hugo" nicht existiert, führt schon der Aufruf + 'task ("hugo")' zum 'errorstop (""hugo" gibt es nicht")'. + +#ib#exists task#ie# + BOOL PROC exists task (TEXT CONST name) + Zweck: Wenn auf der eigenen Station eine Task mit dem Namen 'name' exi­ + stiert, liefert diese Prozedur 'TRUE'. + +#ib#father#ie# + TASK PROC father + Zweck: Liefert die eigene Vatertask. + + TASK PROC father (TASK CONST task) + Zweck: Liefert den Vater von 'task'. Existiert kein Vater (z.B. bei UR), wird niltask + geliefert. Aktualisiert den eigenen Katalog nicht automatisch! + +#ib#index#ie# + INT PROC index (TASK CONST task) + Zweck: Liefert einen INT-Wert von 1 bis 125, der 'task' unter allen gleichzeitig (!) + existierenden Tasks eindeutig identifiziert. + +#ib#is niltask#ie# + BOOL PROC is niltask (TASK CONST task) + Zweck: task = niltask + +#ib#myself#ie# + TASK PROC myself + Zweck: Liefert eigenen Task-Bezeichner. + +#ib#name#ie# + TEXT PROC name (TASK CONST task) + Zweck: Liefert den Namen von 'task'. Die Task muß noch im System existieren, + sonst ist der Name nicht mehr bekannt. Falls die 'task' noch nicht im + eigenen Katalog enthalten ist, wird er aktualisiert. + +#ib#niltask#ie# + TASK CONST niltask + Zweck: Bezeichner für "keine Task". So liefern die Prozeduren 'son', 'brother' + und 'father' als Resultat 'niltask', wenn keine Sohn-, Bruder- oder Vater­ + task existiert. + +#ib#printer#ie# + TASK PROC printer + Zweck: Liefert den internen Taskbezeichner der aktuellen Task mit Namen + #ib#PRINTER#ie#. Diese Prozedur dient zum schnellen und bequemen Anspre­ + chen des Druckspoolers. + +#ib#public#ie# + TASK PROC public + Zweck: Liefert den internen Taskbezeichner der Task #ib#PUBLIC#ie#. + +#ib#reserve#ie# + PROC reserve (TASK CONST task) + Zweck: Reservieren einer Task für den ausschließlichen Dialog mit der Task, in + der das Kommando gegeben wurde. + PROC reserve (TEXT CONST message, TASK CONST task) + Zweck: Wie 'reserve (TASK CONST task)' mit Übergabe einer 'message'. + +#ib#son#ie# + TASK PROC son (TASK CONST task) + Zweck: Liefert den ersten Sohn von 'task'. Falls keiner im Katalog vermerkt ist, + wird 'niltask' geliefert. Aktualisiert den eigenen Katalog nicht automa­ + tisch! + +#ib#supervisor#ie# + TASK PROC supervisor + Zweck: Liefert den internen Taskbezeichner des Supervisors. + +#ib#task#ie# + TASK PROC task (TEXT CONST task name) + Zweck: Liefert die Task des angegebenen Namens, falls sie existiert. Der eigene + Katalog wird automatisch aktualisiert. + Fehlerfall: + * ... gibt es nicht + + TASK PROC task (INT CONST channel number) + Zweck: Liefert den Namen der Task, die an dem angegebenen Kanal hängt. + + + +#ib##ib(9)#Inter-Task-Kommunikation#ie##ie(9)# + + +Die #ib#Task-Kommunikation#ie# im EUMEL System ist strikt botschaftsorientiert. Eine #ib#Bot­ +schaft#ie# bzw. "#ib#Sendung#ie#" besteht immer aus einem #ib#Sendungscode#ie# (INT) und einem +Datenraum (DATASPACE). Damit kann eine Botschaft bis zu 1 Mbyte umfassen! + +Kommunikation zwischen zwei Tasks ist nur dann möglich, wenn #ib#Sender#ie# und #ib#Empfän­ +ger#ie# dazu bereit sind. Eine Sendung kann also nur dann korrekt transferiert werden, +wenn der Empfänger existiert und empfangsbereit ist. Diese Art der Kommunikation +wurde gewählt, um + + - eine möglichst einfache und effiziente Implementation zu ermöglichen und + - mit den vorhandenen Primitiva möglichst flexibel bei der Implementation + "höherer" Kommunikationsmethoden (z.B. Warteschlangen) zu sein. + + +#ib#call#ie# + PROC call (TASK CONST destination, INT CONST send code, + DATASPACE VAR message ds, INT VAR reply code) + Zweck: Die eigene Task wartet, bis die Zieltask 'destination' empfangsbereit ist. + Dann wird die Sendung ('send code' und 'message ds') transferiert. + Anschließend wartet die Sendertask auf eine Antwort von 'destination'. + Für Sendungen anderer Tasks ist sie dabei nicht (!) empfangsbereit, nur + die Zieltask kann eine Antwortsendung schicken. Nachdem eine solche + Antwort eingetroffen ist, wird sie in 'message ds' und 'reply code' gelie­ + fert und die eigene Task fortgesetzt. Wenn die angesprochene Zieltask + nicht existiert, wird -1 als 'reply code' geliefert. 'message ds' ist in + diesem Fall unverändert. + 'call' hat Ähnlichkeiten mit einem Prozeduraufruf, nur ist es hier der + Aufruf einer anderen Task. Störungen können hierbei nicht auftreten, da + der Zustand der Zieltask keine Rolle spielt (es wird auf Empfangsbereit­ + schaft gewartet) und beim Warten auf Antwort auch keine "Querschlä­ + gersendungen" von anderen Tasks dazwischenfunken können. + +#ib#pingpong#ie# + PROC pingpong (TASK CONST destination, INT CONST send code, + DATASPACE VAR message ds, INT VAR reply code) + Zweck: Diese Prozedur wirkt wie die entsprechende 'call'-Prozedur, wartet aber + nicht (!), bis die Zieltask empfangsbereit ist. Wenn die Zieltask existiert, + aber nicht empfangsbereit ist, wird -2 als 'reply code' geliefert. Der + 'message ds' ist dann nicht verändert. + +#ib#send#ie# + PROC send (TASK VAR destination, INT CONST send code, + DATASPACE VAR message ds, INT VAR receipt) + Zweck: Wenn die Zieltask existiert und empfangsbereit ist, wird die Sendung + ('send code' und 'message ds') transferiert und die Zieltask aktiviert. Als + 'receipt' wird 0 (=ack) gemeldet. Diese positive Quittung kommt nicht + von der Zieltask, sondern bestätigt nur, daß die Sendung ordnungsge­ + mäß übertragen wurde. Der Datenraum gehört dann nicht mehr der + Sender-, sondern der Zieltask, d.h. die Variable 'message ds' bezeichnet + keinen gültigen Datenraum mehr. + Im Gegensatz zu 'call' und 'pingpong' läuft die Sendertask ohne Halt + weiter und wartet nicht auf eine Antwort von der Zieltask. + Falls die Zieltask nicht existiert, wird -1, falls sie nicht empfangsbereit ist, + -2 als 'receipt' geliefert. Bei diesen negativen Quittungen bleibt der + Datenraum Eigentum der Absendertask, d.h. die Variable 'message ds' + bezeichnet immer noch einen gültigen Datenraum. + + PROC send (TASK VAR destination, INT CONST send code, + DATASPACE VAR message ds) + Zweck: s.o. Negative Quittungen (-1 oder -2) werden jedoch ignoriert. Der Da­ + tenraum wird entweder transferiert oder gelöscht ('forget'), steht also in + keinem Fall mehr zur Verfügung. Die Prozedur sollte nur verwendet + werden, wenn der Sender sicher ist, daß die Sendung transferiert wer­ + den kann, bzw. daß sie im Fehlerfall nicht transferiert zu werden braucht. + +#ib#wait#ie# + PROC wait (DATASPACE VAR message ds, INT VAR message code, + TASK VAR source task) + Zweck: Die eigene Task geht in den #ub##ib#offenen Wartezustand#ie##ue# über. Sie ist jetzt + gegenüber allen anderen Tasks empfangsbereit. Sie wird erst fortge­ + setzt, wenn eine Sendung eintrifft. Diese wird in 'message ds' und 'mes­ + sage code', die Absendertask in 'source task' geliefert. + +Der #ub##ib#Sendungscode#ue##ie# muß zwischen den Beteiligten abgesprochen sein und ist also frei +wählbar. Allerdings sind negative Werte nicht erlaubt, sondern für bestimmte "Pseudo­ +antworten" vom Betriebssystem reserviert: + + -1 "Zieltask existiert nicht" + + -2 "Zieltask ist nicht empfangsbereit" + + -4 "Eingabe vom Kanal" Diese Meldung kann nur (!) beim offenen War­ + ten ('wait') auftreten, und auch dann nur, wenn die Task gleichzeitig + an einen Kanal angekoppelt ist. Auf diese Weise wird mitgeteilt, daß + mindestens ein Zeichen vorliegt. Dieses kann im folgenden mit 'in­ + char', 'incharety', 'blockin' oder darauf aufbauenden Prozeduren + gelesen werden. + +Weitere Codes werden in Systemroutinen standardmäßig verwandt und sollten auch +von Anwenderroutinen genauso interpretiert werden: + + 0 "#ib#ack#ie#" positive Quittung + + 1 "#ib#nak#ie#" negative Quittung + + 2 "#ib#error nak#ie#" negative Quittung mit Fehlermeldung. + Der gelieferte Datenraum sollte die Struktur eines + BOUND TEXTs haben und die Fehlermeldung in + diesem TEXT beinhalten. + + +Beispiel: #ub#Kommunikation mit einem Manager#ue# + + + Auftraggeber Manager + + + call (....) REP + wait (ds, order, order task) ; + execute order ; + send (order task, reply, ds) + PER + +Da der Auftraggeber 'call' verwendet, wartet er automatisch so lange, bis der Manager +für ihn empfangsbereit wird. Dann schickt er die Sendung und geht gleichzeitig (!) in +den geschlossenen "auf Antwort warten" - Zustand über. Der Manager kann daher +unbesorgt mit dem "unsicheren" 'send' antworten, da die Empfangsbereitschaft des +Auftraggebers nur durch Katastrophen wie Löschung der Task oder "halt from terminal" +gestört werden kann. (In diesen Fällen kann die Antwort ruhig ins Leere gehen.) + +Hier sieht man auch den Unterschied zwischen + + call (...) und send (....); wait (....) . + +Bei der zweiten Alternative können drei Störfälle eintreten: + + + a) Der Manager ist nicht empfangsbereit. 'send' versagt, 'wait' wartet ewig. + + b) Da über die zeitlichen Rahmenbedingungen nichts ausgesagt werden kann, + ist es möglich, daß der Manager die Antwort schickt, bevor die 'wait'-Opera­ + tion beim Auftraggeber ausgeführt werden konnte. In unserem Beispiel + würde das den Verlust der Rückmeldung und ewiges Warten seitens des + Auftraggebers auslösen. + + c) Beim 'wait' kann eine Störsendung einer anderen Task eintreffen. + + + + + + + +#ib(9)#5.2. #ib#Supervisor#ie##ie(9)# + + + +#ib(9)##ib#Verbindung zum Supervisor#ie##ie(9)# + + +#ib#begin#ie# + PROC begin (PROC start, TASK VAR new task) + Zweck: Es wird eine #ib#unbenannte Task#ie# (Pseudoname "-") als neuer Sohn der + aufrufenden eingerichtet und mit der Prozedur 'start' gestartet. Namens­ + kollision ist nicht möglich, die erzeugte Task kann aber auch nicht na­ + mensmäßig angesprochen werden. 'new task' identifiziert den neuen + Sohn, falls kein Fehler auftrat. + Fehlerfälle : + * zu viele Tasks + + PROC begin (TEXT CONST son name, PROC start, TASK VAR new task) + Zweck: Es wird eine Task mit Namen 'son name' als Sohn der aufgerufenen + eingerichtet und mit der Prozedur 'start' gestartet. 'new task' identifi­ + ziert den neuen Sohn, falls kein Fehler auftrat. + Fehlerfälle : + * zu viele Tasks + * Name unzulaessig (* "" oder LENGTH > 100 *) + * ... existiert bereits + +#ib#begin password#ie# + PROC begin password (TEXT CONST password) + Zweck: Bei normalen 'global manager'-Tasks kann man mit dieser Operation + das weitere Kreieren von Sohntasks unter Paßwortkontrolle stellen. + Wenn dieses Kommando in der Manager-Task gegeben worden ist, wird + bei folgenden SV-begin-Kommandos interaktiv das Paßwort verlangt. + Dabei gelten die üblichen Paßwort-Konventionen: + + a) "" (Niltext) bedeutet #on("i")#kein Paßwort#off("i")#. Damit kann man durch + 'begin password ("")' das Paßwort wieder ausschalten. + b) "-" bedeutet #on("i")#jedes eingegebene Paßwort ist ungültig#off("i")#. Damit + kann man durch 'begin password ("-")' das Einrichten von + Sohntasks von außen (durch SV-Kommando) abschalten. + +#ib#break#ie# + PROC break + Zweck: Die Task koppelt sich von einem evtl. angekoppelten Terminal ab. Bei + der Abkopplung wird auf dem Terminal die "Tapete" ("Terminal n... + EUMEL Version ..../M...") ausgegeben. + + PROC break (QUIET CONST quiet) + Zweck: Die Task koppelt sich von einem evtl. angekoppelten Terminal ab. Dabei + wird aber keine "Tapete" ausgegeben. + +#ib#channel#ie# + INT PROC channel + Zweck: Liefert die #ib#Kanalnummer#ie# der eigenen Task. Falls kein Kanal (Terminal) + zugeordnet ist, wird 0 geliefert. + + INT PROC channel (TASK CONST task) + Zweck: Liefert die Kanalnummer der angegebenen Task. Ist kein Kanal zuge­ + ordnet, wird 0 geliefert. + +#ib#clock#ie# + REAL PROC clock (INT CONST index) + Zweck: Liefert die über Index spezifizierte #ib#Systemuhr#ie#. Die Zeiteinheit ist 1 sec, + die Meßgenauigkeit 0.1 sec. + clock (0) : CPU-Zeit der eigenen Task + clock (1) : Realzeit des Systems + + REAL PROC clock (TASK CONST task) + Zweck: Liefert die CPU-Zeit der angegebenen Task. + + Hinweis: Die CPU-Zeit beginnt mit der Taskkreation zu laufen. Sie gibt also + jeweils die gesamte bisher verbrauchte CPU-Zeit an. Die Zeitdauer + bestimmter Operationen kann als Differenz zweier 'clock'-Aufrufe + gemessen werden. Beim Ende einer Task wird ihr CPU-Zeitverbrauch + dem Vater zugeschlagen, um Abrechnungen zu ermöglichen. + +#ib#continue#ie# + PROC continue (INT CONST channel nr) + Zweck: Die Task versucht, sich an den vorgegebenen Kanal anzukoppeln. Falls + sie vorher schon an ein Terminal gekoppelt war, wird implizit 'break' + durchgeführt, falls die Aktion erfolgreich durchgeführt werden konnte. + Ein erfolgreiches 'continue' beinhaltet implizit 'reset autonom'. + Anmerkung: Normale Tasks können auf die Kanäle 1-24 zugreifen, + Systemtasks dürfen sich auch an die privilegierten Kanäle + 25-32 ankoppeln. + Fehlerfälle: + * ungueltiger Kanal + * Kanal belegt + +#ib#end#ie# + PROC end + Zweck: Löscht die eigene Task und alle Söhne. Wenn die Task an ein Terminal + angekoppelt ist, wird vorher angefragt, ob wirklich gelöscht werden soll. + Anschließend wird die Standard-"Tapete" auf dem Bildschirm ausge­ + geben. + + PROC end (TASK CONST task) + Zweck: Löscht die angegebene 'task'. 'task' muß allerdings die eigene oder eine + Sohn- bzw. Enkel-Task der eigenen sein (siehe auch: 'Privilegierte Ope­ + rationen'). Im Unterschied zur oben aufgeführten parameterlosen Proze­ + dur 'end' wird nicht angefragt und auch keine "Tapete" ausgegeben. + Wenn also die eigene Task ohne Reaktion auf dem Terminal beendet + werden soll, kann dies mit 'end (myself)' geschehen. + Fehlerfall: + * 'end' unzulaessig + +#ib#family password#ie# + PROC family password (TEXT CONST password) + Zweck: Diese Prozedur setzt oder ändert das Paßwort derjenigen Familien­ + mitglieder, die kein Paßwort oder das gleiche Paßwort wie die aufrufen­ + de Task haben. + Zu einer Familie gehören die Task, in der man sich befindet, und die ihr + untergeordneten Tasks. + Natürlich gelten auch hier die allgemeinen Paßwortbedingungen (siehe + dazu: 'task password'). + Beispiel: Das Kommando 'family password ("EUMEL")' wird in SYSUR + gegeben. Dadurch wird das SYSUR­Paßwort und die Paß­ + worte der entsprechenden Tasks unter SYSUR auf "EUMEL" + gesetzt. + + +#ib#next active#ie# + PROC next active (TASK VAR task) + Zweck: 'task' wird auf die nächste aktive Task gesetzt. Aktiv sind alle Tasks, die + sich im Zustand 'busy' befinden oder auf Ein/Ausgabe warten (i/o) und + an einen Kanal angekoppelt sind. Beispiel: + + + TASK VAR actual task := myself; + REP + ... ; + next active (actual task) + UNTIL actual task = myself PER. + + + Hier werden alle aktiven Tasks durchgemustert (z.B. für Scheduling- + Anwendungen). Dieses Verfahren ist sehr viel weniger aufwendig als + eine Durchmusterung des ganzen Taskbaumes, liefert aber nur die + gerade aktiven Tasks. + +#ib#rename myself#ie# + PROC rename myself (TEXT CONST new task name) + Zweck: Die eigene Task erhält als neuen Tasknamen 'new task name'. Damit + kann auch aus einer benannten eine unbenannte Task mit dem Pseu­ + donamen "-" werden. Umbenennung in die andere Richtung ist eben­ + falls möglich. + Achtung: Durch das Umbenennen der Task werden alle Taskvariablen, + die sich auf diese Task beziehen, ungültig (als wäre die Task + gelöscht und dann neu eingerichtet). + Fehlerfälle: + * ... existiert bereits + * Name unzulaessig + +#ib#reset autonom#ie# + PROC reset autonom + Zweck: Die eigene Task deklariert sich beim Supervisor als nicht autonom + (Normalzustand). Das bedeutet, 'continue'-Aufforderungen über ein + 'Supervisor-Kommando' vom Terminal werden vom System ohne Be­ + nachrichtigung der Task durchgeführt. + +#ib#set autonom#ie# + PROC set autonom + Zweck: Die eigene Task deklariert sich beim Supervisor als #ib#autonom#ie# (üblich für + Manager-Tasks). Wenn jetzt ein 'continue'-Supervisor-Kommando auf + diese Task von einem Terminal aus gegeben wird, wird der Task über + 'send' eine Nachricht zugestellt. + Achtung: Im autonomen Zustand ist der Programmierer selbst für die + Reaktion der Task verantwortlich. Man kann sie von außen auf + keine Weise gewaltsam an ein Terminal koppeln (ermög­ + licht Paßalgorithmen / Datenschutz). + Um die Programmierung etwas zu entschärfen, wird eine + Task automatisch aus dem autonomen in den Normalzustand + überführt, wenn sie selbst ein 'continue' gibt. + +#ib#status#ie# + INT PROC status (TASK CONST task) + Zweck: Liefert den Status der angegebenen Task: + + 0 -busy- Task ist aktiv. + 1 i/o Task wartet auf Beendigung des Outputs oder + auf Eingabe. + 2 wait Task wartet auf Sendung von einer anderen Task. + 4 busy-blocked Task ist rechenwillig, ist aber blockiert. + 5 i/o -blocked Task wartet auf I/O, ist aber blockiert. + 6 wait-blocked Task wartet auf Sendung, ist aber blockiert. + Achtung: Die Task wird beim Eintreffen einer + Sendung automatisch entblockiert. + +#ib#storage#ie# + PROC storage (INT VAR size, used) + Zweck: Informiert über den physisch verfügbaren ('size') und belegten ('used') + Speicher des Gesamtsystems. Die Einheit ist KByte. + Achtung: 'size' gibt den Speicher an, der benutzt werden kann, ohne in + eine Engpaßsituation zu kommen. Tatsächlich wird auf dem + Hintergrundmedium noch eine gewisse Reserve freigehalten. + Wenn diese angebrochen wird, befindet sich das System im + #ib#Speicherengpaß#ie#. Dieser Zustand kann mit 'used > size' + abgefragt werden. + + INT PROC storage (TASK CONST task) + Zweck: Liefert die Größe des Speicherbereichs in KByte, den die angegebene + Task augenblicklich belegt. + Dabei werden durch Sharing mögliche Optimierungen nicht berücksich­ + tigt. D.h. eine Task kann physisch erheblich weniger Speicher als logisch + belegen. Entsprechend kann die Speichersumme aller Tasks den phy­ + sisch belegten Speicherbereich des Gesamtsystems beträchtlich über­ + schreiten. + +#ib#task password#ie# + PROC task password (TEXT CONST password) + Zweck: Das angegebene Paßwort wird beim Supervisor hinterlegt. Bei folgen­ + den SV-Kommandos 'continue...' auf diese Task wird interaktiv das + Paßwort abgefragt. Dabei gelten die üblichen Paßwort-Konventionen: + + a) "" (Niltext) bedeutet #on("i")#kein Paßwort#off("i")#. Damit kann man durch + 'task password ("")' das Paßwort wieder ausschalten. + + b) "-" bedeutet #on("i")#jedes eingegebene Paßwort ist ungültig#off("i")#. Damit + kann man durch 'task password ("-")' das Ankoppeln an ein + Terminal von außen (durch SV-Kommando) unterbinden. + + + + +#ib##ib(9)#Privilegierte Operationen#ie(9)##ie# + + +Die im folgenden aufgeführten privilegierten Operationen können #ub#nur#ue# von #ib#System­ +tasks#ie# - das sind direkte oder indirekte Söhne des Supervisors - ausgeführt werden. Um +Mißbrauch unmöglich zu machen, sollte der Supervisor nach der Einrichtung der +gewünschten Systemtasks bzgl. der Einrichtung neuer Söhne gesperrt und alle Sy­ +stemtasks durch Paßworte geschützt werden. + + +#ib#block#ie# + PROC block (TASK CONST task) + Zweck: Die angegebene #ib#Task wird blockiert#ie#, d.h. so lange von der Verarbeitung + suspendiert, bis die Blockade durch 'unblock' wieder aufgehoben wird. + Diese Operation wird vom Scheduler benutzt. Falls das Packet 'schedu­ + ler' insertiert ist, sollten andere Tasks die Prozedur 'block' nicht anwen­ + den, um dem Scheduling nicht entgegenzuwirken. + +#ib#collect garbage blocks#ie# + PROC collect garbage blocks + Zweck: Es wird eine außerplanmäßige Gesamtmüllabfuhr durchgeführt. Plan­ + mäßig (d.h. ohne Aufruf dieser Prozedur) wird sie alle 15 Minuten und in + Engpaßsituationen durchgeführt. Nach Aufruf dieser Prozedur wird der + automatische Fixpunkt/ Müllabfuhr-Rhythmus ca. 1 Stunde lang ge­ + sperrt. Somit kann man z.B. in der Task "scheduler" einen eigenen + Fixpunkt/Müllabfuhr-Rhythmus implementieren. + Achtung: Diese Operation erfordert starkes Paging und dauert dement­ + sprechend lange. + +#ib#end#ie# + PROC end (TASK CONST task) + Zweck: Die angegebene Task und alle Söhne, Enkel etc. werden gelöscht. + Systemtasks (direkte und indirekte Nachkommen des SUPERVISORs) + können beliebige andere Tasks (nicht nur eigene Söhne) löschen. + +#ib#fixpoint#ie# + PROC fixpoint + Zweck: Für das Gesamtsystem wird ein außerplanmäßiger #ib#Fixpunkt#ie# geschrie­ + ben. Planmäßige Fixpunkte (d.h. ohne Aufruf dieser Prozedur) werden + alle 15 Minuten geschrieben. Nach Aufruf dieser Prozedur wird der + automatische Fixpunkt/Müllabfuhr-Rhythmus ca. 1 Stunde lang ge­ + sperrt. Somit kann man z.B. in der Task "scheduler" einen eigenen + Fixpunkt/Müllabfuhr-Rhythmus implementieren. + Achtung: Diese Operation verursacht starkes Paging (Rückschreiben + aller veränderten Seiten auf das Hintergrundmedium) und + dauert dementsprechend lange. + +#ib#prio#ie# + INT PROC prio (TASK CONST task) + Zweck: Liefert die augenblickliche #ib#Priorität#ie# der angegebenen Task. + + PROC prio (TASK CONST task, INT CONST new prio) + Zweck: Setzt die Priorität der Task. + + Hinweis: 0 ist die höchste, 15 die niedrigste Priorität. Die Prioritäten 0 bis 2 + werden von EUMEL 0 (fine scheduling) verwaltet. Die restlichen Priori­ + täten können für 'rough scheduling' (siehe auch im Kapitel Scheduler) + eingesetzt werden. + Durch 'continue ("name")' wird die Priorität wieder auf 0 gesetzet. + +#ib#set date#ie# + PROC set date + Zweck: #ib#Datum#ie# und #ib#Uhrzeit#ie# können im Dialog gesetzt werden (Form wie beim + Start des Systems). Dabei wird gegebenenfalls die Hardware­Uhr gele­ + sen. + Sollte der SHard ein falsches Datum liefern, so muß das Datum mit + set clock (date("tt.mm.jj") + time ("hh:mm:ss")) + gesetzt werden. + +#ib#save system#ie# + PROC save system + Zweck: Der gesamte Systemhintergrund wird auf Archivdisketten gesichert. Zu + diesem Zweck wird das System wie bei 'shutup' heruntergefahren. + +#ib#shutup#ie# + PROC shutup + Zweck: #ib#Kontrolliertes Herunterfahren des Systems#ie#. Beim nächsten Systemstart + wird automatisch Datum und Uhrzeit erfragt, wenn der Kommandodial­ + og eingeschaltet ('command dialogue (TRUE)') und keine Hardwareuhr + vorhanden ist. Falls diese Prozedur nicht vor dem Abschalten aufgerufen + wurde, findet beim Neustart ein Aufsetzen auf dem letzten Fixpunkt statt + (RERUN). + +#ib#unblock#ie# + PROC unblock (TASK CONST task) + Zweck: Eine vorherige Blockierung der Task wird aufgehoben. Ist die Task nicht + blockiert, bewirkt 'unblock' nichts. Diese Operation wird vom Scheduler + benutzt. Andere Tasks sollten sie normalerweise nicht anwenden, um + dem Scheduling nicht entgegenzuwirken. + + + + + +#ib(9)#5.3. #ib#ID ­ Konstanten#ie##ie(9)# + + +Die Informationsprozedur + + INT PROC id (INT CONST no) + +liefert folgende Informationen über die Soft­ und Hardware des Rechners: + + Von EUMEL 0 werden geliefert: + id (0) --> EUMEL­Version + id (1) --> Prozessortyp (1: Z80, + 2: Z8001, + 3: 8086 und kompatible, + 4: 68000 + 5: 80286) + id (2) --> Urlader­Version + id (3) --> reserviert + + Vom SHard werden geliefert: + id (4) --> Lizenznummer des SHards + id (5) --> Installationsnummer des EUMEL­Anwenders + id (6) --> SHard­spezifisch + id (7) --> SHard­spezifisch + + + + + +#ib(9)#5.4. #ib#Systemverwaltung#ie##ie(9)# + + +#on("i")#Achtung#off("i")#: Dieser Teil des Systemhandbuchs ist nur für solche Multi-User-Installationen + von Bedeutung, die erweiterte Systemverwaltungsfunktionen generieren + bzw. modifizieren wollen. + + #on("i")#Das EUMEL-System ist in der ausgelieferten minimalen Standardform (ohne + die Features) ohne weiteres benutzbar#off("i")#. + + + + + +#ib(9)#Der Systemmanager #ib#SYSUR#ie##ie(9)# + + +Der Systemmanager verhält sich im wesentlichen wie ein normaler Manager, allerdings +mit folgender Erweiterung: + + - Die Operationen 'list' und 'fetch' können von allen Tasks des Systems und + nicht nur von Söhnen durchgeführt werden. Damit kann man Systemverwal­ + tungsdateien (z.B. "#ib#logbuch#ie#") von allen Tasks aus lesen. 'erase' und 'save' sind + jedoch nur von Söhnen bzw. Enkeln - d.h. von privilegierten Systemtasks - aus + zulässig. + +Das Paket stellt folgende Operationen zusätzlich zur Verfügung: + +#ib#generate shutup manager#ie# + PROC generate shutup manager + Zweck: Es wird eine Sohntask mit Namen "shutup" kreiert. Diese Task ist nicht­ + (!) paßwortgeschützt, läßt aber keine normalen Kommandos zu, son­ + dern fragt nur + + shutup (j/n) ? + + So kann jeder das System kontrolliert abschalten und die privilegierten + Operationen des OPERATORs wie 'end' sind dennoch geschützt. + +#ib#put log#ie# + PROC put log (TEXT CONST log record) + Zweck: Der angegebene 'log record' wird mit vorangestelltem Tasknamen des + Absenders, Datums- und Uhrzeitangabe in die Logbuchdatei "logbuch" + in der Task "SYSUR" geschrieben. Der neue Satz wird an die Datei ange­ + fügt. ("logbuch" wird z.B. vom EUMELmeter verwandt.) + + Hinweis: Bei Verwendung des Logbuchs darf die zwar große, aber doch end­ + liche Dateikapazität nicht vergessen werden. Nachdem das Logbuch + mit 4073 Sätzen voll ist, werden weitere 'put log' Operationen igno­ + riert. Die Datei "logbuch" sollte deshalb - wenn sie beispielsweise vom + EUMELmeter verwandt wird - von Zeit zu Zeit gelöscht werden ('erase' + bzw. 'forget')! + + + + +#ib(9)##ib#Scheduler#ie##ie(9)# + + +Der Scheduler dient zur Verwaltung der rechenwilligen #ib#Hintergrundtask#ie#s. Will man den +Scheduler (eventuell abgeändert) insertieren, muß man die Task "scheduler" als Sohn +von SYSUR einrichten. Dann holt man die Datei "scheduler" vom Archiv und insertiert +sie. "scheduler" beinhaltet "#ib#eumelmeter#ie#". Es wird beim Start erfragt, ob die Meßrouti­ +nen aktiviert werden sollen oder nicht. + + + + +#ib##ib(9)#Funktionsweise des Schedulers#ie(9)##ie# + + +Der Scheduler sammelt in bestimmten Zeitintervallen alle aktiven (rechnenden) Tasks +ab, die an kein Terminal angekoppelt sind und auch keine Manager sind. Diese Tasks +werden blockiert und in die Warteschlange der #ib#Standardklasse#ie# eingefügt. + +Die Klassen des Schedulers werden durch die #ib#Taskpriorität#ie#en 5 bis 9 definiert. Die +Standardklasse entspricht der Priorität 7. Die Klassenzugehörigkeit einer Task kann von +einer Systemtask aus (z.B. von "OPERATOR") mit der Prozedur '#ib#prio#ie#' verändert werden. + +Der Scheduler geht nach folgender Strategie vor: + + Anhand der Vordergrund/Hintergrundlast des Systems wird entschieden, ob + überhaupt Hintergrundtasks aktiv sein dürfen, welche Klassen aktiv sein dürfen + und wieviel #ib#Hintergrundtask#ie#s gleichzeitig rechnen dürfen. + + Die wartenden #ib#Hintergrundtask#ie#s werden im #ib#Round-Robin-Verfahren#ie# aktiviert. + Dabei kommt die Klasse n+1 erst dann zum Zug, wenn die Warteschlange der + Klasse n leer ist oder weniger Tasks enthält, als gleichzeitig aktiviert werden + sollen. + +Die implementierte Standardstrategie hat als oberste Maxime, den Vordergrund auf +keinen Fall zu stören. Dementsprechend wird der Hintergrund nur aktiviert, wenn eine +der folgenden Bedingungen erfüllt ist: + + - Die Vordergrundlast des Systems liegt unter 3% . + + - Es ist keine normale #ib#Vordergrundtask#ie# (Nachfahre von "UR") an einen Kanal + angekoppelt. Man beachte, daß Systemtasks hierbei nicht berücksichtigt + werden. Ein aktiver Drucker blockiert die Hintergrundtasks also nicht. + + + + +EUMELmeter (Systemstatistik) + + +Die #ib#Meßsoftware#ie# zum #ib#Protokollieren der Systembelastung#ie# befindet sich auf dem Archiv +'std.zusatz'. + +Falls das System keinen #ib#Scheduler#ie# benutzt, muß eine Meßtask als Sohn von "SYSUR" +eingerichtet werden. In diese Task muß dann die Datei "#ib#eumelmeter#ie#" vom Archiv geholt +und übersetzt werden. + +Falls das System einen Scheduler beinhalten soll, muß bei der Generierung des Sche­ +dulers lediglich auf die Frage "mit eumelmeter (j/n) ?" mit "j" geantwortet werden. + + + +#ib##ib(9)#EUMELmeter#ie(9)##ie# + + +Das EUMELmeter protokolliert die #ib#Systemlast#ie# in ca. 10 minütigen Abständen in der +Datei "#ib#logbuch#ie#" in "SYSUR". Für jedes Meßintervall wird eine Zeile angefügt. Die Zeilen +sind folgendermaßen aufgebaut: + +tt.mm.jj hh:mm hg uf ub pw pb cpuf cpub cpus last nutz + + +tt.mm.jj hh:mm Datum und Uhrzeit des Eintrags + +hg Größe des aktuell belegten Hintergrundspeichers + (in KB) + +uf Anzahl der aktiven Vordergrundtasks + +ub Anzahl der aktiven Hintergrundtasks + +pw #ib#Paginglast#ie# bei wartender CPU (#ib#Paging/Wait#ie#) + +pb Paginglast bei aktiver CPU (#ib#Paging/Busy#ie#) + +cpuf #ib#CPU-Auslastung#ie# durch Vordergrundtasks + +cpub CPU-Auslastung durch Hintergrundtasks + +cpus #ib#CPU-Systemlast#ie# + +last #ib#Gesamtlast des Systems#ie#: + pw + pb + cpuf + cpub+ cpus + (Achtung: kann 100% übersteigen, da Platte und CPU über­ + lappt arbeiten können.) + +nutz #ib#Nutzgüte#ie# im Meßintervall: 100% - pw - cpus + Die Nutzgüte gibt an, welcher Anteil der Systemarbeit für echte + Nutzarbeit verfügbar war. Sie ist die Summe aus der echten + Nutzlast 'cpuf+cpub' und der Leerzeit, die ja theoretisch auch + für Nutzarbeit hätte verwandt werden können. Sie läßt sich, wie + oben angegeben, auch berechnen, indem man den idealerweise + überflüssigen Overhead 'cpus' und 'pw' von 100% abzieht. +#page# + +#count per page# +#headeven# +%#center#EUMEL-Systemhandbuch + + +#end# +#headodd# +#center#6. Der EUMEL-Drucker#right#% + + +#end# + +#ib(9)#6. Der #ib#EUMEL-Drucker#ie##ie(9)# + + + +#ib(9)#6.1. Allgemeine Einführung#ie(9)# + + +Die Ansteuerung eines #ib#Druckers#ie# durch das EUMEL-System geschieht durch zwei +aufeinanderbauende Komponenten. Die eine Komponete ist der hardwareunabhängi­ +ge #ib#EUMEL-Drucker#ie#, der die #ib#Textverarbeitungsanweisungen#ie# umsetzt und die Druck­ +seite entsprechend aufbereitet, so daß sie im Blocksatz, in Tabellenform oder in Spal­ +ten gedruckt werden kann. Die andere Komponente ist der hardwareabhängige #ib#Druk­ +kertreiber#ie#, der durch ein einfaches Interface zum EUMEL-Drucker, wie z.B. Textausge­ +ben, Positionieren oder Schrifttypen und Modifikationen an- und ausschalten, den +eigentlichen Druck vornimmt. +Die hardwareunabhängige Komponente, der EUMEL-Drucker, befindet sich bei den +ausgelieferten Systemen im priviligierten Ast des Taskbaums, so daß beim Anschluß +eines Druckers nur noch der hardwareabhängige Druckertreiber insertiert werden muß. +Auf dem PRINTER-Archiv befinden sich schon einige Druckeranpassungen für diverse +Druckertypen. + +- Implementierung des Druckertreiber-Interface + Das Paket mit dem Druckertreiber muß in einer Task "PRINTER" insertiert und + ein Spool eingerichtet werden. + +- Erstellen einer Fonttabelle für den anzuschießenden Drucker + Eine vorhandene Fonttabelle wird dabei in die Task "configurator" gebracht + werden. Die Fonttabelle sollte in allen bestehenden Tasks - insbesondere in + der Task "PUBLIC" und der Task "PRINTER" - mit dem #on("i")##on("b")#fonttable#off("i")##off("b")#-Kommando + eingestellt werden. + + + + +#ib(9)#6.2. Das #ib#Druckertreiber-Interface#ie##ie(9)# + + +Da der EUMEL-Drucker vor dem Druckertreiber insertiert ist, aber auf dem Drucker­ +treiber aufbaut, müssen beim Aufruf der 'print'-Prozedur des EUMEL-Druckers die +Prozeduren des Druckertreibers mit übergeben werden. Aus progammtechnischen +Gründen sollte ihre Anzahl möglichst gering gehalten werden. Deshalb gibt es die +folgende drei Prozeduren, die mit einem 'op code' parametrisiert werden. Die Bedeu­ +tung der weiteren Parameter der Interfaceprozeduren hängen von diesem 'op code' ab. +Die folgende Beschreibung der Prozeduren gibt einen Programmrahmen vor, in dem +die Parameter durch Refinements entsprechend ihrer Bedeutung umdefiniert sind. + + + +PROC open (INT CONST op code, INT VAR param 1, param 2) : + + LET document code = 1 , + page code = 2 ; + + SELECT op code OF + CASE document code : open document + CASE page code : open page + END SELECT. + + + x steps : param1 . + y steps : param2 . + + #ib#open document#ie# : + + Zweck: Die Prozedur wird vom EUMEL-Drucker zur Einleitung jedes Ausdrucks + aufgerufen. Hier können notwendige Initialisierungen der Hardware + durchgeführt werden. In 'x steps' und 'y steps' muß die Breite bzw. + Höhe der bedruckbaren Fläche des Papieres in Mikroschritten des + Druckers angegeben werden.#u##count#)#e# +#foot# + +#value#) Zur Definition der Mikroschritte siehe Bemerkung 2. +#end# + + + + x start : param1 . + y start : param2 . + + #ib#open page#ie# : + + Zweck: Hiermit wird dem Hardware-Interface der Beginn einer neuen Seite + mitgeteilt. Die Parameter 'x start' und 'y start' liefern die gewünschte + Position der linken oberen Ecke des Schreibfeldes. Das Hardware-In­ + terface muß in diesen Parametern seine augenblickliche Position auf + dem Papier zurückmelden, wobei die Position (0,0) die linke obere + Ecke des Papieres ist. + Vor der Rückmeldung kann aber auch auf die angegebene Startpo­ + sition positioniert und diese zurückgemeldet werden. Es ist jedoch + darauf zu achten, daß die zurückgemeldete Position den internen + Nullpunkt für die Absolutkoordinaten im EUMEL-Drucker definiert. + Deswegen muß das Hardware-Interface sicherstellen, daß bei einem + "Zeilenrücklauf" die zurückgemeldete Position 'x start' erreicht wird. + (Siehe 'carriage return' in der Prozedur 'execute'). Auch gibt es Fälle, + bei denen links von der gemeldeten 'x start'-Position positioniert wird. + Bei #ib#Druckern mit Einzelblatteinzug#ie#, bei denen das Papier gleich auf die + zweite oder dritte Zeile positioniert wird, sollte, um ein korrektes Druck­ + bild zu erreichen, diese Postion in 'y start' zurückgemeldet werden. + + +END PROC open; + + +PROC close (INT CONST op code, INT CONST param 1) : + + LET document code = 1 , + page code = 2 ; + + SELECT op code OF + CASE document code : close document + CASE page code : close page + END SELECT. + + + #ib#close document#ie# : + + Zweck: Hiermit wird dem Hardware-Interface das Ende eines Druckvorgangs + mitgeteilt. + + + + remaining y steps : param 1 . + + #ib#close page#ie# : + + Zweck: Hiermit wird dem Hardware-Interface mitgeteilt, daß der Druck der + aktuellen Seite abgeschlossen ist. + 'remaining y steps' gibt an, wieviel Mikroschritte das vertikale Papier­ + ende noch von der aktuellen Druckposition entfernt ist. Die x-Position + des Druckers ist bei Aufruf dieser Prozedur immer der linke Rand + 'x start'. + + +END PROC close; + + +PROC execute (INT CONST op code, TEXT CONST string, + INT CONST param1, param2) : + + LET write text code = 1 , + write cmd code = 2 , + carriage return code = 3 , + move code = 4 , + draw code = 5 , + on code = 6 , + off code = 7 , + type code = 8 ; + + SELECT op code OF + CASE write text code : write text + CASE write cmd code : write cmd + CASE carriage return code : carriage return + CASE move code : move + CASE draw code : draw + CASE on code : on + CASE off code : off + CASE type code : type + END SELECT . + + + from : param1 . + to : param2 . + + #ib#write text#ie# : + + Zweck: Der übergebene Text 'string' muß von der Zeichenposition 'from' bis + 'to' (einschließlich) auf dem Drucker ausgegeben werden. Die Über­ + schreitung der Papierbreite braucht nicht überprüft zu werden. + + + + #ib#write cmd#ie# : + + Zweck: Der übergebene Text 'string' enthält zwischen den Positionen 'from' + und 'to' ein direkt angegebenes #ib#Druckerkommando#ie# (\#"..."\#). Wenn + direkte Druckerkommandos erlaubt sein sollen, müssen sie ausgege­ + ben werden. + + + + x steps to left margin : param 1 . + + #ib#carriage return#ie# : + + Zweck: Der Druckkopf muß (ohne Zeilenvorschub) an den linken Rand be­ + wegt werden, d.h. an die bei 'open page' vom Druckertreiber gemel­ + dete Position 'x start'. 'x steps to left margin' gibt an, wieviel Minimal­ + schritte die augenblickliche Position vom linken Rand entfernt ist. + + + + x steps : param 1 . + y steps : param 2 . + + #ib#move#ie# : + + Zweck: Die Schreibposition muß um 'x steps' Mikroschritte nach rechts und um + 'y steps' Mikroschritte nach unten verschoben werden. Negative + Schrittwerte bedeuten dabei die jeweils andere Richtung. Das Über­ + schreiten des Papiers braucht nicht überprüft zu werden. Bei einer + horizontalen Bewegung nach rechts ('x steps' > 0) müssen die einge­ + schalteten Modifikationen beachtet werden. Wenn z.B. 'underline' + eingeschaltet ist, muß die Strecke unterstrichen werden. + Kann eine Leistung (z.B. Bewegung nach links) nicht erbracht wer­ + den, muß ein 'errorstop' ausgelöst werden. Im Fehlerfall bei einer + Horizontalbewegung versucht der EUMEL-Drucker nach einem Zei­ + lenrücklauf nochmals die angestrebte x-Position zu erreichen. Somit + brauchen horizontale Bewegungen nach links ('x steps' < 0) nicht + unbedingt implementiert zu werden, sondern können mit einem 'error­ + stop' beantwortet werden. Im Fehlerfall bei einer vertikalen Bewegung + wird an der alten Position weitergeschrieben. + + + + #ib#draw#ie# : + Zweck: Von der aktuellen Schreibposition an (linke untere Ecke der Zeichenposition) + soll eine gerade Linie zum Zielpunkt ('x steps' weiter rechts, 'y steps' weiter + unten) gezogen werden. Kann eine Leistung (z.B. schräge Linie, Linie nach + oben o.ä.) nicht erbracht werden, muß ein 'errorstop' ausgelöst werden. + Dieser Fehlerfall wird vom EUMEL-Drucker ignoriert. Das Überschreiten + des Schreibfeldes braucht nicht überprüft zu werden. + + + + modification : param 1 . + + #ib#on#ie# : + + Zweck: Die #ib#Modifikation#ie# der Nummer 'modification' soll eingeschaltet wer­ + den, sofern die Hardware es erlaubt. Augenblicklich gibt es folgende + Modifikationen: + + 1 underline + 2 bold + 4 italics + 8 reverse + + Die in der Fonttabelle spezifizierte Befehlssequenz, um die entspre­ + chende Modifikation anzuschalten, kann mit der Prozedur #on("i")#on string + (modification)#off("i")# abgefragt werden. + Kann eine Leistung nicht erbracht werden, muß ein 'errorstop' aus­ + gelöst werden. Im Fehlerfall der Modifikation 'underline' versucht der + neue EUMEL-Drucker die Zeile mit Hilfe von 'draw' zu unterstreichen. + Im Fehlerfall der Modifikation 'bold' wird die Zeile nochmals, um den in + der Fonttabelle spezifizierten 'bold offset' verschoben, ausgegeben. + Bei den restlichen beiden Modifkationen wird der Fehlerfall ignoriert. + + + + #ib#off#ie# : + + Zweck: Die angegebene #ib#Modifikation#ie# 'modification' soll ausgeschaltet wer­ + den. Die in der Fonttabelle spezifizierte Befehlssequenz, um die ent­ + sprechende Modifikation auszuschalten, kann mit der Prozedur #on("i")#off + string (modification)#off("i")# abgefragt werden. Ein Fehlerfall wird hier igno­ + riert. + + + + font nr : param 1 . + + #ibie# : + + Zweck: Die Druckausgabe soll auf den #ib#Schrifttyp#ie# mit der angegebenen Font­ + nummer 'font nr' umgeschaltet werden. Diese Nummer bezieht sich auf + die eingestellte Fonttabelle. Mit den Prozeduren des Fontspeichers + können anhand dieser Nummer die nötigen Informationen beschafft + werden. So liefert z.B. die Prozedur #on("i")#font string (font nr)#off("i")# die in der Font­ + tabelle spezifizierte Befehlssequenz oder die Prozedur #on("i")#font (font nr)#off("i")# + den Namen des Fonts. Die Breite des Leerzeichens kann mit #on("i")#char pitch + (font nr, " ")#off("i")# bestimmt werden. + + +END PROC execute; + + + + + +#ib(9)#6.3. Prozedur-Schnittstelle des EUMEL- + Druckers#ie(9)# + + + +#ib#print#ie# + PROC print (PROC (TEXT VAR) next line, BOOL PROC eof, + PROC (INT CONST, INT VAR, INT VAR) open, + PROC (INT CONST, INT CONST) close, + PROC (INT CONST, TEXT CONST, + INT CONST, INT CONST) execute, + BOOL CONST elan listing, TEXT CONST file name) + Zweck: Solange die Prozedur 'eof' FALSE liefert wird mit der Prozedur 'next + line' eine Zeile eingelesen. Dieser Eingabestrom wird für den Druck + aufbereitet. Ist die Konstante 'elan listing' auf FALSE gesetzt, so wird + der Eingabestrom als Textdatei mit Textkosmetik-Anweisungen aus­ + gedruckt. Andernfalls wird der Eingabestrom wie ein ELAN-Listing + behandelt. In der Textkonstanten 'file name' muß dann der Dateiname + der Programmdatei enthalten sein. + + + PROC print (FILE VAR file, + PROC (INT CONST, INT VAR, INT VAR) open + PROC (INT CONST, INT CONST) close + PROC (INT CONST, TEXT CONST, + INT CONST, INT CONST) execute) + Zweck: Der Eingabestrom kommt aus der angegebenen Datei. Anhand vorge­ + gebener Kriterien wird entschieden, ob diese Datei als Textdatei oder + als ELAN-Listing ausgedruckt wird. + +#ib#with elan listings#ie# + PROC with elan listings (BOOL CONST flag) + Zweck: Mit dieser Prozedur kann bei der vorangegangenen 'print'-Prozedur + gesteuert werden, ob überhaupt irgendwelche Dateien als ELAN-Lis­ + tings gedruckt werden sollen. Wird damit FALSE eingestellt, so wer­ + den alle Dateien als Textdateien gedruckt. + + BOOL PROC with elan listings + Zweck: Liefert die aktuelle Einstellung. + + +#ib#is elan source#ie# + PROC is elan source (FILE VAR file) + Zweck: Entscheidet nach vorgebenen Kriterien, ob die angegebene Datei ein + ELAN-Listing ist. + + +#ib#bottom label for elan listings#ie# + PROC bottom label for elan listings (TEXT CONST label) + Zweck: Bei ELAN-Listings wird in der Fußzeile ein Text eingestellt, der durch + Schägstrich getrennt vor die Seitennummer geschrieben wird. (z.B. zur + Durchnumerierung der Pakete im Quellcode) + + TEXT PROC bottom label for elan listings + Zweck: Liefert die aktuelle Einstellung. + + +#ib#material#ie# + TEXT PROC material + Zweck: Hier kann das Hardware-Interface jeder Zeit den aktuellen Material­ + wert abfragen, der vom Benutzer mit der 'material'-Anweisung einge­ + stellt ist. + + +#ib#x pos#ie# + INT PROC x pos + Zweck: Wird in der Prozedur 'execute' die Funktion 'move' oder 'draw' ange­ + steuert, so liefert diese Prozedur die absolute Zielposition in x-Rich­ + tung, wo bei der Nullpunkt durch das zurückgelieferte 'x start' bei 'open + page' definiert ist. Diese Prozedur dient zur Unterstützung von Druk­ + kern, die eine absolute Positionierung in horizontaler Richtung benöti­ + gen. + + +#ib#y pos#ie# + INT PROC y pos + Zweck: Wird in der Prozedur 'execute' die Funktion 'move' oder 'draw' an­ + gesteuert, so liefert diese Prozedur die absolute Zielposition in y-Rich­ + tung, wo bei der Nullpunkt durch das zurückgelieferte 'y start' bei 'open + page' definiert ist. Diese Prozedur dient zur Unterstützung von Druk­ + kern, die eine absolute Positionierung in vertikaler Richtung benötigen. + + +#ibie# + INT PROC linetype + Zweck: Wird in der Prozedur 'execute' die Funktion 'draw' angesteuert, so gibt + diese Prozedur den gewünschten Linientyp an. Bisher ist nur definiert: + 1 underline + + Anmerkung: Bis jetzt benutzt der EUMEL-Druckers die Funktion 'draw' lediglich + zum Unterstreichen in Fehlerfall der Modifikation 'underline', d.h. + zeichnen mit 'y steps = 0' und 'x steps >= 0' mit 'line type = 1' + reicht aus. + + +#ib#y offset index#ie# + INT PROC y offset index + Zweck: Wurde der Font mit 'y offsets' definiert, so kann hiermit in der bei der + Funktion 'write text' in der Prozedur 'execute' der jeweilige Offset-In­ + dex für den auszugebenden Text abgefragt werden. Der Offset-Index + sagt aus, die wievielte Verschiebung nun ausgegeben wird. Dabei + werden die Verschiebungen in der Reihenfolge durchnummeriert, in + der sie in der Fonttabelle angegeben wurden. Anhand dieses Offset-In­ + dex muß das Hardware-Interface entscheiden, welche Bitmuster aus­ + gegeben werden müssen. + + +#ib#pages printed#ie# + INT PROC pages printed + Zweck: Gibt nach dem Ausdruck an, wieviel Seiten gedruckt wurden. + + + + +#ib(9)#6.4. Bemerkungen und Ratschläge#ie(9)# + + + +1) Für ein Paket, das dieses Interface implementiert, sind folgende Punkte wichtig: + + - Man braucht sich keine Zustände (aktuelle Position o.ä.) zu merken. + + - Rückmeldungen über die Leistungsfähigkeit eines Druckers bzw. seiner An­ + passung erfolgen über 'errorstop'. Der #ib#EUMEL-Drucker#ie# stellt fest, ob bestimm­ + te Leistungen (Einschalten der Attribute und Bewegungen des Druckers) + verfügbar sind, indem er sie versuchsweise ausführen läßt. Bei den Prozedu­ + ren 'open', 'close' und den Funktionen 'write text', 'write cmd', 'carriage return' + und 'type' der Prozedur 'execute' führt ein 'errorstop' jedoch zum Abbruch des + Drucks. + +2) Die #on("i")##on("b")##ib#Mikroschritte#ie##off("i")##off("b")# sollten die kleinsten durchführbaren horizontalen bzw. vertikalen + Bewegungen des Druckers sein. Oft gibt aber das Handbuch des Druckers keine + eindeutige Angabe über die Mikroschritte in horizontaler Richtung, sondern sagt + nur, daß es gewisse Schriften mit einer bestimmten Anzahl von Zeichen pro Zoll + gibt.#u##count#)#e# Dann ergibt sich die Anzahl von Mikroschritten pro Zoll aus dem kleinsten#foot# + +#value#) 1 Zoll = 1 Inch = 2.54 cm + +#end# + gemeinsamen Vielfachen der Anzahl Zeichen pro Zoll aller Schriften. + + Beispiel: + Der Olivetti Drucker PR1470 hat drei Schriften mit 10, 12, und 16.6 Zeichen pro + Zoll. Das kleinste gemeinsame Vielfache ist 300. Ein Mikroschritt bei dem Druk­ + ker PR1470 entspricht also einem 300stel Zoll. Die Breite der einzelnen Schrif­ + ten läßt sich nun aus der folgenden Tabelle ablesen. + + Anzahl Zeichen pro Zoll Breite in 1/300 Zoll + 10 30 + 12 25 + 16.6 18 + + Wenn der Drucker in diesen theoretischen Mikroschritten nicht positionieren kann, + so muß er bei einem #on("i")#move#off("i")#-Befehl so genau wie möglich positionieren. Der Rest + sollte abgespeichert und beim nächsten #on("i")#move#off("i")#-Befehl hinzuaddiert werden. + +3) Um ein optimales Druckbild zu bekommen, müssen alle Breiten und Höhenanga­ + ben der Zeichen genau angegeben werden. + +4) Die Fonttabelle bietet eine einfache Möglichkeit, Zeichen mit Hilfe der #ib#Ersatzdar­ + stellung#ie#en umzucodieren. Deshalb sollte der Druckerkanal auch mit der Konfigu­ + rationstabelle 'transparent' konfiguriert werden. + +5) Um den Schrifttyp festzulegen, mit dem #ib#ELAN-Listing#ie#s gedruckt werden sollen, + kann in der Fonttabelle einem Font der Name #on("i")##on("b")#"#ib#elanlist#ie#"#off("i")##off("b")# zugeordnet werden, denn + der ELAN-Lister versucht auf einen Schrifttyp mit diesem Namen zuschalten. Wenn + kein Schrifttyp "elanlist" existiert, dann wird für ELAN-Listings der erste Schrifttyp + der Fonttabelle genommen. + +6) Nach der Installation des #ib#Druckertreiber#ie#s ist darauf zu achten, daß in der Task + "PRINTER" eine Fonttabelle des Druckers eingestellt ist. + +7) Der #ib#Druckertreiber#ie# sollte eventuell noch ein Prozedur bereitstellen, mit der die + Papierbreite bzw. -höhe eingestellt werden kann, die bei 'open document' dem + EUMEL-Drucker gemeldet wird. + + + + +#ib(9)#6.5. Arbeitsweise des EUMEL-Druckers#ie(9)# + + + +Der EUMEL-Drucker arbeitet mit der folgenden Strategie: + +Die Datei wird zeilenweise analysiert. Bei der Analyse werden einzelne #ib#Token#ie# be­ +stimmt. Ein Token ist ein Textteil, der zusammenhängend gedruckt werden kann, ohne +daß es zu Typumschaltungen, Modifkationsänderungen oder Positionierungen in x- +bzw. y-Richtung kommt. So ist bei einfachem Zeilendruck jede Zeile ein Token, wäh­ +rend im Blocksatz jedes Wort ein Token ist. Ein Token hat also immer + + - einen Text, + - die Länge des Textes bei der Ausgabe, + - eine absolute x- und y- Position auf dem Papier, + - einen Schrifttyp, + - Modifikationen für den Text, + - Modifikationen für den Zwischenraum vom letzten Token zu diesem Token. + +Sind alle Token einer Zeile bestimmt, so werden sie in eine Liste aller bisher erzeug­ +ten, aber noch nicht gedruckten Token der absoluten y-Position nach einsortiert. Diese +Tokenliste wird erst dann ausgedruckt, wenn sichergestellt ist, daß im weiteren Verlauf +der Datei kein Token vor das letzte Token der sortierten Liste kommt. Beim Zeilendruck +ist dies nach jeder Zeile der Fall. Bei Spaltendruck kann jedoch erst dann ausgedruckt +werden, wenn sich die Analyse in der letzten Spalte befindet. Spätestens bei einem +Seitenwechsel muß die Tokenliste ausgegeben werden. + +Durch diese Strategie lassen sich Spaltendruck oder Indizes und Exponenten sehr +leicht für alle Drucker implementieren, ohne daß ein Drucker in vertikaler Richtung +rückwärts positionieren muß. + +Bei der Ausgabe der Tokenliste wird jeweils auf die nächst größere y-Position posi­ +tioniert und dort werden alle Token zu dieser y-Position ausgegeben. Die Ausgabe +eines Tokens erfolgt in der folgenden Reihenfolge: + + - der Schrifttyp wird eingeschaltet, + - die Modifikationen für den Zwischenraum werden eingeschaltet, + - der Positionsbefehl für horizontale Bewegungen wird gegeben, + - die Modifikationen für den Text werden eingeschaltet, + - der Text wird ausgegeben. + +Die ersten vier Punkte werden nur dann ausgeführt, wenn sie notwendig sind. Über­ +schreitet der Text die Papierbreite, so zeigen Punkte am Ende der Zeile dies an. + diff --git a/doc/system/systemhandbuch.4 b/doc/system/systemhandbuch.4 new file mode 100644 index 0000000..e511eb5 --- /dev/null +++ b/doc/system/systemhandbuch.4 @@ -0,0 +1,1185 @@ +#start(2.5,1.5)# +#pageblock# +#block# +#page (91)# +#headeven# +%#center#EUMEL-Systemhandbuch + + +#end# +#headodd# +#center#7. Der Fontspeicher#right#% + + +#end# + +#ib(9)#7. Der #ib#Fontspeicher#ie##ie(9)# + + + +#ib(9)#7.1. #ib#Fonttabellen#ie##ie(9)# + + +Damit die Textverarbeitung Dokumente formatieren kann, muß sie über Breiten und +Höhen der einzelnen Schrifttypen (auch "#ib#Fonts#ie#" genannt) des Druckers, auf dem das +Dokument gedruckt wird, Bescheid wissen. Auch bei dem Ausdruck des Dokuments +wird diese Information benötigt. Im EUMEL-System stellt der #ib#Fontspeicher#ie# diese Infor­ +mation den #ib#Formatierprogramm#ie#en (#on("i")#lineform#off("i")# und #on("i")#pageform#off("i")#) und dem #ib#EUMEL-Drucker#ie# +zur Verfügung. + +Da nun der Drucker Angaben zur Positionierung in seinen #ib#Mikroschritten#ie# (kleinste +Schrittweite in horizontaler oder vertikalter Richtung) benötigt, liefert die Fonttabelle +die Breiten- und Höhenangaben in Mikroschritten und eine Umrechnungseinheit von +Schritten in Zentimeter oder umgekehrt. So braucht der EUMEL-Drucker bei Positionie­ +rungen keine Umrechnung vorzunehmen. Allerdings müssen die Formatierprogramme +auch in Mikroschritten des jeweiligen Druckers rechnen. Dadurch werden jedoch +Unterschiede durch Rundungsfehler zwischen dem EUMEL-Drucker und den Forma­ +tierprogrammen vermieden. + +Bei diesem Konzept können Fonts von verschiedenen Druckern nicht in einer Fontta­ +belle verwaltet werden, denn unterschiedliche Drucker haben meist verschiedene +Mikroschritte. Somit muß es für jeden Drucker mindestens eine Fonttabelle geben. + +Es gibt aber auch Fälle, in denen Fonts auf einem Drucker nicht mit anderen Fonts des +Druckers zusammengedruckt werden können. Solche Fälle liegen z.B. bei Typenrad­ +druckern vor, die immer nur mit einem Typenrad drucken können und dessen Zei­ +chenbreite hardwaremäßig eingestellt werden muß (z.B. beim Olivetti PR320), bei +Druckern, die verschiedene Fonts für Längs- und Querformat haben (z.B. beim Agfa +P400), oder bei Druckern, deren Fonts geladen werden (z.B. beim HP 2686). Eine +#on("b")##ib#Fonttabelle#ie##off("b")# enthält also alle die Fonts eines Druckers, #on("b")#die auf dem Drucker kompati­ +bel sind#off("b")#. Es kann mehrere Fonttabellen zu einem Drucker geben. + +Die verschiedenen Fonttabellen werden von im Multi-User Betrieb von der Task "#ib#confi­ +gurator#ie#" verwaltet. Sie enthält alle Fonttabellen, die auf dem Rechner zur Verfügung +stehen. Mit dem Kommando + + + #ib#fonttable#ie# ("Name der Fonttabelle") + + +wird in einer Task die gewünschte Fonttabelle eingestellt. Danach stehen die Fonts +dieser Tabelle in der Task zur Verfügung. Die Einstellung der Fonttabelle vererbt sich +auf die Sohntasks, d.h. wird eine Sohntask begonnen, so ist dort die Fonttabelle des +Vaters eingestellt. + +Dazu das folgenden Beispiel: + + Für den Agfa-Drucker P400 gibt es die Fonttabellen "agfa" und "agfaquer", in + denen die Fonts für Längsdruck bzw. Querdruck enthalten sind. In der Task + #on("i")#PUBLIC#off("i")# wird mit dem Kommando #on("i")#fonttable ("agfa")#off("i")# die Fonttabelle "agfa" ein­ + gestellt. Alle neuen Sohntasks können sofort ohne weitere Einstellung mit der + Textformatierung im Längsformat beginnen. Will nun jemand im Querformat + drucken, so muß er in seiner Task mit dem Kommando #on("i")#fonttable ("agfaquer")#off("i")# den + Fontspeicher auf die Fonts zum Querdruck umstellen. + +Das Kommando + + + #ib#list fonts#ie# + + +listet die Fonts der eingestellten Fontabelle ins #on("i")#notebook#off("i")# und das Kommando + + + #ib#list fonttables#ie# + + +informiert über die verfügbaren Fonttabellen. + + + + +#ib(9)#7.2. Erstellen einer #ib#Fonttabelle#ie##ie(9)# + + +Die Fonttabelle ist ein Datenraum mit einer eigenen Struktur. Somit kann sie nicht +mehr mit dem Editor, sondern nur mit einem entsprechenden Programm bearbeitet +werden. Solch ein Programm befindet sich in der Datei "#ib#font convertor#ie#" auf dem Stan­ +dardarchiv 'std.zusatz'. Diese Datei sollte in einer Systemtask (Sohntask von "SYSUR") +insertiert werden. Danach stehen entsprechende Kommandos zur Bearbeitung einer +Fonttabelle zur Verfügung. + +Um eine Fonttabelle zu bekommen, muß zuerst eine #on("b")##ib#Fontdatei#ie##off("b")# (d.h. eine editierbare +Datei mit dem unten beschriebenen Aufbau) angelegt werden. Mit dem Kommando + + + #ib#create fonttable#ie# ("Name der Fontdatei") + + +werden alle in der Fontdatei spezifizierten Fonttabellen erstellt. Sie liegen als benannte +Datenräume in der Task vor und können mit dem Kommando #on("i")#save#off("i")# von einer System­ +task an die Task "configurator" gesendet werden. Danach sind diese Fonttabellen in +allen Task auf dem Rechner verfügbar und können mit dem #on("i")#fonttable#off("i")# - Kommando +eingestellt werden. + +Soll dagegen eine bestehende Fonttabelle geändert werden, so erstellt das Komman­ +do + + + #ib#create fontfile#ie# ("Name der Fonttabelle", "Name der Fontdatei") + + +aus der angegebenen Fonttabelle eine Fontdatei. Die Fonttabelle muß dazu in der Task +als benannter Datenraum vorliegen (d.h. sie muß eventuell mit #on("i")#fetch#off("i")# von der Task +"configurator" geholt werden). In der so erstellten Fontdatei können die Änderungen +mit dem Editor vorgenommen, mit #on("i")#create fonttable#off("i")# die geänderte Fonttabelle erstellt +und diese wiederum mit #on("i")#save#off("i")# an die Task "configurator" gesendet werden. Mit dem +#on("i")#fonttable#off("i")#-Kommando kann dann in den bestehenden Tasks die geänderte Fonttabelle +eingestellt werden. Alle neuen Tasks erhalten automatisch die geänderte Fonttabelle. + + + +#ib(9)#Prozedurbeschreibung der Umwand­ +lungs­Kommandos#ie(9)# + + +Nach der Insertierung der Datei "font convertor" stehen die folgenden Kommandos zur +Umwandlung einer Fontdatei in eine Fonttabelle oder umgekehrt zur Verfügung. + +#ib#create fontfile#ie# + PROC create fontfile (TEXT CONST fonttable name, fontfile name) + Zweck: Aus Fonttabelle 'fonttable name' wird eine Fontdatei mit dem ange­ + gebenen Name erstellt. Die Fonttabelle muß dabei in der eigenen Task + als benannter Datenraum vorliegen. + +#ib#create fonttable#ie# + PROC create fonttable (TEXT CONST fontfile name) + Zweck: Es werden alle Fonttabellen erzeugt, die in der Fontdatei 'fontfile name' + angegeben sind. Die Fonttabellen liegen dann als benannte Datenräu­ + me in der Task vor. + + PROC create fonttable + Zweck: Es werden alle Fonttabellen erzeugt, die in der zuletzt bearbeiteten + Datei angegeben sind. + + + + +#ib(9)#7.3. Aufbau der #ib#Fontdatei#ie##ie(9)# + + +In der Fontdatei können drei Strukturen stehen und zwar Kennungen, Identifkationen +und Zeichenspezifikationen.#u##count#)#e# +#foot# + +#value#) Beim formalen Aufbau bedeuten eckige Klammern, daß diese Angaben optional sind. + +#end# + + + +#ib(9)##ib#Kennungen#ie##ie(9)# + + + Formaler Aufbau: <#on("i")#Kennung#off("i")#> : Name 1 [, Name 2] [ ... ] ; + + Eine Kennung leitet eine Definition ein. Für die Namen der Namensliste gelten die + folgenden Konventionen: + + - der Name muß als TEXT-Denoter angegeben werden, + - der Name muß ungleich #on("i")#niltext#off("i")# sein, + - Leerzeichen sind im Namen nicht signifikant (d.h. "agfa quer" wird zu "agfa­ + quer"). + + Eine Kennung kann die folgenden Werte annehmen: + + <#on("i")#Kennung#off("i")#> { FONTTABLE, FONT } + + - #on("b")##ib#FONTTABLE#ie##off("b")# + Hiermit wird eine Definition einer Fonttabelle eingeleitet. Es wird nur der erste + Name der Namensliste ausgewertet, da die Fonttabelle eindeutig identifiziert + sein muß. Alle folgenden Angaben werden dieser Fonttabelle zugeordnet, bis + eine neue Kennung FONTTABLE folgt. + + - #on("b")##ib#FONT#ie##off("b")# + Hiermit wird eine Definition eines Schrifttyps eingeleitet. Ein Schrifttyp kann + mehrere Namen haben. Jedoch darf in einer Fonttabelle jeder Fontname nur + einem Font zugeordnet werden. + + + +#ib(9)##ib#Identifikation#ie#en#ie(9)# + + + Formaler Aufbau: [ <#on("i")#Identifikation#off("i")#> = ; ] + + Mit den Identifikationen werden bestimmte Angaben zu den Kennungen gemacht. + Sie müssen unmittelbar nach der entsprechenden Kennung folgen, brauchen aber + nur angegeben werden, wenn sie von den Standardwerten abweichen. + + + +#ib(9)#Identifikationen nach der Kennung #ib#FONTTABLE#ie##ie(9)# + + + <#on("i")#Identifikation#off("i")#> { x unit, y unit, on string, off string } + + - #on("b")##ib#x unit#ie##off("b")# + Hiermit wird die Anzahl der Mikroschritte des Druckers pro Zentimeter in + horizontaler (x-) Richtung spezifiziert. Die Einheit muß als REAL-Denoter + angegeben werden. Alle weiteren Breitenangaben zu den Fonts dieses Druk­ + kers beziehen sich auf diese Einheit. + + STD-Wert: 10.0 / 2.54 = 3.937008 + + - #on("b")##ib#y unit#ie##off("b")# + Hiermit wird die Anzahl der Mikroschritte des Druckers pro Zentimeter in + vertikaler (y-) Richtung spezifiziert. Die Einheit muß als REAL-Denoter ange­ + geben werden. Alle weiteren Höhenangaben zu den Fonts dieses Druckers + beziehen sich auf diese Einheit. + + STD-Wert: 6.0 / 2.54 = 2.362205 + + - #on("b")##ib#on string#ie##off("b")# + Hier müssen vier Textdenoter, durch Komma getrennt, angegeben werden. + Die Textdenoter enthalten die Befehlssequenzen, um beim Drucker die Mo­ + difikationen anzuschalten. Dabei ist die Reihenfolge der Modifikationen + underline, bold, italics, reverse. + Liegt für eine der Modifikationen keine Befehlssequenz vor, so muß #on("i")#niltext#off("i")# + angegeben werden. Die Befehlssequenzen können vom Druckertreiber ab­ + gefragt werden. + + STD-Wert: #on("i")#niltext#off("i")# für alle Modifikationen + + - #on("b")##ib#off string#ie##off("b")# + Hier müssen vier Textdenoter, durch Komma getrennt, angegeben werden. + Die Textdenoter enthalten die Befehlssequenzen, um beim Drucker die Mo­ + difikationen auszuschalten. Dabei ist die Reihenfolge der Modifikationen + underline, bold, italics, reverse. + Liegt für eine der Modifikationen keine Befehlssequenz vor, so muß #on("i")#niltext#off("i")# + angegeben werden. Die Befehlssequenzen können vom Druckertreiber ab­ + gefragt werden. + + STD-Wert: #on("i")#niltext#off("i")# für alle Modifikationen + + + +#ib(9)#Identifikationen nach der Kennung #ib#FONT#ie##ie(9)# + + + <#on("i")#Identifikation#off("i")#> { font lead, font height, font depth, indentation pitch, + next larger font, next smaller font, + font string, y offsets, bold offset } + + - #on("b")##ib#font lead#ie##off("b")##u##count#)#e# + Der Durchschuß eines Fonts gibt den Zwischenraum in vertikaler Richtung + zwischen den Zeilen bei einfachem Zeilenvorschub an. Er muß in Mikroschrit­ + ten der y-Richtung als INT-Denoter angegeben werden. + + STD-Wert: 0 +#foot# + +#value#) Für spätere Erweiterungen des EUMEL-Druckers wurde die bisherige Fonthöhe in Durchschuß, Fonthöhe + und Fonttiefe aufgespalten. Für alle bis jetzt definierten Leistungen braucht nur wie bisher die Fonthöhe + angegeben zu werden. Der Durchschuß und die Fonttiefe werden dann auf Null gesetzt. +#end# + + - #on("b")##ib#font height#ie##off("b")##u##value#)#e# + Die Fonthöhe ist die Distanz von der Basislinie bis zur Oberkante des höch­ + sten Zeichens. Sie muß in Mikroschritten der y-Richtung als INT-Denoter + angegeben werden. + + STD-Wert: 6 Zeilen pro Inch entsprechend der definierten #on("i")#y unit#off("i")# + + - #on("b")##ib#font depth#ie##off("b")##u##value#)#e# + Die Fonttiefe ist die Distanz von der Basislinie bis zur Unterkante des tief­ + sten Zeichens. Sie muß in Mikroschritten der y-Richtung als INT-Denoter + angegeben werden. + + STD-Wert: 0 + + - #on("b")##ib#indentation pitch#ie##off("b")# + Einrückungen oder Aufzählungen werden äquidistant berechnet, d.h. Anzahl + der Zeichen mal einer festen Breite. Diese Einrückbreite sollte ein Mittel al­ + ler Zeichenbreiten sein und braucht nicht der Breite des Leerzeichens zu + entsprechen. Sie muß in Mikroschritten der x-Richtung als INT-Denoter an­ + gegeben werden. + + STD-Wert: 10 Zeichen pro Inch entsprechend der definierten #on("i")#x unit#off("i")# + + - #on("b")##ib#next larger font#ie##off("b")# + Hier muß der Name des nächst größeren Fonts als TEXT-Denoter aufgeführt + werden. Gibt es keinen nächst größeren Font, so ist #on("i")#niltext#off("i")# anzugeben. + + STD-Wert: #on("i")#niltext#off("i")# + + - #on("b")##ib#next smaller font#ie##off("b")# + Hier muß der Name des nächst kleineren Fonts als TEXT-Denoter aufge­ + führt werden. Gibt es keinen nächst kleineren Font, so ist #on("i")#niltext#off("i")# anzugeben. + Bei Indizes oder Exponenten wird automatisch auf diesen nächst kleineren + Font umgeschaltet. + + STD-Wert: #on("i")#niltext#off("i")# + + + - #on("b")##ib#font string#ie##off("b")# + Hier kann als TEXT-Denoter eine Befehlssequenz angegeben werden, die + den Drucker auf diesen Font umschaltet. Diese Befehlssequenz kann vom + Druckertreiber abgefragt werden. Dadurch ist es nicht nötig, daß er die Na­ + men der Fonts kennt. + + STD-Wert: #on("i")#niltext#off("i")# + + - #on("b")##ib#y offsets#ie##off("b")# + Um bei Matrixdruckern Schriften zu erzeugen, die höher als eine Nadelreihe + sind, müssen entsprechende Bitmuster des Textes an verschiedenen y-Po­ + sitionen ausgegeben werden. Um diese Anforderung durch den EUMEL- + Drucker zu unterstützen, kann hier eine Liste von Verschiebungen von der + Basislinie angegeben werden, an denen der Text ein weiteres Mal ausgege­ + ben wird. Dabei bedeuten negative Werte eine Verschiebung oberhalb und + positive Werte eine Verschiebung unterhalb der Basislinie. Ist der Wert Null, + so wird der Text auf der Basislinie ausgegeben. Die Modifikation #on("i")#underline#off("i")# + wird bei der Ausgabe des Textes nur an der ersten Verschiebung angestellt. + Die Werte für die Verschiebungen müssen in Mikroschritten der y-Richtung + als INT-Denoter angegeben und durch Komma getrennt werden. + + STD-Wert: 0 + + - #on("b")##ib#bold offset#ie##off("b")# + Falls der Drucker die Modifikation #on("i")#bold#off("i")# nicht beherrscht, versucht der + EUMEL-Drucker sie durch Doppeldruck zu simulieren. Der 'bold offset' gibt + an, ob und wieviel der zweite Durchgang in x-Richtung verschoben werden + soll. Dies ergibt insbesondere bei Laserdruckern, die nicht für alle Schriftty­ + pen einen Bold-Typ haben, einen recht guten Fettdruck. Der Wert muß in + Mikroschritten der x-Richtung als INT-Denoter angegeben werden. + + STD-Wert: 0 + + + +#ib(9)##ib#Zeichenspezifikationen#ie##ie(9)# + + + + Formaler Aufbau: [ [, ] + [, ] ; ] + + + Nachdem die Identifikationen zu einer Kennung angegeben wurden, können Zei­ + chenspezifikationen folgen, d.h. zu einem Zeichen kann die Breite und/oder eine + Ersatzdarstellung spezifiziert werden. Dazu muß zuerst das Zeichen selber als + TEXT-Denoter angegeben werden. + + - #on("b")##ib#Breite des Zeichens#ie##off("b")# + Die Zeichenbreite muß als INT-Denoter in Mikroschritten angegeben werden. + Alle Zeichenbreiten werden mit der Einrückbreite vorbesetzt, so daß nur sol­ + che Zeichen angegeben werden müssen, deren Breite von der Einrückbreite + abweichen. Negative Zeichenbreiten sind nicht erlaubt. Die Angabe von Zei­ + chenbreiten nach der Kennung FONTTABLE wird ignoriert. + + - #on("b")##ib#Ersatzdarstellung des Zeichens#ie##off("b")# + Die Ersatzdarstellung wird statt des Zeichens ausgedruckt. Sie muß als + TEXT-Denoter angegeben werden. Werden Ersatzdarstellungen nach der + Kennung FONTTABLE angegeben, so gelten sie global für alle Fonts dieser + Fonttabelle. Sie können jedoch bei der Fontangabe lokal wieder überschrie­ + ben werden. Eine Ersatzdarstellung darf höchsten 255 Zeichen lang sein. Alle + Ersatzdarstellungen eines Fonts dürfen 32767 Zeichen nicht überschreiten. + + + +#ib(9)##ib#Kommentare in der Fontdatei#ie##ie(9)# + + + In der Fontdatei dürfen Kommentare eingefügt werden. Sie müssen den Kommen­ + taren der ELAN-Syntax entsprechen, d.h. mit '(*' beginnen und mit '*)' enden. + + + +#ib(9)##ib#Deutsche Namen#ie##ie(9)# + + + Kennungen und Identifikationen dürfen in der Fontdatei auch mit folgenden deut­ + schen Namen angegeben werden. + + FONTABLE : FONTABELLE + FONT : FONT + +#free (0.15)# + x unit : x einheit + y unit : y einheit + on string : on sequenz + off string : off sequenz + indentation pitch : einrueckbreite + font lead : durchschuss + font height : fonthoehe + font depth : fonttiefe + next larger font : groesserer font + next smaller font : kleinerer font + font string : font sequenz + y offsets : y verschiebungen + bold offset : bold verschiebung + + + + +#ib(9)#7.4. Beispiel für eine Fontdatei#ie(9)# + + +In diesem Beispiel einer Fonttdatei sind drei Fonttabellen enthalten, nämlich "agfa" und +"agfaquer" für den Agfa-Drucker und "epson" für einen Epson-Drucker. + + +FONTTABLE : "agfa" ; + x unit = 160.0 ; #right#(* Anzahl der Mikroschritte pro cm *) + y unit = 160.0 ; + on string = "\UL1;", "\BO1;", "\IT1;", "\CFW;\CBB;" ; + off string = "\UL0;", "\BO0;", "\IT0;", "\CFT;\CBT;" ; + +#right#(* globale Ersatzdarstellungen für alle Agfa-Fonts *) + + ""214"" , "\!298;" ; #right#(* AE *) + ""215"" , "\!299;" ; #right#(* OE *) + ""216"" , "\!300;" ; #right#(* UE *) + ""217"" , "\!451;" ; #right#(* ae *) + ""218"" , "\!452;" ; #right#(* oe *) + ""219"" , "\!453;" ; #right#(* ue *) + . + . + . + + FONT : "trium10" ; + indentation pitch = 30 ; + font lead = 7 ; + font heigth = 54 ; + font depth = 15 ; + next larger font = "trium12" ; + next smaller font = "helvetica8" ; + font string = "\FO5;" ; + + " " , 20 ; "!" , 16 ; + """" , 22 ; "\#" , 31 ; + "$" , 31 ; "%" , 55 ; + . + . + . + ""217"" , 31 ; #right#(* ae *) + +#right#(* lokale Ersatzdarstellungen für Font "trium10" *) + + ""244"" , 43 , "\FO23;\!725;\FO5;" ; #right#(* ungleich *) + ""245"" , 31 , "\FO23;\!405;\FO5;" ; #right#(* mal-Zeichen *) + + FONT : "modern12", "elanlist" ; #right#(* Mehrere Namen für einen Font *) + indentation pitch = 33 ; + font lead = 14; + font heigth = 53; + font depth = 13; + next larger font = "" ; + next smaller font = "micro" ; + font string = "\FO11;" + #right#(* Alle Zeichen haben die gleiche Breite *) + + FONT . . . + + +FONTTABLE : "agfaquer" ; + x unit = 160.0 ; + y unit = 160.0 ; + on string = "\UL1;", "\BO1;", "\IT1;", "\CFW;\CBB;" ; + off string = "\UL0;", "\BO0;", "\IT0;", "\CFT;\CBT;" ; + . + . + . + + +FONTTABLE : "epson" ; + x unit = 47.24409 ; #right#(* 120.0 / 2.54 *) + y unit = 85.03937 ; #right#(* 216.0 / 2.54 *) + on string = ""27"-"1"", "", ""27"4", ""; + off string = ""27"-"0"", "", ""27"5", ""; + + ""214"" , ""27"R"2""091""27"R"0"" ; #right#(* AE *) + ""215"" , ""27"R"2""092""27"R"0"" ; #right#(* OE *) + ""216"" , ""27"R"2""093""27"R"0"" ; #right#(* UE *) + ""217"" , ""27"R"2""123""27"R"0"" ; #right#(* ae *) + ""218"" , ""27"R"2""124""27"R"0"" ; #right#(* oe *) + ""219"" , ""27"R"2""125""27"R"0"" ; #right#(* ue *) + ""220"" , "k" ; #right#(* Trenn-k *) + ""221"" , "-" ; #right#(* Trennstrich *) + ""222"" , "\#" ; #right#(* geschütztes Nummernkreuz *) + ""223"" , " " ; #right#(* geschütztes Leerzeichen *) + ""251"" , ""27"R"2""126""27"R"0"" ; #right#(* ss *) + ""252"" , ""27"R"2""064""27"R"0"" ; #right#(* Paragraph *) + + FONT : "12", "elite", "elite12" ; #right#(* Mehrere Namen für einen Font *) + font height = 36 ; + indentation pitch = 10 ; + next smaller font = "12.klein" ; + font string = ""27"!"1""27"p"0""27"T" ; + bold offset = 2 ; + + FONT : "12.klein", "elite.klein", "elanlist" ; + font height = 20 ; + indentation pitch = 10 ; + next smaller font = "12.klein" ; + font string = ""27"!"1""27"p"0""27"S"1"" ; + bold offset = 1 ; + + FONT : "12.hoch" ; + font height = 96 ; + indentation pitch = 10 ; + next smaller font = "12.klein" ; + font string = "" ; + bold offset = 2 ; + y offsets = 12, -12 ;#right#(* der Text wird jeweils 12 Mikroschritte unter- + #right# und überhalb der Basislinie ausgegeben *) + + FONT : "prop10", "prop" ; + font height = 12 ; + indentation pitch = 24 ; + next smaller font = "" ; + font string = ""27"!"0""27"p"1""27"T" ; + bold offset = 2 ; + + "!" , 10 ; + """" , 16 ; + "(" , 12 ; + . . . + + + + + +#ib(9)#7.5. Schnittstelle des #ib#Fontspeicher#ie#s#ie(9)# + + + +Das Paket #on("i")#font store#off("i")# liefert die folgenden Prozeduren: + +#ib#fonttable#ie# + PROC fonttable (TEXT CONST fonttable name) + Zweck: Stellt die angegebene Fonttabelle in der Task ein. Dabei wird zuerst in + der eigenen Task nach der angegebenen Fonttabelle gesucht. Existiert + die Fonttabelle in der eigenen Task nicht, so wird die Fonttabelle von + der Task "configurator" geholt. + Wenn die Fonttabelle eingestellt ist, sind in der Task nur noch die Fonts + dieser Fonttabelle bekannt. Die Einstellung vererbt sich auf die Sohn­ + tasks. + + TEXT PROC fonttable + Zweck: Liefert den Name der eingestellten Fonttabelle. + +#ib#list fonttables#ie# + PROC list fonttables + Zweck: Zeigt die Liste der verfügbaren Fonttabellen im #on("i")#notebook#off("i")#. + +#ib#list fonts#ie# + PROC list fonts + Zweck: Listet die Fonts der eingestellten Tabelle ins #on("i")#notebook#off("i")#. + + PROC list fonts (TEXT CONST fonttable name) + Zweck: Listet die Fonts der angegebenen Fonttabelle ins #on("i")#notebook#off("i")#. Die vorher + eingestellte Fonttabelle bleibt jedoch weiter eingestellt. + +#ib#x step conversion#ie# + INT PROC x step conversion (REAL CONST cm) + Zweck: Rechnet die in Zentimeter angegebene Länge in Mikroschritte der + x-Richtung um. + + REAL PROC x step conversion (INT CONST steps) + Zweck: Rechnet die in Mikroschritten der x-Richtung angegebene Länge in + Zentimeter um. + +#ib#y step conversion#ie# + INT PROC y step conversion (REAL CONST cm) + Zweck: Rechnet die in Zentimeter angegebene Länge in Mikroschritte der + y-Richtung um. + + REAL PROC y step conversion (INT CONST steps) + Zweck: Rechnet die in Mikroschritten der y-Richtung angegebene Länge in + Zentimeter um. + +#ib#on string#ie# + TEXT PROC on string (INT CONST modification) + Zweck: Liefert die in der Fonttabelle spezifizierte Befehlssequenz, um eine + Modifikation anzuschalten. Es gibt die folgenden Modifikationen + 1 underline + 2 bold + 4 italics + 8 reverse + +#ib#off string#ie# + TEXT PROC off string (INT CONST modification) + Zweck: Liefert die in der Fonttabelle spezifizierte Befehlssequenz, um eine + Modifikation auszuschalten. Es gibt die folgenden Modifikationen + 1 underline + 2 bold + 4 italics + 8 reverse + +#ib#font#ie# + INT PROC font (TEXT CONST font name) + Zweck: Liefert die interne Fontnummer des Fonts. Mit dieser Fontnummer + können die weiteren Informationen über den Font angefordert werden. + Existiert kein Font mit diesem Namen, so wird Null geliefert. + + TEXT PROC font (TEXT CONST font nr) + Zweck: Liefert den Fontnamen des Fonts mit der angegeben Fontnummer. Hat + der Font mehrere Namen, so wird der erste Name der Namensliste aus + der Fontdatei geliefert. Existiert kein Font unter dieser Nummer, so wird + #on("i")#niltext#off("i")# geliefert. + +#ib#font exists#ie# + BOOL PROC font exists (TEXT CONST font name) + Zweck: Informationsprozedur zur Abfrage der Existenz eines Fonts. + +#ib#next smaller font exists#ie# + BOOL PROC next smaller font exists (INT CONST font nr, + INT VAR next smaller font) + Zweck: Informationsprozedur zur Abfrage der Existenz des nächst kleineren + Fonts. Wenn er existiert, wird die Fontnummer dieses Fonts zurück­ + geliefert. + +#ib#next larger font exists#ie# + BOOL PROC next larger font exists (INT CONST font nr, + INT VAR next larger font) + Zweck: Informationsprozedur zur Abfrage der Existenz des nächst größeren + Fonts. Wenn er existiert, wird die Fontnummer dieses Fonts zurück­ + geliefert. + +#ib#indentation pitch#ie# + INT PROC indentation pitch (INT CONST font nr) + Zweck: Liefert die Einrückbreite in Mikroschritten der x-Richtung. Sie sollte eine + mittlere Breite der Zeichen sein, denn mit ihr werden die Einrückungen + und Aufzählungen berechnet. + +#ib#font lead#ie# + INT PROC font lead (INT CONST font nr) + Zweck: Liefert den Durchschuss des Fonts in Mikroschritten der y-Richtung. + Der Druchschuß ist der Zwischenraum zwischen den einzelnen Zeilen + bei einfachem Zeilenvorschub. + +#ib#font height#ie# + INT PROC font height (INT CONST font nr) + Zweck: Liefert die Höhe des Fonts in Mikroschritten der y-Richtung. Die Fon­ + thöhe ist die Distanz von der Basislinie bis zur Oberkante des höchsten + Zeichens. + +#ib#font depth#ie# + INT PROC font depth (INT CONST font nr) + Zweck: Liefert die Tiefe des Fonts in Mikroschritten der y-Richtung. Die Fonttie­ + fe ist die Distanz von der Basislinie bis zur Unterkante des tiefsten + Zeichens. + +#ib#font string#ie# + TEXT PROC font string (INT CONST font nr) + Zweck: Liefert den Fontstring des Fonts. Der Fontstring enthält die Befehls­ + sequenz, um den Drucker auf diesen Font umzuschalten. + +#ib#y offsets#ie# + TEXT PROC y offsets (INT CONST font nr) + Zweck: Liefert einen Text mit den y-Verschiebungen von der Basislinie. Die + einzelnen Verschiebungen können mit dem Operator 'ISUB' abgefragt + werden. + +#ib#bold offsets#ie# + INT PROC bold offsets (INT CONST font nr) + Zweck: Liefert die 'bold'-Verschiebung. + +#ib#char pitch#ie# + INT PROC char pitch (INT CONST font nr, TEXT CONST char) + Zweck: Liefert die Breite des Zeichens in Mikroschritten der x-Richtung. + +#ib#replacement#ie# + TEXT PROC replacement (INT CONST font nr, TEXT CONST char) + Zweck: Falls das Zeichen eine Ersatzdarstellung hat, so wird diese geliefert, + anderfalls das Zeichen selbst. + +#ib#get font#ie# + PROC get font (INT CONST font nr, + INT VAR indentation pitch, font lead, font height, font depth, + ROW 256 INT VAR pitch table) + Zweck: Die Variablen liefern die entsprechenden Informantionen über den + Font. Der Eintrag des Codewerts eines Zeichens plus eins in der Brei­ + tentabelle liefert die Breite dieses Zeichens. + +#ib#get replacements#ie# + PROC get replacements (INT CONST font nr, + TEXT VAR replacements, + ROW 256 INT VAR replacement table) + Zweck: In der Fonttabelle kann für jedes Zeichen eine Ersatzdarstellung an­ + gegeben werden. Diese Ersatzdarstellungen werden mit dieser Proze­ + dur geliefert. Dabei stehen in der Textvariablen 'replacement' die ge­ + samten Ersatzdarstellungen des Fonts. Die Ersatzdarstellungstabelle + enthält Zeiger auf den Text der Ersatzdarstellungen. Die Ersatzdarstel­ + lung eines Zeichnes bestimmt sich wie folgt: + + + ersatzdarstellung : + INT CONST wert := replacement table (code( zeichen ) + 1); + IF wert > 0 + THEN INT CONST ende := wert + code (replacements SUB wert); + subtext (replacements, wert + 1, ende) + ELSE zeichen + FI. + + +Bei den Prozeduren des Packets #on("i")#font store#off("i")# können die folgenden Fehlerfälle auftreten: + + - Fonttabelle noch nicht eingestellt + Es wurde noch keine Fonttabelle in der Task eingestellt. + + - Fonttabelle "fonttable name" gibt es nicht + Die angegebene Fonttabelle wurde weder in der eigenen Task, noch in der + Task 'configurator' gefunden. + + - Font 'font nr' gibt es nicht + Unter der angegebenen Fontnummer gibt es in der eingestellten Font­ + tabelle keinen Font. Speziell ist das für 'font nr' = 0 der Fall, falls ein Font­ + name nicht gefunden wurde. + + - unzulaessige Modifikation + Die angegebene Modifikation ist ungleich 1, 2, 4 oder 8. +#page# + +#headeven# + +%#center#EUMEL-Systemhandbuch + + +#end# +#headodd# + +#center#8. Verschiedenes#right#% + + +#end# + +#ib(9)#8. Verschiedenes#ie(9)# + + + + +#ib(9)#8.1. Der Spoolmanager#ie(9)# + + +Der "#ib#Spoolmanager#ie#" verwaltet eine #ib#Warteschlange von Datenräumen#ie# (Dateien), die von +einem "#ib#Server#ie#" abgearbeitet werden sollen. Dabei puffert der Spoolmanager Dateien, +die von beliebigen Tasks geschickt werden können, in einer Warteschlange und gibt +sie der Reihe nach dem Server zur eigentlichen Verarbeitung. Ein typischer Einsatzfall +(aber nicht der einzige) für ein solches System ist der Druck von Dateien in Multi- +User-Systemen. Unabhängig davon, ob der Drucker gerade aktiv ist und wieviele +Dateien noch auf den Ausdruck warten, kann jeder seine Datei dem Druckerspool (in +der Regel die Task "PRINTER") senden und sofort danach weiterarbeiten. + + + +#ib(9)#Prozeduren des Spoolmanagers#ie(9)# + + +Im privilegierten Ast des Taskbaumes (Söhne von "SYSUR"), stehen die folgenden +Prozeduren zur Einrichtung eines Spoolmanagers zur Verfügung. + +#ib#spool manager#ie# + PROC spool manager (PROC server, BOOL CONST with start) + Zweck: Die Task, in der die Prozedur aufgerufen wird, wird zum Spoolmanager. + Wenn 'with start' auf TRUE gesetzt ist, wird eine Server-Task als unbe­ + nannter Sohn ("-") eingerichtet und mit der übergebenen 'PROC server' + gestartet. Anderfalls muß der Spool durch den Benutzer mit Hilfe der + Spoolkommandos (siehe dort) gestartet werden. + + PROC spool manager (PROC server) + Zweck: Diese Prozedur ruft die Prozedur 'spool manager' mit 'with start' gleich + TRUE auf. + + +Mit Hilfe der folgenden Prozeduren kann der Spool eingestellt werden. + +#ib#station only#ie# + PROC station only (BOOL CONST flag) + Zweck: Wenn flag auf TRUE gesetzt ist, nimmt der Spooler nur Aufträge von + Tasks der eigenen Station entgegen. + Voreinstellung: 'station only (FALSE)'. + + BOOL PROC station only + Zweck: liefert TRUE, wenn der Spooler nur von der eigenen Station benutzt + werden darf. + +#ib#spool duty#ie# + PROC spool duty (TEXT CONST duty) + Zweck: Mit dieser Prozedur kann ein Text im Spooler eingestellt werden, der die + Aufgabe des Spoolers beschreibt. Dieser wird beim 'list' gemeldet. + + TEXT PROC spool duty + Zweck: Liefert die eingestellte Text-Beschreibung der Aufgabe des Spools. + +#ib#spool control task#ie# + PROC spool control task (TASK CONST task) + Zweck: Diese Prozedur gibt der Task 'task' und ihrer Söhne die Berechtigung + Spoolkommandos (z.B. 'stop' oder 'start') an den Spoolmanager zusen­ + den. Dabei muß die Task auf derselben Station wie der Spool sein und + in der Task muß die Datei "spool cmd", die sich auf dem Standardar­ + chiv befindet, insertiert werden. + Wird "SUPERVISOR" als Spoolkontrolltask eingestellt, so können alle + Tasks der Station, in denen die Datei "spool cmd" insertiert ist, die + Spoolkommandos geben. + + TASK PROC spool control task + Zweck: Liefert die Taskidentifikation der Spoolkontrolltask. + +#ib#server channel#ie# + PROC server channel (INT CONST channel) + Zweck: Mit Hilfe dieser Prozedur wird im Spoolmanager eine Kanalnummer + eingestellt, die der Server mit der Prozedur 'server channel' abfragen + kann. + Fehlerfall: + * falsche Kanalangabe + Der angegebene Kanal ist kleiner als 1 oder größerer als 32. + + INT PROC serverchannel + Zweck: Liefert die Nummer des Kanals, der im Spool eingestellt ist. + +#on("b")#Anmerkung:#off("b")# Soll im nicht-privilegierten Ast des Taskbaums (Söhne von "PUBLIC") ein + Spool eingerichtet werden, so muß dort die Datei "spool manager", die + sich auf dem Standardarchiv "std.zusatz" befindet, insertiert werden. + + + + +#ib(9)##ib#Spoolkommandos#ie##ie(9)# + + +Ein Spool kann zur Verwaltung der Warteschlange wie jede andere Task ans Termi­ +nal gekoppelt werden. Danach stehen die folgenden Spoolkommandos zur Verfügung. +Diese Kommandos sind keine Prozeduren, sondern werden nur interpretiert. Sie dürfen +also nur alleine eingegeben werden. Nach Beendigung der Verwaltungsaufgaben muß +der Spool mit dem Kommando 'break' verlassen werden, da sonst keine weiteren +Aufträge an den Spool gesendet werden können und auch die Warteschlange nicht +weiter abgearbeitet wird. + +#ib#stop#ie# + Zweck: Die Server-Task wird gelöscht und dadurch der Spool deaktiviert. Der + Spool empfängt zwar noch weitere Aufträge und sortiert diese in die + Warteschlange ein. Die Warteschlange wird aber nicht weiterabgearbei­ + tet. Ein eventuell von der Server-Task belegter Kanal wird freigegeben. + Ist bei einem 'stop' noch ein Auftrag in Bearbeitung, so wird dieser + Auftrag abrupt abgebrochen. Es wird jedoch angefragt, ob der Auftrag + nochmal neu an die erste Stelle in der Warteschlange eingetragen wer­ + den soll. + Ist ein Spool deaktiviert, so wird dies bei einem 'list' angezeigt, + +#ib#halt#ie# + Zweck: Der Spool deaktiviert sich nach Abarbeitung des Auftrags, der gerade + bearbeitet wird. Bei einem 'list' wird dies vermerkt. + +#ib#start#ie# + Zweck: Der Spool wird aktiviert, indem eine neue Server-Task begonnen wird. Ist + der Spool zuvor nicht gestoppt worden, so wird zuerst ein 'stop' durch­ + geführt. + Wurde mit der Prozedur 'server channel' kein Kanal eingestellt, so wird + die Warnung + WARNUNG : Serverkanal nicht eingestellt + ausgeben. Der Spool wird trotzdem gestartet. + +start (kanal nummer) + Zweck: Vor dem Start des Spools wird zuerst mit der Prozedur 'server channel' + der angegebene Kanal eingestellt. + +#ib#first#ie# + Zweck: Im Dialog kann ein Auftrag in der Warteschlange auf den ersten Platz + vorgezogen werden. + +#ib#killer#ie# + Zweck: Im Dialog werden alle Aufträge der Warteschlange zum Löschen ange­ + boten. + +#ib#list spool#ie# + Zweck: Der aktuelle Zustand des Spools und die Warteschlange werden geli­ + stet. + +Ist nun eine Spoolkontrolltask eingestellt worden (siehe 'spool control task'), so muß in +ihr die Datei "spool cmd" insertiert werden. Danach stehen die folgenden Prozeduren +zur Verfügung. + +#ib#stop#ie# + PROC stop (TASK CONST spool) + Zweck: Dem Spool 'spool' wird ein 'stop' zugestellt, was den Spool deaktiviert. + Wird noch ein Auftrag bearbeitet, so wird angefragt, ob dieser neu + eingetragen werden soll. + +#ib#halt#ie# + PROC halt (TASK CONST spool) + Zweck: Dem Spool 'spool' wird ein 'halt' zugestellt, d.h der Spool deaktiviert + sich nach Beendigung des aktuellen Auftrags. + +#ib#wait for halt#ie# + PROC wait for halt (TASK CONST spool) + Zweck: Dem Spool 'spool' wird ein 'halt' zugestellt. Die Task wartet jedoch auf + eine Rückantwort, die ihr der Spool sendet, wenn er sich nach Been­ + digung des aktuellen Auftrags deaktiviert hat. + Fehlerfall: + * Task "task name" wartet schon auf halt + Die angegebene Task wartet schon auf eine Rückantwort des Spools + 'spool'. + +#ib#start#ie# + PROC start (TASK CONST spool) + Zweck: Dem Spool 'spool' wird ein 'start' zugestellt, wodurch der Spool sich + aktiviert. War der Spool zuvor nicht deaktiviert, so wird er zuerst ge­ + stoppt. + +#ib#first#ie# + PROC first (TASK CONST spool) + Zweck: Im Dialog kann einer der Aufträge in der Warteschlange des Spools + 'spool' auf den ersten Platz vorgezogen werden. + +#ib#killer#ie# + PROC killer (TASK CONST spool) + Zweck: Im Dialog werden die Aufträge der Warteschlange des Spools 'spool' + zum Löschen angeboten. + + + +#ib(9)#Arbeitsweise des #ib#Servers#ie##ie(9)# + + +Der Server wird vom Spoolmanager mit einer Prozedur gestartet, die die Abarbeitung +der Warteschlange vornimmt. Dabei muß diese Prozedur zuerst den Datenraum mit +dem 'fetch code' (= 11) holen. Danach kann der Server sich noch mit dem 'fetch +param code' (= 21) die Dateiparameter (Dateiname, Schreib- und Lesepaßwort, Sen­ +dername und Senderstation) abholen und mit der Bearbeitung des Auftrags beginnen. + +Beispiel: + + +LET fetch code = 11, + param fetch code = 21; +BOUND STRUCT (TEXT name, write pass, read pass, sendername, + INT senderstation ) VAR msg; +DATASPACE VAR ds, param ds; +INT VAR reply; + +spool manager (PROC server); + +PROC server : + disable stop; + continue (server channel); + REP forget (ds); ds := nilspace; + call (father, fetch code, ds, reply); + forget (param ds); param ds := nilspace; + call (father, param fetch code, param ds, reply); + msg := param ds; + execute spool; + IF is error THEN error treatment FI; + PER; +END PROC server; + +PROC execute spool : + enable stop; + ... + + + + + +#ib(9)#Senden eines Auftrags an den Spool#ie(9)# + + +Jede Task kann jedem Spool durch Aufruf von '#ib#save#ie#' eine Datei senden. + +Beispiel: + + + save ("datei name", task ("spool name")) + + +Dieses 'save'-Kommando funktioniert zweiphasig. Dabei wird in der ersten Phase dem +Spool die Dateiparameter zugesendet. In der zweiten Phase folgt dann der Datenraum +selber. Bei Netzübertragung zu einem Spool ist dieses zweiphasige 'save' jedoch +nachteilig. Deshalb können Dateien vom Typ 'FILE' auch mit einem einphasigen 'save' +unter dem 'file save code' (= 22) an den Spool gesendet werden. Die #on("i")#'headline'#off("i")# dieser +Dateien muß jedoch dann auf eine bestimmte Art und Weise aufbereitet werden, so +daß sie die Dateiparameter enthält. Beim Aufbau der #on("i")#'headline'#off("i")# muß eine Information +muß mit dem Code 0 beginnen und dem Code 1 enden. Die Dateiparamter müssen +dann mit der folgenden Reihenfolge in die #on("i")#'headline'#off("i")# eingetragen werden. + + - Dateiname + - Schreibepaßwort + - Lesepaßwort + - Name des Senders + - Station des Senders + +Beispiel: + + +... +LET file save code = 22; +DATASPACE VAR ds := old (file name); +FILE VAR file := sequential file (input, ds); +INT VAR reply; +headline (file, ""0"" + file name + + ""1""0"" + write password + + ""1""0"" + read password + + ""1""0"" + name (myself) + + ""1""0"" + text (station (myself)) + ""1""); +call (spool task, file save code, ds, reply); +... + + +Der Spoolmanager setzt bei Dateien, die mit dem 'file save code' angeliefert werden +die #on("i")#'headline'#off("i")# wieder auf den Dateinamen. + +Den Benutzer stehen neben dem '#ib#save#ie#'-Kommando zur Übertragung einer Datei zum +Spool noch die folgenden Kommandos zur Verfügung. + + + save (ALL myself, task ("spool name")) + save (SOME myself, task ("spool name")) + + übertragung aller bzw. einiger Dateien der eigenen Task zum Spool. + + + #ib#erase#ie# ("datei name", task ("spool name")) + erase (ALL task ("spool name"), task ("spool name")) + + Löschen eines bzw. aller eigenen Aufträge in der Warteschlange des Spools + + + #ib#list#ie# (task ("spool name")) + + Liste des Spools über den aktuellen Zustand und die Warteschlange. + +Existiert ein Spool "PRINTER", so gibt es noch die folgenden Befehle. + + + #ib#print#ie# + print ("datei name") + print (ALL myself) + print (SOME myself) + + Sie entsprechen einem 'save' an die Task "PRINTER" + + + #ib#printer#ie# + + Liefert den internen Taskbezeichner der Task "PRINTER", d.h. diese Proze­ + dur entspricht dem Aufruf von 'task ("PRINTER")'. + + + + + +#ib(9)#8.2. #ib#Freie Kanäle#ie(9)##ie# + + +Das Paket '#ib#free channel#ie#' ermöglicht in Multi-User-Systemen die Einrichtung freier +Kanäle. Freie Kanäle kann man zusätzlich zu dem Terminalkanal, der einem vom +Supervisor zugeordnet wurde, benutzen. Jeder freie Kanal wird durch eine (benannte) +Task - dem #ib#Kanalmanager#ie# - implementiert. Er wird danach mit dem Tasknamen ange­ +sprochen und kann von jeder Task belegt und wieder freigegeben werden. Während +einer Belegung können andere Tasks den Kanal nicht benutzen. Der Kanalmanager +koppelt sich für jede Belegung an den physikalischen Kanal an und gibt ihn danach +auch wieder frei. Ein physischer Kanal kann also im Wechsel von mehreren Kanalma­ +nagern oder einem Kanalmanager und "normalen" Tasks belegt werden. + +Das Paket 'free channel' muß beim Kanalmanager und allen Benutzern des Kanals +bzw. bei einem gemeinsamen Vater insertiert sein. + + +#ib#FCHANNEL#ie# + Zweck: Der Datentyp FCHANNEL spezifiziert einen freien Kanal. Die Assoziie­ + rung mit einem realen freien Kanal erfolgt mit der Prozedur 'free chan­ + nel' und der Zuweisung ':=' (ähnlich wie beim Datentyp FILE). + +:= + OP := (FCHANNEL VAR dest, FCHANNEL CONST source) + Zweck: Zuweisung. Wird insbesondere bei der Assoziation (Assoziation: Verbin­ + dung zwischen FCHANNEL VAR und Kanal) benötigt. + +#ib#close#ie# + PROC close (FCHANNEL VAR f) + Zweck: Der belegte FCHANNEL wird freigeben. + + PROC close (TEXT CONST channel name) + Zweck: Der namentlich spezifizierte Kanal wird freigegeben. + +#ib#dialogue#ie# + PROC dialogue (FCHANNEL CONST f, TEXT CONST end of dialogue char) + Zweck: Der Terminalkanal wird direkt mit dem angegebenen freien Kanal ge­ + koppelt. (Das Benutzerterminal wird "durchgeschaltet".) Eingaben am + Terminal werden auf 'f' ausgegeben, auf 'f' ankommende Daten werden + auf dem Benutzerterminal ausgegeben. Der Datenverkehr erfolgt im + #ib#Vollduplexmodus#ie#, d.h. der Datenverkehr beider Richtungen läuft unab­ + hängig voneinander parallel. Hiermit können Terminals dynamisch an + andere Rechner gekoppelt werden. Der Dialogzustand wird durch Ein­ + gabe des 'end of dialogue char' am Benutzerterminal beendet. + +#ib#fetch#ie# + PROC fetch (FCHANNEL VAR channel, TEXT CONST filename, controlchars) + Zweck: Die angegebene datei wird über den Kanal 'channel' eingelesen. Dabei + besteht 'control chars' aus zwei bis vier Zeichen + (eof + eol + handshake + handshake prompt) + eof: + Dieses Zeichen wird als Dateiabschluß erwartet. + eol: + Dieses Zeichen wird als Zeilenende erwartet. + handshake, handshake prompt: + Falls 'handshake prompt <> "" ' ist, wird bei dem Empfang eines + Prompt­Zeichen eine Quittung (Handshake­Zeichen) ausgegeben. + +#ib#free channel#ie# + FCHANNEL PROC free channel (TEXT CONST channel name) + Zweck: Der namentlich spezifizierte Kanal wird belegt und als FCHANNEL + geliefert. + Fehlerfälle: + * task not existing + * channel not free + + PROC free channel (INT CONST physical channel number) + Zweck: Installiert die eigene Task als Kanalmanager für den angegebenen + physikalischen Kanal. + +#ib#in#ie# + PROC in (FCHANNEL CONST f, TEXT VAR response) + Zweck: Es werden die Daten geliefert, die seit dem letzten 'in'­Aufruf bzw. seit + der Assoziierung eingetroffenen Daten geliefert. Bei 'niltext' liegen keine + Eingabedaten vor. + +#ib#open#ie# + PROC open (FCHANNEL VAR f) + Zweck: Der Kanal wird neu belegt. Die Assoziation erfolgt mit dem gleichen + Kanal wie bei der letzten Assoziation. + Fehlerfälle: + * "task" gibt es nicht + * Kanal ist nicht frei + +#ib#out#ie# + PROC out (FCHANNEL VAR f, TEXT CONST message) + Zweck: Der übergebene Text wird auf dem Kanal 'f' ausgegeben. + +#ib#save#ie# + PROC save (FCHANNEL VAR f, TEXT CONST name, control chars) + Zweck: Die übergebene Datei muß eine Textdatei sein (Struktur eines FILEs + haben). Sie wird komplett auf dem Kanal 'f' ausgegeben. + Dabei bestehen 'control chars' aus bis zu drei Zeichen: + (eof char + eol char + handshake option) + eof char: + Dieses Zeichen wird als Dateiabschluß geschickt. + eol char: + Dieses zeichen wird als Zeilenabschluß geschickt. + handshake option: + Falls die 'control chars' drei Zeichen umfassen, wird nach jeder + Zeile auf das als drittes definierte Handshake­Zeichen gewartet. + +Beispiele: + + + a) FCHANNEL VAR f := free channel ("otto") ; + TEXT VAR antwort ; + out (f, "hallo") ; + in (f, antwort) ; + put (antwort) ; + close (f) ; + + b) open (f) ; + REP + out (f, "hallo ") ; + in (f, antwort) + UNTIL antwort <> "" PER ; + put (antwort) ; + close (f) ; + + c) open (f) ; + dialogue (f, "§") ; + close (f) + diff --git a/doc/user/benutzerhandbuch.1 b/doc/user/benutzerhandbuch.1 new file mode 100644 index 0000000..7c8fec7 --- /dev/null +++ b/doc/user/benutzerhandbuch.1 @@ -0,0 +1,580 @@ +____________________________________________________________________________ + + +#on("b")##on ("u")# +#center#Betriebssystem E U M E L +#off ("u")# + + +#center#Benutzerhandbuch + + + + +#off("b")# +#center#Lizenzfreie Software der +#on ("b")# + +#center#Gesellschaft für Mathematik und Datenverarbeitung mbH, +#center#5205 Sankt Augustin + + +#off("b")# +#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für +#center#nichtkommerzielle Zwecke gestattet. + +#center#Gewährleistung und Haftung werden ausgeschlossen + + +____________________________________________________________________________ +#page# + +#start(5.0,1.5)##pagenr("%",1)##setcount(1)##block##pageblock##count per page# +#headeven# +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# + EUMEL-Benutzerhandbuch +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#headodd# +#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")# +#table# + Teil 1: Einleitung +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#bottomeven# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +1 - % GMD +#tableend##clearpos# +#end# +#bottomodd# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +GMD 1 - % +#tableend##clearpos# +#end# +TEIL 1: Einleitung +#free(1.0)# + +1.1. Vorwort +#free(1.0)# + +Dieses Buch bietet Ihnen eine Anleitung zur Handhabung des Betriebssystems +EUMEL in Hinblick auf die Textverarbeitung. Das Buch wendet sich somit an alle, die +das leicht erlernbare EUMEL-System zur Erstellung von Texten jeglicher Art und +jeden Umfangs nutzen wollen. + +Die Anleitung erfordert keinerlei Vorkenntnisse, weder von Computern im allgemei­ +nen noch von EUMEL im besonderen. Neulingen auf dem Gebiet der Benutzung eines +Computers sei empfohlen, dieses erste Kapitel, das sich kurz mit der 'grauen Theorie' +beschäftigt, mindestens zweimal zu lesen: + +- Der erste Durchgang sollte nur einer groben Orientierung dienen. Die Begriffe, die + teilweise erst im routinierteren Umgang Sinn gewinnen, sollten Sie 'mal gehört' + haben, um die folgenden Kapitel leichter lesen zu können. + +- Der zweite Durchgang erscheint uns sinnvoll, wenn Sie sich 'freigeschwommen' + haben. Wenn der Umgang mit dem EUMEL-System Ihnen nach einigen Tagen + schon vertrauter erscheint, ist es zweckmäßig, sich auf dem Hintergrund der + gemachten Erfahrungen die Erklärungen noch einmal durchzulesen. Einige der + Begriffe werden erst dann wirklich verständlich und manche Unsicherheit wird + beseitigt werden. + +Die weiteren Teile des Buches geben dann Anleitung vom ersten Einstieg ins +EUMEL-System bis hin zur detaillierten Beschreibung der Textverarbeitung. Alle in +Teil 3 und 4 enthaltenen Beispiele sollten Sie sorgfältig durchgehen und am Bild­ +schirm nachvollziehen. Aus dem Teil 5 können Sie nach eigener Einschätzung zu­ +nächst die Bereiche auswählen, die Sie selbst für besonders wichtig halten. Sie wer­ +den feststellen, daß Sie durch den Umgang mit der EUMEL-Textverarbeitung mit +fortschreitender Routine immer mehr der gebotenen Möglichkeiten hinzunehmen +werden. +#free(1.0)# +Was ist ein Betriebssystem ? + +Ein #ib#Betriebssystem#ie# ist eine Sammlung von Programmen, die dem Benutzer eines +Computers die Arbeit mit diesem Gerät erst ermöglichen. Die Programme des Be­ +triebssystems stellen die Verbindung zwischen den Bausteinen eines Computers, der +Hardware, und den Anwendungsprogrammen eines Benutzers her. + +Alle Programme, die diese riesige Lücke schließen und z.B. dafür sorgen, daß der +Befehl: #on("i")#drucke ("diesen brief")#off("i")# tatsächlich dazu führt, daß der eben noch am Bild­ +schirm verfaßte Brief zum Drucker gesendet und dort ausgedruckt wird, sind soge­ +nannte Systemprogramme, Teile des Betriebssystems. + +Dieses Benutzerhandbuch zum Betriebssystem EUMEL wird Ihnen schrittweise die +Befehle erklären, die Sie zur Nutzung aller Möglichkeiten der Textverarbeitung mit +EUMEL verwenden können, und Ihnen somit einen Teil des Betriebssystems vorstel­ +len. +#free(1.0)# +Ist EUMEL anders als andere ? + +#on("b")#Ja.#off("b")# Das Betriebssystem EUMEL (#on("b")#E#off("b")#xtendable multi #on("b")#U#off("b")#ser #on("b")#M#off("b")#icroprocessor #on("b")#EL#off("b")#an Sy­ +stem) erklärt durch seinen voll ausgeschriebenen Namen einen wesentlichen Unter­ +schied zu anderen Systemen: "Erweiterbares Mehrbenutzer Mikroprozessor ELAN- +System." + +Während andere auf Mikroprozessoren (und damit auf sogenannte Personal Compu­ +ter) abgestimmte Betriebssysteme #on("u")#einen#off("u")# Benutzer bei seiner Arbeit unterstützen, ist +EUMEL fähig, #on("u")#mehreren#off("u")# Anwendern gleichzeitig die Benutzung eines Computers zu +ermöglichen. Natürlich funktioniert EUMEL ebensogut für einen einzigen Benutzer. Es +gibt aber bei EUMEL die Möglichkeit, durch Ankoppeln weiterer Bildschirme an den +Rechner und #on("b")#ohne#off("b")# Kosten für zusätzliche Software mehreren Benutzern gleichzeitig +die Arbeit an diesem Rechner zu ermöglichen. + +Zweitens ist EUMEL hardwareunabhängig, das heißt, gleichgültig von welchem Her­ +steller Ihr Computer stammt, die Bedienung und die Kommandosprache ist immer +gleich. Auch können Disketten, die mit einem XY-Rechner beschrieben wurden, von +einem ABC-Computer gelesen werden; durchaus keine Selbstverständlichkeit. + +Eine weitere Besonderheit des EUMEL-Systems macht alle froh, die damit arbeiten: +EUMEL ist durchgängig in der Programmiersprache ELAN gehalten. Auch wenn Sie +(noch) nicht programmieren möchten, erleichtert Ihnen ELAN das Leben dadurch, daß +Sie schreiben können, was Sie meinen: eine Datei, die einen Geschäftsbrief fix und +fertig und druckbereit enthält, heißt nicht etwa: + + $TXT.PRT + +sondern: + + Angebot an Fa.Müller 1.7.86 + + +Ein weiterer wichtiger Unterschied wird Ihnen bewußt werden, wenn Sie ein anderes +Betriebssystem kennen: Die EUMEL-Textverarbeitung ist kein zusätzliches Programm +mit eigener Kommandosprache, welches bei Bedarf geladen werden muß, sondern +steht jederzeit, im wahrsten Sinne des Wortes auf Knopfdruck, zu Ihrer Verfügung. +#free(1.5)# +1.2. Wichtige Begriffe +#free(1.0)# +- #on("b")#TASK#off("b")#. Eine #ib#Task#ie# ist ein eigenständiger Prozeß innerhalb eines EUMEL-Systems, + der entweder zur Verwaltung des EUMEL-Systems oder zu einem Benutzer + gehört. Indem jedem Benutzer ein eigener Arbeitsbereich zugewiesen ist, wird + verhindert, daß unkontrolliert auf fremde Daten zugegriffen wird. Eine Task hat + einen Namen, mit dem sie angesprochen werden kann. Ein EUMEL-System + besteht aus mehreren Tasks. + + Ein brauchbarer Vergleich mit einem EUMEL-Tasksystem ist ein Firmengebäude: + Es besteht aus vielen Räumen und jeder Raum ( = Task ) ist entweder ein nor­ + males Arbeitszimmer oder ein Chefzimmer oder eine Werkstatt, in der Dienst­ + leistungen für andere erledigt werden. + + Eine solche Ordnung zeigt folgendes Tasksystem; der #on("i")#kursiv#off("i")# gesetzte Kommentar + zeigt die Benennung der 'Dienstposten' eines vergleichbaren Büros: + + + SUPERVISOR #on("i")#(* Zimmerverwalter *)#off("i")# - + - + + SYSUR #on("i")#(* Werkstattmeister *)#off("i")# + + + ARCHIVE #on("i")#(* Archivar *)#off("i")# + + configurator #on("i")#(* Elektriker *)#off("i")# + + OPERATOR #on("i")#(* Hausmeister *)#off("i")# + + shutup #on("i")#(* Nachtwächter *)#off("i")# + + UR #on("i")#(* Aufsichtsrat *)#off("i")# + + PUBLIC #on("i")#(* Abteilungsleiter *)#off("i")# + + Meier #on("i")#(* Angestellter *)#off("i")# + Müller #on("i")#(* " *)#off("i")# + Schulze #on("i")#(* " *)#off("i")# + + + Bildlich gesprochen stellt eine Task also ein 'Arbeitszimmer' für einen EUMEL- + Benutzer dar. Als EUMEL Anwender richten Sie sich Ihre Task selbst ein, indem + Sie das Kommando 'begin ("taskname")' geben. + + Nachdem Sie dieses Kommando einmal gegeben haben, existiert diese Task unter + dem von Ihnen gewählten Namen. + + In der Task (also sinngemäß im Arbeitszimmer) arbeiten Sie - insbesondere legen + Sie Dateien (= Akten) an. Dateien existieren nur innerhalb einer Task. + + Tasks werden durch den SUPERVISOR verwaltet, er regelt den Zugriff auf Tasks. + Um Ihre Task zu verlassen, geben Sie das Kommando 'break' an den + SUPERVISOR, um sie wieder zu betreten, das Kommando 'continue ("taskna­ + me")'. + + +- #on("b")#DATEI#off("b")#. Eine #ib#Datei#ie# ist eine Menge von zusammengehörigen Daten. Eine Datei in + einer Task entspricht einer Akte in einem Arbeitszimmer. Eine Task kann bis zu + 200 Dateien enthalten. Jede Datei in einer Task hat einen eigenen Namen, in ver­ + schiedenen Tasks dürfen gleichnamige Dateien existieren. Eine Datei ist in Zeilen + unterteilt. + + Für die Arbeit in einer Datei am Bildschirm muß auf die Datei mit dem Editor + zugegriffen werden: 'edit ("dateiname")', danach kann der Inhalt der Datei am + Terminal bearbeitet werden (siehe Kapitel 4 und 5). + + +- #on("b")#KOMMANDO#off("b")#. Ein #ib#Kommando#ie# ist ein Befehl an den Rechner, eine Arbeit zu tun. + Welche Kommandos Sie dem Rechner zum jeweiligen Zeitpunkt geben können, + hängt davon ab, auf welcher 'Kommandoebene' Sie sich befinden. Als Anhalt gilt: + + - Kommandos auf Supervisor-Ebene betreffen das Tasksystem. + + - Kommandos auf Monitor-Ebene betreffen die eigene Task oder Dateien. + + - Kommandos auf Editor- Ebene betreffen Zeilen, Worte oder einzelne Zeichen + der aktuellen Datei. + + Auf welcher Ebene Sie sich befinden, werden Sie nach kurzer Gewöhnung leicht + am Bildschirm erkennen (siehe Teil 3). + + Bei manchen Kommandos muß nicht nur gesagt werden, was getan werden soll, + sondern auch, womit es getan werden soll. Eine solche Angabe zum Kommando + heißt #ib#Parameter#ie#. + Kommando Parameter + | | + Beispiel: Lege neue Task an = begin ("taskname") + Drucke Datei = print ("dateiname"). + Suche das Wort ENDE = down ("ENDE") + + Parameter werden in runde Klammern gesetzt und ggf. durch Kommata voneinan­ + der getrennt. Textparameter werden zusätzlich in Anführungsstriche gesetzt. + + Ein Kommando kann keinen, einen oder viele Parameter benötigen; die + Beschreibung der Kommandos in diesem Buch zeigt jeweils alle Möglichkeiten. + + +- #on("b")#SUPERVISOR#off("b")#. Spezielle Task zur Überwachung eines EUMEL-Systems. Ein + Benutzer kann durch die #ib#Supervisor#ie#-Kommandos Leistungen von dieser Task + fordern: neue Task einrichten, Task wiederaufnehmen und diverse Informationen. + + +- #on("b")#MONITOR#off("b")#. Befehlsempfänger in einer Task. Jede Arbeit im EUMEL-System + findet in einer Task statt. Die Arbeit mit einem Computer besteht in wesentlichen + Teilen im Aufruf von Programmen durch Kommandos. Der Empfänger dieser + Kommandos in einer Task ist der #ib#Monitor#ie#. Der Monitor ist sichtbar durch eine + Zeile, in der 'gib kommando' steht. In diese Zeile werden #ib#Kommando#ie#s und erfor­ + derliche Parameter eingegeben. + + +- #on("b")#ARCHIVE#off("b")#. Spezielle Task zur Verwaltung des Diskettenlaufwerks. Da für die + längerfristige Datenhaltung und zur zusätzlichen Datensicherung Dateien auf + Disketten geschrieben werden, besitzt das EUMEL-System für diese Aufgabe + eine besondere Task, die die Bedienung vereinfacht und exklusiven Zugriff auf das + Laufwerk garantiert. + + +- #on("b")#EDITOR#off("b")#. Programm zur Dateibearbeitung am Bildschirm. Das Programm wird + durch das ( Monitor- ) Kommando 'edit' und die Eingabe des Namens der ge­ + wünschten Datei als Parameter gestartet. + + Da ein Bildschirm normelerweise auf 80 Zeichen Zeilenbreite und 24 Zeilen be­ + schränkt ist, kann der Editor als Fenster betrachtet werden, das über die mögli­ + cherweise weitaus größere Datei bewegt wird und durch das der betrachtete Aus­ + schnitt der Datei bearbeitet werden kann. + + + +-------------------------------------------------------------------+ + i i + i i + +------------------------------------+ i + i i i + i Der Editor, Fenster zur i i + i Dateibearbeitung i i + i i i + +------------------------------------+ i + i i + +-------------------------------------------------------------------+ + + + + + + + + + + +1.3. Die Notation in diesem Buch +#free(1.0)# +Im weiteren Text werden Sie schrittweise in die Bedienung des Systems eingeführt. +Für alle Kommandos und Arbeiten haben wir Beispiele in dieses Buch aufgenommen, +die Sie direkt am Rechner nachvollziehen sollten. + +Beachten Sie dabei bitte folgende Regeln der Aufschreibung: + +- Es gibt eine Reihe von Tasten auf einer Computertastatur, die eine besondere + Bedeutung haben. Diese sogenannten Funktionstasten werden ebenso wie beson­ + dere Tastenkombinationen explizit als Tasten dargestellt: + + + + + + + + + +- Alles, was Sie am Bildschirm Ihres Rechners schreiben oder lesen sollen, ist in + Textbereiche, die einen Bildschirm darstellen, eingefaßt. + + Beispiel: + +____________________________________________________________________________ + +gib kommando: +edit ("meine datei") + +____________________________________________________________________________ + + +- Innerhalb des Handbuchs sind in der Aufschreibung die Konventionen der + Programmiersprache ELAN, in der alle Programme des Betriebssystems geschrie­ + ben sind, berücksichtigt. Dabei sind folgende Besonderheiten zu beachten: + + 1) Kommandos werden grundsätzlich klein geschrieben. + + 2) Dateinamen u.ä. werden in Klammern und Anführungsstriche gesetzt. In + diesem Buch steht an den Stellen, wo ein Dateiname auftaucht #on("i")# 'dateiname' #off("i")#; + den Namen, den Sie tatsächlich verwenden, können Sie frei wählen. + + 3) Falls besondere Begriffe oder Beispiele innerhalb eines normalen Textes + auftreten, werden sie in einfache Anführungsstriche gesetzt. + + +Also: Das Kommando 'edit' benötigt als Parameter einen Dateinamen. Wählen Sie + einen Namen und geben Sie 'edit ("dateiname")' ein. Falls Sie den Namen #on("i")# + "Geschäftsbrief" #off("i")# gewählt haben, müssen Sie am Bildschirm: + + +edit ("Geschäftsbrief") + + +tippen und das Kommando mit der Taste dem Monitor zur Bearbeitung überge­ +ben: + +____________________________________________________________________________ + +gib kommando : +edit ("Geschäftsbrief") + +____________________________________________________________________________ + + + + +#on("b")##on("i")#Die Eingabe von als 'Auslöser' für die Ausführung von +Kommandos wird im weiteren nicht besonders hervorgehoben.#off("b")##off("i")# +#page# +1.4. Voraussetzungen + +#free(1.0)# +Neben dem Computer an sich ist die vollständige Installation eines EUMEL-Systems +auf diesem Computer Voraussetzung für alle im folgenden beschriebenen Aktivitäten. + +Die Beschreibung einer Systeminstallation finden Sie im Anhang I. Im weiteren gehen +wir davon aus, daß Ihr Rechner sich in einem Zustand befindet, der durch Eingabe +von oder (gleichzeitig) die sogenannte EUMEL-Tapete zeigt und +Supervisor-Kommandos annimmt. + + +____________________________________________________________________________ + + Terminal 2 + + + EUMEL Version 1.8/M + + + gib supervisor kommando: + begin("meine erste task") + + + + ESC ? --> help + ESC b --> begin("") ESC h --> halt + ESC c --> continue("") ESC s --> storage info + ESC q --> break ESC t --> task info + + +____________________________________________________________________________ + + + +Weiterführende Information zum Aufbau eines EUMEL-Systems finden Sie im An­ +hang I. + +#page# +Die Funktionstasten des EUMEL-Systems + + + +Die Lage der EUMEL-Funktionstasten entnehmen Sie bitte der speziellen Installa­ +tionsanleitung zu dem von Ihnen benutzten Gerät. #l pos (0.0)##l pos(4.0)# + + +<,>,v,^ Positionierungstasten +#table# +#free(0.5)# + Umschalttaste +#free(0.5)# + Eingabe-/ Absatztaste +#free(0.5)# + Verstärkertaste +#free(0.5)# + Löschtaste +#free(0.5)# + Einfügetaste +#free(0.5)# + Tabulatortaste +#free(0.5)# + Markiertaste +#free(0.5)# + Kommandotaste +#free(0.5)# + Supervisortaste +#free(0.5)# + Stoptaste +#free(0.5)# + Weitertaste +#tableend##clear pos# + +Task-Organisation +#free(1.0)# + +Zum Verständnis der Handhabung des Systems sollten Sie versuchen, eine Vorstel­ +lung von der Organisation der Teile zu bekommen. + +Die einzelnen #ib#Task#ie#s eines EUMEL-Systems 'stehen nicht frei im Raum', sondern +sind in einer baumartigen Beziehung organisiert: + + + +SUPERVISOR + - + SYSUR + configurator + OPERATOR + + ARCHIVE +UR + PUBLIC + Meyer + Müller + Schulze + + + +Das System besteht aus zwei Zweigen, die nebeneinander liegen: + +Dem Systemzweig mit der Wurzel SUPERVISOR + + und + +dem Benutzerzweig mit der Wurzel UR. + +Der Systemzweig stellt Ihnen privilegierte Dienstleistungen zur Verfügung, der Benut­ +zerzweig stellt die normale Arbeitsumgebung dar. + +Alle unter diesen Wurzeln liegenden Tasks des EUMEL-Systems haben mindestens +einen Vorgänger, es besteht also eine 'Vater-Sohn Beziehung' zwischen allen Tasks +des Systems. + +Grundsätzlich können Dateien ohne besondere Kommandos zur Vater-Task geschickt +und von der Vater-Task geholt werden, aber nicht zu beliebigen anderen Tasks. + +'Müller' kann eine Datei an '#ib#PUBLIC#ie#' schicken und 'Schulze' kann sie dann dort +abholen, aber eine direkte Sendung von 'Müller' nach 'Schulze' ist in der Regel nicht +möglich. + +Zur Sprechweise: jede Task, über die diese Art von 'Dateivermittlung' abgewickelt +werden kann, heißt 'Manager-Task'. Jede Task kann zum '#ib#Manager#ie#' erklärt werden. +1.5. Eine Beispielsitzung +#free(1.0)# +Der Ablauf zur Erstellung eines Schreibens stellt sich im EUMEL-System wie folgt +dar: + + SUPERVISOR aufrufen + + + +____________________________________________________________________________ + + Terminal 2 + + + EUMEL Version 1.8/M + + + gib supervisor kommando: + begin("meine erste task") + + + + ESC ? --> help + ESC b --> begin("") ESC h --> halt + ESC c --> continue("") ESC s --> storage info + ESC q --> break ESC t --> task info + + +____________________________________________________________________________ + + +Durch das Kommando 'begin ("meine erste task")', welches durch abgeschlos­ +sen werden muß, wird eine Task mit dem Namen 'meine erste task' im Benutzer­ +zweig, also unterhalb von 'PUBLIC' angelegt. Würde diese Task bereits existieren, so +könnten Sie sie mit 'continue ("meine erste task")' an das Terminal holen. + +____________________________________________________________________________ + +gib kommando : +edit ("Rechnung zum 31.12.86") + +____________________________________________________________________________ + + +In der Task eröffnen Sie eine Datei mit dem Kommando 'edit ("dateiname")'. Falls +diese Datei neu ist, erfolgt eine Kontrollfrage (zur Kontrolle der gewünschten Schreib­ +weise des Dateinamens), die Sie durch bejahen. + +Die Datei ist in diesem Beispiel bereits mit etwas Text gefüllt. Tippen Sie einen belie­ +bigen Text ein und beenden Sie die Bearbeitung dieser ersten Datei durch Drücken +der Tasten (nacheinander!). + + +____________________________________________________________________________ +.................... Rechnung zum 31.12.86 ...................... Zeile 1 + G M D + Sankt Augustin + Schloß Birlinghoven + +Sehr geehrte Damen und Herren, +> + + +____________________________________________________________________________ + + + + +Um die Arbeit in der Task zu beenden, geben Sie auch an dieser Stelle +(nacheinander!) ein. + +Nach Verlassen der Task ist wiederum die EUMEL-Tapete auf dem Bildschirm. Jede +weitere Aktion wird wiederum von hier aus durch begonnen. Insbesondere zum +#ib#Ausschalten des Geräts#ie# muß nach die Task '#ib#shutup#ie#' angestoßen werden (siehe +auch Anhang I). + diff --git a/doc/user/benutzerhandbuch.2 b/doc/user/benutzerhandbuch.2 new file mode 100644 index 0000000..0153fae --- /dev/null +++ b/doc/user/benutzerhandbuch.2 @@ -0,0 +1,443 @@ +#start(5.0,1.5)##pagenr("%",1)##setcount(1)##block##pageblock##count per page# +#headeven# +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# + EUMEL-Benutzerhandbuch +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#headodd# +#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")# +#table# + Teil 2: Der Supervisor +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#bottomeven# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +2 - % GMD +#tableend##clearpos# +#end# +#bottomodd# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +GMD 2 - % +#tableend##clearpos# +#end# + +TEIL 2: Der Supervisor +#free(1.0)# + +#ib(9)#2.1. Steuerkommandos#ie(9)# +#free(1.0)# + +Jegliche Aktivität im EUMEL-System beginnt mit dem Aufruf des SUPERVISOR +durch Drücken der Taste + + + + +Dieser Tastendruck koppelt Ihr Terminal an den Rechner an. Dieser Vorgang ist auch +dann nötig, wenn diese Geräte praktisch eine Einheit bilden. + + +____________________________________________________________________________ + + Terminal 2 + + + EUMEL Version 1.8/M + + + gib supervisor kommando: + + + + + ESC ? --> help + ESC b --> begin("") ESC h --> halt + ESC c --> continue("") ESC s --> storage info + ESC q --> break ESC t --> task info + + +____________________________________________________________________________ + + +Die auf den unteren Informationszeilen angezeigten Kommandos stehen nun zur +Auswahl. Für alle diese Kommandos gilt, daß sie entweder durch zwei aufeinander­ +folgende Tastendrücke und Kennzeichen oder auch durch vollständiges Eintip­ +pen eingegeben werden können und mit ausgelöst werden. + +Die Eingabe eines falschen Zeichens nach oder eines falschen Kommandos +wird abgewiesen. Die Eingabe ist dann zu wiederholen. + + +Bedeutung der Kommandos: + +#on("b")# +1) Steuerkommandos #off("b")# + + #ib#ESC b#ie# #ib#begin#ie# ("taskname") Task einrichten. + #ib#ESC c#ie# #ib#continue#ie# ("taskname") Task wieder ankoppeln. + #ib#ESC q#ie# #ib#break#ie# Terminal abkoppeln. + #ib#ESC h#ie# #ib#halt#ie# Programmlauf abbrechen. + + + +#on("b")# +2) Informationskommandos#off("b")# (nur Supervisor) + + #ib#ESC ?#ie# #ib#help#ie# Information. + #ib#ESC s#ie# #ib#storage info#ie# Belegten Speicherplatz anzeigen. + #ib#ESC t#ie# #ib#task info#ie# Im System befindliche Tasks anzeigen. + +#page# +2.2. Eine Task einrichten +#free(1.0)# + + + Mit dem Kommando 'begin' wird eine neue Task eingerichtet. + + +#free(1.0)# + +Zunächst koppeln Sie Terminal und Rechner, dann legen Sie eine neue Task an. + + Terminal ankoppeln: + + + +Die Tastenkombination 'ESC b' schaltet den Einfügemodus ein und positioniert +den Cursor passend für die Eingabe des Tasknamens. + +____________________________________________________________________________ + +gib supervisor kommando : +begin ("") + +____________________________________________________________________________ + + + +Dateinamen eintippen: + +____________________________________________________________________________ + + gib supervisor kommando: + begin ("taskname") + +____________________________________________________________________________ + + +Nachdem Sie den Namen eingegeben haben, betätigen Sie die Taste. Daraufhin +meldet sich der Monitor der neuen Task und Sie können beliebige Monitor- +Kommandos (siehe Teil 3) eingeben. + +Wird eine Task in dieser geschilderten Weise neu eingerichtet, so wird sie automa­ +tisch (von der Task SUPERVISOR) als Sohn der Task PUBLIC angelegt. + + +Soll eine Task nicht als Sohn von PUBLIC, sondern als Sohn einer anderen Task +angelegt werden, so ist das Kommando 'begin' mit zwei Parametern zu geben. Die +neue Task wird dann als Sohn einer anderen Manager-Task angelegt (siehe Teil 3). + + +____________________________________________________________________________ + + gib supervisor kommando: + begin ("taskname","name der vatertask") + +____________________________________________________________________________ + + + +ACHTUNG: Die Task, die als Vater-Task angegeben wird, muß + eine Manager-Task sein, sonst passiert überhaupt nichts! + (s. Kap. 3.1.2.) + +#page# +Task wiederankoppeln +#free(1.0)# + + + Mit dem Kommando 'continue' wird eine existierende Task an das + Terminal angekoppelt. + + +#free(1.0)# + +Wenn Sie die Arbeit in einer Task wiederaufnehmen wollen, holen Sie die Task mit +dem Kommando 'continue' an das Terminal. Dieser Vorgang ähnelt dem Einrichten +einer neuen Task: + + Terminal ankoppeln: + + + +Die Tastenkombination 'ESC c' schaltet den den Einfügemodus ein und positioniert +den Cursor passend für die Eingabe des Tasknamens. + + +____________________________________________________________________________ + + gib supervisor kommando: + continue ("taskname") + +____________________________________________________________________________ + + +Nach dieser Eingabe finden Sie die wiederaufgenommene Task so vor, wie Sie sie +verlassen haben. + +#page# +Terminal abkoppeln +#free(1.0)# + + + Mit dem Kommando 'break' wird das Terminal vom Rechner abgekoppelt. + + +#free(1.0)# + +Wenn Sie beispielsweise nach einem Informationskommando (siehe Teil 2.3.ff) das +Terminal sofort vom Rechner abkoppeln möchten, geben Sie das 'break'-Kommando. +Nach 'storage info' geht es jedoch nur mit weiter. + +____________________________________________________________________________ + + gib supervisor kommando: + break + +____________________________________________________________________________ + + +Nach dieser Eingabe ist das Terminal abgekoppelt. Jede neue Aktivität ist wiederum +mit einzuleiten. +#page# +Laufendes Programm stoppen +#free(1.0)# + + + Mit dem Kommando 'halt' wird ein Programm gestoppt, das am betreffenden Termi­ + nal läuft. + + +#free(1.0)# + +Dieses Kommando ist in besonderen Fehlersituationen von Wichtigkeit. Falls Sie ein +Programm abbrechen wollen, aber keine regulären Eingaben am Bildschirm mehr +möglich sind, so geben Sie zunächst ein. + +Sobald der Supervisor-Bildschirm erscheint, drücken Sie die Tasten + +#center# (oder tippen 'halt' und drücken 'CR'). + +____________________________________________________________________________ + + gib supervisor kommando: + halt + +____________________________________________________________________________ + + +Nach dieser Eingabe wird das an diesem Terminal laufende Programm unterbrochen. +Nach dem Abbruch kommen Sie wieder auf die Monitor-Ebene (s. Teil 3). +#page# +2.3. Informationskommandos +#free(1.0)# + + + Mit den Informationskommandos können Informationen zum System abgerufen + werden. + +#free(1.0)# + +Die folgenden Informationskommandos können direkt an den SUPERVISOR gegeben +werden. + + Terminal ankoppeln: + + + + +beziehungsweise + +____________________________________________________________________________ + + gib supervisor kommando : + storage info + +____________________________________________________________________________ + + +gibt Auskunft über den belegten Speicherplatz auf dem EUMEL-Hintergrundspeicher. + +Das Kommando: + + +____________________________________________________________________________ + + gib supervisor kommando : + task info + +____________________________________________________________________________ + + +gibt Auskunft über die Namen der im EUMEL-System befindlichen Tasks und die +Struktur des Taskbaums. Verzweigungen im Taskbaum sind durch Einrückungen in +den Ebenen des Taskbaums dargestellt. + + +Alle in dem Schema der Task-Organisation (siehe Teil 1) fettgedruckten Tasks sind +auch auf jedem Multi-User-Sysrtem zu finden, da sie zum Betrieb nötig sind. + +Die unterhalb von PUBLIC gelegenen Tasks werden, falls überhaupt schon vorhan­ +den, häufig nach ihrem 'Besitzer' oder der in ihnen erledigten Arbeit benannt sein. + +#page# +2.4. Übersicht über Supervisor-Kommandos +#free(1.0)# + + + In diesem Abschnitt werden alle Supervisor- und Task-Kommandos in der + ELAN-Notation dargestellt. + +#free(1.0)# + +Die Supervisor-Kommandos entsprechen - wie alle anderen Kommandos im +EUMEL-System - der ELAN-Syntax (Kommando-Namen werden klein geschrie­ +ben, Parameter in Klammern, mehrere Parameter durch Kommata getrennt, TEXT- +Parameter in Anführungsstrichen usw.). +#free(1.0)# +Die ELAN-Notation +#free(1.0)# + +Diese Notation dient der präzisen Beschreibung von Konstrukten der Programmier­ +sprache ELAN. Im Anschluß an die teilweise eher informelle Formulierung innerhalb +des Kapitels folgt jedem Teil eine Kurzbeschreibung der zu diesem Themenkreis +gehörigen Konstrukte. + +Eine solche Beschreibung hat z.B. die Form: + + PROC edit (TEXT CONST dateiname) + +Die klein geschriebenen Benennungen von Prozeduren, Parametern etc. sind hoffent­ +lich selbsterklärend, die groß geschriebenen Begriffe sind sogenannte Schlüsselworte +und haben folgende Bedeutung: + +OP Operator + Ein Operator bewirkt eine elementare Operation. Operatoren werden stets + durch Großbuchstaben oder Sonderzeichen dargestellt. + + Beispiel: + ( Addition zweier Zahlen) + + +PROC Prozedur + Programm, welches unter seinem Namen aufrufbar ist, ggf. unter Anfügung + von Parametern. beendet die Eingabe und läßt das Programm ablaufen. + + Beispiel: 'edit ("dateiname")' + + +CONST Konstante + Unveränderbarer Wert. + + +VAR Variable + Veränderbarer Wert. + + +BOOL Wahrheitswert + Typ, der nur die Werte TRUE oder FALSE annnehmen kann. + + +TEXT Text + Typ, der alle Buchstaben, Sonderzeichen, aber auch Ziffern umfaßt. Eine + TEXT CONST ist somit eine sogenannte Zeichenkette: + + "meine datei" + "$abc123(XYZ)" + "abrechnung vom 30.09.86" + + + Eine im Editor erstellte Datei besteht ausschließlich aus TEXTen. Ein Text + wird in Anführungszeichen " " eingeschlossen. + + +INT Integer + Ganze Zahl. Ein INT CONST ist also irgendeine ganze Zahl. Falls beschrie­ + ben ist: 'INT CONST zeilennr', so ist gemeint, daß an dieser Stelle die Zeilen­ + nummer der gewünschten Zeile der Datei anzugeben ist, also '25' oder '999'. + + +REAL Real + Reelle Zahl. Eine REAL CONST bezeichnet eine Zahl mit Dezimalpunkt. + + PROC sin (REAL CONST x) => sin (0.5) + + + +TASK Task + Eine TASK CONST bezeichnet eine existierende Task durch einen internen + Task-Bezeichner. + + + +THESAURUS + Ein THESAURUS ist eine Liste von Namen, z.B. eine Liste von Dateinamen. + + + +#page# +Folgende Supervisor-Kommandos stehen zur Verfügung: + + +#sy("begin + PROC begin (TEXT CONST task name) + Richtet eine neue Task als Sohn von PUBLIC ein. + + PROC begin (TEXT CONST task name, father task name) + Richtet eine neue Task als Sohn der 'fathertaskname'-Task ein. + + +break + PROC break + Das Terminal wird vom Rechner abgekoppelt. + + +continue + PROC continue (TEXT CONST task name) + Eine existierende Task wird an das Terminal des Benutzers angekoppelt. + +halt + PROC halt + Das laufende Programm der dem Terminal aktuell zugeordneten Task wird + abgebrochen. Natürlich wird die Task nicht gelöscht. + + Genauer: + Es wird der Fehler 'halt from terminal' induziert. Normalerweise wird das + Programm dadurch wie durch jeden anderen Fehler abgebrochen. Genaueres + findet man im Systemhandbuch unter Fehlerbehandlung. + +storage info + PROC storage info + Informationsprozedur über den Hintergrund-Speicher. + +task info + PROC task info + Informiert über alle Tasknamen im System unter gleichzeitiger Angabe der + Vater/Sohn-Beziehungen durch Einrückungen. + diff --git a/doc/user/benutzerhandbuch.3 b/doc/user/benutzerhandbuch.3 new file mode 100644 index 0000000..eb1c762 --- /dev/null +++ b/doc/user/benutzerhandbuch.3 @@ -0,0 +1,2019 @@ +#start(5.0,1.5)##pagenr("%",1)##setcount(1)##block##pageblock##count per page# +#headeven# +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# + EUMEL-Benutzerhandbuch +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#headodd# +#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")# +#table# + Teil 3: Der Monitor +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#bottomeven# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +3 - % GMD +#tableend##clearpos# +#end# +#bottomodd# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +GMD 3 - % +#tableend##clearpos# +#end# + +TEIL 3: Der Monitor +#free(1.0)# +#ib(9)#3.1. Der Monitor#ie(9)# +#free(1.0)# + + + Der Monitor nimmt die Kommandos des Benutzers entgegen, die dieser innerhalb + seiner Task gibt. In diesem Kapitel sind die gebräuchlichen Kommandos zur Text­ + verarbeitung beschrieben. + + +#free(1.0)# + +Der #ib#Monitor#ie# ist der Empfänger der Kommandos in einer EUMEL-Task. Jede Task +und somit jeder aktive Benutzer eines EUMEL-Systems verfügt über einen eigenen +Monitor. Halten Sie sich an dieser Stelle vor Augen: +#on("i")##on("b")# + + +Der SUPERVISOR ist die Task, die die Aufsicht über +alle weiteren Tasks des EUMEL-Systems hat. + +Der Monitor ist der Befehlsempfänger in Ihrer Task. +Jede Task hat einen Monitor. + +#goalpage("Mon-kdo")# +Der Monitor in Ihrer Task macht sich direkt bemerkbar durch die Zeile: + +____________________________________________________________________________ + +#ib#gib kommando#ie# : +____________________________________________________________________________ + + +Die Kommandos der Monitor-Ebene, die Sie an dieser Stelle eingeben können, +lassen sich in Gruppen ordnen: +#on("b")# + + +Informationskommandos #off("b")# + + #ib#storage info#ie# Belegten Speicherplatz anzeigen. + #ib#task info#ie# Im System befindliche Tasks anzeigen. + #ib#task status#ie# Zustand der Task anzeigen. + + +#on("b")# +Kommandos zur Tasksteuerung #off("b")# + + #ib#break#ie# Task abkoppeln. + #ib#end#ie# Task löschen. + #ib#global manager#ie# Task zum Manager machen, d.h. + Sohn-Tasks können eingerichtet + werden. + + +#on("b")# +Kommandos zur Dateibearbeitung #off("b")# + + #ib#copy#ie# ("dateiname","kopie") Datei kopieren. + #ib#edit#ie# ("dateiname") Editor aufrufen. + #ib#forget#ie# ("dateiname") Datei löschen. + #ib#list#ie# Dateien auflisten. + #ib#rename#ie# ("dateiname","neu") Datei umbenennen. + +#on("b")# +Transport von Dateien#off("b")# + + #ib#fetch#ie# ("dateiname") Datei von Vater-Task holen. + #ib#erase#ie# ("dateiname") Datei in Vater-Task löschen. + #ib#save#ie# ("dateiname") Datei zu Vater-Task senden. + + +#on("b")# +Archiv-Kommandos#off("b")# + + #ib#archive#ie# ("name") Archivlaufwerk reservieren. + #ib#fetch#ie# ("dateiname",archive) Datei von Archiv holen. + #ib#save#ie# ("dateiname",archive) Datei auf Archiv schreiben. + #ib#list (archive)#ie# Inhalt des Archivs listen. + #ib#check#ie# ("dateiname",archive) Datei auf Lesbarkeit prüfen. + #ib#clear#ie# (archive) Archiv löschen/umbenennen. + #ib#format (archive)#ie# Archivdiskette für Benutzung + vorbereiten. + +#on("b")# +Textverarbeitung #off("b")# + + #ib#list fonts#ie# Nennt die eingestellten + Schrifttypen. + #ib#fonttable#ie# Stellt die gewünschte Fonttabelle ein. + #ib#lineform#ie# ("dateiname") Zeilenweise formatieren. + #ib#autoform#ie# ("dateiname") Automatische Zeilenformatierung. + #ib#pageform#ie# ("dateiname") Seitenweise formatieren. + #ib#autopageform#ie# ("dateiname") Automatische Seitenformatierung. + #ib#index#ie# ("dateiname.p") Stichwortverzeichnis erzeugen. + #ib#outline#ie# ("dateiname") Übersicht bzw. Kurzfassung eines + Textes erstellen. + #ib#print#ie# ("dateiname") Datei drucken. + + + +#on("b")# +Passwortschutz #off("b")# + + #ib#task password#ie# ("geheim") Passwort für existierende Task festlegen. + #ib#begin password#ie# ("geheim") Passwort für neue Task festlegen. + #ib#family password#ie# ("geheim") Passwort für mehrere Tasks + festlegen. + #ib#enter password#ie# ("geheim") Passwort für Datei festlegen. + +#page# +3.1.1. Informationskommandos +#free(1.0)# + + + Mit den Informationskommandos können Informationen zur eigenen Task bzw. zum + gesamten System abgerufen werden. + +#free(0.5)# + +Bereits von Teil 2 bekannt sind die Informationskommandos 'ESC s' und 'ESC t'. Auf +der Monitor-Ebene ist die abkürzende Schreibweise nicht voreingestellt. + +____________________________________________________________________________ + +gib kommando : +storage info + +____________________________________________________________________________ + + +gibt Auskunft über den belegten Speicherplatz auf dem EUMEL-Hintergrundspeicher. + +____________________________________________________________________________ + +gib kommando : +task info + +____________________________________________________________________________ + + +gibt Auskunft über die Namen der im EUMEL-System befindlichen Tasks und die +Struktur des Taskbaums. +#page# +Auf Monitor-Ebene kann durch zusätzliche Angabe einer Zahl zwischen 1 und 3 +Zusatzinformation angefordert werden. + +____________________________________________________________________________ + +gib kommando : +task info (2) + +____________________________________________________________________________ + +liefert: + +____________________________________________________________________________ +26.11.86 10:10 CPU PRIO CHAN STATUS +SUPERVISOR........................... 0001:08:50 0 - wait + -................................ 0000:00:08 0 2 i/o + -................................ 0000:01:45 0 - wait + SYSUR............................ 0000:01:48 0 - wait + configurator................. 0000:00:43 0 - wait + OPERATOR..................... 0000:00:03 0 - i/o + shutup dialog............ 0000:03:08 0 - i/o + ARCHIVE...................... 0000:03:03 0 31 wait +UR................................... 0000:00:43 0 - wait + PUBLIC........................... 0000:01:26 0 - i/o + agfa......................... 0000:00:11 0 - i/o + werner....................... 0000:06:00 0 - -busy- + + +____________________________________________________________________________ + + + + +'task info (1)' entspricht dabei dem Kommando ohne Parameterangabe, '(2)' liefert +zusätzlich die verbrauchte CPU-Zeit (=reine Rechenzeit), die Priorität, den Kanal +(siehe S.#topage("Kanal")#) und den Taskstatus für jede Task des Systems. '(3)' liefert neben diesen +Angaben auch noch den belegten Speicherplatz jeder Task. Die Ausführung von task +info (3) ist sehr zeitaufwendig! + +Um insbesondere den belegten Speicherplatz der eigenen Task anzusehen, aber auch +die übrigen der oben erwähnten Angaben, benutzt man das Kommando: + +____________________________________________________________________________ + + gib kommando : + task status + +24.12.86 18:30 TASK: wenni + +Speicher: 1000K +CPU-Zeit: 0000.01:11 +Zustand : -busy-, (Prio 1), Kanal 1 + + gib kommando : + +____________________________________________________________________________ +#page# +3.2. Tasksteuerung +#free(1.0)# +Task abkoppeln +#free(1.0)# + + + Mit dem Kommando 'break' wird eine Task vom Terminal abgekoppelt. + + +#free(1.0)# + +Durch die Eingabe des Kommandos 'break' auf Monitor-Ebene wird die Task vom +Terminal abgekoppelt. Dieses Kommando bewirkt ansonsten keine Veränderungen. + +____________________________________________________________________________ + +gib kommando : +break + +____________________________________________________________________________ + + + +Statt 'break' einzutippen, können Sie auch die Tastenkombination + +#center# + +benutzen. + +#page# + +Eine Manager-Task erzeugen +#free(1.0)# + + + Eine Task kann zum #ib#Manager#ie#, d.h. zum Kommunikationspartner anderer Tasks, + erklärt werden. Insbesondere zwischen Manager-Tasks und anderen, die + zueinander in Vater-Sohn-Beziehung stehen, ist ein einfacher Dateitransfer + möglich (siehe S.#topage("Dateitrans")#). + +#free(1.0)# + +Normalerweise werden Benutzertasks als Sohn der Task PUBLIC eingerichtet. Es +kann jedoch wünschenswert sein, selbst eine Task-Hierarchie aufzubauen und eine +vorhandene Task zum Vater einer oder mehrerer in Zukunft einzurichtender Tasks zu +machen, um somit auch eine Dateihierarchie mit den benötigten Operationen zu +erhalten. Dazu wird diese Task zum 'Manager' erklärt:#goalpage("globalmanager")# + +____________________________________________________________________________ + +gib kommando: +global manager + +____________________________________________________________________________ + + +Durch das '#ib#global manager#ie#'-Kommando wird implizit ein 'break'-Kommando gege­ +ben, so daß Sie nach Eingabe dieses Kommandos wieder ein Supervisor-Kommando +geben können. Wenn Sie nun zu irgendeinem Zeitpunkt diese (zunächst potentielle) +Vater-Task wieder ankoppeln ('continue'-Kommando), meldet sich die Task nicht +wie gewohnt mit 'gib kommando :', sondern mit: + +____________________________________________________________________________ + +maintenance : + +____________________________________________________________________________ + + +um anzudeuten, daß es sich um eine Manager-Task handelt. + +Um eine Sohn-Task unterhalb einer Manager-Task einzurichten, wird zur Erzeu­ +gung dieser neuen Task nicht nur der gewünschte Name, sondern auch der Name der +Vater-Task angegeben.#u#1)#e# +#foot# +#u#1)#e# Falls keine Vater-Task angegeben wird, so ist die neue Task Sohn der +Manager-Task 'PUBLIC'. +#end# + +____________________________________________________________________________ + + Terminal 2 + + + EUMEL Version 1.8/M + + + gib supervisor kommando: + begin("sohntask","vatertask") + + + + ESC ? --> help + ESC b --> begin("") ESC h --> halt + ESC c --> continue("") ESC s --> storage info + ESC q --> break ESC t --> task info + + +____________________________________________________________________________ + + + + +In dieser Sohn-Task können dann mit einfachen Kommandos Dateien von der +Vater-Task geholt und zur Vater-Task geschickt werden. + +Soll eine Task für alle anderen Tasks, nicht nur für Sohn-Tasks, des Gesamtsystems +als Kommunikationspartner erreichbar sein, so muß diese Task als freier Manager +deklariert werden: + +____________________________________________________________________________ + +gib kommando: +#ib#free global manager#ie# + +____________________________________________________________________________ + + +Auf eine solche Task kann von #on("u")#jeder#off("u")# anderen Task aus zugegriffen werden, ansonsten +gilt das für gewöhnliche Manager-Tasks gesagte. +#page# +Task löschen +#free(1.0)# + + + Eine Task kann mit dem '#ib#end#ie#' Kommando gelöscht werden (und mit ihr alle Daten). + + #free(0.5)# +Normale Benutzertasks werden meistens zweck- oder themengebunden eingerichtet. +Sind die Aufgaben im Zusammenhang mit einer solchen Task erledigt, so sollte die +Task gelöscht werden, nachdem alle Daten von Bedeutung auf Diskette gesichert +wurden. + +____________________________________________________________________________ + +gib kommando : +end + +____________________________________________________________________________ + +Wie bei allen Löschungen im EUMEL-System folgt eine Kontrollfrage durch den +Monitor: + +____________________________________________________________________________ + +gib kommando : +end +task "taskname" löschen (j/n) ? + + +____________________________________________________________________________ + + +Nur bei der positiven Antwort wird gelöscht, alle Dateien sind unwiderruflich verlo­ +ren. Als positive Antwort auf derartige Abfragen wirken: + +#center# + + bzw. unterdrücken die angebotene Aktion, andere Eingaben werden abgewie­ +sen. + +#on("b")# +ACHTUNG: Wird eine Manager-Task gelöscht, so werden alle Sohn- Enkel- etc. + Tasks ohne zusätzliche Nachfrage gelöscht, falls die Sicherheitsabfrage + mit 'j' beantwortet wurde. #off("b")# +#page# +3.3. Dateibearbeitung +#free(1.0)# +Datei einrichten +#free(1.0)# + + + Mit dem Editoraufruf 'edit' wird eine neue Datei eingerichtet, bzw. eine existierende + Datei zur Bearbeitung am Bildschirm gezeigt. + + + +#free(0.5)# + +Eine Datei enthält Texte, die logisch zusammengehören und sie wird über ihren +Namen eindeutig gekennzeichnet. + +Das EUMEL-System speichert einmal geschriebene Texte, bis sie vom Benutzer +gelöscht werden. In der Regel wird nicht nur ein (langer) Text oder ein Programm­ +text geschrieben, sondern mehrere und unterschiedliche. Um diese auseinanderhalten +zu können, versehen wir sie jeweils mit einem Namen, der frei gewählt werden kann. +Beispiele für Namen: + + + "Brief vom 1.12.86" + "1. Kapitel meines Buches" + + +Eine Sammlung von Zeichen (also im Normalfall unsere geschriebenen Texte), die mit +einem Namen versehen worden ist, nennt man eine #ib##on("b")#Datei#ie##off("b")#. Der Editor erstellt also eine +Datei, wenn wir einen Text schreiben. Eine Datei kann bis zu 4 000 Zeilen fassen, +wobei jede bis zu 32 000 Zeichen lang sein darf. + + +Einrichten der ersten #ib#Datei#ie# in Ihrer Task: + +Der erste Schritt sollte darin bestehen, daß Sie sich einen vernünftigen Dateinamen +ausdenken. Das EUMEL-System legt Ihnen praktisch keine Beschränkungen über +Länge oder Form des Dateinamens auf, deshalb sollten Sie sich angewöhnen, Ihre +Dateien so zu benennen, daß Sie anhand des Namens auch nach einer Woche oder +länger noch erahnen können, was diese Datei enthält. + +Ein guter Name für die erste Datei wäre zum Beispiel: "meine erste Datei" oder +"werners test vom 1.12.86". Im weiteren Text steht nur "dateiname" o. ä.. Setzen Sie +dafür den von Ihnen gewählten Namen ein. + +____________________________________________________________________________ + +gib kommando: +edit ("dateiname") + +____________________________________________________________________________ + +____________________________________________________________________________ + +gib kommando: +edit ("dateiname") + +"dateiname" neu einrichten (j/n)? + +____________________________________________________________________________ + +Drücken Sie 'j', so wird eine neue Datei unter dem von Ihnen eingegebenen Namen +eingerichtet. Die Datei ist zunächst leer: + +____________________________________________________________________________ + ................... dateiname .................... Zeile 1 + +____________________________________________________________________________ + + + +Welche Möglichkeiten Sie bei der Bedienung des Editors haben, können Sie in Teil 4 +nachschlagen. Schreiben Sie an dieser Stelle nur einige Worte in die Datei, anhand +derer der Dateiinhalt wiederzuerkennen ist. Sie können die Tastatur genauso benutzen +wie die einer Schreibmaschine. + +____________________________________________________________________________ + ................... dateiname .................... Zeile 1 +Inhalt der ersten Datei. 1234567890 + +____________________________________________________________________________ + + +Die Datei sollte an dieser Stelle wieder geschlossen werden. + +Drücken Sie dazu . + +Dabei ist gleichgültig, wo der Cursor steht. + +Wiederholen Sie das Neuanlegen einer Datei mit einer zweiten Datei "anderer datein­ +ame". Bitte schreiben Sie wiederum einige Zeichen in die Datei. + +____________________________________________________________________________ + +gib kommando : +edit ("anderer dateiname") + +____________________________________________________________________________ + + +Vorschlag zur Eingabe: + +____________________________________________________________________________ + + .............. anderer dateiname ................. Zeile 1 +Halten Sie irgendeine Taste gedrücktttttttttttttttt + +____________________________________________________________________________ + + +Beenden Sie die Arbeit ebenfalls mit . + + +#page# +Dateinamen auflisten +#free(1.0)# + + + Mit dem Kommando 'list' werden die Dateinamen der Dateien in der Task aus­ + gegeben. + + +#free(1.0)# + +Vor jedem Dateinamen wird das Datum der letzten Bearbeitung der Datei angezeigt. + +____________________________________________________________________________ + +gib kommando: +list + +____________________________________________________________________________ + +bewirkt: +____________________________________________________________________________ + + ..................... list ....................... Zeile 1 + +01.08.86 "dateiname" +01.08.86 "anderer dateiname" + +____________________________________________________________________________ + + + +Auch bei dieser Auflistung der Dateinamen handelt es sich um eine EUMEL-Datei + (allerdings um eine schreibgeschützte), die Ausgabe wird also wie gewohnt durch + das Kommando beendet. +#page# +Datei duplizieren +#free(1.0)# + + + Mit dem Kommando 'copy' wird eine existierende Datei dupliziert. + + +#free(1.0)# + +Eine existierende Datei kann dupliziert werden durch das Kommando : + +____________________________________________________________________________ + +gib kommando: +copy ("dateiname","kopiename") + +____________________________________________________________________________ + + +Durch dieses Kommando wird eine Kopie der Datei "dateiname" unter dem Namen +"kopiename" angelegt, der Inhalt der beiden Dateien ist zunächst identisch. Kontrol­ +lieren Sie die Richtigkeit dieser Behauptung, indem Sie nachsehen, ob der Inhalt der +kopierten Datei gleich dem Inhalt der Ursprungsdateiname ist: + +____________________________________________________________________________ + +gib kommando: +edit ("kopiename") + +____________________________________________________________________________ +#page# +Dateinamen ändern +#free(1.0)# + + + Mit dem Kommando 'rename' wird der Name einer Datei geändert. + + +#free(1.0)# + +Sollte Ihnen der Name einer Datei nicht gefallen, so besteht die Möglichkeit, den +Namen zu ändern: + +____________________________________________________________________________ + +gib kommando: +rename ("dateiname","neuer dateiname") + +____________________________________________________________________________ + + +#page# +Datei löschen +#free(1.0)# + + + Mit dem Kommando 'forget' wird eine Datei gelöscht. + + +#free(1.0)# + +Das Löschen einer Datei wird durch das Kommando: + +____________________________________________________________________________ + +gib kommando: +forget ("neuer dateiname") + +____________________________________________________________________________ + +eingeleitet. Aus Gründen der Sicherheit erfolgt vor der Ausführung des Kommandos +jedoch die Abfrage: + +____________________________________________________________________________ + +gib kommando: +forget ("neuer dateiname") + +"dateiname" löschen ? (j/n) + +____________________________________________________________________________ + +Als positive Antwort auf derartige Abfragen wirken: + + bzw. unterdrücken die angebotene Aktion, andere Eingaben werden abgewie­ +sen. + +#page# +Dateien verschicken +#free(1.0)# +#goalpage("Dateitrans")# + + + Dateien können zur Vater-Task geschickt und von der Vater-Task geholt werden. + +#free(1.0)# + +Die Vereinbarung, daß Dateien in einer Task lokal sind, d.h. daß nur in dieser Task +Zugriff auf die Daten möglich ist, ist häufig zu einschränkend. So kann es zweck­ +mäßig sein, von mehreren Arbeitsplätzen (= Tasks) aus die wesentlichen Ergebnisse +an einer zentralen Stelle zu sammeln oder Ergebnisse aus Tasks, die nur kurzzeitig +für eine spezielle Aufgabe eingerichtet wurden, länger aufzubewahren. + +Zu diesem Zweck wird eine Benutzertask zum Manager erklärt (siehe S.#topage("globalmanager")#) und es +werden Söhne dieser Task eingerichtet. +#page# +Datei zur Vater-Task schicken +#free(1.0)# + + + Mit dem Kommando 'save' wird die Kopie einer Datei zur Vater-Task geschickt. + + +#free(1.0)# + +____________________________________________________________________________ + +gib kommando: +save ("dateiname") + +____________________________________________________________________________ + +Wird eine Datei an die Vater-Task gesendet, wird eine Kopie der Ursprungsdateina­ +me unter dem Namen 'dateiname' in der Vater-Task eingerichtet. Danach sind diese +beiden, zunächst gleichen Dateien unabhängig voneinander. Änderungen, welcher Art +auch immer, haben keinen Einfluß auf die namensgleiche Kopie in der anderen Task. + +Falls in der Vater-Task bereits eine Datei mit dem Namen 'dateiname' existiert, sei +es durch Zufall oder weil bereits einmal eine 'save'-Operation durchgeführt worden +ist, erfolgt eine Abfrage: + +____________________________________________________________________________ + +gib kommando: +save ("dateiname") + +"dateiname" überschreiben ? (j/n) + +____________________________________________________________________________ + +Nur wenn die positive Eingabe 'j' erfolgt, wird die Datei in der Vater-Task durch die +eigene Datei überschrieben. +#page# +Datei von der Vater-Task holen +#free(1.0)# + + + Mit dem Kommando 'fetch' wird die Kopie einer Datei von der Vater-Task geholt. + + +#free(1.0)# + +Entsprechend dem Versenden einer Dateikopie können Sie eine Kopie von der Vater­ +Task holen und ggf., natürlich nach Abfrage, Ihre Datei dieses Namens überschrei­ +ben. + +____________________________________________________________________________ + +gib kommando: +fetch ("dateiname") + +____________________________________________________________________________ + +#page# +Datei in der Vater-Task löschen +#free(1.0)# + + + Mit dem Kommando 'erase' wird eine Datei in der Vater-Task gelöscht. + + +#free(1.0)# + +Soll eine Datei in der Vater-Task gelöscht werden, so kann dieses, dem 'forget'- +Kommando analoge Kommando, in der Sohn-Task gegeben werden: + +____________________________________________________________________________ + +gib kommando: +erase ("dateiname") + +____________________________________________________________________________ + +Falls die Datei in der Vater-Task existiert, wird sie nach Kontrollfrage gelöscht. + +____________________________________________________________________________ + +gib kommando: +erase ("dateiname") +"dateiname" loeschen (j/n) j + +gib kommando : + + +____________________________________________________________________________ + + + Anm: Die Task 'PUBLIC' ist grundsätzlich eine Manager-Task. Da Benut­ + zer-Tasks als Sohn von '#ib#PUBLIC#ie#' eingerichtet werden, falls Sie nicht als + Sohn einer besonderen Manager-Task eingerichtet wurden, beziehen sich + 'fetch'-, 'save'- und 'erase'-Kommandos auf 'PUBLIC'. +#page# +3.4. Das Archiv +#free(1.0)# + + + Das Archiv dient der Speicherung von Dateien auf Disketten (Sicherung). + +#free(1.0)# + +Das #ib#Archiv#ie# übernimmt im EUMEL-System die Verwaltung der langfristigen Daten­ +haltung. Das Archiv sollen Sie benutzen, um: + +- Sicherungskopien wichtiger Dateien außerhalb des Rechners zu besitzen; + +- nicht benötigte Dateien außerhalb einer Task zu halten (Speicherplatzersparnis!); + +- Dateien auf andere Rechner zu übertragen. + +Das Archiv wird im EUMEL-System durch die Task 'ARCHIVE', die das Disketten­ +laufwerk des Rechners verwaltet, realisiert. Die Steuerung durch eine Task hat für Sie +die erfreuliche Folge, daß die Handhabung des Archivs sich kaum von den schon +bekannten Dateioperationen unterscheidet. In den Kommandos wird zusätzlich ange­ +geben, daß das Archiv angesprochen werden soll. + +#page# +Archiv-Kommandos +#free(1.0)# + + + Der Arbeitsablauf bei Benutzung des Archivs besteht immer aus der Reservierung, + dem Lese- oder Schreibzugriff und der Freigabe des Archivs nach Ende der + Arbeit. Jede Arbeit mit dem Archiv beginnt mit dem Reservierungskommando. + + +#free(1.0)# + +Als ersten Schritt der Archivbenutzung müssen Sie das Archiv reservieren, das heißt +der Verwaltung Ihres EUMEL-Systems mitteilen, daß Sie die Task 'ARCHIVE', die +der Steuerung des Diskettenlaufwerks dient, für Ihre Task arbeiten lassen. Solange für +Ihre Task das Archiv reserviert ist, kann keine andere Task das Archivlaufwerk benut­ +zen. + +Für die Reservierung müssen Sie bei Benutzung einer schon vorbereiteten oder sogar +beschriebenen Diskette den Namen dieser Archivdiskette kennen (er sollte auf dem +Diskettenaufkleber stehen) oder vor Benutzung einer neuen Diskette einen Namen +festlegen (und auf dem Aufkleber vermerken). Wie gewohnt gibt es keine Vorschrif­ +ten für die Namensgebung. + +Erst nachdem Sie das Reservierungskommando gegeben haben: + +____________________________________________________________________________ + +gib kommando: +archive ("diskettenname") + +____________________________________________________________________________ + + +sollten Sie die Diskette in das Laufwerk einschieben, um zu verhindern, daß ein +anderer Benutzer, der das Archiv bereits für sich reserviert hat, auf Ihrer zufällig +gleichnamigen Datei arbeitet. + + +Eine Datei wird mit dem Kommando: + +____________________________________________________________________________ + +save ("dateiname",archive) + + +____________________________________________________________________________ + + +auf eine Diskette geschrieben und mit dem Kommando: + +____________________________________________________________________________ + +fetch ("dateiname",archive) + +____________________________________________________________________________ + + +von einer Diskette geholt. + +Das Inhaltsverzeichnis einer Diskette erhalten Sie durch: + +____________________________________________________________________________ + +list (archive) + +____________________________________________________________________________ + +#page# +Benutzung einer neuen Archivdiskette +#free(1.0)# + + + Eine neue Diskette muß für die Benutzung vorbereitet (formatiert) werden. + + + +#free(1.0)# +Vor der erstmaligen Benutzung einer Archivdiskette muß diese formatiert, d.h. in +Spuren und Sektoren für die Positionierung des Schreib-/Lesekopfes des Disketten­ +laufwerks eingeteilt werden, um überhaupt ein Beschreiben der Diskette zu ermög­ +lichen. Die Einteilung ist geräteabhängig, häufige Formate sind: + + 40 Spuren zu je 9 Sektoren (360 K) + 80 Spuren zu je 9 Sektoren (720 K). + +Die #on("b")#Erst#off("b")#benutzung einer #ib#Archivdiskette#ie# erfordert nach der Reservierung des Archivs +das Kommando: + +____________________________________________________________________________ + +gib kommando: +format (archive) + +____________________________________________________________________________ + + +Erst nach einer Kontrollabfrage: + +____________________________________________________________________________ + +gib kommando: +format (archive) + +Archiv "diskettenname" formatieren ? (j/n) + +____________________________________________________________________________ + +wird tatsächlich formatiert und die Diskette steht mit dem Namen "diskettenname" für +Archivoperationen zur Verfügung. + +#on("b")# +ACHTUNG: Wird eine bereits beschriebene Diskette noch einmal formatiert, so sind + alle Daten, die auf der Diskette waren, verloren.#off("b")# + + +Bei einigen Rechnern ist es möglich, die Formatierung zu variieren. Falls beim Forma­ +tieren auf einem solchen Rechner ein anderes als das Standardformat erzeugt werden +soll, so ist die Codierung des gewünschten Formats mitanzugeben. + + +Beispiel: Für ein Gerät mit 5μ Zoll Disketten wäre z.B. einstellbar: + code 0 : Standardformat + code 1 : 40 Spuren + code 2 : 80 Spuren + code 3 : High Density + + 'format (archive)' erzeugt ebenso wie 'format (0,archive)' eine standard­ + formatierte Diskette, 'format (3,archive)' erzeugt eine High Density + Formatierung. +#page# +Diskette löschen / umbenennen +#free(1.0)# + + + Bereits benutzte Disketten können wieder gelöscht und auch umbenannt werden. + + +#free(1.0)# + +Falls Sie den Inhalt einer beschriebenen Archivdiskette löschen oder den Namen einer +Diskette ändern wollen, müssen Sie das Archiv unter dem gewünschten Namen reser­ +vieren: Falls Sie den Inhalt löschen möchten, tun Sie das unter dem bisherigen und +bestehenden Namen. Falls Sie die Diskette umbenennen wollen, reservieren Sie das +Archiv unter dem neuen gewünschten Namen. Beachten Sie, daß durch das Umbe­ +nennen eines Archivs alle darauf befindlichen Dateien gelöscht werden. Anschließend +geben Sie das Kommando: + +____________________________________________________________________________ + +gib kommando: +#ib#clear#ie# (archive) + +____________________________________________________________________________ + +Durch die Ausführung des Kommandos erhält die eingelegte Diskette den in der +Reservierung angegebenen Namen. Das Inhaltsverzeichnis, das sich auf der Diskette +befindet, wird gelöscht. Damit sind die Daten, die sich eventuell auf dieser Diskette +befanden, nicht mehr auffindbar. Die Diskette entspricht einer neu formatierten Disket­ +te#u#1)#e#. #foot# +#u#1)#e# Das Kommando 'format' enthält implizit 'clear'. +#end# +Eine Neuformatierung ist demnach bei Wiederverwendung der Diskette nicht notwen­ +dig. + +#page# +Inhaltsverzeichnis der Diskette +#free(1.0)# + + + Mit 'list (archive)' werden die Dateien auf der Diskette angezeigt. + + +#free(1.0)# + +Eine formatierte Diskette kann nach der Archivanmeldung gelesen oder beschrieben +werden. Um zu sehen, welche Dateien auf der Diskette zu holen (= lesen) sind bzw. +wieviel Platz zum Beschreiben vorhanden ist, ist es zweckmäßig, zunächst das In­ +haltsverzeichnis der Diskette zu betrachten. + +____________________________________________________________________________ + +gib kommando: +list (archive) + +____________________________________________________________________________ + +Beispiel: + +____________________________________________________________________________ + + ............diskettenname (100 K belegt von 720 K).............. + +01.05.86 25 K "rechnungen april" +01.06.86 23 K "rechnungen mai" +01.07.86 20 K "rechnungen juni" +01.08.86 32 K "rechnungen juli" + +____________________________________________________________________________ +#page# +Lesen und Schreiben auf Diskette +#free(1.0)# + + + Lesen und Schreiben auf der Diskette entspricht den bekannten Operationen zum + Senden und Holen von Dateien. + + + +#free(1.0)# +Das Schreiben einer Datei auf Diskette entspricht dem Übersenden einer Datei an die +Vater-Task. Einziger Unterschied ist, daß Sie das Ziel explizit angeben müssen: + +____________________________________________________________________________ + +gib kommando: +#ib#save#ie# ("dateiname",archive) + +____________________________________________________________________________ + +Entsprechend funktioniert auch das Lesen einer Datei von der Diskette: + +____________________________________________________________________________ + +gib kommando: +fetch ("dateiname",archive) + +____________________________________________________________________________ + +Wie auch bei der Kommunikation zwischen Sohn- und Vater-Task werden nur +Kopien der Dateien geholt bzw. geschrieben. +#page# +Wechsel der Archivdiskette +#free(1.0)# +Bei Einlegen einer anderen Archivdiskette müssen Sie erneut das Kommando + +____________________________________________________________________________ + +gib kommando: +archive ("diskettenname") + +____________________________________________________________________________ + +geben, da mit der Archivreservierung zugleich die Prüfung von Diskettenname und +-Inhaltsverzeichnis vorbereitet wird. +#page# +Beenden der Archivreservierung +#free(1.0)# + + + Nach Benutzung Archiv freigeben! + + +#free(1.0)# + +Wenn Sie alle gewünschten Arbeiten mit dem Archiv fertiggestellt haben, geben Sie +das Archiv wieder frei. + +____________________________________________________________________________ + +gib kommando: +#ib#release#ie# (archive) + +____________________________________________________________________________ + +Durch dieses Kommando kann die Task 'ARCHIVE' mit ihren Leistungen von einer +anderen Task in Anspruch genommen werden. Falls Sie dieses Kommando nicht +gegeben haben aber seit 5 Minuten keine Archivoperation ausgelöst haben, kann eine +andere Task durch die Anforderung 'archive("diskettenname")' das Archiv reservieren. +Durch diese Maßnahme wird verhindert, daß ein vergeßlicher Benutzer bei einem +System mit mehreren Benutzern das Archiv blockiert. +#page# +Fehlermeldungen des Archivs +#free(1.0)# + + + Bei Archiv-Operationen kann es zu Fehlersituationen kommen. + +#free(1.0)# + +Versucht man, eine Datei vom Archiv zu holen, kann es vorkommen, daß das Ar­ +chiv-System + +____________________________________________________________________________ + +#ib#Lese-Fehler (Archiv)#ie# + +____________________________________________________________________________ + +meldet und den Lese-Vorgang abbricht. Dies kann auftreten, wenn die Floppy +beschädigt oder aus anderen Gründen nicht lesbar ist (z.B. nicht justierte Disket­ +ten-Geräte). In einem solchen Fall vermerkt das Archiv-System intern, daß die Datei +nicht korrekt gelesen werden kann. Das sieht man z.B. bei 'list (archive)'. Dort ist der +betreffende Datei-Name mit dem Zusatz 'mit Lese-Fehler' gekennzeichnet. Um +diese Datei trotzdem zu lesen, muß man sie unter ihrem Dateinamen mit dem Zusatz +'mit Lese-Fehler' lesen. + +____________________________________________________________________________ + +gib kommando: +fetch ("dateiname mit Lese-Fehler") + +____________________________________________________________________________ + +Die Datei wird in diesem Fall trotz Lese-Fehler (Informationsverlust!) vom Archiv +gelesen. + +Um solche Fälle möglichst zu vermeiden, sieht das EUMEL-System die Möglichkeit +vor, Archive bzw. Archiv-Dateien nach Beschreiben zu prüfen. Das erfolgt mit dem +Kommando + +____________________________________________________________________________ + +gib kommando : +#ib#check#ie# ("dateiname", archive) + +____________________________________________________________________________ + + +Durch dieses Kommando werden eventuelle Lese-Fehler gemeldet. + +Weitere Fehlermeldungen des Archivs: + +* Lesen unmöglich (Archiv) + Die Archiv-Diskette ist nicht eingelegt oder die Tür des Laufwerks ist nicht ge­ + schlossen. +=> Diskette einlegen bzw. Tür schließen. + +* Schreiben unmöglich (Archiv) + Die Diskette ist schreibgeschützt. +=> falls wirklich gewünscht, Schreibschutz entfernen. + +* Archiv nicht angemeldet + Das Archiv wurde nicht angemeldet +=> 'archive ("name")' geben. + +* Lese-Fehler (Archiv) + Siehe Lesen unmöglich + +* Schreibfehler (Archiv) + Die Diskette kann nicht (mehr) beschrieben werden. +=> Andere Diskette verwenden. + +* Speicherengpass + Im System ist nicht mehr genügend Platz, um eine Datei vom Archiv zu laden, ggf. +=> ggf. Dateien löschen. + +* RERUN bei Archiv-Zugriff Das System wurde bei einer Archiv-Operation durch + Ausschalten bzw. Reset unterbrochen. + +* "dateiname" gibt es nicht + Die Datei "dateiname" gibt es nicht auf dem Archiv. +=> mit 'list(archive)' Archiv prüfen. + +* Archiv heißt ... + Die eingelegte Diskette hat einen anderen als den eingegebenen Archivnamen. +=> Kommando 'archive' mit korrektem Namen geben. + +* Archiv wird von Task ... benutzt + Das Archiv wurde von einem anderen Benutzer reserviert. +=> Abwarten. + +* "dateiname" kann nicht geschrieben werden (Archiv voll) + Die Datei ist zu groß für die eingelegte Diskette. +=> Andere Diskette für diese Datei nehmen. + +* Archiv inkonsistent + Die eingelegte Diskette hat nicht die Struktur einer Archiv-Diskette. +=> 'format (archive)' vergessen. + +* save/erase wegen Lese-Fehler verboten + Bei Archiven mit Lese-Fehler sind Schreiboperationen verboten, weil ein Erfolg + nicht garantiert werden kann. + + + +3.5. Kommandos für mehrere Dateien +#free(1.0)# + + + Durch Anwendung der besonderen Operatoren 'ALL' und 'SOME' können Sie + mehrere Dateien mit einem Kommando behandeln. + + +#free(1.0)# +Oft ist es sehr zweckmäßig und erleichternd, einen Befehl für eine ganze Reihe von +Dateien wirken zu lassen, wie z.B. beim Archivieren, wenn Sie etwa alle während des +Tages veränderten Dateien mit deren neuen Stand auf Diskette schreiben möchten. + +Da Tasks einen Namen haben und jede Task ein Inhaltsverzeichnis ihrer Dateien +führt, ist es möglich, Listen von Dateien zu benennen. +#page# +Interne Tasknamen +#free(1.0)# +Wenn Sie eine andere als die eigene oder die Vater-Task ansprechen wollen, ist es +notwendig, den 'internen Tasknamen' anzugeben. Diese auf den ersten Blick etwas +undurchsichtige Forderung hat folgenden Hintergrund: + +Durch die in der Einleitung vorgestellte Baumstruktur des EUMEL-Systems ist es +ohne besondere Angaben nur möglich, Kommandos zu geben, die die eigene Task +('edit'..) oder die Vater-Task ('save'..) betreffen. Beim Archivieren zum Beispiel wäre +es demzufolge erforderlich, eine Datei über den Vater vom Vater vom Vater... an den +Sohn des Sohnes... zu schicken, damit die Datei endlich in der Task 'ARCHIVE' +landet. Statt dessen verwenden Sie eine Prozedur 'archive', die den internen Task­ +bezeichner liefert. Damit wird die gewünschte Task intern identifiziert, ohne daß Sie +sich darum kümmern müssen. + +Wichtige Prozeduren, die interne Taskbezeichner liefern, sind: + + myself Bezeichner der eigenen Task + public Bezeichner von PUBLIC + father Bezeichner der Vater-Task#u##count##e# + archive Bezeichner von ARCHIVE + printer Bezeichner von PRINTER #foot# +#u##value##e# Falls kein besonderer Manager eingerichtet wurde, liefern 'father' und 'public' + natürlich dieselbe Task: PUBLIC. #end# +#page# +Dateiverzeichnisse +#free(1.0)# +Jede Task verfügt über ein Verzeichnis der in ihr befindlichen Dateien. Das Verzeich­ +nis Ihrer eigenen Task können Sie mit dem 'list'-Kommando betrachten. Das Ver­ +zeichnis einer anderen Task sehen Sie beispielsweise durch das Kommando 'list +(archive)'. In diesem Fall müssen Sie dem eigentlichen Kommando den internen +Taskbezeichner der gewünschten Task hinzugeben, um das Verzeichnis zu sehen. + +Um ein Verzeichnis in Verbindung mit anderen Kommandos benutzen zu können, gibt +es besondere Operatoren: + + #ib#ALL#ie# liefert das gesamte Verzeichnis + #ib#SOME#ie# bietet das Verzeichnis zur Auswahl von Einträgen an. + + +In Verbindung mit einem internen Taskbezeichner wird einer der beiden Operatoren +einem Monitor-Kommando als Parameter nachgestellt. Das Kommando wirkt dann +nacheinander auf alle im Verzeichnis enthaltenen Dateien. + + +____________________________________________________________________________ + +gib kommando: +fetch (ALL father) + +____________________________________________________________________________ + +Alle Dateien der Vater-Task werden nacheinander geholt, bei Namensgleichheit +erfolgt die bekannte Kontrollfrage, ob die gleichnamige Datei in der eigenen Task +überschrieben werden soll. + +Falls nur einige Dateien des Verzeichnisses bearbeitet werden sollen, wird der Opera­ +tor 'SOME' dem Taskbezeichner vorangestellt: + +____________________________________________________________________________ + +gib kommando: +fetch (SOME father) + +____________________________________________________________________________ + + +Hier wird zunächst das Dateiverzeichnis der Task angeboten. Streichen Sie alle +Dateien, die auf der Diskette sind, aber nicht in Ihre Task geholt werden sollen, aus +dem Verzeichnis, indem Sie + +- den Dateinamen mit Blanks überschreiben + + oder: + +- die Zeile mit löschen + + oder: + +- mehrere Zeilen markieren, indem Sie zu Beginn des zu markierenden Bereichs + 'mark' betätigen und mit Hilfe der Cursor-Tasten den Beereich so weit wie benö­ + tigt ausdehnen. Im Anschluß daran können Sie diese Zeilen durch + + oder + +

+ + löschen. + + +____________________________________________________________________________ + + .............................. .......................... #markoff# +rechnungen april +rechnungen mai +rechnungen juni +rechnungen juli + + + +____________________________________________________________________________ + + + +In obigem Beispiel werden nach dem Kommando 'ESC RUBOUT' (=Löschen der +markierten Zeilen) und dem Kommando 'ESC q' (=editieren beenden) die Dateien +'rechnungen juni' und 'rechnungen juli' vom Archiv geholt. + +Als weitere Vereinfachung gibt es die Prozedur 'all' als Abkürzung für 'ALL myself'. + +Beispiel: alle Dateien auf Archivdiskette schreiben. + +____________________________________________________________________________ + +gib kommando: +save (all,archive) + +____________________________________________________________________________ + + +Für Fortgeschrittene: + +Sie können auch aus den Verzeichnissen mehrerer Tasks ein neues Verzeichnis +bilden. Zu diesem Zweck sind folgende Mengenoperationen auf Verzeichnisse mög­ +lich: + + #ib#-#ie# Differenzmenge + #ib#+#ie# Vereinigungsmenge + #ib#/#ie# Schnittmenge + +Beispiel: + + fetch (ALL father - ALL myself) + +Alle Dateien der Vater-Task, die noch nicht in der eigenen Task sind, werden geholt. + +3.7. Passwortschutz +#free(1.0)# + + + Das EUMEL- System ermöglicht Passwortschutz für Dateien, einzelne Tasks und + ganze Zweige des Taskbaumes. + +#free(1.0)# + +Falls Sie sicherstellen wollen (oder müssen), daß Teile Ihres EUMEL-Systems vor +unberechtigter Benutzung geschützt sind, können Sie den Zugriff mit einem Passwort +regeln. + +Als Passwort können Sie jeden beliebigen Text nehmen. Bedenken Sie jedoch, daß +ein wirklich wirksamer Schutz nur dann gewährleistet ist, wenn Sie weder ein triviales +Passwort (etwa den eigenen Vornamen) auswählen, noch eines, das Sie selbst nicht +behalten. #u##count("1")#)#e# #foot# +#u##value("1")#)#e# Man darf Passwörter nicht vergessen! Durch Passwörter geschützte Tasks kann +niemand - außer durch die Angabe des korrekten Passworts - wieder ankoppeln. +Hat man das Passwort vergessen, kann man nur noch die Task löschen. +#end# + +ACHTUNG: Es gibt ein besonderes Passwort im EUMEL-System: "-". Dieses + Passwort verhindert, daß die Task in der es gegeben wurde (z.B. UR), an + ein Terminal geholt wird, es darf folglich nicht für normale + Manager-Tasks gegeben werden. +#page# +Eine Task mit Passwort schützen +#free(1.0)# +Das Monitor-Kommando '#ib#task password#ie#' sorgt dafür, daß eine Task fortan nur wieder +mit einem 'continue'-Kommando 'betreten' werden kann, wenn man vorher das +richtige Passwort angibt. + +____________________________________________________________________________ + +gib kommando: +task password ("rosebud") + +____________________________________________________________________________ + +Versucht nun ein Benutzer, die mit dem Passwort geschützte Task mit dem 'conti­ +nue'-Kommando an sein Terminal anzukoppeln, wird er zunächst nach dem #ib#Pass­ +wort#ie# gefragt. Nur unter Angabe des Passworts wird die Task angekoppelt. + +Bei der Beantwortung des Passworts werden statt der eingegebenen Zeichen Punkte +auf den Bildschirm geschrieben. Durch Betätigen von ESC können die getippten +Zeichen lesbar gemacht werden. + +____________________________________________________________________________ + + gib supervisor kommando: + continue("taskname") + Passwort: ....... + + +____________________________________________________________________________ + + +Der Passwortschutz gewährleistet, daß kein unberechtigter Benutzer direkt an die +Dateien und Programme der Task gelangen kann. Es gibt jedoch noch zwei Situatio­ +nen, die einen unberechtigten Zugang zu Dateien erlauben: + +a) Dateien in die Vater-Task schicken: + Transportiert man Dateien in die Vater-Task ('save'-Kommando) können Benut­ + zer auf diese Dateien zugreifen (sofern sie Zugang zu dieser Task haben). Dies + kann man verhindern, indem man ein Datei-Passwort angibt. Man beachte, daß + das Passwort für Dateien und das oben beschriebene Passwort für Tasks nichts + miteinander zu tun haben. + +b) Dateien werden in eine Sohn-Task geholt: + Ist die Task als Vater-Task eingerichtet ('global manager'-Kommando), dann ist + es möglich, von der Sohn-Task Dateien ('fetch'-Kommando) aus der Vater- + Task zu holen, die mit einem Passwort geschützt ist. Darum muß man verhindern, + daß unberechtigte Benutzer Söhne einer mit Passwort geschützten Task einrich­ + ten können. Das kann man mit dem Kommando + +____________________________________________________________________________ + +maintenance : +#ib#begin password#ie# ("geheim") + +____________________________________________________________________________ + + + Wird dieses Kommando gegeben, wird man bei dem Versuch, eine Sohn-Task + einzurichten, nach einem Passwort gefragt. Beachten Sie, daß das 'begin pass­ + word' nichts mit dem Task-Passwort und Datei-Passwort zu tun hat. + + +Man kann einen ganzen Zweig eines EUMEL-Systems durch das Kommando 'family +password' vor unberechtigtem Zugriff schützen. Das Kommando: + +____________________________________________________________________________ + +maintenance: +family password ("geheim") + +____________________________________________________________________________ + +wird dazu (wie gewohnt als Monitor-Kommando) in der Vater-Task des zu schüt­ +zenden Zweigs des Taskbaumes gegeben. Damit ist das Passwort aller Söhne, Enkel +usw. dieser Task auf 'geheim' gesetzt, falls sie vorher kein Passwort oder das gleiche +Passwort wie die aufrufende Task haben. Eine Task in diesem Zweig, die bereits ein +eigenes, vom 'family password' verschiedenes Passwort besitzt, behält dieses eigene +Passwort. + +Bsp: Für 'PUBLIC' wird das Kommando '#ib#family password#ie# ("geheim")' gege­ + ben. Dann ist das Passwort von 'PUBLIC' und aller Tasks des Benutzerzweiges + auf 'geheim' gesetzt. + + +Es ist zu beachten, daß bei der Vergabe des 'family password' nur die aktuellen +Söhne der Task berücksichtigt werden. Söhne, die nach der Vergabe des 'family +password' eingerichtet werden, sind nicht durch dieses Passwort geschützt. + +Passwort löschen + + +Um ein Passwort zu löschen, geben Sie das Passwort-Kommando mit "" als Para­ +meter: + +____________________________________________________________________________ + +maintenance: +begin password("") + +____________________________________________________________________________ + + +Durch diese Angabe haben Sie den Passwort einen leeren Text als Parameter gege­ +ben, der das bisherige Passwort 'überschreibt'. + +#page# +Dateipasswort + + +Etwas komplizierter gestaltet sich der Passwortschutz für einzelne Dateien einer +Manager-Task, da in dieser Anwendung eine Unterscheidung nach Schreib- und +Leseschutz vorgenommen wird. + +Da in dieser Anwendung nur einige Dateien der Vater-Task vor Lesen ('fetch'), +Schreiben ('save','erase') oder beidem geschützt werden sollen, benötigt diese Proze­ +dur Angaben über Dateinamen, Schreibpasswort und Lesepasswort. + +____________________________________________________________________________ + +maintenance : +enter password ("dateiname","schreibschutz","leseschutz") + +____________________________________________________________________________ + +Falls die Datei nicht gegen Lesen geschützt werden soll, wird (wie beim Löschen +eines Passworts) '""' als Lesepasswort angegeben. + +Falls Schreiben und/oder Lesen für eine Datei gänzlich verboten#u#1)#e# sein soll, so ist +"-" als entsprechendes Passwort anzugeben. +#foot# +1) Natürlich kann die Datei in der Manager-Task, der sie gehört, normal editiert + werden. +#end# + +Um von einer Sohn-Task eine Datei mit Passwortschutz in der Vater-Task zu lesen +oder zu schreiben muß vor dem 'fetch', 'save' oder 'erase' Kommando das 'enter +password' Kommando eineggeben werden: + +____________________________________________________________________________ + +gib kommando: +enter password ("schreibpasswort/lesepasswort") + +____________________________________________________________________________ + +In der Sohn-Task wird also nur ein Passwort eingegeben. Falls wie oben ein '/' in +diesem Passwort enthalten ist, wird der erste Teil vor dem '/' als Schreibpasswort und +der zweite Teil als Lesepasswort geprüft. Falls kein '/' in dem Passwort enthalten ist, +wird das Wort sowohl als Schreib- als auch als Lesepasswort interpretiert. + +Beispiel: +In einer Manager-Task wird eine Datei "texte" eingerichtet, die Textvorlagen enthält. +In einigen Sohn-Tasks soll diese Datei geholt (= gelesen) werden können. Die +bearbeitete, somit veränderte Datei darf aber nicht zurück in die Vater-Task ge­ +schrieben werden. + +In der Vater-Task: enter password ("texte","-","psw") + + +In der Sohn-Task : enter password ("psw") + + +Falls das Passwort in einer Sohn-Task fehlerhaft oder gar nicht eingegeben wurde, +erscheint die Meldung : + +____________________________________________________________________________ + + gib kommando : + fetch ("geschützte datei") +FEHLER : Passwort falsch + +____________________________________________________________________________ + + +Somit kann diese Datei nur von Benutzern, die das Lesepasswort kennen, geholt +werden. Ein Überschreiben der Datei ist nicht möglich, da das Schreibpasswort nicht +gegeben werden kann ("-" !). +#page# +3.8. Monitor-Kommandos +#free(1.0)# +ALL + THESAURUS OP ALL (TASK CONST task) + Liefert einen Thesaurus#u#1)#e#, der alle Dateinamen der angegebenen Task enthält + (auch der Benutzer-Task 'myself'). +#foot# +1) Ein Thesaurus ist eine Liste, in diesem Zusammenhang eine Liste von Dateien. + (Siehe auch 2.4. Die ELAN-Notation +#end# + fetch (ALL father) + + THESAURUS OP ALL (TEXT CONST datei) + Liefert einen Thesaurus, der die in 'datei' vorhandenen Dateinamen (jede Zeile ein + Name) enthält. + + fetch (ALL "dateiliste") + +archive + PROC archive (TEXT CONST archivname) + Anmeldung von Archiv-Operationen. 'archivname' wird zur Überprüfung für alle + folgenden Archiv-Operationen verwandt, um die unberechtigte Benutzung eines + Archivs zu verhindern. Die Anmeldung wird abgelehnt, wenn ein anderer Nutzer + das Archiv belegt hat. + + + archive ("textdiskette") + + + TASK PROC archive + Liefert den internen Task-Bezeichner für die Verwendung in Dateikommandos. + + + save ("dateiname", archive) + + + +begin password + PROC begin password (TEXT CONST geheim) + Verhindert das unberechtigte Einrichten einer Sohn-Task. + + + begin password("gmd") + + +break + PROC break + Die zum Terminal aktuell zugeordnete Task wird abgekoppelt. Sie wird damit zu + einer Hintergrund-Task. + + +brother + TASK PROC brother (TASK CONST task) + Liefert den internen Task-Bezeichner der angegebenen "Bruder"-Task. + + + list(brother) + + +check + PROC check (TEXT CONST dateiname, TASK CONST task) + Überprüft, ob die Datei 'dateiname' auf dem Archiv lesbar ist. + + + check ("meine datei", archive) + + + PROC check (THESAURUS CONST t, TASK CONST task) + Überprüft, ob die in dem Thesaurus 't' enthaltenen Dateien auf dem Archiv lesbar + sind. + + + check (ALL archive, archive) + + + +clear + PROC clear (TASK CONST task) + Löscht alle Dateien der Task 'ARCHIVE'und benennt die Diskette um, falls ein + anderer als der bisherige Diskettenname bei der Reservierung angegeben wurde. + + + archive("disk1"); clear(archive) + + +copy + PROC copy (TEXT CONST quelle, ziel) + Kopiert die Datei 'quelle' in eine neue Datei mit dem Namen 'ziel' in der + Benutzer-Task. + + + copy("datei","neue datei") + + Fehlerfälle: "ziel" existiert bereits + "quelle" gibt es nicht + zu viele Dateien + + +edit + PROC edit + a) Im Monitor: + Ruft den Editor mit den zuletzt verwandten Dateinamen auf. + b) Im Editor: + Der Dateiname wird erfragt. + Für jedes 'edit' gilt: + Wurde 'edit' zum ersten Mal aufgerufen, nimmt das Fenster den gesamten + Bildschirm ein. Bei erneutem 'edit'-Aufruf wird ein Fenster nach rechts unten ab + der aktuellen Cursor-Position eröffnet. + + PROC edit (TEXT CONST dateiname) + Ruft den Editor mit 'dateiname' auf. + + + edit("handbuch teil3") + + + + PROC edit (TEXT CONST dateiname, x, y, xbreite, yhöhe) + Wie obiger 'edit'-Aufruf, jedoch kann das Fenster, in dem 'dateiname' editierbar + ist, gesetzt werden. Die Parameter definieren ein Editor-Fenster mit der linken + oberen Ecke auf den Bildschirmkoordinaten 'x' und 'y' und einer Zeilenbreite + 'xbreite' und 'yhöhe' Zeilen. Wird der Editor mit 'edit ("dateiname")' aufgerufen, + wird implizit 'edit ("dateiname", 1, 1, 79, 24)' aufgerufen. + + + edit("notiz",5,5,44,12) + + + PROC edit (THESAURUS CONST t) + Editieren aller in dem Thesaurus 't' enthaltenen Dateien nacheinander. + + + edit (ALL father) + + + +end + PROC end + Die zum Terminal aktuell gehörende Task wird abgebrochen und gelöscht. + +enter password + PROC enter password (TEXT CONST datei, schreibpass, lesepass) + Die angegebene Datei wird mit Schreib- und Lesepassword versehen. Die + Passwörter werden in der eigenen Task nicht berücksichtigt. + Falls der Schutz total sein soll, so ist für die verbotene Operation "-" als + Passwort anzugeben. + + + enter password ("daten","sicher","heit") + + + PROC enter password (TEXT CONST password) + Gibt Schreib- und Lesepasswort für den Austausch mit Manager-Task an. Falls + zwei verschiedene Passwörter für Lesen und Schreiben vereinbart sind, so sind + sie als ein Text durch "/" getrennt einzugeben. + + + enter password ("lese/schreibpasswort") + + +erase + PROC erase (TEXT CONST datei) + Löscht eine Datei mit dem Namen 'name' in der unmittelbaren Vater-Task. + + + erase("alte datei") + + + Fehlerfälle: + "datei" gibt es nicht + Passwort falsch + + PROC erase (TEXT CONST name, TASK CONST manager) + Löscht eine Datei mit dem Namen 'name' in der Task 'manager'. + + + erase ("dateiname", father) + + + PROC erase (THESAURUS CONST thesaurus) + Löscht die im 'thesaurus' angegebenen Dateien in der Vater-Task. + + + erase (ALL myself) + (* löscht alle Dateien in der Vater-Task, die in der + Benutzer-Task vorhanden sind *) + + + PROC erase (THESAURUS CONST thesaurus, TASK CONST manager) + + + erase (all,father) + (* löscht alle Dateien in der Vater-Task, die in der + Benutzer-Task vorhanden sind *) + + + +father + TASK PROC father + Liefert den internen Task-Bezeichner der Vater-Task der Benutzer-Task. + + + list(father) + + + TASK PROC father (TASK CONST task) + Liefert den internen Task-Bezeichner von 'task'. + + + save ("dateiname", father (father)) + (* Kopiert 'dateiname' zum "Großvater" *) + + + +fetch + PROC fetch (TEXT CONST name) + Kopieren einer Datei von der Vater-Task in die Benutzer-Task + + + fetch("sicherungskopie") + + Fehlerfälle: + "datei" gibt es nicht + Passwort falsch + zu viele Dateien + + + PROC fetch (TEXT CONST name, TASK CONST manager) + Kopieren einer Datei in die Benutzer-Task von 'manager'. + + + fetch ("dateiname", /"global") + + + PROC fetch (THESAURUS CONST thesaurus) + Holt alle im 'thesaurus' enthaltenen Dateien von der Vater-Task. + + + fetch (ALL) + + + PROC fetch (THESAURUS CONST thesaurus, TASK CONST manager) + Zweck: Holt alle im 'thesaurus' enthaltenen Dateien von der 'manager'-Task. + + + fetch (ALL /"global", /"global") + + +forget + PROC forget (TEXT CONST datei) + Löschen einer Datei mit dem Namen 'name' in der Benutzer-Task. + + + forget ("alte datei") + + Fehlerfälle: + "datei" gibt es nicht + + PROC forget (THESAURUS CONST thesaurus) + Löscht die im 'thesaurus' enthaltenen Dateien in der Benutzer-Task. + + + forget (SOME myself) + + +format + PROC format (THESAURUS CONST thes) + Formatieren von Disketten und Einstellen des Namens. + + + format(archive) + + + PROC format (INT CONST art, THESAURUS CONST thes) + Formatieren von Disketten im Nichtstandardformat des benutzten Geräts + + + format(2,archive) + + +global manager + PROC global manager + Durch den Aufruf der Prozedur wird die Benutzer-Task zu einem Datei- + Manager. Danach können Söhne dieser Task eingerichtet werden. + + +list + PROC list + Listet alle Dateien der Benutzer-Task mit Namen und Datum des letzten Zugriffs + auf dem Terminal auf. + + PROC list (TASK CONST task) + Listet alle Dateien der angegebenen 'task' mit Namen und Datum der letzten + Änderung auf dem Terminal auf. + + + list (father) + + + +myself + TASK PROC myself + Liefert den internen Task-Bezeichner der Benutzer-Task. + + + save (ALL myself, father) + + + +public + TASK PROC public + Liefert den internen Task-Bezeichner von "PUBLIC". + + + fetch ("dateiname", public) + + + +rename + PROC rename (TEXT CONST altername,neuername) + Umbenennen einer Datei von 'altername' in 'neuername'. + + + rename("altes handbuch","neues handbuch") + + +save + PROC save (TEXT CONST dateiname) + Datei 'dateiname' wird an die unmittelbare Vater-Task übertragen. + + + save("neues handbuch") + + + Fehlerfälle: + "neues handbuch" gibt es nicht + zu viele Dateien + Passwort falsch + + PROC save (TEXT CONST name, TASK CONST task) + Datei mit dem Namen 'name' in Task 'task' kopieren + + + save ("dateiname", /"global") + + + Fehlerfälle: + "dateiname" gibt es nicht + zu viele Dateien + Passwort falsch + + PROC save (THESAURUS CONST thesaurus) + Kopiert die Dateien, die in 'thesaurus' enthalten sind, in die Vater-Task. + + + save (SOME myself) + + + PROC save (THESAURUS CONST thesaurus, TASK CONST manager) + Kopiert die Dateien, die in 'thesaurus' enthalten sind, in Task 'manager'. + + + save(SOME myself, /"global") + + +SOME + THESAURUS OP SOME (THESAURUS CONST thesaurus) + Bietet den angegebenen 'thesaurus' zum Editieren an. Dabei können nicht + erwünschte Namen gestrichen werden. + + THESAURUS OP SOME (TASK CONST task) + Bietet einen THESAURUS von 'task' zum Editieren an. + + THESAURUS OP SOME (TEXT CONST dateiname) + Bietet einen 'thesaurus', der aus 'dateiname' gebildet wird, zum Editieren an. + + +task + TASK PROC task (TEXT CONST task name) + Liefert den internen Task-Bezeichner von 'task name'. + + + save ("dateiname", task ("PUBLIC")) + = save ("dateiname", public) + + + +storage info + PROC storage info + Informationsprozedur über den belegten Hintergrund-Speicher. + + +task info + PROC task info + Informiert über alle Tasknamen im System unter gleichzeitiger Angabe der + Vater/Sohn-Beziehungen (Angabe durch Einrückungen). + + PROC task info (INT CONST art) + Informiert über alle Tasks im System. Mit 'art' kann man die Art der Zusatz- + Information auswählen. Für 'art' sind zur Zeit folgende Werte zugelassen: + + art=1: entspricht 'task info' ohne Parameter, d.h. es gibt nur die Tasknamen + unter Angabe der Vater/Sohn-Beziehungen aus. + + art=2: gibt die Tasknamen aus. Zusätzlich erhalten Sie Informationen über die + verbrauchte CPU-Zeit der Task, die Priorität, den Kanal, an dem die + Task angekoppelt ist, und den eigentlichen Taskstatus. Hierbei bedeuten: + + 0 -busy- Task ist aktiv. + 1 i/o Task wartet auf Beendigung des Outputs oder auf + Eingabe. + 2 wait Task wartet auf Sendung von einer anderen Task. + 4 busy-blocked Task ist rechenwillig, aber blockiert. + 5 i/o -blocked Task wartet auf I/O, ist aber blockiert. + 6 wait-blocked Task wartet auf Sendung, ist aber blockiert. + Achtung: Die Task wird beim Eintreffen einer + Sendung automatisch entblockiert. + + art=3: wie 2, aber zusätzlich wird der belegte Speicher angezeigt. (Achtung: + Prozedur ist zeitaufwendig!). + + + task info(2) + + +task status + PROC task status + Informationsprozedur über den Zustand der eigenen Task. Informiert u.a. über + - Name der Task, Datum und Uhrzeit; + - verbrauchte CPU-Zeit; + - belegten Speicherplatz; + - Kanal, an den die Task angekoppelt ist; + - Zustand der Task (rechnend u.a.m.); + - Priorität. + + PROC task status (TASK CONST t) + Wie obige Prozedur, aber über die Task mit dem internen Tasknamen 't'. + + + task status (father) + + + +task password + PROC task password (TEXT CONST geheim) + Einstellen eines Passworts für Benutzertask. Das Kommando 'task password' ist + ein Monitor-Kommando. Ist eine Task mit einem Paßwort geschützt, so wird + durch den Supervisor nach dem 'continue'-Kommando das Passwort angefragt. + Nur nach Eingabe des richtigen Passworts gelangt man in die gewünschte Task. + Das Passwort kann durch nochmaligen Aufruf von 'task password' geändert + werden, z.B. wenn es in regelmäßigen Abständen geändert werden muß, um + personenbezogene Daten zu schützen. + + Es gibt keine Möglichkeit, ein einmal eingestelltes Passwort in Erfahrung zu + bringen. Sollte das Passwort vergessen werden, kann somit die Task nur noch + gelöscht werden. + + Wird als Passwort ein '-'-Zeichen eingegeben, so wird verhindert, daß die + betreffende Task jemals wieder mit dem 'continue'-Kommando angekoppelt + werden kann. Dies ist z.B. für Manager-Tasks sinnvoll. + + + task password("mein geheimnis") + + ++ + THESAURUS OP + (THESAURUS CONST links, rechts) + Vereinigungsmenge von 'links' und 'rechts'. + + THESAURUS OP + (THESAURUS VAR thes, TEXT CONST name) + Nimmt den TEXT 'name' in den Thesaurus 'thes' auf. + + + save (SOME father + "rechnung", archive) + + + +- + THESAURUS OP - (THESAURUS CONST links, rechts) + Differenzmenge von 'links' und 'rechts'. + + THESAURUS OP - (THESAURUS VAR thes, TEXT CONST name) + Liefert einen Thesaurus aus 'thes', aber ohne den Eintrag 'name'. + + + save (ALL myself - "rechnung", archive) + + + +/ + THESAURUS OP / (THESAURUS CONST links, rechts) + Zweck: Schnittmenge von 'links' und 'rechts'. + + + save(ALL myself / ALL father, archive) + + + TASK OP / (TEXT CONST task name) + Liefert aus einem Tasknamen den internen Tasknamen. '/' kann überall dort + eingesetzt werden, wo ein interner Taskname verlangt wird. + + + fetch ("dateiname", /"global") + diff --git a/doc/user/benutzerhandbuch.4 b/doc/user/benutzerhandbuch.4 new file mode 100644 index 0000000..c13a091 --- /dev/null +++ b/doc/user/benutzerhandbuch.4 @@ -0,0 +1,2242 @@ +#start(5.0,1.5)##pagenr("%",1)##setcount(1)##block##pageblock##count per page# +#headeven# +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# + EUMEL-Benutzerhandbuch +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#headodd# +#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")# +#table# + Teil 4: Der Editor +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#bottomeven# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +4 - % GMD +#tableend##clearpos# +#end# +#bottomodd# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +GMD 4 - % +#tableend##clearpos# +#end# +TEIL 4: Der Editor +#free(1.0)# + +4.0. Vorwort + +#free(1.0)# +Mit dem #ib#EUMEL-Editor#ie# schreiben Sie alle Ihre Texte und Daten. Er bietet vielfäl­ +tige Möglichkeiten, um Autoren oder Programmierer bei dem Erstellen, Korrigieren und +Gestalten von Manuskripten oder Programmen zu unterstützen. Die größte Hilfe beim +Schreiben besteht (durch die Speicherfähigkeit von Computern) im beliebig häufigen +Zugriff auf einmal geschriebene Informationen. Im Gegensatz zu einer Schreibmaschi­ +ne können Sie mit dem EUMEL-Editor (beliebig oft) Einfügungen vornehmen, Texte +korrigieren, löschen und neu gestalten. + +Somit ist das Schreiben von Texten mittels des EUMEL-Systems besonders dann +vorteilhaft und zeitsparend, wenn Texte häufig geändert werden oder wenn sie in +einer besonders schönen Form gedruckt werden sollen. Weiterhin bietet der Editor +Hilfen zum Schreiben an, wie z.B. automatischen Wortumbruch am Zeilenende, eine +Einrückungsautomatik, "Lernen" von Texten u.a.m. Zusätzlich kann der Editor in +seinen Fähigkeiten erweitert und somit für spezielle Schreibarbeiten angepaßt werden. +Aber das soll in einem späteren Kapitel beschrieben werden. + +Bei der Entwicklung des Editors wurde besonderer Wert auf einfache Bedienung +gelegt: innerhalb von wenigen Minuten können Sie schon Texte schreiben und Daten +erfassen und sehen stets auf dem Bildschirm, was mit Ihrem Text passiert. Das +Schreiben und Korrigieren werden durch einige wenige, aber leistungsstarke Funk­ +tionstasten unterstützt. + +Einige Gestaltungsmöglichkeiten für Texte kann man nicht direkt auf dem Terminal +"sehen", wie z.B. Proportionalschriften, Fettdruck usw. Solche Leistungen können +durch Anweisungen an die Textkosmetik-Programme und den EUMEL-Drucker +angefordert werden. Diese Anweisungen müssen in den Text eingefügt werden. Lesen +Sie hierzu Teil 5 ("Textkosmetik"). +#free(1.0)# + +#ib(9)#4.1. #ib#Ein- und Ausschalten des Editors#ie##ie(9)# + +#free("1.0")# + #on("i")# + Hier beschreiben wir, wie der Editor ein- und ausgeschaltet wird und wie der + Editor eine Datei einrichtet. + + #off("i")##free(1.0)# +Wenn in Ihrer Task auf dem Bildschirm die Aufforderung + +____________________________________________________________________________ + +gib kommando : + +____________________________________________________________________________ + + +erscheint, tippen Sie + +____________________________________________________________________________ + +#ib#edit#ie# ("dateiname") + +____________________________________________________________________________ + + +und der EUMEL-Editor wird eingeschaltet. Ist die Datei noch nicht vorhanden, d.h. +kein Text unter dem angegebenen Namen im System gespeichert, folgt eine Anfrage, +ob eine Datei unter dem eingegebenen Namen neu eingerichtet werden soll: + +____________________________________________________________________________ + +"dateiname" neu einrichten (j/n) ? + +____________________________________________________________________________ + + +Dies dient zur Kontrolle von Schreibfehlern, die besonders bei ähnlichen Dateina­ +men auftreten. Man kann dann das Einrichten der Datei ablehnen, den Dateinamen +verbessern und das Kommando erneut geben. + +Falls Sie die Datei neu anlegen wollen, bejahen Sie diese Frage mit + +#center##taste1(" j ")# #taste1(" J ")# #taste1(" y ")# oder #taste1(" Y ")# + + +Es erscheint ein leerer Editorbildschirm. Die oberste Zeile des Bildschirms ist die +#ib#Titelzeile#ie#. In ihr kann nicht geschrieben werden. Sie zeigt jedoch verschiedene +nützliche Dinge an: den Namen der Datei, die Nummer der aktuellen Zeile, in der +gerade geschrieben wird, Tabulatormarken, Einfügemodus, Lernmodus, Auftrennung +usw. + +____________________________________________________________________________ + + ................. dateiname ...................... Zeile 1 +_ + + +____________________________________________________________________________ + + +In unserem Fall haben Sie eine neue Datei angelegt. Sie enthält noch keinen Text. In +der Titelzeile sind jedoch schon der Name der Datei und die aktuelle Zeilennummer +eingetragen. Bei einer neuen Datei ist der Bildschirm unterhalb der Titelzeile leer. +Dieser Teil dient als "Schreibfläche". Der #ib#Cursor#ie# steht dann direkt unter der Titelzei­ +le. Er zeigt immer die aktuelle #ib# Schreibposition#ie# an. Jetzt kann sofort mit dem Schrei­ +ben begonnen werden, ganz wie mit einer normalen Schreibmaschine. + +Rufen Sie eine Datei auf, in die Sie schon Text geschrieben haben, zeigt Ihnen der +Editor das zuletzt bearbeitete Textstück und Sie können normal weiter schreiben. + +Wollen Sie die #ib#Schreibarbeit beenden#ie# und den #ib#Editor ausschalten#ie#, so drücken Sie die +beiden Tasten + + + +nacheinander. Es erscheint + +____________________________________________________________________________ + +gib kommando: + +____________________________________________________________________________ + + +und Sie haben damit den #ib#Editor verlassen#ie# und befinden sich wieder im Monitor. #page# + +#ib(9)#4.2. Die wichtigsten Tasten des Editors#ie(9)# +#free(1.0)# +#ib(9)#4.2.1. Das #ib#Tastenfeld#ie##ie(9)# + +#free(1.0)# + #on("i")# + Auf dem Tastenfeld gibt es einige Tasten, die auf einer Schreibmaschine nicht vor­ + handen sind. + + #off("i")# +#free(1.0)# +Das Tastenfeld eines EUMEL-Terminals entspricht weitgehend dem einer Schreib­ +maschine. Sie finden also die Buchstaben a-z und die Ziffern 0-9 auf Tasten. Mit +der #ib#SHIFT-Taste#ie# (Umschalttaste) und gleichzeitigem Drücken einer anderen Taste +können Sie die großen Buchstaben und eine Reihe von speziellen anderen Zeichen, +die #ib#Sonderzeichen#ie# genannt werden, schreiben. Die "Zwischenraumtaste" oder Leer­ +taste erzeugt immer ein Leerzeichen. + +Nun gibt es in der Praxis zwei unterschiedliche Tastaturen. Zum einen existiert die +#ib#EDV-Tastatur#ie#, die zum Schreiben von Programmen benutzt wird. Sie erkennt man +daran, daß keine #ib#Umlaute#ie# (ä, ö, ü) und kein ß auf den Tasten abgebildet sind. Dafür +gibt es Tasten für eckige und geschweifte Klammern. Sollen auf einer solchen Tasta­ +tur die Umlaute geschrieben werden, muß man sich eines Tricks bedienen: mit der +Taste ESC und nachfolgendem Betätigen einer anderen Taste (z.B. a, o, u) erhalten +wir den entsprechenden Umlaut. + +In der Regel kann man die Umlaute auf dem Bildschirm eines solchen EDV-Ter­ +minals nicht sehen, sondern sie erscheinen als "a", "u", usw. Beim Druck eines +Textes werden sie aber richtig dargestellt. + +Die andere Tastatur entspricht in der #ib#Tastenbelegung#ie# weitgehend einer deutschen +Schreibmaschine und besitzt Tasten für die Umlaute und ß. Sollen vorwiegend deut­ +sche Texte geschrieben werden, empfiehlt es sich, solch ein Terminal zu verwenden. + + + + Tastatur + + + + + + + + + + + + + + + +Neben diesen "einfachen" Tasten gibt es die Funktionstasten, die zur Bedienung des +Editors (aber auch anderer Programme) notwendig sind. Wo die Tasten auf Ihrem +Gerät liegen, hängt von dem jeweiligen Gerätetyp ab. Die Wirkung der Tasten +erklären wir in den anschließenden Abschnitten. #count("1")#) #foot# +#value("1")#) Es kann sein, daß die Tasten nicht richtig beschriftet sind. Die Installations­ + anleitung muß dann die Entsprechungen beschreiben. Zusätzlich zu den im + folgenden beschriebenen können sich noch weitere Tasten auf Ihrem Terminal + befinden, die aber standardmäßig keine besondere Bedeutung für den Editor + haben. +#end# +#page# +Die Funktionstasten des EUMEL-Systems +#l pos (0.0)##l pos(4.0)# + + +<,>,v,^ Positionierungstasten +#table# +#free(0.5)# + Umschalttaste +#free(0.5)# + Eingabe-/ Absatztaste +#free(0.5)# + Verstärkertaste +#free(0.5)# + Löschtaste +#free(0.5)# + Einfügetaste +#free(0.5)# + Tabulatortaste +#free(0.5)# + Markiertaste +#free(0.5)# + Kommandotaste +#free(0.5)# + Supervisortaste +#free(0.5)# + Stoptaste +#free(0.5)# + Weitertaste +#tableend##clear pos# + + +#page# +Die Wirkung der Funktionstasten +#free(0.5)# + + +#ib#Umschalttaste#ie# + +Wird diese Taste gleichzeitig mit einer anderen betätigt, so wird ein Buchstabe in +Großschreibung, bei den übrigen Tasten das obere Zeichen, ausgegeben. So wird z.B. +anstelle der "9" das Zeichen ")" ausgegeben. +#free(1.5)# + + +#ib#Kontroll-/Steuertaste#ie# + +Mit dieser Taste in Kombination mit Zusatztasten können Sonderfunktionen des +Systems angewählt werden. Für EUMEL sind folgende drei Tastenkombinationen +(wobei die Tasten gleichzeitig betätigt werden müssen) wichtig: + + Anhalten der Bildschirmausgabe + + Wirkung der SV-Taste (bei jedem Rechner) + + Bildschirmausgabe fortführen +#l pos (0.0)##l pos(4.0)# + + +#free(1.5)# + + +#ib#Eingabetaste / Absatztaste#ie#, Carriage Return, kurz: 'CR' + +Diese Taste wird im Editor betätigt, um das Ende eines Absatzes zu kennzeichnen. +Die kontinuierliche Fließtexteingabe wird durch sie unterbrochen und es wird an den +Beginn der nächsten Zeile positioniert. Einrückungen werden beibehalten. Eine Ab­ +satzmarke ist im Editor an der Inversmarkierung am rechten Bildschirmrand zu erken­ +nen. + +Die 'CR'-Taste ist oft mit einem geknicktem Pfeil nach links gekennzeichnet. Im +Kommandomodus (also bei "gib kommando :") wird durch Betätigung dieser Taste ein +gegebenes Kommando ausgeführt. + +Die sonstige Benutzung dieser Taste außerhalb des Editors wird in der jeweiligen +Anwendung beschrieben, z.B. Bestätigung eines Trennvorschlags bei der Silbentren­ +nung. + +<, >, v, ^ + +Tasten für die Positionierung + +#ib#Positionierung des Cursors#ie# um eine Spalten-/Zeilenposition in die jeweilige Richtung. +#free(1.5)# + + +"#ib#Verstärkertaste#ie#"; wird als Vorschalttaste bedient. + +In Kombination mit anderen Funktionstasten wird deren Wirkung verstärkt. (vgl. +4-#topage("HOP")#) + +#on("u")#Beispiel:#off("u")# + + + + +Steht der Cursor nicht am unteren Bildrand, so wird er dorthin positioniert. Steht er +am unteren Bildrand, so wird um einen Bildschirminhalt "weitergeblättert". + +Auch die Funktionen 'RUBIN'/'RUBOUT' werden in Kombination mit der HOP-Taste +verstärkt.(vgl. 4-#topage("verstärkt")#ff) #free(1.5)# + + +#ib#Löschtaste#ie# + +Das Zeichen, auf dem der Cursor steht, wird gelöscht. Wenn der Cursor hinter dem +letzten Zeichen einer Zeile steht, wie bei fortlaufender Eingabe üblich, wird das letzte +Zeichen gelöscht. + +#on("u")#Beispiel:#off("u")# + +____________________________________________________________________________ + ................. dateiname ...................... Zeile 4 + +Mit der RUBOUT-Taste ist es möglich, ein +Zeichen nach dem anderen auf dem Bildschirm +zu löschen. Steht der Cursor auf einem +Zeichen, das irrtümlicherweise eingetipp?t +wurde, kann dieses durch einmaliges +Betätigen der RUBOUT-Taste aus der Datei +gelöscht werden. + +____________________________________________________________________________ + + +Nach Betätigen der - Taste: + + +____________________________________________________________________________ + ................. dateiname ...................... Zeile 4 + +Mit der RUBOUT-Taste ist es möglich, ein +Zeichen nach dem anderen auf dem Bildschirm +zu löschen. Steht der Cursor auf einem +Zeichen, das irrtümlicherweise eingetippt +wurde, kann dieses durch einmaliges +Betätigen der RUBOUT-Taste aus der Datei +gelöscht werden. + +____________________________________________________________________________ + +#page# + + + + +#ib#Ein- bzw. Ausschalten des Einfügemodus.#ie# + +Das Betätigen der Taste schaltet in den Einfügemodus.Der Zustand wird durch das +Wort "RUBIN" im linken Drittel der Titelzeile der Datei angezeigt. Vor dem Zeichen, +auf dem der Cursor steht, wird eingefügt. Nochmaliges Betätigen der Taste schaltet +den Einfügemodus aus. + +#on("u")#Beispiel:#off("u")# + + +____________________________________________________________________________ + ................. dateiname ...................... Zeile 5 + +Das Betätigen der Taste schaltet in den +Einfügemodus. Der Zustand wird durch das +Wort "RUBIN" im linken Drittel der Titelzeile +angezeigt. Vor dem Zeichen, auf dem der +Cursor steht, wird ' ' eingefügt. +Nochmaliges Betätigen der Taste schaltet den +Einfügemodus aus. + +____________________________________________________________________________ + + + +Nach Betätigen der - Taste und Einfügen des Wortes " jetzt": + +____________________________________________________________________________ + .......RUBIN...... dateiname ..................... +Zeile 5 +Das Betätigen der Taste schaltet in den +Einfügemodus. Der Zustand wird durch das +Wort "RUBIN" im linken Drittel der Titelzeile +angezeigt. Vor dem Zeichen, auf dem der +Cursor steht, wird jetzt ' ' eingefügt. +Nochmaliges Betätigen der Taste schaltet den +Einfügemodus aus. + +____________________________________________________________________________ + + + + + +#ib#Tabulatortaste#ie# + +Betätigen Sie die 'TAB'-Taste, um vom linken Bildschirmrand auf den Textbeginn in +der Zeile bzw. eine Tabellenspalte zu positionieren. Erneutes Betätigen der 'TAB'- +Taste positioniert den Cursor auf die nächste eingestellte Tabulator-Position. Die +eingestellten Tabulatorpositionen erkennen Sie an den Tabulatorzeichen (Dachzei­ +chen) in der obersten Bildschirmzeile. + +Wenn keine TABs gesetzt sind, werden die beiden Schreibgrenzen, linker Bildschirm­ +rand und Ende der Zeile, als #on("i")#voreingestellte# #off("i")# TABs angesehen. +#free(1.5)# + + +#ib#Ein- bzw. Ausschalten der Markierung#ie#. + +Bei Betätigung dieser Taste wird in einen speziellen #ib#Markierzustand#ie# geschaltet. Alles, +was Sie jetzt schreiben bzw. durch Bewegen des Cursors in Richtung Dateiende +kennzeichnen, steht als #on("i")#markierter# #off("i")# Bereich für die Bearbeitung zur Verfügung. Zur +besseren Sichtbarkeit wird der markierte Bereich invers zum übrigen Text dargestellt. + +Wird der Cursor in eine Richtung bewegt, wird das gesamte Textstück zwischen +Einschaltpunkt der Markierung und aktueller Cursorposition markiert. Rückwärtsbewe­ +gungen des Cursors verkürzen den markierten Bereich wieder. + +Einen derart markierten Bereich können Sie nun z.B. duplizieren, verschieben, lö­ +schen, durchsuchen oder weiterverarbeiten. (vgl. 4- #topage("mark")# ff). + +Durch erneutes Betätigen der MARK-Taste schalten Sie den Markier-Zustand auch +wieder aus. + +#on("u")#Beispiel:#off("u")# + +Sie wollen einen Textteil markieren, um ihn an eine andere Stelle zu verschieben +(evtl. um ihn an dieser Stelle später zu löschen): + +Sie positionieren den Cursor auf den Beginn des Textteils, gehen in den Markierzu­ +stand durch Betätigen der MARK-Taste und führen nun den Cursor mit Hilfe der +Positioniertasten bis zum Ende des zu markierenden Bereichs. + + +____________________________________________________________________________ + ................. dateiname ...................... Zeile 5 + +Mit dem Cursor positionieren Sie an die +Stelle, ab der markiert werden soll und +betätigen die MARK-Taste. Nun führen Sie den +Cursor bis zu der Stelle, bis zu der +markiert werden soll. Der markierte Text wird +normalerweise "schwarz auf weiss" +dargestellt. + +____________________________________________________________________________ + + + +Mit weiteren Kommandos (vgl. ESC-Taste und Kommando-Verarbeitung, 4- #topage("ESC")#) +kann der Bereich nun bearbeitet werden. +#free(1.5)# + + +#ib#Kommandotaste#ie# + +Mit der ESC-Taste in Kombination mit einer Folgetaste können Sie vordefinierte +Aktionen anwählen. Es gibt Aktionen, die vorprogrammiert zur Verfügung stehen, und +Sie selbst können weitere hinzufügen. (vgl. 4-#topage("ESC")# ) #free(1.5)# + + +#ib#SUPERVISOR-Taste im Mehrbenutzer-Betrieb#ie# + +Betätigen Sie diese Taste im Editor, dann unterbrechen Sie Ihre Editierarbeit und +erhalten die Meldung + +____________________________________________________________________________ + + Terminal 2 + + + EUMEL Version 1.8/M + + + gib supervisor kommando: + + + + + ESC ? --> help + ESC b --> begin("") ESC h --> halt + ESC c --> continue("") ESC s --> storage info + ESC q --> break ESC t --> task info + + +____________________________________________________________________________ + + +Wollen Sie nun im Editor fortfahren bzw. haben Sie irrtümlich die SV-Taste betätigt, +dann geben Sie das Kommando + +____________________________________________________________________________ + + gib supervisor kommmando : + continue ("Sekretariat") + + +____________________________________________________________________________ + + +(falls Ihre Task, in der Sie arbeiteten, wirklich "Sekretariat" hieß!) + +Um Ihren in Bearbeitung befindlichen Text wieder vollständig auf dem Bildschirm zu +sehen, betätigen die die Tasten + + + +Sie sind wieder an der Stelle, an der Sie den Text mit der SV-Taste verlassen ha­ +ben, und können normal weiterarbeiten. + +#on("u")#Achtung:#off("u")# Die SV-Taste kann, je nach Terminal, durch das Betätigen von zwei +Tasten gleichzeitig realisiert sein (oft 'CTRL b'). Beachten Sie die Beschreibung Ihrer +Tastatur! +#free(1.5)# + + +#ib#Unterbrechen einer Ausgabe#ie# (oft auch als CTRL a realisiert). + +Haben Sie diese Taste aus Versehen betätigt, erkennen Sie dies daran, daß der +Editor nicht "reagiert". Betätigen Sie die WEITER-Taste (oft auch CTRL c). +#free(1.5)# + + +Unterbrochene Ausgabe fortsetzen. + +Ein mit der STOP-Taste angehaltene Ausgabe können Sie durch Betätigen der +#ib#WEITER-Taste#ie# fortsetzen. + + +#on("u")#VORSICHT:#off("u")# Die STOP-Taste unterbricht nur die Ausgabe auf den Bildschirm. +Zeichen, die während des STOP eingegeben werden, werden gespeichert und nach +'WEITER' ausgegeben! + + +#page# +4.2.2 Speicherung von Texten +#free(1.0)# + #on("i")# + In diesem Abschnitt wird der Begriff "Datei" erklärt und es wird erläutert, wie + unterschiedliche Texte auseinandergehalten werden können. + ## #off("i")# + + + +Das EUMEL-System speichert einmal geschriebene Texte, bis sie vom Benutzer +gelöscht werden. In der Regel wird nicht nur ein (langer) Text oder ein Programm +geschrieben, sondern mehrere und unterschiedliche. Um diese auseinanderhalten zu +können, versehen wir sie jeweils mit einem Namen, der frei gewählt werden kann. +Beispiele für Namen: + + + "Brief vom 1.12.86" + "1. Kapitel meines Buches" + + +Eine Sammlung von Zeichen (also im Normalfall unsere geschriebenen Texte), die mit +einem Namen versehen worden ist, nennt man eine #ib##on("bold")#Datei#ie##off("bold")#. Der Editor erstellt also eine +Datei, wenn wir einen Text schreiben. Eine Datei kann bis zu 4 000 Zeilen fassen, +wobei jede Zeile bis zu 32 000 Zeichen lang sein darf. Das Produkt aus der Anzahl +der Zeilen und den Zeichen pro Zeile kann z.Zt. jedoch 1 000 000 Zeichen (=1MB) +nicht übersteigen. #page# + +#ib(9)#4.2.3. #ib#Schreiben von Texten#ie##ie(9)# +#free(1.0)# + #on("i")# + Texte werden fortlaufend geschrieben. Absätze werden durch die CR-Taste + markiert. + # #off("i")# + +#free(0.8)# + +Nach dieser etwas langen Vorrede können wir endlich losschreiben. Wird ein Zeichen +geschrieben, rückt der #ib#Cursor#ie# automatisch nach rechts auf die nächste Schreibstelle. +Durch den automatischen #ib#Wortumbruch#ie# werden angefangene Worte, die über ein +Zeilenende hinausgehen würden, ohne Silbentrennung in die nächste Zeile gebracht. +#u##count("6")#)#e# +#foot# +#u##value("6")#)#e# Nehmen Sie bitte keine Silbentrennung "per Hand" vor. Eingebrachte Trenn­ + striche gelten als Bindestrich und bleiben somit auch bei Umformatierungen + erhalten, was unerwünscht ist. Für diese mühevolle Aufgabe gibt es in der Text­ + verarbeitung ein Programm! +#end# + +Die 'CR'-Taste (bei einer Schreibmaschine bedeutet sie "Wagenrücklauf") braucht +also nur noch betätigt zu werden, wenn eine Zeile vorzeitig beendet werden soll, d.h. +bei einem #ib#Absatz#ie# oder einer #ib#Leerzeile#ie#. Der Cursor wird dabei an den Anfang der +nächsten Zeile positioniert. Gleichzeitig erscheint in der vorherigen Zeile am rechten +Rand des Bildschirms eine Markierung, die anzeigt, daß hier ein Absatz gemacht +wurde. + +Darum ist das Betätigen der 'CR'-Taste bei Tabellenzeilen und Programmtexten +besonders wichtig, denn hier soll ja jede Zeile separat bleiben. Sie wirkt nur hinter +dem letzten Zeichen. + +Der Editor ist auf das Schreiben von "normalen" Texten eingestellt. Bei normalen +Texten soll ein Wort, welches über das Ende einer Zeile gehen würde, automatisch in +die nächste Zeile gebracht werden. Diese Funktion wird "Wortumbruch" genannt. + +Ist kein Wortumbruch erwünscht, zum Beispiel bei der Beschreibung von Program­ +men, so geben Sie, bevor Sie den Editor aufrufen, im Monitor das Kommando + +____________________________________________________________________________ +gib kommando : +#ib#word wrap (false)#ie# + +____________________________________________________________________________ + + +Der Wortumbruch kann durch das Kommando + +____________________________________________________________________________ + +gib kommando : +#ib#word wrap (true)#ie# + +____________________________________________________________________________ + + +wieder eingeschaltet werden. Der Editor ist standardmäßig auf "Wortumbruch" einge­ +stellt und Sie sollten nur in Ausnahmefällen diese Benutzungsart ausschalten. + +Ein Bildschirm faßt (neben der Titelzeile) üblicherweise 23 Zeilen, die mit Text be­ +schrieben werden können. Ist die letzte Zeile voll und muß eine neue Zeile begonnen +werden, "rutscht" der Bildschirminhalt automatisch um eine Zeile nach oben. Damit +ist Platz für eine Leerzeile, die nun ebenfalls beschrieben werden kann, usw. Keine +Angst: die so verschwundenen Zeilen sind natürlich nicht "weg". Da ein Bildschirm +immer nur eine beschränkte Anzahl von Zeilen hat, kann der Editor nur einen Aus­ +schnitt aus der Datei zeigen. +#page# +Einrückungen +#free(1.0)# + #on("i")# + Die #ib#Einrückungautomatik#ie# erlaubt bei fortlaufendem Schreiben, die Einrückung zu + erhalten. + # #off("i")# +#free(0.5)# +Soll ein Text eingerückt werden, so betätigt man entsprechend oft die Leertaste. Die +in dieser Zeile geschriebene Einrückung wird automatisch in den folgenden Zeilen +beibehalten, bis sie durch die Cursor-Positionierungstasten wieder aufgehoben wird. + +#on("u")#Beispiele für Aufzählungen:#off("u")# Einrückung funktioniert automatisch ohne aktive Eingabe +von Leerschritten. + +____________________________________________________________________________ + ................. dateiname ...................... Zeile 1 + - Der erste Typ der Aufzählungsform + ist die #ib#Aufzählung#ie# durch Voran­ + stellen eines Sondersymbols. + Als Sondersymbole sind die beiden + Zeichen "-" und "*" zugelassen. An + ihnen erkennt der Editor eine + Aufzählung. + + 12. Weiterhin können Aufzählungen + durch Begriffe, gefolgt von + einem Punkt oder einer ")", als + #ib#Aufzählungskriterium#ie# verwendet + werden. + + + Aufzählung: Auch diese Möglichkeit + steht Ihnen zur Verfü­ + gung. Der Editor er­ + kennt, daß Sie hier + einen Begriff erläutern + wollen. + +____________________________________________________________________________ + +#page# +Wann werden nun Aufzählungen vom Editor erkannt? + +Die hier aufgeführten Einzelheiten sollte nur der hieran interessierte Anfänger lesen! + +Wenn die Einrückung nicht funktionieren sollte, prüfen Sie die folgenden Punkte, die +für das Einrücken erfüllt sein müssen: + +1) Die Vorgängerzeile hat eine Absatzmarke. + + Wichtig: Innerhalb eines Aufzählungspunktes schaltet die Absatztaste die Aufzäh­ + lungseinrückung aus! + +2) "*" bzw. "-" und mindestes ein Leerzeichen sind die ersten Zeichen in der + Zeile. + +3) "." bzw. ")" und mindestens ein Leerzeichen nach höchstens sieben Zeichen sind + die ersten Zeichen in der Zeile. + +4) ":" und mindestens ein Leerzeichen nach höchstens 19 Zeichen sind die ersten + Zeichen in der Zeile. +#page# + +#ib(9)#4.2.4. #ib#Positionieren#ie# im Text#ie(9)# + +#free(1.0)# + #on("i")# + Um Korrekturen (Überschreiben, Löschen oder Einfügen) vorzunehmen, muß der + #ib#Cursor#ie#, der die aktuelle Schreibposition anzeigt, bewegt werden können. Bei + längeren Texten ist es möglich, den Cursor auch auf Zeilen zu positionieren, die + (noch nicht) auf dem Bildschirm angezeigt werden. Somit zeigt der Editor nicht nur + immer das Ende einer Datei, sondern einen beliebigen Ausschnitt, der auf dem + Bildschirm im sogenannten '#ib#Fenster#ie#' sichtbar ist. + #off("i")# +#free(1.0)# +Ist eine Korrektur notwendig, positionieren Sie den Cursor auf die Stelle, an der die +Korrektur vorgenommen werden soll. Dazu verwenden Sie die #ib#Positionierungstasten#ie# +LINKS, RECHTS, OBEN und UNTEN. LINKS und RECHTS bewegen den Cursor +innerhalb einer Zeile. Stößt man mit RECHTS an das Ende einer Zeile, wird der +Cursor an den Anfang der nachfolgenden Zeile bewegt. + + v ^ + +Ein #ib#Zeilenwechsel#ie# kann einfacher mit den Tasten OBEN und UNTEN vorgenommen +werden. Die Taste OBEN bewegt den Cursor eine Zeile nach oben, die Taste UNTEN +entsprechend eine Zeile tiefer. + +Was passiert nun, wenn Sie den unteren oder den oberen Rand des Bildschirms +erreicht haben, und Sie positionieren darüber hinaus? In diesem Fall wird der Text +zeilenweise nach oben oder nach unten verschoben und es erscheint die gewünschte +Zeile, wobei am anderen Rand einige verschwinden". Wir sehen also, daß wir mit den +Positionierungstasten den Bildschirm als Fenster über die Datei hinweggleiten lassen +können. Den Text selbst können wir uns auf einem langen Band geschrieben vorstel­ +len. Die #ib#Zeilennummer#ie#, die die Position des Cursors angibt, wird stets in der Titel­ +zeile angezeigt. + +Vermeiden Sie es, den Cursor über das Textende hinaus nach unten laufen zu las­ +sen. Sie verlängern dadurch Ihren Text um Leerzeilen, die Sie beim Weiterschrei­ +ben nicht auffüllen, sondern vor sich herschieben. + +Innerhalb einer Zeile ist es etwas anders: Positionieren wir bei einer Zeile, die breiter +als der Bildschirm ist, nach rechts, wird nicht das Fenster verschoben, sondern die +Zeile 'gerollt'.(vgl. Sie hierzu das Verschieben des Gesamtfensters mit dem 'mar­ +gin'-Kommando 4-#topage("margin")#) +4.2.5. Korrigieren im Text +#free(1.0)# + + #on("i")# + Einfache Korrekturen können durch #ib#Überschreiben von Zeichen#ie#, #ib#Löschen von + Zeichen#ie# und #ib#Einfügen von Zeichen#ie# vorgenommen werden. + + #off("i")# +#free(1.0)# + + +Die einfachste Möglichkeit der Korrektur ist das #ib#Überschreiben#ie#. Soll z.B. ein Zeichen +durch ein anderes ersetzt werden, so positioniert man der Cursor genau über dieses +und tippt das richtige Zeichen ein. Das kann natürlich auch mit mehreren Zeichen +nacheinander erfolgen. + +Korrekturen können Sie gleich beim Schreiben vornehmen, indem Sie die zuletzt +geschriebenen Zeichen mit der #ib#RUBOUT-Taste#ie# löschen. Häufig bemerkt man aber +#ib#Schreibfehler#ie# erst etwas später, so daß man diese Fehler nicht so leicht korrigieren +kann. Für solche Zwecke müssen Sie den Cursor an die Textstelle bewegen, an der +korrigiert werden soll. + +Wollen Sie ein #ib#Zeichen löschen#ie#, so positionieren Sie den Cursor auf dieses Zeichen +und betätigen die Taste #ib#RUBOUT#ie#. Das Zeichen verschwindet und die Restzeile rückt +heran. Sollen mehrere Zeichen gelöscht werden, muß die RUBOUT-Taste entspre­ +chend oft gedrückt werden. + +Steht der Cursor hinter dem letzten Zeichen der Zeile, wird immer das letzte Zeichen +der Zeile gelöscht. Man kann also mit dieser Eigenschaft eine Zeile "von hinten +wegradieren".(vgl. hierzu auch 4- #topage("ESC RUBOUT")#) + + + + + +Fehlende Zeichen können Sie genauso einfach einfügen. Sie bringen den Cursor auf +das Zeichen, vor das eingefügt werden soll. Dann drücken Sie die Taste #ib#RUBIN#ie#. Der +Editor gelangt in den #ib#Einfügemodus#ie#, was in der Titelzeile durch RUBIN angezeigt +wird. Er fügt alle Zeichen ein, die jetzt getippt werden (anstatt zu überschreiben). Der +Teil der Zeile rechts vom Cursor rückt jeweils um entsprechend viele Stellen nach +rechts. + +Wichtig ist, daß im RUBIN-Modus der Editor genauso funktioniert wie im Normalzu­ +stand (natürlich mit der Ausnahme, daß eingefügt statt überschrieben wird). + +Im eingeschalteten RUBIN-Modus können keine Zeichen verloren gehen. Viele +Benutzer lassen darum den RUBIN-Modus immer eingeschaltet, um sich vor einem +unbeabsichtigten Überschreiben von Texten zu schützen. Sie korrigieren, indem Sie +die Verbesserung einfügen und den alten Text löschen. + +Durch erneutes Betätigen der RUBIN-Taste beenden Sie den Einfügemodus. Die +RUBIN-Taste wirkt wie ein Schalter, der den Einfügemodus ein- und ausschaltet. +Allerdings können Sie nur so viele Zeichen in eine Zeile einfügen, bis das letzte Wort +der Zeile an das Zeilenende stößt. Das letzte Wort wird am Anfang der folgenden +Zeile eingefügt, sofern dort noch Platz ist und es sich nicht offensichtlich um die +letzte Zeile eines Absatzes handelt. Andernfalls wird automatisch eine neue Zeile für +das angefangene Wort eingefügt.(vgl. Sie hierzu auch 4- #topage("ESC RUBIN")#) #free(1.5)# +#page# +Springen und Zeilen einfügen/löschen +#free(1.0)# + #on("i")# + Bewegungen des Cursors sind mit den Positionierungstasten bei größeren "Ab­ + ständen" etwas mühsam, ebenso bei umfangreichen Löschungen und Einfügun­ + gen. Die "#ib#Verstärkertaste#ie#" HOP ermöglicht es, diese Operationen auf einfache + Weise zu beschleunigen. Mit der #ib#HOP-Taste#ie# kann man das Fenster über der + Datei nicht nur zeilenweise, sondern auch um jeweils eine Fensterlänge verschie­ + ben. Das nennt man #ib#Blättern#ie#. + + #off("i")# +#free(1.0)# +#goalpage("HOP")# +Wird die HOP-Taste vor einer anderen der schon erklärten Funktionstasten gedrückt, +verstärkt sie deren Wirkung. Die HOP-Taste ist eine "Präfix"-Taste: sie wird vor +(und nicht gleichzeitig mit, wie z.B. die Umschalttaste SHIFT) einer anderen Taste ge­ +drückt. Zuerst das springende Positionieren: +#free(1.0)# + <>> + +#ib#Sprung an das rechte Bildschirmende#ie#. + +Falls die Zeile länger als das Fenster breit ist, wird die Zeile um eine Fensterbreite +nach links verschoben. +#free(1.0)# + <<> + +#ib#Sprung an den Bildschirmrand links#ie# (ggf. seitlich blätternd). +#free(1.0)# + <^> + +#ib#Sprung auf die erste Zeile des Bildschirms#ie#. + +Nochmaliges Betätigen dieser Tastenkombination positioniert den Cursor (und damit +das Fenster in der Datei) um ein Fenster zurück. ("Blättern") +#free(1.0)# + + +#ib#Sprung auf die letzte Zeile des Bildschirms#ie#. + +Das Blättern erfolgt analog HOP OBEN. +#free(1.0)# + + +Positioniert das Fenster so, daß die aktuelle Zeile zur ersten des Fensters wird. +#free(1.0)# + + +#ib#Einfügen von Textpassagen#ie#. #goalpage("verstärkt")# Die HOP-Taste in Verbindung mit RUBIN und +RUBOUT wird zum "verstärkten" Löschen und Einfügen verwendet. + +Ab der aktuellen Position des Cursors "verschwindet" der restliche Text. Es kann wie +bei der anfänglichen Texteingabe fortgefahren werden. Die Anzeige '#ib#REST#ie#' in der +Titelzeile erinnert daran, daß noch ein Resttext existiert. Dieser erscheint nach einem +neuerlichen Betätigen der beiden Tasten HOP RUBIN wieder auf dem Bildschirm (die +Anzeige 'REST' verschwindet dann wieder). + +____________________________________________________________________________ + ................. dateiname ...................... Zeile 4 + +In diesem Text soll vor dem zweiten Satz +etwas eingefügt werden. #cursor("H")#ierzu wird der +Cursor an die Position geführt, an der +ein beliebiger Text eingefügt werden soll. + +____________________________________________________________________________ + + +Nach Betätigen der Tasten und sieht der Bildschirm wie folgt +aus: + +____________________________________________________________________________ + ............... dateiname .........REST.......... Zeile 4 + +In diesem Text soll vor dem zweiten Satz +etwas eingefügt werden. + + +____________________________________________________________________________ + + + +Nun kann beliebig viel Text eingefügt werden. Nochmaliges Betätigen von HOP und +RUBIN führt den Text-Rest wieder bündig heran. + + + + +Löscht die Zeile ab Cursor-Position bis Zeilenende. + + +____________________________________________________________________________ + ................. dateiname ...................... Zeile 4 + +Soll eine ganze Zeile oder ein Textrest +gelöscht werden, so positioniert man an die +Stelle, ab der gelöscht werden soll. 'R'est löschen.... +Nach HOP RUBOUT ist der Zeilenrest gelöscht. + + +____________________________________________________________________________ + + +Nach Betätigen der Tasten und sieht der Bildschirm wie +folgt aus: + +____________________________________________________________________________ + ................. dateiname ...................... Zeile 4 + +Soll eine ganze Zeile oder ein Textrest +gelöscht werden, so positioniert man an die +Stelle, ab der gelöscht werden soll. +Nach HOP RUBOUT ist der Zeilenrest gelöscht. + +____________________________________________________________________________ + + + +Steht der Cursor am Zeilenanfang, wird nach HOP RUBOUT dementsprechend die +ganze Zeile gelöscht und die Lücke durch Nachrücken der Folgezeilen geschlossen +(HOP RUBOUT betätigen). +#page# +Zeilen aufbrechen und Rückumbruch + +#free(1.0)# + #on("i")# + Um grössere Textpassagen einzufügen, betätigt man #ib#HOP RUBIN#ie# nacheinander. + Diese Tastenfolge kann benutzt werden, um eine Zeile bzw. eine längere Textpas­ + sage aufzubrechen). #ib#HOP RUBOUT#ie# am Ende einer Zeile macht einen #ib#Rückum­ + bruch#ie#. + + #off("i")# +#free(1.0)# + + +Wie bereits beschrieben, bewirkt #ib#HOP RUBIN#ie# in einer Zeile, daß der Zeilenrest rechts +des Cursors und alle Zeilen unterhalb der aktuellen Zeile scheinbar verschwinden. +#ib#REST#ie# in der Titelzeile erinnert daran, daß ein Teil der Datei nicht sichtbar ist. + +Wird unmittelbar nach HOP RUBIN wiederum HOP RUBIN betätigt, wird der vorherige +Zeilenrest als eigenständige Zeile dargestellt. Es ist damit eine Aufspaltung einer Zeile +in zwei Zeilen vollzogen. + + + + +Der umgekehrte Fall, nämlich zwei Zeilen zu einer zusammenzufassen (sog. #ib# Rück­ +umbruch#ie#), ist durch #ib#HOP RUBOUT#ie# hinter dem letzten Zeichen einer Zeile möglich. +Hinter das letzte Zeichen einer Zeile kann einfach mit dem Tabulator positioniert +werden. + +Das Aufbrechen einer Zeile und der Rückumbruch zusammen angewandt stellen den +ursprünglichen Zustand wieder her. Beispiel: Mit HOP RUBIN bricht man eine Zeile +auf, der Rest der Zeile und nachfolgende Zeilen verschwinden vom Bildschirm. Erneu­ +tes HOP RUBIN stellt den rechten Zeilenteil auf der nächsten Zeile und die nachfol­ +genden Zeilen auf dem Bildschirm wieder dar. Da der Cursor sich noch immer am +rechten Rand der aufgebrochenen Zeile befindet, kann man mit HOP RUBOUT den +ursprünglichen rechten Zeilenteil wieder rekombinieren. +#page# + + +#ib(9)#4.2.6. Der #ib#Tabulator#ie##ie(9)# + +#free(1.0)# + #on("i")# + Eine weitere wichtige #ib#Positionierungshilfe#ie# innerhalb einer Zeile ist die #ib#TAB#ie#-Taste. + Sie wird u.a. zum Schreiben von Tabellen benötigt. Wie bei einer Schreibmaschine + können #ib#Tabulatormarken#ie# gesetzt bzw. gelöscht werden. + + #off("i")# +#free(1.0)# + + +Der Tabulator hat eine wichtige Funktion für das schnelle Positionieren, auch wenn +keine Marken eingestellt wurden. #ib#Voreingestellte Tabulatormarken#ie# sind nämlich der +Textanfang einer Zeile (Einrückung, falls vorhanden) und die Stelle direkt hinter dem +letzten Zeichen der Zeile. Betätigt man also die Taste TAB, dann springt die Schreib­ +marke an die nächste dieser voreingestellten Positionen. So kann man schnell mit +dem Cursor an den Anfang oder das Ende einer Zeile gelangen (und z.B. am Zeilen­ +ende Zeichen "von hinten" löschen oder dort weiterschreiben). + + + +Nun zum #ib#Setzen des Tabulators#ie#: Sie setzen ihn, indem Sie den Cursor auf die Zei­ +lenposition bringen, in der die Marke plaziert werden soll. Hier betätigen Sie nun #ib#HOP +TAB#ie#. Die Tabulatorsetzung kann man in der Titelzeile an einer Markierung ("Dach­ +"-Zeichen) sehen, falls sie im Fensterbereich ist und die aktuelle Zeile nicht seitlich +verschoben ist. Betätigt man nun an irgendeiner Position innerhalb einer Zeile die +TAB-Taste, wird der Cursor auf die Position der nächsten Tabulatormarkierung (die +sich rechts von dem Cursor befindet) oder eine der voreingestellten Positionen be­ +wegt. + +#ib#Gesetzte Tabulatormarken#ie# können gelöscht werden, indem man mit der TAB-Taste +die Position der Tabulatormarke einstellt und dann HOP TAB betätigt. Die Marke ist +dann gelöscht, das Dach verschwindet in der Titelzeile. + +Tabulatormarkierungen hinterlassen keine Spuren in der Datei, sondern dienen nur als +Positionierungshilfen. mit 'HOP TAB' gesetzte Markierungen, die mit 'TAB' ange­ +sprungen werden, wirken beim Schreiben von Zahlen wie Dezimaltabulatoren, vgl. Sie +dazu 4- #topage("zahlen")#. + +#on("u")#Beispiel:#off("u")# + +Es soll für den Textbeginn eine Tabulatorposition auf die 12. Spalte gesetzt werden. +Hierzu wird der Cursor auf die 12. Spalte positioniert und die HOP- und die TAB- +Taste nacheinander betätigt. Das "Dach"-Zeichen erscheint in der 12. Spalte in der +Titelzeile und von nun an kann durch Betätigen der TAB-Taste diese Position direkt +angesteuert werden. + +____________________________________________________________________________ + ..........^....... dateiname ...................... Zeile 4 + +HOP TAB wurde in der 12. Spalte betätigt. + Mit TAB stehen Sie auf der 12. + Spalte. + +____________________________________________________________________________ + + +Werden #ib#Tabulatormarken#ie# gesetzt (HOP TAB), gelten die voreingestellten Tabulator­ +marken (Anfang und Ende einer Zeile) nicht mehr. Dies ist z.B. bei dem Schreiben +von Tabellen notwendig. Andererseits möchte man beim Schreiben von "normalem" +Text wieder die voreingestellten Tabulatormarken bedienen können. Mit den Tasten + + + +kann man die gesetzten Tabulatormarken (erkenntlich an dem "Dach"-Zeichen in +der Kopfzeile) vorübergehend verschwinden lassen. Dann gelten wieder die voreinge­ +stellten Marken. Erneutes #ib#ESC TAB#ie# stellt die gesetzten Tabulatormarken wieder her +usw.. +#free(1.5)# +Zahlentabellen schreiben: Dezimaltabulator +#goalpage("zahlen")# + +#free(1.0)# + #on("i")# + Beim Schreiben von #ib#Zahlentabellen#ie# sollen die Zahlen oft rechtsbündig im Text + erscheinen. Dazu bietet der Editor den #ib#Dezimaltabulator#ie# an. + + #off("i")# +#free(1.0)# +Für jede Zahlenkolonne wird die gewünschte Position der Einerstelle (also der letzten +Stelle) mit Hilfe eines Tabulators eingestellt. Mit #ib#TAB#ie# wird der Cursor zur jeweils +nächsten Tabulatormarke vorgerückt. Werden nun Ziffern geschrieben, so schreibt +man nicht - wie gewohnt - nach rechts, sondern die Ziffern werden nach links +eingerückt. Etwas genauer: Beim Drücken einer Zifferntaste wird, solange links vor +der Zahl noch ein Blank, eine Zahl, "+", "-" oder ein Punkt sichtbar ist, diese +gelöscht und die hierdurch neu entstandene Ziffernfolge rechtsbündig an der Tabula­ +torposition geschrieben. Das Schreiben von rechtsbündigen Zahlenkolonnen ist so +leicht möglich #count("11")#): +#foot# +#value("11")#) Wird eine #ib#Proportionalschrift#ie# (Schrift, bei der die Zeichen unterschiedliche + Breiten haben) verwendet, sollte man zwischen den einzelnen Zahlenkolonnen + mindestens zwei Leerzeichen schreiben. Andernfalls bekommt man - auf Grund + der unterschiedlicher Zeichenbreiten - keine rechtsbündigen Kolonnen gedruckt. +#end# + + + 12 12345,78 + 1 0,23 + 12345 1234,00 + + + +Es gibt somit vier nützliche Automatiken: neben dem automatischen Dezimaltabulator +den Wortumbruch, die Einrückautomatik und die Zeileneinfügeautomatik beim ein­ +fügenden Schreiben. +4.2.7. Lernen im Editor + +#free(1.0)# + + Beliebige Folgen von Tastenbetätigungen können gelernt und Tasten zugeordnet + werden. Das ist sinnvoll, wenn Sie wiederholt immer die gleichen Tastenbetä­ + tigungen ausführen müssen, wie z.B. in Tabellenzeilen etwas einfügen oder wenn + des öfteren gleiche Texte geschrieben werden müssen, wie z.B. ein Absender, + Grußformeln usw. + #goalpage("ESC")# + #free(1.0)# +< ESC> + +Der #ib#Lernmodus#ie# wird durch Betätigen der Tasten #ib#ESC HOP#ie# eingeschaltet, es erscheint +#ib#LEARN#ie# als Kontrolle rechts in der Titelzeile). Alle Tastenanschläge werden jetzt bis +zum Ausschalten des Lernmodus gelernt. Auch Tastenanschläge wie 'CR'), so daß +man kann demnach auch mehrere Zeilen lernen lassen kann. + + <'taste'> z.B. ESC HOP j + +Das Beenden oder Ausschalten des Lernmodus erfolgt durch Drücken der drei Tasten +#ib#ESC HOP 'taste'#ie#. Dabei wird die gelernte Tastenanschlagsfolge, auch #ib#Lernsequenz#ie# +genannt, der Taste 'taste' zugeordnet. + + <'taste'> z.B. ESC j + +Durch späteres Betätigen der Tastenfolge ESC 'taste' kann der gelernte Text an jeder +Stelle der Datei geschrieben werden. + +#on("u")#Beispiel:#off("u")# + +Ein Sachbearbeiter hat jeden Tag 50 mal die Worte 'Gesellschaft für Datenverarbei­ +tung' zu tippen. Er läßt den Editor diese Worte lernen mit + + +ESC HOP Gesellschaft für Datenverarbeitung ESC HOP m + +Die Worte liegen jetzt auf der Taste 'm'. Wird 'm' gedrückt, erscheint ein 'm' auf dem +Bildschirm. Mit ESC 'm' erscheinen die obigen Worte. ESC ist also notwendig, um +das normale 'm' von der Lernsequenz zu unterscheiden. + +Welche Tasten dürfen zum #ib#Lernen#ie# belegt werden? Alle Tasten, außer + +- vom System benutzte Tasten, wie SV, CTRL; +- vom Editor (je nach Anwendung) vorbelegte Tasten, wie die Tasten q oder ESC + und HOP; +- durch Programmierung (siehe dieses Kapitel) fest belegte Tasten. + +Praktische Tips: Man sollte die Tastatur nicht mit Lernsequenzen überlasten, weil man +sich zu viele Tasten nicht merken kann. Besser ist es, einige wenige Tasten fest zu +belegen und andere für momentane Aufgaben einzusetzen. + +Der Einsatz von #ib#Lernsequenz#ie#en ist besonders sinnvoll für das Schreiben von Text­ +kosmetikanweisungen. Anweisungen wie z.B. 'Unterstreichen einschalten', Schrift­ +typ-Anweisungen usw. werden zweckmäßigerweise auf Tasten gelegt. + +Hat man sich einmal beim '#ib#Lernen#ie#' verschrieben, so ist das nicht weiter schlimm: es +kann ohne Bedenken korrigiert werden (z.B. mit der Taste RUBOUT). Solche Tasten­ +anschläge werden dann allerdings auch gelernt, was aber bei der Benutzung der +Lernsequenzen keine Bedeutung hat. +4.2.8. Textabschnitte durch Markieren bearbeiten + +#free(1.0)# + #on("i")# + Oft ergibt sich die Notwendigkeit, mehrere Zeilen oder ganze Textpassagen zu + löschen oder zu verschieben. Hierbei hilft die Taste #ib#MARK#ie#, mit der man #ib#Texte + markieren#ie# (also kennzeichnen) kann. Die so markierten Texte können dann auf + verschiedene Weisen als Ganzes verarbeitet werden. + #goalpage("ESC")# + + #free(1.0)# + + +Durch Drücken der Taste MARK wird die #ib#Markierung#ie# eingeschaltet und - bei erneu­ +ter Betätigung - wieder ausgeschaltet. Der Anfang der Markierung wird "festgehal­ +ten" und man kann nun das Markierende durch die Positionierungstasten und die +HOP-Taste in Richtung auf das Dateiende verschieben, wobei die dazwischen lie­ +genden Zeichen markiert (in der Regel "schwarz auf weißem Grund" dargestellt) +werden. + + + + +Ein so markierter Text kann mit #ib#ESC RUBOUT#ie# gelöscht werden. #ib#Markieren und +löschen#ie# mit ESC RUBOUT ist eine bequeme und sichere Löschmethode, da man +genau sieht, was gelöscht wird.#goalpage("ESC RUBOUT")# + + + +#goalpage("ESC RUBIN")# + +Der gelöschte Abschnitt ist aber nicht vollständig gelöscht, sondern er kann an ande­ +rer (oder an der gleichen) Stelle im Text durch #ib#ESC RUBIN#ie# wieder eingefügt werden. +Der vorsichtig gelöschte Text landet in einem #ib#Zwischenspeicher#ie# und kann bei Bedarf +mit #ib#ESC RUBIN#ie# wieder aufgerufen werden. Wird erneut vorsichtig gelöscht, so wird +der letzte Text des Zwischenspeichers überschrieben. Im Zwischenspeicher ist nur für +einen #on("u")#Text#off("u")# Platz. Auf diese Art kann ein Textabschnitt beliebiger Länge an eine +andere Stelle des Textes sicher, schnell und bequem verschoben werden. Zusätzlich +ist die nachträgliche Korrektur von fehlerhaften Löschungen möglich, weil der Text +wieder mit ESC RUBIN reproduziert werden kann. + +Mit eingeschalteter Markierung kann auch geschrieben werden. Das #ib#markierende +Schreiben#ie# ist eine besonders vorsichtige Art der Texterstellung, denn der Textein­ +schub bleibt erst durch Ausschalten der Markierung (MARK) wirklich bestehen. Er +kann wieder gelöscht (ESC RUBOUT) und an eine andere Stelle gebracht werden +(ESC RUBIN). Beim markierenden Schreiben wirkt RUBOUT immer auf das Zeichen +vor der Cursorposition. + +Hinweis: Positionierungen sind nur innerhalb der Markierung möglich. +#page# +4.2.9. Der Fenstereditor +#free(1.0)# + + #on("i")# + Oft ist es notwendig, mit mehreren Dateien gleichzeitig zu arbeiten, z.B. wenn aus + einer Datei etwas in eine andere kopiert werden muß, wenn Fehler durch die + Textkosmetik-Programme oder einen Compiler gefunden werden oder wenn man + kurz etwas in einer anderen Datei nachschauen will. Zu diesem Zweck bietet der + Editor die Möglichkeit, zwei (oder mehr) Dateien zur gleichen Zeit zu bearbeiten. #off("i")# + + +#free(1.0)# +Der Editor ermöglicht dem Benutzer wie durch ein Fenster auf den zu bearbeitenden +Text zu schauen. Es ist in diesem Zusammenhang nur natürlich, daß man bei der +Bearbeitung eines Textes sich die Möglichkeit wünscht, weitere Texte gleichzeitig +ansehen zu können. Dies kann notwendig sein, um zu vergleichen, Fehler zu entdek­ +ken oder Textteile aus einem Fenster in ein anderes zu übertragen. + +Um ein neues Editor-Fenster zu "öffnen", betätigt man im Editor + + + +Betätigt man ESC e ungefähr in der Mitte des Bildschirms, hat man das Fenster auf +die neue Datei in der unteren Hälfte des Bildschirms und die "alte" Datei in der +oberen Bildschirmhälfte. Zunächst wird der Dateiname erfragt. Nach dessen Eingabe +und dem Betätigen der 'CR' Taste wird ein Fenster auf eine andere Datei eröffnet. +Die obere linke Ecke des Fensters befindet sich an der aktuellen Cursor-Position. +Dabei darf sich der Cursor nicht zu sehr am rechten oder unteren Rand befinden, weil +das Fenster sonst zu klein würde. In diesem "Fenster" kann man dann genauso +arbeiten wie im "normalen" Editor. + + +Mit der Tastenfolge + + + +wechselt man von einem Fenster (zyklisch) in das benachbarte. Es gibt eine Hier­ +archie zwischen den Fenstern in der Reihenfolge, in der eines im anderen einge­ +richtet worden ist. Gibt man + + + +in einem Fenster, so verschwindet dieses und alle darin eingeschachtelten Fenster, +und man befindet sich im übergeordneten Fenster. + +Wir schilderten zuvor, daß man mit ESC RUBOUT und ESC RUBIN Texte verschie­ +ben und löschen kann. Zwischen Dateien im Fenstereditor geht dies folgendermaßen: + +Durch + +

oder + +schreibt man einen markierten Teil in eine temporäre Datei (einen Zwischenspeicher); +durch ESC p wird ein markierter Text aus der Ursprungsdatei entfernt und in einen +Zwischenspeicher geschrieben. Im Gegensatz dazu wird er durch ESC d kopiert. +Durch + + + +fügt man ihn in eine andere (oder dieselbe) Datei ein. Im Unterschied zu ESC RUBIN +wird die temporäre Datei dadurch nicht entleert. + +Die Funktionen ESC d und ESC g leisten auf schnellere Weise dasselbe wie die +Kommandos 'PUT ""' und 'GET ""'. +#page# +4.2.10. Die wichtigsten vorbelegten Tasten +#free(1.0)# + + #on ("i")# + Lernsequenzen und Kommandos (d.h. ELAN-Programme) können Tasten zuge­ + ordnet werden. Da einige Funktionen häufig benötigt werden, sind diese stan­ + dardmäßig bestimmten Tasten zugeordnet. #off("i")# + + + +#free(1.0)# +#ib#ESC q#ie# Verlassen des Editors bzw. der eingeschachtelten Fenster. + +#ib#ESC e#ie# Weiteres Editorfenster einschalten. + +#ib#ESC n#ie# Notizbuch "aufschlagen". + +#ib#ESC v#ie# Dateifenster auf ganzen Bildschirm vergrößern + bzw. Bildschirm rekonstruieren (eingeschachteltes Fenster verlas­ + sen). + +#ib#ESC w#ie# Dateiwechsel beim Fenstereditor. + +#ib#ESC f#ie# Nochmalige Ausführung des letzten Kommandos. + +#ib#ESC b#ie# Das Fenster wird auf den linken Rand der aktuellen (ggf. verscho­ + benen) Zeile gesetzt. + +ESC > Zum nächsten Wortanfang. + +ESC < Zum vorherigen Wortanfang. + +#ib#ESC 1#ie# Zum Anfang der Datei. + +#ib#ESC 9#ie# Zum Ende der Datei. +#page# +Lernen + + +#ib#ESC HOP#ie# Lernen einschalten. + +#ib#ESC HOP taste#ie# Lernen ausschalten und Lernsequenz auf 'taste' legen. + +#ib#ESC HOP HOP#ie# Gelerntes vergessen. Bedingung ist, daß man die Lernsequenz in + der Task löscht, in der man sie hat lernen lassen. +#free(1.0)# +Operationen auf Markierungen + +#free(1.0)# +#ib#ESC RUBOUT#ie# Markiertes "vorsichtig" löschen. + +#ib#ESC RUBIN#ie# Vorsichtig mit ESC RUBOUT Gelöschtes einfügen. + +#ib#ESC p#ie# Markiertes löschen und in die Notiz-Datei schreiben. Kann mit ESC + g an anderer Stelle reproduziert werden. + +#ib#ESC d#ie# Duplizieren: + Markiertes in die Notiz-Datei kopieren (PUT ""), anschließend die + Markierung abschalten. Kann mit ESC g beliebig oft reproduziert + werden. + +#ib#ESC g#ie# MIT ESC p gelöschten oder mit ESC d duplizierten Text an aktuelle + Cursor-Stelle schreiben, d.h. Notiz-Datei an aktueller Stelle einfü­ + gen (GET ""). +#free(1.0)# +#on("b")#Zeichen schreiben#u#1#e# +#off("b")# +#foot# +1) Diese Tasten sind standardmäßig so vorbelegt wie hier aufgeführt, sie könne aber +von Benutzern und in Anwenderprogrammen geändert werden. +#end# +#free(0.5)# +#ib#ESC a#ie# Schreibt ein ä. +#ib#ESC A#ie# Schreibt ein Ä. +#ib#ESC o#ie# Schreibt ein ö. +#ib#ESC O#ie# Schreibt ein Ö. +#ib#ESC u#ie# Schreibt ein ü. +#ib#ESC U#ie# Schreibt ein Ü. +#ib#ESC s#ie# Schreibt ein ß. +#ib#ESC (#ie# Schreibt eine [. +#ib#ESC )#ie# Schreibt eine ]. +#ib#ESC <#ie# Schreibt eine {. +#ib#ESC >#ie# Schreibt eine }. +#ib#ESC \##ie# Schreibt ein \#, das auch gedruckt werden kann. +#ib#ESC ­#ie# Schreibt einen (geschützten) Trennstrich, siehe Textverarbeitung. +#ib#ESC k#ie# Schreibt ein (geschütztes) "k", siehe Textverarbeitung. +#ib#ESC blank#ie# Schreibt ein (geschütztes) Leerzeichen, siehe Textverarbeitung. +#free(1.0)# +Kommando auf Taste legen + +#free(1.0)# +#ib#ESC ESC#ie# Kommandodialog einschalten + +#ib#ESC ! taste#ie# Im Kommandodialog: + Geschriebenes Kommando auf Taste legen. + +#ib#ESC ? taste#ie# Im Kommandodialog: + Auf 'taste' gelegtes Kommando zum Editieren anzeigen. + +#ib#ESC k#ie# Im Kommandodialog: + Das zuletzt editierte Kommando (einzeilige ELAN-Programm) + anzeigen. + +Eine ausführliche Beschreibung des Kommandodialogs finden Sie im folgenden Kapi­ +tel. +4.3. Die wichtigsten Editor-Kommandos +#goalpage("ESC")# +#free(0.5)# + +#ib(9)#4.3.1. Der #ib#Kommandodialog#ie##ie(9)# + +#free(1.0)# + #on("i")# + Einige Operationen kann man nur mühselig mit den bis jetzt beschriebenen Tasten + durchführen. Z.B. ist es sehr zeitaufwendig, eine bestimmte Textstelle zu finden. + Andere Operationen sind mit den im vorigen Kapitel beschriebenen Tasten über­ + haupt nicht möglich, wie etwa die Zeilenbreite einzustellen oder Programme aufzu­ + rufen, die die zu editierende Datei verarbeiten. Solche Operationen werden durch + Kommandos ermöglicht, die man auf Editorebene geben kann. #off("i")# + + +#free(1.0)# +Um Kommandos an den Editor geben zu können, schalten wir in den #ib#Kommando­ +zustand#ie#. + + + +Durch zweimaliges Betätigen von ESC erfolgt #on("u")#im Editor#off("u")# die Aufforderung + +____________________________________________________________________________ + ................. dateiname ...................... Zeile 4 + +Mit der ESC-Taste ist es möglich, den Kommandodialog +gib kommando : + +____________________________________________________________________________ + + + +Auf dem Bildschirm erscheint eine #ib#Kommandozeile#ie#, in der der Benutzer +Kommandos schreiben kann. Durch Betätigen der Taste 'CR' wird das +Kommando ausgeführt. +#page# + + +#ib(9)#4.3.2. Zeile und #ib#Textstelle anwählen#ie##ie(9)# +#free(1.0)# + #on("i")# + Auf der Kommandoebene des Editors können Sie Kommandos erteilen, um an eine + beliebige Stelle in der Datei zu positionieren.#off ("i")# + +#free(1.0)# +Sie haben einen (größeren) Text erstellt und stehen nun vor dem Problem, für die +Korrektur die entsprechenden Textstellen aufzufinden. + +#on("u")#Beispiel:#off("u")# + +Bei der Durchsicht eines Ausdrucks Ihres Textes stellen Sie fest, daß Sie sich ver­ +schrieben haben. Anstelle von "diese Zeichen" haben Sie "diese Ziichen" geschrie­ +ben. Um diese Textstelle anzuwählen, gehen Sie wie folgt vor: Sie positionieren an +den Beginn der Datei und betätigen die Tastenfolge + + + + + +Auf dem Bildschirm ersceint: + +____________________________________________________________________________ + +gib kommando: + +____________________________________________________________________________ + + +Sie schreiben nun die zu suchende Textstelle auf: + +____________________________________________________________________________ + +gib kommando: "diese Ziichen" + +____________________________________________________________________________ + + +Durch die Angabe eines TEXTes in Anführungsstrichen wird nach dem eingeschlosse­ +nen TEXT 'diese Ziichen' ab der aktuellen Cursor-Position gesucht. Wird 'diese +Ziichen' gefunden, bleibt der Cursor auf dem gesuchten Text stehen. Andernfalls steht +der Cursor am Ende der letzten Zeile der Datei. + +Eine andere Möglichkeit, an eine entferntere Stelle im Text zu kommen, ist die fol­ +gende: + + + + +Es erscheint auf dem Bildschirm: + +____________________________________________________________________________ + +gib kommando: + +____________________________________________________________________________ + + +Sie geben nun die Textzeile an, die Sie suchen: + +____________________________________________________________________________ + +gib kommando: 134 + +____________________________________________________________________________ + + +Durch dieses Kommando wird auf die 134. Zeile positioniert. +#page# + +#ib(9)#4.3.3. #ib#Suchen und Ersetzen#ie##ie(9)# +#free(1.0)# + #on("i")# + Auf der Kommandoebene des Editors können Sie wie auf der Monitor-Ebene + beliebige Kommandos geben. Diese können Sie zu (ELAN-) Programmen ver­ + knüpfen. Zur Erstellung dieser Programme editieren Sie wie gewohnt in der Kom­ + mandozeile. Für das Positionieren, Suchen und Ersetzen innerhalb Ihres ELAN- + Programms stehen Ihnen Kommandos zur Verfügung. Beliebige ELAN-Prog­ + ramme sind zulässig.#off ("i")# + +#free(1.0)# +Die #ib#Kommandozeile#ie# kann wie eine "normale" Textzeile editiert werden (Positionieren, +Überschreiben, Einfügen, Löschen und Markieren). Bevor ein Programm eine Aus­ +gabe erzeugt oder fehlerhafte Kommandos Fehlermeldungen hervorrufen, wird der +Cursor in die linke obere Ecke positioniert. Um die Meldungen festzuhalten, sollte das +#ib#Kommando 'pause'#ie# folgen. Diese Meldungen werden dann in der ersten Zeile des +Bildschirms angezeigt. Danach ist man wieder im Editor und kann wie gewohnt +arbeiten. + +Kommandos werden durch ein Semikolon voneinander getrennt. + +#on("u")#Beispiel:#off("u")# + +____________________________________________________________________________ + +gib kommando: T1; "Geschäftsführung";fetch("Lieferanten",archive) + +____________________________________________________________________________ + + +Ihr ELAN-Programm besteht aus zwei Kommandos: zunächst positionieren Sie in die +erste Zeile und suchen ab dort nach dem Wort "Geschäftsführung". dann lesen Sie +die Datei "Lieferanten" von der Diskette in den Arbeitsspeicher. + +Die beiden beschriebenen Kommandos (Text bzw. eine Zeile anwählen) sind Spezial­ +kommandos und können in dieser Form nicht durch ein Semikolon mit anderen Kom­ +mandos kombiniert werden. Deshalb gibt es für sie eine ELAN-Form, die es erlaubt, +sie mit anderen Kommandos zusammen zu verwenden: + +a) Einen Text ab der aktuellen Cursor-Position suchen (D ist eine Abkürzung für + '#ib#DOWN#ie#'): + +____________________________________________________________________________ + +gib kommando: "diese Zeichen" + +____________________________________________________________________________ + +(* Kurzform *) + + +____________________________________________________________________________ + +gib kommando: #ib#D#ie# "diese Zeichen" + +____________________________________________________________________________ + +(* Allgemeine Version *) + + + +b) Auf eine Zeile positionieren (#ib#T#ie# ist eine Abkürzung für '#ib#TO LINE#ie#'): + +____________________________________________________________________________ + +gib kommando: 127 + +____________________________________________________________________________ + + +(* Kurzform *) + + +____________________________________________________________________________ + +gib kommando: T 127 + +____________________________________________________________________________ + + +(* Allgemeine Version *) + + +Mehrere Kommandos können in der Kommandozeile angegeben werden. Die einzel­ +nen Kommandos müssen in diesem Fall mit ';' voneinander getrennt werden. + +#on("u")#Beispiel:#off("u")# + + + +schaltet in den Kommandomodus + +____________________________________________________________________________ + +gib kommando: T 1; D "noch Zeichen" + +____________________________________________________________________________ + + + +Diese zwei Kommandos werden nacheinander ausgeführt. Zuerst wird auf die erste +Zeile positioniert und dann (von der ersten Zeile ab) nach 'noch Zeichen' gesucht. +Damit ist es möglich, die Datei nicht nur ab der aktuellen Zeile zu durchsuchen, +sondern die gesamte Datei. Soll nicht in Richtung auf das Dateiende, sondern in +Richtung auf den Dateianfang (also nach "oben") gesucht werden, kann man das +#ib#U-Kommando#ie# (Abkürzung für #ib#UP#ie#) verwenden: + + + +____________________________________________________________________________ + +gib kommando: U "noch ein Text" + +____________________________________________________________________________ + + + +Ein weiteres Kommando ist das #ib#C-Kommando#ie# (Abkürzung für '#ib#CHANGE#ie#'), mit +welchem man einen TEXT sucht und diesen dann ersetzt. + +#on("u")#Beispiel:#off("u")# + + + +____________________________________________________________________________ + +gib kommando: "alte Zeichen" C "neue Zeichen" + +____________________________________________________________________________ + + +Ab der aktuellen Cursor-Position wird nach 'alte Zeichen' gesucht. Wird der TEXT +gefunden, wird er durch 'neue Zeichen' ersetzt. Der Cursor befindet sich in diesem +Fall hinter dem ersetzten TEXT. Wird 'alte Zeichen' dagegen nicht in der Datei gefun­ +den, befindet sich der Cursor (wie beim erfolglosen Suchen mit D) am Ende der +letzten Zeile der Datei. + +Wie alle anderen Kommandos kann auch das C-Kommando mit anderen Komman­ +dos verbunden werden. + +#on("u")#Beispiel:#off("u")# + + + +____________________________________________________________________________ + +gib kommando: #ib#T#ie# 500; "Schreibfelher" #ib#C#ie# "Schreibfehler" + +____________________________________________________________________________ + + + +Hier wird ab der 500. Zeile der Datei nach 'Schreibfelher' gesucht und ggf. ersetzt. +Soll ein TEXT nicht nur einmal, sondern bei jedem Auftreten ersetzt werden, benutzt +man das #ib#CA-Kommando#ie# (Abkürzung für #ib#CHANGE ALL#ie#): + + + +____________________________________________________________________________ + +gib kommando: "dieser alte Text" CA "dieser neue Text" + +____________________________________________________________________________ + + +Dadurch wird 'dieser alte Text' bei jedem Auftreten ab der aktuellen Cursor-Position +durch 'dieser neue Text' ersetzt. +Pattern Matcher +#free(1.0)# + + + Der #ib#Pattern Matcher#ie# ist ein Werkzeug zur #ib#Mustererkennung#ie#. Er dient zur + Beschreibung von Texten, die in verschiedenen Ausprägungen auftreten können. + Zum Suchen oder Ersetzen wird nicht ein Text fester Gestalt vorgegeben, sondern + eine Beschreibung der gesuchten Struktur. + + +#free(1.0)# + +Häufig werden Sie #ib#Texte suchen#ie# oder ersetzen wollen, die in einigen Varianten inner­ +halb eines umfangreicheren Textes auftauchen können. + +Beispiel: Gesucht wird 'unser' in verschiedenen Zusammenstellungen, also auch + 'unsere' oder 'unserem'. Alle Textstellen, die diesem Muster entsprechen, + können in #on("u")#einem#off("u")# Suchverfahren gefunden werden, indem das Muster, + welches diese Texte beschreibt, für die Suche benutzt wird: + +____________________________________________________________________________ +Suchen nach Begriffen deren genaue Ausprägung unbekannt ist. +gib kommando:D(" unser" + any + " ") + + +____________________________________________________________________________ + + + + Leseweise: + + Suche 'unser', gefolgt beliebigen Zeichen plus einem Leerzeichen, oder + auch nur einem Leerzeichen. + + + Dieses Suchkommando liefert Treffer bei 'unser', 'unsere', 'unseres' usw.. + +#free(1.0)# +Wie baut man ein Pattern ? + +#free(1.0)# + + + Texte werden durch ihr Konstruktionsmuster aus bekannten und unbekannten + Teilen beschrieben + +#free(1.0)# + +Ein Text, der in seiner konkreten Form nicht bekannt ist, dessen Aufbau jedoch durch +ein Muster beschrieben werden kann, besteht aus Teilen, die als: + + - bekannte Texte + - unbekannte Texte + +bezeichnet werden und die mit dem Operatoren: + + '+' Zusammensetzen + 'OR' Alternative + +kombiniert werden können. + + +Ein bekannter Text ist z.B. ein Stück eines gesuchten Textes, das als fest vorgegeben +betrachtet werden kann, wie etwa der Wortstamm 'unser' in dem obigen Beispiel. Wie +gewohnt wird ein solcher bekannter Text, in Anführungsstriche gesetzt, als TEXT +CONST "text" notiert. + +Demgegenüber ist ein unbekannter Text von nicht näher zu beschreibender Gestalt. +Das Muster, welches einen unbekannten Text beschreibt, steht für irgendeinen einer +Vielzahl von Texten, die diesem Muster entsprechen. + +Mit der Prozedur: + + any + +wird das Muster für einen beliebigen Text geliefert. + +Im einleitenden Beispiel ist der Wortstamm bekannt, das Teilwort 'unser' kann also im +'Klartext' angegeben werden. Die Endungen sind je nach dem Zusammenhang in dem +das gesuchte Wort auftritt verschieden, also zunächst unbekannt. +Ein solcher unbekannter Text kann entweder durch Aufzählung der möglichen +Alternativen seiner Erscheinung beschrieben werden oder durch die Prozedur 'any'. + + + (text + ("er" OR "es" OR "em" OR ..... ) + + alternative Verknüpfung durch OR + + + ("text" + any + .... ) + + additive Verknüpfung durch + + +Grundsätzlich ist zu beachten, daß der Suchvorgang des Pattern Matcher Zeichenket­ +ten untersucht und nicht etwa einzelne Worte und stets nach dem längstmöglichen +Muster gesucht wird! + +Ein schlecht beschriebener Suchtext kostet somit nicht nur viel Rechenzeit, sondern +liefert auch unerwünschte Ergebnisse: z.B. sollte der Artikel 'der' mit einem führenden +Leerzeichen als " der" gesucht werden, da andernfalls jedes Wort, das die Silbe 'der' +enthält, einen Treffer in der Suche ergibt. + +Da die Suche nach unbekannten Texten viele unerwünschte Ergebnisse liefern +könnte, kann die Prozedur any in zweifacher Weise eingeschränkt werden: + + +D(" d" + any (2) ) + + Die Länge der unbekannten Textes wird vorgegeben, indem die Anzahl + der Zeichen aus denen der Text besteht, angegeben wird. Die Angabe + steht in Klammern hinter 'any'. (In diesem Beispiel genau 2 Zeichen). + + +D(" d" + any ("aeirs")) + + + Das Alphabet, aus dem der unbekannte Text bestehen darf, wird angege­ + ben. (In diesem Beispiel darf der Text der einen Treffer ergibt nur aus + den Zeichen 'a', 'e', 'i', 'r', 's' bestehen, z.B: der, die, das oder auch + dies.) + + +D(" d" + any (2,"aeirs") + + + Auch die Kombination der Beschränkungen ist möglich. (Jetzt liefern nur + noch 'der', 'die','das' etc. Treffer). + + +#on("b")# +ACHTUNG: Das Zeichen '*' nimmt eine Sonderstellung ein, da es als Abkürzung für + 'any' verwandt werden kann. Soll dieses Zeichen im Text gesucht oder + ersetzt werden, müssen Sie statt "*" 'any(1,"*")' schreiben. + + Weitere Informationen zum Pattern Matcher finden Sie im EUMEL- + Handbuch zur Programmierung. +#off("b")# +#free(1.0)# +4.3.4. Kommandos auf Tasten legen + +#free(1.0)# + #on("i")# + Oft benutzte Kommandos können auf Tasten gelegt werden. Damit ist es möglich, + den Editor auf Ihre speziellen Bedürfnisse einzurichten.#off ("i")# + +#free(1.0)# + +Oft benutzte Kommandos können mit der Drei-Tastenfolge + + <'taste'> auf eine Taste gelegt werden. + +#on("u")#Beispiel:#off("u")# + + + (* die Kommandozeile erscheint *) + +____________________________________________________________________________ + +gib kommando: save (SOME myself) + +____________________________________________________________________________ + + + (* das Kommando 'save (SOME myself)' ist + nun auf die Taste 's' gelegt *) + + +Wird nun die Taste 's' gedrückt, erscheint das Zeichen 's' auf dem Bildschirm. Mit +#ib#ESC s#ie# wird das 'save'-Kommando ausgeführt. Natürlich können auch kompliziertere +Kommandos auf Tasten gelegt werden. + +Möchten Sie ein Kommando, das auf eine Taste gelegt wurde, verändern, drücken Sie +im Kommandodialog (!) die Drei-Tastenfolge + + <'taste'> + + +#on("u")#Beispiel:#off("u")# + + (* in den Kommandodialog gehen *) + + + (* es erscheint nun: 'save (SOME myself)' *) + +Dieses Kommando kann nun z.B. verändert und ausgeführt (durch 'CR') oder +wiederum auf die gleiche oder eine andere Taste gelegt werden (durch #ib#ESC ! 'taste'#ie#). + +Im Editor kann das letzte im Kommandodialog eingegebene Kommando durch '#ib#ESC f#ie#' +wiederholt werden. +#page# + +#ib(9)#4.3.5. Texte aus anderen Dateien benutzen#ie(9)# +#free(1.0)# + #on("i")# + Manchmal ist es notwendig, einen Text in eine andere Datei zu schreiben (z.B. + wenn man diesen Text noch einmal verwenden will) oder einen Text einer anderen + Datei in den zu bearbeitenden Text einzufügen. Die '#ib#GET#ie#'- und '#ib#PUT#ie#'-Kom­ + mandos bieten die Möglichkeit, Texte zwischen Dateien auszutauschen (vergl. + auch den Abschnitt über paralleles Editieren).#off ("i")# + +#free(1.0)# +Mit dem #ib#'GET'-Kommando#ie# können wir Texte aus einer anderen Datei an die aktuelle +Schreibposition kopieren. + +____________________________________________________________________________ + +gib kommando: GET "absender" + +____________________________________________________________________________ + +holt den Text 'absender'. Wenn also des öfteren Briefe geschrieben werden, braucht +man sich den Absender nur einmalig in die Datei 'absender' zu schreiben und kann +diesen mit dem Kommando 'GET' (was man auf eine Taste legen kann) u.U. mehr­ +mals an verschiedenen Stellen in die Datei einfügen. + +Mit dem #ib#'PUT'-Kommando#ie# können wir zuvor markierte Textteile in eine Datei schrei­ +ben. + +____________________________________________________________________________ + +gib kommando: PUT "adressen" + +____________________________________________________________________________ + + +schreibt einen markierten Text in die Datei 'adressen'. 'adressen' wird ggf. eingerich­ +tet. Ist die Datei 'adressen' bereits vorhanden, so wird erfragt, ob die Datei gelöscht +werden kann, um den markierten Text aufzunehmen (überschreiben). Andernfalls wird +der markierte Text an den bereits vorhandenen Text in 'adressen' angefügt. Es ist +somit durch mehrmaliges Markieren und das 'PUT'-Kommando möglich, Texte aus +einer Datei zu sammeln und in eine neue Datei zu geben. +#page# + +#ib(9)#4.3.6. #ib#Breitere Zeilen#ie# bearbeiten#ie(9)##goalpage("margin")# +#free(1.0)# + #on("i")# + Der Editor ist auf eine Zeilenbreite von 77 Zeichen eingestellt. Oft ist es notwen­ + dig, mit einer anderen Zeilenbreite zu schreiben, welche man mit dem #ib#'limit'- + Kommando#ie# einstellen kann. Aber auch die Positionierung innerhalb einer Zeile + wird dadurch anders, weil breitere Zeilen nicht als Ganzes auf den Bildschirm + passen. In diesem Fall wird "#ib#gerollt#ie#".#off ("i")# + +#free(1.0)# +Eine andere Zeilenbreite stellt man durch 'limit' ein. Beachten Sie, daß die eingestell­ +te Zeilenbreite für die gesamte Datei gilt. + +#on("u")#Beispiel:#off("u")# + +____________________________________________________________________________ + +gib kommando: limit (180) + +____________________________________________________________________________ + + +Nun können Sie wie gewohnt schreiben. Allerdings wird die aktuelle Zeile, in der man +sich befindet, nicht wie gewohnt am Bildschirmende umgebrochen, sondern erst an +der Spalte 180, sofern sie nicht vorher durch die 'CR'-Taste beendet wird. Wird über +das rechte Bildschirmende hinaus geschrieben, bleibt die Cursor-Position am Ende +des Bildschirms erhalten, aber die Zeile wird beim weiteren Schreiben nach links +verschoben, "rollt" also nach links (der Anfang der Zeile verschwindet scheinbar nach +links). + +Mit der Positionierung verhält es sich ähnlich. Wird mit RECHTS über den rechten +Bildschirmrand positioniert, wird die Zeile ebenfalls gerollt. #ib#HOP RECHTS#ie# bewirkt ein +#ib#Blättern#ie# innerhalb einer einzelnen Zeile nach rechts. Analog verläuft es bei verscho­ +bener Zeile, wenn nach links (LINKS bzw. #ib#HOP LINKS#ie#) positioniert wird. + +Beim Schreiben von Tabellen kann es sinnvoll sein, das Fenster vorübergehend auf +eine andere Anfangsposition (als 1) einzustellen. Das kann mit dem +#ib#'margin'-Kommando#ie# erfolgen. + +#on("u")#Beispiel:#off("u")# + +____________________________________________________________________________ + +gib kommando:#ib#margin#ie# (50) + +____________________________________________________________________________ + + +Das Editorfenster zeigt nun einen Ausschnitt aus der Datei, beginnend ab der Spalte +50. In der Titelzeile wird "M50" angezeigt. +#page# + +#ib(9)#4.3.7. Die wichtigsten Kommandos#ie(9)# +#free(1.0)# + #on("i")# + Einige Kommandos sind speziell für die Textverarbeitung im Editor programmiert. + Die wichtigsten werden hier vorgestellt.#off ("i")# + +#free(1.0)# +any + TEXT PROC any + liefert ein Muster beliebiger Gestalt und Länge (also auch der Länge 0) für + Suchoperationen. + + + " ir" + any + "was" + + +any + TEXT PROC any (TEXT CONST alphabet) + liefert den längstmöglichen Text, der aus den in 'alphabet' angegebenen Zeichen + besteht. + + + any ("1234567890") (* suche Zahlen *) + + +any + TEXT PROC any (INT CONST laenge) + liefert ein Muster beliebiger Gestalt und der Länge 'laenge'. + + + " d" + any (2) + + +any + TEXT PROC any (INT CONST laenge, TEXT CONST alphabet) + liefert ein Muster der Länge 'laenge', das nur aus Zeichen aus + 'alphabet' besteht. + + + " d" + any (2,"erias") + + + +C + OP C (TEXT CONST muster, ersatz) + Ab der aktuellen Positon wird 'muster' in Richtung Dateiende gesucht und durch + 'ersatz' ersetzt. Der Cursor steht danach hinter 'ersatz'. + + + "alt" C "neu" + + + +CA + OP CA (TEXT CONST muster, ersatz) + Arbeitet ab der aktuellen Position wie C. Die Aktion wird jedoch bis zum Erreichen + des Dateiendes wiederholt. Nach Ausführung ist somit jedes 'muster' durch + 'ersatz' ersetzt. Der Cursor steht danach hinter dem letzten Zeichen der Datei. + + + "alt" CA "neu" + + + + +D + OP D (INT CONST n) + Positioniert das Fenster n Zeilen vorwärts in Richtung auf das Dateiende. + + + D 50 + + + OP D (TEXT CONST muster) + Sucht 'muster' vorwärts in Richtung auf das Dateiende. Die Suche beginnt direkt + hinter der aktuellen Cursor-Position. Wird 'muster' nicht gefunden, steht der + Cursor hinter dem letzten Zeichen der Datei. Wird 'muster' gefunden, steht der + Cursor direkt auf dem ersten Zeichen von 'muster'. + + + D "muster" + + + +GET + OP GET (TEXT CONST dateiname) + Kopiert den Inhalt der Datei mit dem angegebenen Namen vor die aktuelle + Cursor-Position. Ist ein Teil der Quelldatei markiert, wird nur der markierte Teil + kopiert. + + + GET "quelldatei" + + + OP G (TEXT CONST dateiname) + Wie GET. + + +limit + OP limit (INT CONST limit) + Setzt die rechte Schreibgrenze auf 'limit'. + + + limit (50) + + + +margin + PROC margin (INT CONST anfang) + Alle Zeilen erscheinen erst ab Spalte 'anfang' im Sichtfenster. + + + margin (50) + + + +OR + TEXT OP OR (TEXT CONST texteins,textzwei) + Liefert ein Muster, wenn texteins oder textzwei gefunden wird. Die Reihenfolge + spielt keine Rolle. + + + D ("Geschäfts" + ("führung" OR "leitung")) + + + +PUT + OP PUT (TEXT CONST dateiname) + Richtet eine Datei mit dem angegebenen Namen ein und kopiert den markierten + Textabschnitt in diese. + + + PUT ("meine hilfsdatei") + + + OP P (TEXT CONST dateiname) + Zweck: Wie PUT. + + +T + OP T (INT CONST n) + Positioniert auf die Zeile 'n'. + + + T 999 + + + +type + PROC type (TEXT CONST zeichenkette) + + Fügt 'zeichenkette' in die aktuelle Position der editierten Datei ein. Besonders + nützlich in Verbindung mit der Prozedur 'code', um nicht auf der Tastatur enthal­ + tene Zeichen in den Text zu bringen. + + + type(code(200)) + + + +U + OP U (INT CONST n) + Positioniert das Fenster n Zeilen rückwärts in Richtung auf den Dateianfang. + + + U 100 + + + OP U (TEXT CONST muster) + Sucht 'muster' rückwärts in Richtung auf den Dateianfang. Die Suche beginnt + links neben der aktuellen Cursor-Position. Vergl. D + + + U "muster" + + +word wrap + PROC word wrap (BOOL CONST an) + Schaltet den automatischen Wortumbruch an (voreingestellt) bzw. aus. + + + word wrap (true) (* angeschaltet *) + word wrap (false) (* ausgeschaltet *) + +4.4. Fehlersituationen und Abhilfe + +#free(1.0)# + #on("i")# + Von Zeit zu Zeit werden Sie als Anfänger in Arbeitssituationen geraten, wo Sie + nicht weiterwissen. Hier sind einige Tips, wie Sie sich behelfen können.#off ("i")# + +#free(1.0)# + +Wie helfe ich mir, wenn... + + +... nach + continue("taskname") + + der Monitor #on("u")#nicht#off("u")# + + gib kommando: + + sagt, sondern "schweigt"? + +=> Sie haben die Task bei der letzten Benutzung nicht mit dem Kommando + 'break' verlassen (evtl. haben Sie SV betätigt?). Sie sind jetzt im Editor, sehen + aber den zuletzt bearbeiteten Textausschnitt nicht. Betätigen Sie die Tasten + + ESC b + + und der Text wird neu auf dem Bildschirm ausgegeben. +#free(1.0)# +... im Editor kein Tastendruck mehr akzeptiert wird? + +=> Sie haben irrtümlich die STOP-Taste (auch oft als CTRL a realisiert, abhängig + vom Terminal), d.h. Anhalten der Bildschirmausgabe betätigt. + + Drücken Sie die WEITER-Taste (= CTRL c, d.h. Bildschirmausgabe fortfüh­ + ren). Alle Tastenanschläge, die zwischenzeitlich zu keiner Reaktion führten, + werden jetzt ausgegeben. + + Je nach Tastatur können STOP und WEITER auch auf anderen Tasten liegen. #free(1.0)# +... der Lernmodus über lange Zeit (ungewollt) eingeschaltet war? + +=> a) Sie merken plötzlich, daß über einen unbestimmt langen Zeitraum alle Ihre + Tastenanschläge gelernt wurden (zu erkennen an der "LEARN"-Anzeige in + der Überschriftzeile). + + #on("u")#Was ist zu tun?#off("u")# + + Mit dem Kommando + + ESC HOP HOP + + vergessen Sie alles Gelernte und schalten den Lernmodus aus. + +=> b) Sie beenden den Editor mit ESC q und die Meldung + +____________________________________________________________________________ + + WARNUNG: Lernmodus nicht ausgeschaltet + +____________________________________________________________________________ + + + + erscheint auf dem Bildschirm. + + #on("u")#Was ist zu tun?#off("u")# + + Sie können mit + + ESC HOP HOP + + das Gelernte sofort vergessen. +#free(1.0)# +... Sie zu viele Absatzzeichen in Ihrem Text gesetzt haben und diese entfernen + müssen? + +=> Sie positionieren in die Zeile, in der die Absatzmarke gelöscht werden soll. Sie + betätigen dann die TAB-Taste, um hinter den Text zu positionieren, dann die + RUBOUT-Taste. Wenn Sie jetzt die Zeile mit den Cursor-Tasten nach oben + oder unter verlassen, verschwindet die Absatzmarkierung. +#free(1.0)# +... nach + + save("dateiname","vatertask") + + das Betriebssystem nicht mehr reagiert? + +=> Sie haben die Vater-Task nicht mit dem Kommando 'global manager' in + jenem Prozeß zum Empfang von Daten aus anderen Prozessen vorbereitet. +#free(1.0)# +... Sie in Ihrer Task das Archive mit dem Kommando + + archive("archivname") + + anmelden wollen und das System Ihnen die Meldung + + "Fehler: Archive wird von Task "bib" benutzt" + + zustellt? + +=> Es gibt zwei Möglichkeiten: + a) Ein anderer Benutzer benötigt das Archiv-Laufwerk in diesem Moment. Sie + müssen warten, bis er seine Arbeit beendet hat. + + b) Ein anderer Benutzer (oder Sie selbst) hat vergessen, mit dem Kommando + + release(archive) + + das Archiv in jener Task freizugeben. Falls Sie es selbst waren, holen Sie + das nach. Ansonsten kann das Archiv-Kommando wieder erfolgreich gege­ + ben werden, wenn fünf Minuten nicht auf das Archiv + zugegriffen wurde. #free(1.0)# +... Sie eine (scheinbare oder echte) Endlosschleife auf einer Taste (z.B. Taste "x") + gelernt haben und diese (versehentlich oder bewußt) durch 'ESC x' aktivieren? + +=> Wie immer, wenn Sie eine endlos laufende Task beenden wollen, gelangen Sie + mit der SV-Taste in den Supervisor-Modus und mit dem Kommando + + 'halt' + + beenden Sie die Endlosschleife. + + Mit + + ESC HOP HOP x + + wird danach das Gelernte 'vergessen'! +#free(1.0)# +... Sie Ihre Datei verlassen wollen und + + 'ESC q' + + (scheinbar) nicht funktioniert? + +=> Sie haben versehentlich den Feststeller für Großbuchstaben (SHIFT LOCK / + CAPS LOCK) betätigt und ESC q zeigt keine Wirkung (wie auch andere Tasten­ + kombinationen mit Großbuchstaben evtl. keine Wirkung zeigen). + diff --git a/doc/user/benutzerhandbuch.5a b/doc/user/benutzerhandbuch.5a new file mode 100644 index 0000000..1e907f0 --- /dev/null +++ b/doc/user/benutzerhandbuch.5a @@ -0,0 +1,1446 @@ +#start(5.0,1.5)##pagenr("%",1)##setcount(1)##block##pageblock##count per page# +#headeven# +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# + EUMEL-Benutzerhandbuch +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#headodd# +#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")# +#table# + Teil 5: Textkosmetik und Druck +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#bottomeven# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +5 - % GMD +#tableend##clearpos# +#end# +#bottomodd# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +GMD 5 - % +#tableend##clearpos# +#end# + +#ib(9)#TEIL 5: Textkosmetik und Druck#ie(9)# +#free(1.0)# +#ib(9)#5.0. Vorwort#ie(9)# + +#free(1.0)# +Die #ib#Textkosmetik-Programme#ie# des EUMEL-Systems bieten Ihnen eine einfach zu +erlernende und zu bedienende Möglichkeit, Texte für den Druck zu gestalten (pro­ +grammtechnisch: #ib#formatieren#ie#) und zu manipulieren. + +Die Textkosmetik-Programme bearbeiten Ihre Dateien, die durch den EUMEL-Editor +erstellt wurden. Darum sollten Sie sich zuerst mit dem EUMEL-Editor vertraut +machen. + +Die Programme sind so konstruiert, daß die meisten Aufgaben durch in den Text +eingefügte Anweisungen gesteuert werden. Solche Angaben für die Textkosmetik und +den EUMEL-Drucker nennen wir im folgenden kurz #on("b")##on("i")#'Anweisung' #off("b")##off("i")#. Die Form der +#ib#Anweisung#ie# ist für die Textkosmetik und den EUMEL-Drucker gleich und entspricht +der ELAN-Syntax. Beachten Sie den #ib#Unterschied zwischen einem Kommando und +einer Text-Anweisung#ie#: während ein Kommando direkt ausgeführt wird, wird eine in +den Text eingebettete Anweisung erst nach dem Aufruf von Textkosmetik- und +Drucker-Programmen wirksam. + +Die Wirkungsweise der Textkosmetik-Anweisungen ist leicht zu erlernen und kann +vor allen Dingen stufenweise erfolgen. Deshalb ein guter Rat für Anfänger: Lesen Sie +diesen Teil des Benutzer-Handbuchs erst oberflächlich, so daß Sie ungefähr +Bescheid wissen, welche Möglichkeiten die Textkosmetik-Programme bieten. Dann +können Sie diejenigen Teile der Textkosmetik auswählen und bei Bedarf anwenden, +die Sie für Ihre spezielle Anwendung benötigen. +#page# + +#ib(9)#5.1. Einführung in die Benutzung der + #ib#Textkosmetik#ie##ie(9)# + +#free(1.0)# + #on("i")# + In diesem Kapitel erhalten Sie eine Übersicht über die verfügbaren Programme der + Textkosmetik. + +#off("i")# +#free(1.3)# +Schreiben, Gestalten und Drucken von Texten + +#free(1.0)# + #on("i")# + Im EUMEL-System unterscheiden wir zwischen drei Stufen einer Textbehand­ + lung:#on("b")# Erstellung, Gestaltung#off("b")# und #on("b")#Druck#off("b")#. Die Trennung in verschiedene Arbeits­ + stufen hat den Vorteil, daß Sie sich zu einem Zeitpunkt nur auf einen Arbeitsschritt + konzentrieren müssen. + #off("i")# +#free(1.3)# +Texterstellung bzw. Textbearbeitung + +#free(1.0)# +Das Schreiben von Texten wird mit Hilfe des Editors erledigt. In dieser Stufe der +Texterstellung können Sie sich ausschließlich auf das Schreiben und die inhaltliche +Korrektheit Ihres Textes konzentrieren. Wird ein Text ohne Anweisungen gedruckt, +dann erscheint er so, wie er mit dem Editor geschrieben wurde. Bei der Erstellung +des Textes können Sie aber auch bereits Textkosmetik-Anweisungen in den Text +einfügen. + +____________________________________________________________________________ + + Es ist wichtig, daß Sie das Kapitel 'Editor' + \#on("b")\#sehr\#off("b")\# gründlich lesen. + +____________________________________________________________________________ + + +Druckbild: + +Es ist wichtig, daß Sie das Kapitel 'Editor' +#on("b")#sehr#off("b")# gründlich lesen. + + +Sie sollten Texte im 'Fließtext'-Modus erstellen, d.h., dann werden Worte, die über +Zeilengrenzen gehen, ohne Silbentrennung vom Editor in die nächste Zeile gebracht. +#free(1.5)# +Textkosmetik bzw. Textgestaltung + +#free(1.0)# +Nachdem Sie einen Text geschrieben haben, können Sie ihn mit #ib#Textkosmetik- +Programme#ie#n gestalten, ohne ihn inhaltlich zu verändern. Dies kann auch vor oder +nach eventuellen Korrekturen erfolgen. Die Textkosmetik bietet zur Zeit vier Pro­ +gramme an, die je nach Bedarf eingesetzt werden können: + +--- #on("b")#'#ib#lineform'/'autoform#ie#'#off("b")# formatiert einen Text zeilenweise und vollzieht eine + Silbentrennung. Weiterhin erlaubt 'lineform'/'autoform' die Verwendung unter­ + schiedlicher Schrifttypen und Schrifthöhen. + +--- #on("b")#'#ib#pageform#ie#'/'#ib#autopageform#ie#'#off("b")# gestattet die Formatierung eines Textes in Seiten + (drucktechnisch: "Seitenumbruch"). Dabei berücksichtigt 'pageform'/'auto­ + pageform' unterschiedliche Schrifthöhen. Es ist mit 'pageform'/ 'autopage­ + form' u.a. möglich, die Seiteneinteilung zu bestimmen, eine Seite in Spalten + zu formatieren ("Zeitungsformat"), Zeilen am Anfang bzw. Ende jeder Seite + einfügen zu lassen, eine Seitennumerierung (drucktechnisch: "Paginierung") + zu erhalten und Fußnoten zu gestalten. + +--- #on("b")#'#ib#index#ie#'#off("b")# erlaubt die Erstellung von Stichwort- und Inhaltsverzeichnissen aus + einer mit 'pageform'/'autopageform' bearbeiteten Datei. + +--- #on("b")#'#ib#outline#ie#'#off("b")# holt aus einer Datei alle mit Index-Anweisung gekennzeichneten + Überschriften und Stichworte. Es erstellt somit eine Übersicht bzw. Kurz­ + fassung eines Textes. +#free(1.5)# +Drucken +#free(1.0)# +Zu jedem Zeitpunkt der Texterstellung kann gedruckt werden. Der EUMEL-Drucker +beachtet die gleichen Anweisungen wie die Textkosmetik-Programme und noch +einige zusätzliche, die nur für die Druckaufbereitung notwendig sind. Spezielle Druck­ +leistungen, wie z.B. verschiedenartige Schrifttypen, können nur auf besonderen +Druckern erzeugt werden. Verfügt ein Drucker nicht über eine bestimmte Hardware- +Eigenschaft, wird die von ihm geforderte Leistung ignoriert. Somit ist es möglich, +Probedrucke für Korrekturen etc. auch auf preiswerten Druckern herzustellen. (siehe +hierzu 5.6.1.) +#page# + + +-------------------------+ + l Text-Eingabe l + l l + +->-+ Editor +->-+ + l l l l + l l erstellt Datei l l + l +------------+------------+ l + l l l + l V l + l +------------+------------+ l + l l lineform l l + +-<-+ +->-+ + l l formatiert Zeilen l l + l +------------+------------+ l + l l l + l V l + l +------------+------------+ l + l l outline l l +--------------------------+ + l l l l l E U M E L - Drucker l + +-<-+ gibt Übersicht bzw. +->-+ ->--+ l + l l Kurzfassung eines Textesl l l Probe- bzw. l + l l l l l endgültiger Druck l + l l Dateiname + '.outline' l l +--------------------------+ + l +------------+------------+ l + l l l + l V l + l +------------+------------+ l + l l pageform l l + l l l l + +-<-+ formatiert Seiten +->-+ + l l l l + l l Druckdatei l l + l l Dateiname + ".p" l l + l +------------+------------+ l + l l l + l V l + l +------------+------------+ l + l l index l l + l l l l + l l erstellt Stichwort- und l l + +-<-+ Inhaltsverzeichnisse +->-+ + l l + l Indexdatei(en) l + l Dateiname + "i" l + +-------------------------+ + #page# + +#ib(9)#5.1.1. Anweisungen für die Textkosmetik + und den Drucker#ie(9)# +#free(1.0)# + #on("i")# + In diesem Abschnitt wird beschrieben, wie Sie #ib#Anweisungen#ie# für die Textkosme­ + tik- und Druckprogramme in einen Text einfügen können. Beachten Sie, daß jede + Anweisung von '\#'-Zeichen eingeschlossen werden muß. Benötigen Sie das + '\#'-Zeichen in Ihrem Text, müssen Sie es mit 'ESC' schreiben. + #off("i")# +#free(1.0)# +Es gibt zwei Arten von Anweisungen: + +a) Anweisungen, die das gesamte Aussehen eines Manuskripts verändern (#on("i")##ib#"layout- + Anweisungen"#ie##off("i")#). Zu diesen Anweisungen gehören die Anweisungen \#limit (...)\#­ + (Einstellen der Zeilenbreite), \#linefeed (...)\# (Zeilenabstand), \#page\# (neue Seite) + usw. Diese Anweisungen gelten erst ab der nächsten Zeile und Sie sollten sie + daher in eine extra Zeile zwischen den Text stellen. + +____________________________________________________________________________ + +\#type ("trium8")\#\#limit (11.0)\# +\#start(5.0,1.5)\# +\#pagelength(17.4)\#\#pagenr("%",148)\#\#setcount(1)\# +\#block\#\#pageblock\# +\#count per page\# +\#headeven\# +\#lpos(0.0)\#\#cpos(5.5)\#\#rpos(11.0)\# +\#table\# + EUMEL-Benutzerhandbuch +\#fillchar(" ")\# +\#on("u")\# \#off("u")\# +\#table end\#\#clear pos\# + +\#end\# +\#headodd\# +\#lpos(0.0)\#\#cpos(5.5)\#\#rpos(11.0)\#\#fillchar(" ")\# +\#table\# + Teil 5: Textkosmetik und Druck +\#fillchar(" ")\# +\#on("u")\# \#off("u")\# +\#table end\#\#clear pos\# + +\#end\# + +____________________________________________________________________________ + + + Das Druckbild (das Ergebnis der Anweisungen) sehen Sie im vorliegenden + Benutzerhandbuch. + + Anweisungen, die für den Gesamttext gelten sollen, müssen Sie an den Anfang + der Datei stellen (noch vor \#head\#). + +b) Anweisungen, die unmittelbar auf den nachfolgenden Text wirken sollen, wie z.B. + \#type\# (Schrifttyp), \#on\#/\#off\# (Modifikationen wie unterstreichen oder fett druk­ + ken), \#ib\#/\#ie\# (Markierung von Stichworten) usw. Solche Anweisungen werden + unmittelbar beachtet und können überall auf einer Zeile stehen (wie in dem fol­ + genden Beispiel). + +____________________________________________________________________________ + + \#on("underline")\#Ausnahmen\#off("underline")\# werden bei der + Beschreibung der Anweisungen speziell erwähnt. + +____________________________________________________________________________ + + +Druckbild: + + #on("u")#Ausnahmen#off("u")# werden bei der + Beschreibung der Anweisungen speziell erwähnt. + +____________________________________________________________________________ + +Weitere Beispiele für Textkosmetik-Anweisungen: + +____________________________________________________________________________ + +\#page\# +\#free(3.0)\# +\#type("quadrato")\# + +____________________________________________________________________________ + + +Diese Anweisungen entsprechen - wie alle Kommandos im EUMEL-System - der +ELAN-Syntax (u.a. müssen sie klein geschrieben werden; Parameter in runden +Klammern; mehrere Parameter werden durch Kommata getrennt; #ib#TEXT-Parameter#ie# in +Anführungsstrichen; #ib#REAL-Parameter#ie# mit Dezimalpunkt usw.). Leerzeichen spielen +(außer in TEXT-Parametern) keine Rolle und können zur besseren Lesbarkeit belie­ +big verwendet werden. + +Die Zeichen, aus denen eine Anweisung besteht, werden bei der Formatierung einer +Zeile oder Seite nicht mitgezählt und vom EUMEL-Drucker nicht gedruckt. Eine +Zeile, die nur aus Anweisungen besteht, wird ebenso behandelt, auch wenn sie mit + abgeschlossen wird. +#page# +#on("b")# + +#ib(9)#5.1.2. #ib#Aufruf der Textkosmetik-Programme#ie##ie(9)# +#free(1.0)# + #on("i")# + In diesem Abschnitt wird beschrieben, wie Sie die #ib#Textkosmetik-Programme + aktivieren#ie# können. + #off("i")# +#free(1.0)# +Sie rufen die Textkosmetik-Programme durch Kommandos auf (d.h. in der 'gib +kommando'-Ebene). Sie geben ebenso wie zum Editieren den Namen des Pro­ +gramms und der Datei an.#goalpage("lineform")# + +____________________________________________________________________________ + + gib kommando: + lineform ("dateiname") + +____________________________________________________________________________ + + + oder: + autoform ("dateiname") + pageform ("dateiname") + autopageform ("dateiname") + outline ("dateiname") +#mark ("", "")# + index ("dateiname") + + + + +'lineform'/'autoform' können Sie auch vom EUMEL-Editor aus aufrufen. Zu diesem +Zweck markieren Sie den zu formatierenden Abschnitt der Datei und geben im +Kommando-Zustand ( drücken) 'lineform' bzw. 'autoform' (ohne Para­ +meter). +#mark ("", "")# + +Das Programm 'pageform'/'autopageform' erzeugt aus der Eingabedatei eine #ib#Druck­ +datei#ie#, die den Namen der angegebenen Eingabedatei mit dem Zusatz '.p' bekommt. + +____________________________________________________________________________ + + gib kommando: + pageform ("dateiname") + +____________________________________________________________________________ + + +Als Ergebnis erhalten Sie: "dateiname.p" + + + + +Das Programm 'index' kann nur eine Druckdatei bearbeiten: + +____________________________________________________________________________ + + gib kommando: + index ("dateiname.p") + +____________________________________________________________________________ + + +und erstellt die angeforderten Verzeichnisse in Dateien, die mit dem Zusatz +'.i' gekennzeichnet werden. + +Beispiele: "dateiname.i1", "dateiname.i2" etc. + + + + +'#ib#outline#ie#' erstellt ebenfalls eine neue Datei. + +____________________________________________________________________________ + + gib kommando: + outline ("dateiname") + +____________________________________________________________________________ + + +führt zu dem Ergebnis: "dateiname.outline" #mark ("", "")# +#page# + +#ib(9)#5.1.3. Vorzeitiger #ib#Abbruch#ie# und + #ib#Fehlermeldungen#ie##ie(9)# +#free(1.0)# + #on("i")# + Sie können alle Textkosmetik-Programme vorzeitig abbrechen. Eventuelle + Fehlermeldungen werden Ihnen in einem Fenster angezeigt. + #off("i")# +#free(1.0)# +Durch die #ib##ie(1,"-Abbruch")##ib##ie(1,"Abbruch mit ESC")#-Taste oder die #ib# #ie#-Taste und das Supervisor-Kommando 'halt' +können Sie die Textkosmetik-Programme jederzeit vorzeitig abbrechen. Die Eingabe­ +datei steht Ihnen dann unverändert zur Verfügung. Ein #ib#vorzeitiger Abbruch#ie# kann +notwendig sein, wenn Sie ein Programm mit einer falschen Datei aufgerufen haben +oder zu viele Fehler gemeldet wurden. +#mark ("", "")# + +Alle Textkosmetik-Programme melden Fehler, wenn Sie Anweisungen falsch be­ +nutzen. Die Fehlermeldungen werden auf dem Bildschirm angezeigt. Bei Beendigung +eines Programms wird - falls Fehler entdeckt wurden - automatisch der #ib#Fenster- +Editor#ie# aufgerufen, wobei die Fehlermeldungen im unteren #ib#Fenster#ie# (das ist das #ib#Notiz­ +buch#ie#) angezeigt werden, während Ihnen im oberen Fenster die Eingabedatei zur +Korrektur angeboten wird. + +____________________________________________________________________________ + +.......................dateiname.................Zeile 1 + + \#corner1("-5.0")\#\#on("i")\# + Sie können alle Textkosmetik-Programme vorzeitig abbrechen. + Eventuelle Fehlermeldungen werden Ihnen in einem Fenster ange­ + zeigt. + \#box3("T","2","115.0")\#\#off("i")\# + #cursor(" ")# + +.......................notebook..................Zeile 1 +FEHLER Zeile 1: Unbekannte Anweisung (ignoriert): corner1("-5.0") + >>> Bitte Korrigieren +FEHLER Zeile 5: Unbekannte Anweisung (ignoriert): + box3("T","2","115.0") + >>> Bitte Korrigieren + +____________________________________________________________________________ + + + + + +Um von der Eingabedatei zum Notizbuch - und umgekehrt - zu wechseln, betätigen +Sie . +#page# + +#ib(9)#5.2. #ib#Lineform/Autoform#ie##ie(9)# +#free(1.0)# + #on("i")# + Die Programme '#ib(1, "ff")#lineform#ie#' oder '#ib(1, "ff")#autoform#ie#' formatieren einen Text zeilenweise (ggf. + mit Silbentrennung) unter Berücksichtigung von Schrifttyp und Zeilenbreite. + #off("i")# +#free(1.0)# +Zur #ib#Zeilenformatierung#ie# werden Ihnen zwei Programme (Kommandos) angeboten, die +sich nur in ihrem interaktiven Charakter unterscheiden (Behandlung von Silben­ +trennungen): + +---- #on("b")##ib#autoform#ie##off("b")#: + Zeilenformatierung mit automatischer #ib#Silbentrennung#ie#. Sie sollten 'autoform' + nur bei Texten einsetzen, in denen einige wenige Trennfehler nicht von + großer Bedeutung sind, z.B. bei Probedrucken. + +---- #on("b")##ib#lineform#ie##off("b")#: + Zeilenformatierung mit Silbentrennung "per Hand", wobei (nach deutschen + Trennregeln) ein sinnvoller Trennvorschlag gemacht wird. Die Trennstelle + kann interaktiv soweit verschoben werden, wie das zu trennende Wort noch + auf die Zeile paßt. + + +'lineform'/'autoform' hat im wesentlichen vier Aufgaben: + +---- #ib#Auffüllen von Zeilen#ie#: + 'lineform'/'autoform' kann besonders gut nach Korrekturen eingesetzt wer­ + den, bei denen - nach Einfügungen oder Löschungen - nicht vollständige + oder zu lange Zeilen in der Datei stehenbleiben können. + +---- Erstellen von Zeilen mit unterschiedlichen Schrifttypen: + Werden in einer Datei mehrere Schriftarten (\#type\#-Anweisung) verwendet, + berechnet 'lineform'/'autoform' nach der eingestellten Zeilenbreite die Anzahl + der Zeichen, die auf eine Zeile passen. + +---- Bearbeitung unterschiedlicher Zeilenbreiten: + Manchmal ist es notwendig, die Zeilenbreite zu verändern (\#limit\#- + Anweisung). Dies wird von 'autoform'/'lineform' berücksichtigt. + +---- Silbentrennung: + Automatische ('autoform') und interaktive Silbentrennung ('lineform'). + + +'lineform'/'autoform' akzeptiert als Eingabe eine Datei und verändert diese. Dafür wird +eine (interne) Zwischendatei benötigt. Deshalb müssen Sie darauf achten, daß noch +ausreichend Platz auf dem System ist, der jedoch nur zwischenzeitlich für den Forma­ +tierungsschritt benötigt wird. + +'lineform' und auch 'pageform' sind auf den ersten Schrifttyp der Fonttabelle, auf eine +Zeilenbreite von 16.0 und eine Seitenhöhe von 25.0 initialisiert. Sind die ersten An­ +weisungen, die das verändern könnten, fehlerhaft, so bleiben diese Werte (wie auch +sonst bei ignorierten Anweisungen) erhalten. + +'lineform'/'autoform'fragt nach dem Kommando an, mit welchem #ib#Schrifttyp#ie# und mit +welcher #ib#Zeilenbreite#ie# die Datei formatiert werden soll. Dabei erscheinen zuerst die +voreingestellten Anweisungen. Beispiel: + +____________________________________________________________________________ + +LINEFORM (für ... Zeilen): dateiname + +Bitte Schrifttyp: micro +Zeilenbreite (in cm): 16.0 + + +____________________________________________________________________________ + + + +Diese Anweisungen können Sie jetzt durch Ihre gewünschten Anweisungen ersetzen. +Diese Informationen werden von 'autoform'/'lineform' in Form von \#limit\#- und +\#type\#-Anweisungen in der Datei vermerkt, so daß die Anfragen bei weiteren +Datei-Bearbeitungen entfallen. + +Bei Zeilen, die länger als die angegebene Zeilenbreite sind, werden diejenigen Worte, +die über die Zeilenbreite hinausgehen, in die nächste Zeile umgebrochen. Kürzere +Zeilen werden aus der nachfolgenden Zeile bis zur Zeilenbreite aufgefüllt. Worte +werden jedoch nicht über Absatzgrenzen hinweg verschoben. Deshalb sollten Sie vor +Anwendung von 'lineform'/'autoform' darauf achten, daß Absätze richtig markiert +wurden. Fehlende Markierungen sollten Sie nachträglich einfügen ( am Ende +einer Zeile), andernfalls werden Zeilen über Absatzgrenzen zusammengezogen. Dies +ist besonders bei Tabellenzeilen unangenehm. + +#ib#Einrückungen#ie# (Leerzeichen am Anfang einer Zeile) werden von 'lineform'/'autoform' +ebenfalls bei der Formatierung von Zeilen eingehalten. +#page# + +#ib(9)#5.2.1. #ib#Zeilenweise formatieren#ie##ie(9)# +#free(1.0)# +#ib(9)#5.2.1.1. #ib#Interaktive Silbentrennung#ie##ie(9)# +#free(1.0)# + #on("i")# + 'lineform' trennt Silben interaktiv, d.h., es werden Ihnen von 'lineform' #ib#Trennungs­ + vorschläge#ie# gemacht, die Sie bestätigen oder ablehnen können. + #off("i")# +#free(1.0)# +Paßt ein Wort nicht mehr ganz auf eine Zeile, dann wird es zur interaktiven Tren­ +nung angeboten. Bei der Trennung werden Anweisungen innerhalb des Wortes ent­ +sprechend berücksichtigt. Die Umgebung dieses Wortes wird zur Erleichterung des +Trennvorgangs mit angezeigt. Das Trennzeichen erscheint an einer sinnvollen Stelle +im zu trennenden Wort. + +____________________________________________________________________________ + + Text vor dem Trennwort; das + Trenn-wort steht mit diesem Text in dieser Zeile + +____________________________________________________________________________ + + +Der Teil des zu trennenden Wortes, der noch auf die Zeile passen würde, wird mar­ +kiert angezeigt. Sie können das Trennzeichen mit Hilfe der Positionierungstasten +innerhalb des Trennbereichs verschieben. An der gewünschten Trennposition (der +Wortteil, der noch auf die Zeile kommen soll, steht links vom Trennstrich) kann die +-Taste betätigt werden. zeigt dem Programm 'lineform' an, daß an dieser +Stelle die Trennung erfolgen soll. 'lineform' fügt an den ersten Teil des Wortes das +"-"-Zeichen an und schreibt den abgetrennten Wortteil in die nächste Zeile. +#page# +Es stehen folgende #ib(1)#Operationen bei der interaktiven Trennung#ie# zur Verfügung: +#lpos(0.0)# #bpos(4.0, 11.0)# #table# + +#on("b")#Taste Bedeutung#off("b")# + + Trennen. + + +<<> Trennzeichen um ein Zeichen nach links verschieben. + + +<>> Trennstelle um ein Zeichen nach rechts verschieben. + + + <<> Trennstelle vor das Wort setzen (das Wort wird an + dieser Position nicht getrennt). + + + <>> Trennstelle an das Ende der Markierung setzen. + + + Trennzeichen wird von "-" auf " " umgeschaltet. + Dies kann verwendet werden, um Worte, die nicht + zusammengeschrieben werden sollen, beim Trenn­ + vorgang in zwei Worte aufzuspalten. + + +<-> Schaltet das Trennzeichen von Leerzeichen (" ") + wieder auf den Trennstrich ("-") um. + + + Abbruch von 'lineform'/'autoform'. Die zu bearbeitende + Datei steht unverändert zur Verfügung. + +#tableend##clearpos# +#page# +Zwei Besonderheiten sind bei der interaktiven Trennung noch zu beachten: + + - Bei Worten mit Bindestrich wird die Trennstelle hinter dem Bindestrich als Leer­ + zeichen angezeigt. + + - Bei einer Trennposition zwischen den Zeichen "ck" wird das Zeichen "c" in ein + "k" umgewandelt. + + Beispiel: Druk-ker + +Sofern es für die Zeilenformatierung notwendig ist, macht die Prozedur 'lineform' +bereits erfolgte Trennungen rückgängig (das Trennzeichen wird entfernt und die +Wortteile werden wieder zusammengefügt), wenn sich das getrennte Wort (etwa durch +Korrekturen oder Veränderungen der Zeilenbreite) nicht mehr am Zeilenende befinden +sollte. + +Wenn Sie nicht Ihren Gesamttext mit 'lineform' bearbeiten möchten, haben Sie die +Möglichkeit, #ib#'lineform' auf einen Textausschnitt#ie# anzuwenden. Hierfür markieren Sie +den gewünschten Bereich, drücken und geben im Editor das Kommando +'lineform'. (siehe S. #topage("lineform")#) + +____________________________________________________________________________ + +...................dateiname................... Zeile 30 + + +Wenn Sie nicht Ihren Gesamttext mit 'lineform' bearbeiten +möchten/brauchen, haben Sie die Möglichkeit, +'lineform' für einen +Textausschnitt anzuwenden. Hierfür markieren Sie den gewünschten +Bereich, drücken 'ESC' 'ESC' und +geben das Kommando 'lineform'. + + +gib kommando:lineform + + +____________________________________________________________________________ + + +#page# + +#ib(9)#5.2.1.2. #ib#Automatische Silbentrennung#ie# mit + '#ib#autoform#ie#'#ie(9)# +#free(1.0)# + #on("i")# + 'autoform' arbeitet wie 'lineform', nur werden die Silbentrennungen automatisch + vorgenommen. + #off("i")# +#free(1.0)# +Ist eine Silbentrennung bei der Formatierung notwendig, übernimmt 'autoform' diese +automatisch. Die Trennungen werden in das #ib#Notizbuch#ie# eingetragen. Nach Beendigung +der Formatierung wird die bearbeitete Datei und das Notizbuch zur Kontrolle der +Silbentrennungen angezeigt. Die automatische Silbentrennung arbeitet mit einer hohen +#ib#Trenngüte#ie#; allerdings nur für deutsche Texte. Trotzdem kann es vorkommen, daß +einige Trennungen, insbesondere bei zusammengesetzten Worten, falsch vorgenom­ +men werden. In einem solchen Fall müssen Sie diese nachträglich mit dem Editor +korrigieren. (vgl. Sie dazu auch 5.8.4.) +#page# + +#ib(9)#5.2.2. #ib#Unterschiedliche Schriften#ie##ie(9)# +#free(1.0)# + #on("i")# + #ib#Unterschiedliche Schrifttypen#ie# (Schriftarten) können Sie mit der \#type ("schrift­ + name")\#-Anweisung anfordern. + #off("i")# +#free(1.0)# +Sie haben die Möglichkeit, mit 'lineform' verschiedenartige #ib#Schrifttypen#ie(1, ", unterschiedliche")# (kurz Typen +genannt) verarbeiten zu lassen. Jede Type hat eine bestimmte Höhe und jedes Zei­ +chen hat eine bestimmte Breite. Alle Typen werden auf einer Grundlinie gedruckt. + +Es gibt zwei Arten von Schriften: +bei#on("b")# #ib#äquidistanten Schriften#ie##off("b")# sind alle Zeichen gleich breit (wie bei einer Schreib­ +maschine).#on("b")# #ib#Proportionalschrift#ie##off("b")# findet man in gedruckten Büchern. Hier haben unter­ +schiedliche Zeichen auch unterschiedliche Breiten. Die Zeichen ".", "i", "!" sind z.B. +schmaler als die Zeichen "w", "o", "m" usw. + +Mit der Anweisung: + +____________________________________________________________________________ + + \#type ("schriftname")\# + +____________________________________________________________________________ + + +kann auf einen anderen Schrifttyp umgeschaltet werden (auch mehrmals innerhalb +einer Zeile). Diese Type gilt solange, bis wieder eine neue \#type ("schriftname")\#- +Anweisung gegeben wird. + +____________________________________________________________________________ + + + \#type ("micro")\#Jetzt schreiben wir mit einem + Schrifttyp, der 'micro' heißt. Und jetzt + \#type ("modern15")\#schalten wir auf eine an­ + dere Schriftart um. Nun \#type ("modern12")\# + möchten wir mit einer größeren Type schrei­ + ben. Um wieder zu unserem gewohnten Schrift­ + typ zu gelangen, schalten wir auf \#type + ("trium8")\# zurück. + + +____________________________________________________________________________ + + +Druckbild (ohne 'lineform'): + + +Jetzt schreiben wir mit einem +Schrifttyp, der 'micro' heißt. Und jetzt +schalten wir auf eine an­ +dere Schriftart um. Nun +möchten wir mit einer größeren Type schrei­ +ben. Um wieder zu unserem gewohnten Schrift­ +typ zu gelangen, schalten wir auf +\#type ("trium8")\# zurück. + + + +Welche Schriftarten Ihnen zur Verfügung stehen, hängt natürlich von dem verfügbaren +Drucker ab. Sie können die vorhandenen Schrifttypen mit dem Kommando 'list fonts' +erfragen. + +Schrifttypen können modifiziert, d.h. verändert, gedruckt werden (vergl. Sie dazu den +nächsten Abschnitt). Durch die Angabe einer \#type ("schriftname")\#-Anweisung +werden alle Modifikationen ausgeschaltet. +#page# +#goalpage("on")##goalpage("off")# + +#ib(9)#5.2.3. #ib#Veränderung des Schrifttyps#ie##ie(9)# +#free(1.0)# + #on("i")# + Mit der #ib#\#on ("..."\#-#ie(1,"Anweisung")# und #ib#\#off ("...")\#-Anweisung#ie# können Sie einen Schrifttyp in + seinem Aussehen verändern. Die Schrift wird zwar nicht gewechselt, aber ver­ + ändert gedruckt. Zur Zeit ist #ib##ie(1,"Unterstreichung")##ib# unterstrichen#ie#, #ib#fett#ie#, #ib#kursiv#ie# und der Druck von#ib# weiß auf + schwarz #ie#möglich (abhängig vom eingesetzten Drucker). + #off("i")# +#free(0.7)# +Die \#on\#/\#off\#-Anweisung wirkt wie ein Schalter, der die gewünschte #ib#Schrifttyp- +Modifikation#ie# ein- bzw. ausschaltet. Die Anweisung \#on\# schaltet die Modifikation ein, +\#off\# schaltet sie aus. + +____________________________________________________________________________ + + Das EUMEL-System ermöglicht es Ihnen, + + \#on ("italic")\#kursiv\#off ("italic")\# + \#on ("i")\# \#off ("i")\# + + und + + \#on ("underline")\#unterstrichen\#off ("underline")\# + \#on ("u")\# \#off ("u")\# + + und + + \#on ("bold")\#fett\#off ("bold")\# + \#on ("b")\# \#off ("b")\# + + und + + \#on ("reverse")\#invers (weiß auf schwarz)\#off ("reverse")\# + \#on ("r")\# \#off ("r")\# + + zu schreiben + +____________________________________________________________________________ +#page# +Druckbild: + + + Das EUMEL-System ermöglicht es Ihnen, + + #on("i")#kursiv#off("i")# + + und + + #on("underline")#unterstrichen#off("underline")# + + und + + #on("b")#fett#off("b")# + + und + + #on("reverse")#invers (weiß auf schwarz)#off("reverse")# + + zu schreiben. + + + +Dabei sollten Sie folgendes beachten: + +a) Ein \#type\#-Anweisung schaltet immer eine vorausgehende Modifikation aus, d.h. + ein Schrifttypwechsel macht eventuelle \#off ("b")\#-, \#off ("u")\#-, \#off ("i")\#- + und \#off ("r")\#-Anweisungen überflüssig. + +b) 'lineform'/'autoform' erzeugt eine Warnung, falls Sie vergessen haben, eine Modi­ + fikation auszuschalten. + +c) Nicht alle Drucker können die hier angegebenen Modifikationen auch drucken. + Welche Modifikationen gleichzeitig eingeschaltet werden können, ist ebenfalls + druckerabhängig. +#page# + +#ib(9)#5.2.4. #ib#Gesperrt schreiben#ie##ie(9)# +#free(1.0)# + #on("i")# + Die Silbentrennung an einem Leerzeichen verhindert man durch Verwendung des + geschützten Leerzeichens 'ESC' und 'Leertaste'. + #off("i")# +#free(1.0)# +Möchten Sie ein Wort g e s p e r r t schreiben, muß natürlich verhindert werden, daß +dieses Wort beim Formatieren getrennt wird. Andere Worte, wie z.B. in Formeln, +sollten ebenfalls zusammen auf eine Zeile geschrieben werden (z.B. 'sin (x)'). Dies +können Sie erreichen, indem Sie nicht das Leerzeichen zwischen die Zeichen schrei­ +ben, denn das Leerzeichen bedeutet für 'autoform'/'lineform' immer das Ende eines +Wortes. Stattdessen verwenden Sie . Das geschützte Leerzeichen +erscheint auf dem Bildschirm zur besseren Identifizierung invers dargestellt bzw. als +ein anderes Zeichen (abhängig von Ihrem Gerät). Beim Drucken wird jedoch wieder +ein Leerzeichen produziert. + + + +____________________________________________________________________________ + + g e s p e r r t + + +____________________________________________________________________________ + + +Druckbild: + + g e s p e r r t + + + +#page# +#goalpage("limit")# + +#ib(9)#5.2.5. #ib#Zeilenbreite einstellen#ie##ie(9)# +#free(1.0)# + #on("i")# + Mit der #ib#\#limit\#-Anweisung#ie# können Sie die Zeilenbreite einstellen. + #off("i")# +#free(1.0)# +Die \#limit\#-Anweisung gibt in cm an, wie breit die Zeile sein soll. Beachten Sie, daß +diese Anweisung nichts mit dem Editor-Kommando 'limit' zu tun hat. Dieses gibt an, +wie viele Zeichen eine Bildschirmzeile lang sein soll. + +Die Zeilenbreite wird zusammen mit dem Schrifttyp beim erstmaligen Aufruf von +'autoform'/'lineform' interaktiv erfragt und als \#limit\#-Anweisung (zusammen mit der +\#type\#-Anweisung) in die erste Zeile der Datei eingetragen. Sie kann in einer Datei +mehrmals verändert werden. + +Die neue Zeilenbreite gilt immer ab der #on("b")#nächsten#off("b")# Zeile, die der \#limit\#-Anweisung +folgt. Beachten Sie, daß Sie als Parameter in der \#limit\#-Anweisung eine Zahl mit +Dezimalpunkt und Nachkommastelle angeben müssen. + +____________________________________________________________________________ + + +\#limit(9.0)\# + Mit der \#limit\#-Anweisung können Sie Para­ + graphen in einem anderen Format leicht gestal­ + ten. Die rechte Schreibgrenze wird durch die + \#limit\#-Anweisung eingestellt, wobei Sie den + linken Rand durch eine entsprechende Ein­ + rückung gestalten können. +\#limit(11.0)\# + +____________________________________________________________________________ + + +Druckbild (mit 'lineform' bearbeitet): + + + Mit der \#limit\#-Anweisung können Sie Paragraphen in einem + anderen Format leicht gestalten. Die rechte Schreibgrenze + wird durch die \#limit\#-Anweisung eingestellt, wobei Sie den + linken Rand durch eine entsprechende Einrückung gestalten + können. + + + +Die folgende Tabelle gibt sinnvolle #ib#'limit'-Einstellungen#ie# für die am häufigsten ver­ +wendeten Papiergrößen an: + + + #on("b")#Format 'limit' Verbleibender + (Zeilenbreite) Rand#off("b")# + + DIN A4 16.0 cm je 2.50 cm + + DIN A5 12.0 cm je 1.42 cm + + DIN A4 quer 25.0 cm je 2.35 cm +#page# +#goalpage("einfache Tabellen")# + +#ib(9)#5.2.6. Einfache #ib#Tabellen#ie(1,", einfache")# und #ib#Aufzählungen#ie# + schreiben#ie(9)# +#free(1.0)# + #on("i")# + Aufzählungen und einfache #ib#Tabellen#ie(1, ", einfache")# werden automatisch richtig formatiert und + gedruckt, wenn Sie sich an einige einfache Regeln halten. + #off("i")# +#free(1.0)# +Verwenden Sie eine #ib#Proportionalschrift#ie# beim Tabellenschreiben, so sind die Spalten in +der Regel unterschiedlich breit, selbst wenn Sie eine gleiche Anzahl Zeichen in jeder +Spalte schreiben. Dies können Sie durch das Schreiben von einem "#ib#Doppelblank#ie#" +("#ib#Mehrfachblank#ie#") vermeiden; für kompliziertere Tabellen gibt es spezielle Tabellen­ +anweisungen. (siehe auch S. #topage("tabellenanw")#) + +____________________________________________________________________________ + + iiii ooooo + mmmm lllll + +____________________________________________________________________________ + + + +Druckbild: + + + iiii ooooo + mmmm lllll + +Erste und zweite Spalte stehen nicht untereinander. + + +Aber mit Doppelblanks: + +____________________________________________________________________________ + + iiii ooooo + mmmm lllll + +____________________________________________________________________________ + + +Druckbild: + + + iiii ooooo + mmmm lllll + +Erste und zweite Spalte stehen jetzt untereinander. + +Das Doppelblank dient 'lineform'/'autoform' und dem Drucker als Zeichen, daß die +Positionen speziell berechnet und beim Druck berücksichtigt werden müssen. Das gilt +nur nach einer Absatzzeile. In seltenen Fällen (insbesondere beim Einsatz von Schrift­ +typen, die in der Größe stark voneinander abweichen) kann es vorkommen, daß diese +Tabellenautomatik nicht funktioniert und Spalten übereinander gedruckt werden. In +solchen Fällen müssen Sie die Anzahl der trennenden Doppelblanks erhöhen. + +#on("b")##on("is")#Praktischer Tip:#off("is")##off("b")# +Beachten Sie, daß es für das Funktionieren der "#ib#Tabellenautomatik#ie#" erforderlich ist, +daß jede Tabellenzeile eine Absatzzeile ist. Man sollte diese Zeilen vor dem Druck +daraufhin überprüfen oder durch 'lineform'/'autoform' die Datei bearbeiten lassen. +Sollten durch die zeilenweise Formatierung einmal wegen fehlender Absatzkennzeich­ +nung zwei Zeilen zusammengezogen sein, können Sie diese leicht mit dem Editor +wieder "auseinanderbrechen" ( , und ). + + +Ähnliches gilt bei Aufzählungen. + +____________________________________________________________________________ + + 1) Das ist die erste Aufzählung. + Dieser Satz wird bündig gedruckt. + 2) Hier auch. + +____________________________________________________________________________ + + +Druckbild: + + + 1) Das ist die erste Aufzählung. + Dieser Satz wird bündig gedruckt. + 2) Hier auch. + + +Auch in solchen Fällen wird der gedruckte Text in der Regel richtig eingerückt. Die +#ib#Tabellenautomatik#ie# wirkt nur nach einem Absatz. Hier aber ein Beispiel für eine +typische Fehlersituation: + +____________________________________________________________________________ + + \#type("normal")\# + 1. Aufzählung + 2. Aufzählung + 3. Aufzählung + + \#type("fett")\#M1. Aufzählung + +____________________________________________________________________________ + + +Die Einrückbreite wird durch den Schrifttyp bestimmt, der vor der Zeile herrscht, und +den ganzen Absatz über beibehalten. + + +Druckbild: + + + 1. Aufzählung + 2. Aufzählung + 3. Aufzählung + + M1. Aufzählung + + +Das Blank zwischen 'M1.' und 'Aufzählung' reicht nicht aus, um eine Überschreibung +zu verhindern. Diesen Fehler können Sie umgehen, indem Sie die \#type\#-Anweisung +in eine gesonderte Zeile stellen. Richtig wäre folgendes (gewünschter Schrifttyp vor +die Zeile!): + +____________________________________________________________________________ + + \#type("trium8")\# + 1. Aufzählung + 2. Aufzählung + 3. Aufzählung + + \#type("triumb14")\# + M1. Aufzählung + +____________________________________________________________________________ + + + +Druckbild: + + + 1. Aufzählung + 2. Aufzählung + 3. Aufzählung + + + M1. Aufzählung + + +Die genauen Regeln sind etwas kompliziert, so daß sie hier nicht einzeln aufgeführt +werden (siehe S. 5-89#topage("block")# unter der Anweisung \#block\#). Treffen Sie auf einen der +seltenen Fälle, wo die Tabellenautomatik nicht funktioniert, können Sie immer noch +Tabellen-Anweisungen verwenden. +#mark ("", "")# +#page# + +#goalpage("tabellenanw")# +#ib(9)#5.2.6.1. #ib#Tabellenanweisungen#ie##ie(9)# +#free(1.0)# + Mit den Tabellenanweisungen der Textkosmetik können Sie auf einfache Art Tabel­ + len auch mit Porportionalschriften gestalten. +#free(1.0)# +Es ist sehr einfach, eine Tabelle in einer äquidistanten Schrift zu schreiben, denn +hierbei stimmt das Schriftbild auf dem Terminal weitgehend mit dem späteren Druck +überein. Bei einer äquidistanten Schrift ist jedes Zeichen gleich breit - Sie können +also "sehen", an welcher Zeilenposition eine neue Spalte beginnt. + +Etwas schwieriger sind Tabellen mit Proportionalschriften, da hier jedes Zeichen eine +unterschiedliche Breite hat. Sie können somit einer Spaltenbreite nicht direkt "an­ +sehen", wie breit sie beim Druck wirklich wird. "Einfache" Tabellen können Sie mit +dem Mehrfachblank gestalten (siehe S. 5-27). Bei komplizierteren Tabellen müssen +Sie die folgenden Tabellenanweisungen benutzen. + +Um eine Tabelle zu gestalten, gehen Sie folgendermaßen vor: + +- Definieren Sie die Spaltenpositionen der Tabelle mit den folgenden Anweisungen. + Für die Punkte bei den Anweisungen müssen Sie entsprechende Parameter + einsetzen. + +#goalpage("lpos")##goalpage("rpos")##goalpage("cpos")##goalpage("dpos")##goalpage("bpos")# +#goalpage("fillchar")# +____________________________________________________________________________ + + #ib#\#l pos#ie(1,"-Anweisung")# (...)\# (* linksbündig *) + #ib#\#r pos#ie(1,"-Anweisung")# (...)\# (* rechtsbündig *) + #ib#\#c pos#ie(1,"-Anweisung")# (...)\# (* zentrierend *) + #ib#\#d pos#ie(1,"-Anweisung")# (..., ...)\# (* zentrierend um eine Zeichenkette *) + #ib#\#b pos#ie(1,"-Anweisung")# (..., ...)\# (* Blocksatz in einer Spalte *) + #ib#\#fillchar#ie(1,"-Anweisung")# (...)\# (* Füllzeichen zwischen Spalten *) + +____________________________________________________________________________ + + + Die Zentrierung um eine Zeichenkette ist wie folgt zu verstehen: Die Spalte wird + bis zum Anfang der angegebenen Zeichenkette rechtsbündig und ab der Zeichen­ + kette linksbündig geschrieben. + +#goalpage("table")# +- Schreiben Sie dann die Tabelle. Sie muß von den Anweisungen + +____________________________________________________________________________ + + #ib#\#table\##ie(1,"-Anweisung")# + + + #ib#\#table end\##ie(1,"-Anweisung")# + +____________________________________________________________________________ + + + eingefaßt werden. Die Spalten in der Tabelle müssen Sie durch mindestens zwei + Leerzeichen voneinander trennen. Es müssen alle Spalten in einer Tabelle vor­ + handen sein. Soll einmal eine Spalte leer bleiben, müssen Sie für diese Spalte ein + #ib#geschütztes Leerzeichen#ie# verwenden. + +- Da die Spaltenpositionen erhalten bleiben (auch über die Anweisung \#table end\# + hinweg), sollten Sie direkt hinter dem Tabellenende die #ib#\#clear pos\#-Anweisung#ie# + geben. + +- Dann können Sie 'lineform'/'autoform' vornehmen. + +____________________________________________________________________________ + + + \#r pos (2.2)\#\#c pos (3.8)\#\#l pos (5.8)\#\#d pos (8.8, ".")\# + \#table\# + erste Spalte zweite Spalte dritte Spalte vierte Spalte + rechtsbündig zentriert linksbündig dezi.mal + 1234 1234 1234 12.34 + 12345 12345 12345 123.45 + 123456 123456 123456 1234.56 + \#table end\# \#clear pos\# + +____________________________________________________________________________ + + +Druckbild: + + + #r pos (2.2)##c pos (3.8)##l pos (5.8)##d pos (8.8, ".")# + #table# + erste Spalte zweite Spalte dritte Spalte vierte. Spalte + rechtsbündig zentriert linksbündig dezi.mal + 1234 1234 1234 12.34 + 12345 12345 12345 123.45 + 123456 123456 123456 1234.56 + #table end##clear pos# + + + +Solche Tabellen können Sie in \#head\#, \#bottom\# oder innerhalb von Fußnoten schrei­ +ben. Es ist jedoch nicht möglich, eine Fußnote innerhalb dieser Tabelle zu definieren. +Ausweg: Tabelle um die Fußnote aufspalten. +#page# + +#ib(9)#5.2.6.2. Einstellen der #ib#Tabellenpositionen#ie (1, ", Einstellen von")##ie(9)# +#free(0.7)# + #on("i")# + Mit den \#pos\#-Anweisungen können Sie eine bestimmte Position innerhalb der + Tabelle einstellen, zugleich aber auch bestimmen, wie die Spalte gedruckt werden + soll. #off("i")# + +#free(0.7)# +____________________________________________________________________________ + + \#l pos (5.0)\#\#r pos (10.0)\#\#d pos (15.0, ".")\# + +____________________________________________________________________________ + + +Die Anweisung oben stellt die erste Spalte der Tabelle auf 5 cm vom Rand ein (links­ +bündig). Die zweite Spalte endet 10 cm vom Rand, wobei diese Spalte rechtsbündig +geschrieben werden soll. Die dritte wird an die Position 15, zentriert um den Dezimal­ +punkt, gedruckt#u##count#)#e#.#foot# +#u##value#)#e# Spaltenposition < 0.0 und Spaltenposition > 'eingestelltes limit' sind nicht + erlaubt. +#end# + +Beachten Sie, daß ein "Überlappen" von Spalten erfolgen kann (in unserem Beispiel +kann die erste Spalte in die zweite hineinschreiben). 'lineform' bzw. 'autoform' meldet +bei Spalten-Überschreibungen einen entsprechenden Fehler. + +Für jede Spaltenposition nehmen Sie ein Element einer Zeile. Die Elemente müssen +Sie beim Schreiben im Editor durch mindestens zwei Leerzeichen voneinander tren­ +nen. Auf die erste Spaltenposition wird das erste Element gedruckt, auf die zweite +Position das zweite Element usw. Für das Drucken der Spalten wird der eingeschal­ +tete Schrifttyp mit möglicherweise einer Modifikation genommen. Der Schrifttyp und +die Modifikation können innerhalb der Tabelle geändert werden#u##count#)#e#.#foot# +#u##value#)#e# Die Zwischenräume zwischen den Spalten werden nicht modifiziert (also z.B. + nicht unterstrichen). +#end# + +Beachten Sie, daß die Tabellenpositionen so lange erhalten bleiben, bis sie explizit +gelöscht werden (\#clear pos\#-Anweisung, siehe S. 5-38). +#page# + +#ib(9)#5.2.6.3. #ib#Blocksatz innerhalb einer Spalte#ie##ie(9)# +#free(1.0)# + #on("i")# + Für Blocksatz innerhalb einer Spalte verwenden Sie die \#b pos (...)\#-Anweisung. + #off("i")# +#free(1.0)# +____________________________________________________________________________ + +\#l pos (0.0)\#\#b pos (2.2, 8.0)\#\#l pos (9.0)\# +\#table\# +1. Spalte Die mittlere Spalte wird bis zur Druck­ 3. Spalte +1. Spalte position '8.0' in Blocksatz gedruckt. Um 3. Spalte +1. Spalte in dieser Spalte einen Absatz zu bekom­ 3. Spalte +1. Spalte men, muß ein geschütztes Leerzeichen am 3. Spalte +1. Spalte Ende der Spalte stehen. #cursor(" ")# 3. Spalte +\#table end\# \#clear pos\# + +____________________________________________________________________________ + + + +Druckbild: + +#l pos (0.0)##b pos (2.2, 8.0)##l pos (9.0)# +#table# +1. Spalte Die mittlere Spalte wird bis zur Druck­ 3. Spalte +1. Spalte position '8.0' in Blocksatz gedruckt. Um 3. Spalte +1. Spalte in dieser Spalte einen Absatz zu bekom­ 3. Spalte +1. Spalte men, muß ein geschütztes Leerzeichen am 3. Spalte +1. Spalte Ende der Spalte stehen. 3. Spalte +#table end##clear pos# +#page# + +#ib(9)#5.2.6.4. #ib#Tabellenspalten auffüllen#ie# (#ib#Füllzeichen#ie#)#ie(9)# +#free(1.0)# + #on("i")# + Mit der \#fillchar\#-Anweisung können Sie Spaltenzwischenräume füllen. + #off("i")# +#free(1.0)# +Angenommen, Sie möchten eine Rechnung erstellen. Die Warenposten sollen links­ +bündig an der Druckposition '0.0' und die Beträge rechtsbündig an der Position '9.0' +gedruckt werden. Zwischen einem Warenposten und dem dazugehörigen Betrag sollen +entsprechend viele Punkte ('.') gedruckt werden. Das folgende Druckbild: + +#l pos (0.0)##r pos (9.0)##fillchar(".")# +#table# +30 Benutzerhandbücher 450,-DM +10 Systemhandbücher 150,-DM + +#table end##clear pos# + +wird mit + +____________________________________________________________________________ + + \#l pos (0.0)\#\#r pos (9.0)\#\#fillchar(".")\# + \#table\# + 30 Benutzerhandbücher 450,-DM + 10 Systemhandbücher 150,-DM + + \#table end\#\#clear pos\# + +____________________________________________________________________________ + + +erreicht. Mit der Anweisung \##ib#fillchar#ie#\# stellen Sie das/die #ib#Füllzeichen#ie# ein. Somit wer­ +den entsprechend viele Füllzeichen (anstatt der Leerzeichen) von dem Textende einer +Spalte bis zu dem Textanfang der nächsten Spalte gedruckt. Die Füllzeichen bleiben +so lange eingestellt, bis erneut die Anweisung \#fillchar\# gegeben wird. Insbesondere +bleibt das Füllzeichen - genauso wie auch die eingestellten Spaltenpositionen - +über das Tabellenende erhalten. Die Anweisung \#clear pos\# löscht - zusätzlich zu +den Tabellenpositionen - auch das eingestellte Füllzeichen (setzt das Zeichen auf ' ' +zurück). + +Beachten Sie, daß die Füllzeichen direkt gedruckt werden (also ohne Leerzeichen +zwischen dem Spaltentext und den Füllzeichen). Möchten Sie einen Zwischenraum +zwischen dem Spaltentext und den Füllzeichen haben, dann fügen Sie ein geschütz­ +tes Leerzeichen an den Spaltentext an oder setzen eins vor die nachfolgende Spalte. + +Die Anweisung \#fillchar\# gilt für Zwischenräume zwischen allen Spalten. Soll nur #on("i")#ein#off("i")# +Spaltenzwischenraum ausgefüllt werden, müssen Sie die \#fillchar\#-Anweisung in der +Tabelle entsprechend geben. + +____________________________________________________________________________ + + \#l pos (1.0)\#\#r pos (5.0)\#\#r pos (10.0)\# + \#table\# + 1\#fillchar(".")\# 3\#fillchar(" ")\# 4 + 2\#fillchar(".")\# 17\#fillchar(" ")\# 6 + \#table end\# + +____________________________________________________________________________ + + + +Druckbild: + +#l pos (1.0)##r pos (5.0)##r pos(10.0)# +#table# +1#fillchar(".")# 3#fillchar(" ")# 4 +2#fillchar(".")# 17#fillchar(" ")# 6 +#tableend##clear pos# + + + + +Eingeschaltete Modifikationen gelten in diesem Fall auch für die Spaltenzwischen­ +räume. +#page# + +#ib(9)#5.2.6.5. #ib#Tabellenpositionen löschen#ie##ie(9)# +#goalpage("clearpos")# +#free(1.0)# + #on("i")# + Mit der #ib#\#clear pos\#-Anweisung#ie# löschen Sie alle eingestellten Positionen. + #off("i")# +#free(1.0)# +Sollen gänzlich neue Positionen eingestellt werden, benutzen Sie die Anweisung + + +____________________________________________________________________________ + + \##ib#clear pos#ie(1,"-Anweisung")#\# + +____________________________________________________________________________ + + + +ohne Parameter. Sie löscht alle eingestellten Tabellenpositionen. Beachten Sie, daß +\#clear pos\# auch das Füllzeichen für die \#fillchar\#-Anweisung löscht (es wird wieder +ein ' ' voreingestellt). Eine einzelne Tabellenposition können Sie z.B. mit + + +____________________________________________________________________________ + + \#clear pos (10.0)\# + +____________________________________________________________________________ + + +löschen. +#mark ("","")# +#page# + +#goalpage("u")##goalpage("d")# +#ib(9)#5.2.7. #ib#Indizes#ie# und #ib#Exponenten#ie##ie(9)# + +#free(1.0)# + #on("i")# + Mit den Anweisungen #ib#\#u\##ie(1, "-Anweisung")#, #ib#\#d\##ie(1,"-Anweisung")# und #ib#\#e\##ie(1,"-Anweisung")# können Sie Exponenten und Indizes + schreiben. + #off("i")# +#free(1.0)# +Die Anweisung \#u\# (steht für 'up') schaltet auf eine Exponenten-Schreibweise um +und zwar so lange, bis die Anweisung \#e\# (steht für 'end') angetroffen wird. Dabei +wird automatisch auf den nächst kleineren Schrifttyp umgeschaltet (sofern vorhanden). + +____________________________________________________________________________ + + a\#u\#i,k\#e\# + +____________________________________________________________________________ + + +Druckbild: + + a#u#i,k#e# + + + +Die \#d\#-Anweisung ('d' steht für 'down') ist für Indizes gedacht und arbeitet analog +zur \#u\#-Anweisung. + +____________________________________________________________________________ + + a\#d\#i,k\#e\# + +____________________________________________________________________________ + + +Druckbild: + + a#d#i,k#e# + + +Die automatische Umschaltung auf den nächst kleineren Schrifttyp erfolgt nur, wenn +in der #ib#Fonttabelle#ie# ein nächst kleinerer Schrifttyp angegeben ist. Sonst wird der ein­ +gestellte Schrifttyp für den Exponenten beibehalten. + +Nach der \#e\#-Anweisung wird automatisch wieder der Schrifttyp eingestellt, der vor +der zugehörigen \#u\#-Anweisung galt. Die \#u\#- und \#e\#-Anweisungen bilden also +Klammern. Innerhalb einer Anweisung kann jede beliebige, sinnvolle Textkosmetik- +Anweisung stehen. Beachten Sie, daß Anweisungen innerhalb einer Klammer die +Zeilenhöhe nicht verändern sollen. Wenn Sie beispielsweise eine \#type\#-Anweisung +in eine Klammer schreiben, wird zwar der Index/Exponent in diesem Schrifttyp ge­ +druckt, aber der Drucker geht davon aus, daß die Zeilenhöhe nicht überschritten wird. +Deshalb ist es angeraten, nur einen kleineren Schrifttyp innerhalb eines Index/Expo­ +nenten zu verwenden. Wie bereits erwähnt, wird auch in diesem Beispiel nach dem +Klammerende auf den vorher eingestellten Schrifttyp zurückgestellt. + +Die Index/Exponenten-Klammern können auch geschachtelt werden. + +____________________________________________________________________________ + + a\#u\#um 1 hoch\#u\#noch 1 hoch\#e\#um 1 zurück\#e\# Grundlinie + +____________________________________________________________________________ + + +Druckbild: + + a#u#um 1 hoch#u#noch 1 hoch#e#um 1 zurück#e# Grundlinie + + + +Es gelten folgende #on("b")#Einschränkungen#off("b")#: + +1. Ein Exponent (Index) wird so positioniert, daß es in der Regel keine Überschrei­ + bung mit der vorhergehenden (nachfolgenden) Zeile gibt. + +2. Bei mehrfachen Exponenten oder Indizes oder bei Umschaltung auf einen anderen + Schrifttyp innerhalb eines Exponenten (Index) oder wenn nicht auf einen kleineren + Schrifttyp umgeschaltet werden kann, besteht die Möglichkeit, daß der Exponent + oder Index über die "normale" Zeile hinausragt. In diesem Fall kann es Über­ + schreibungen geben, die Sie mit der #ib#\#linefeed\#-Anweisung#ie# ausgleichen können. + +3. Eine Exponenten- oder Index-Klammer muß als Ganzes auf einer Zeile stehen. + +4. Gleichzeitige Exponenten- und Index-Ausdrücke, die übereinander stehen + sollen, sind zur Zeit mit den \#u\#/\#d\#-Anweisungen nicht möglich. Jedoch funk­ + tioniert folgendes: + + +____________________________________________________________________________ + + a\#u\#Exponent\#d\#Index des Exponenten\#e\#\#e\# + +____________________________________________________________________________ + + + + Druckbild: + + a#u#Exponent#d#Index des Exponenten#e##e# + + + +5. Doppelblanks spielen innerhalb einer solchen Klammer keine Rolle, wirken also + wie zwei "normale" Leerzeichen und nicht als implizite Positionierung. Innerhalb + einer solchen Klammer werden Blanks, sofern die Anweisung \#block\# gegeben + wurde, nicht verbreitert. + +6. Indizes oder Exponenten sollten nicht mit den Modifikationen \#underline\# und/oder + \#reverse\# zusammen verwendet werden, da z.B. ein Unterstreichen von Indizes + und Exponenten innerhalb einer unterstrichenen Zeile zu einem solchen Ergebnis + führt: + + + Druckbild: + + #on("u")#Indizes und Exponenten a#d#i,k#e# a#u#i,k#e# sollten nicht unterstrichen werden!#off("u")# +#page# + diff --git a/doc/user/benutzerhandbuch.5b b/doc/user/benutzerhandbuch.5b new file mode 100644 index 0000000..748e398 --- /dev/null +++ b/doc/user/benutzerhandbuch.5b @@ -0,0 +1,1632 @@ +#start(5.0,1.5)##pagenr("%",42)##setcount(1)##block##pageblock##count per page# +#headeven# +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# + EUMEL-Benutzerhandbuch +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#headodd# +#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")# +#table# + Teil 5: Textkosmetik und Druck +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#bottomeven# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +5 - % GMD +#tableend##clearpos# +#end# +#bottomodd# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +GMD 5 - % +#tableend##clearpos# +#end# + +#ib(9)#5.3. #ib#Pageform#ie##ie(9)# +#free(1.0)# +#ib(9)#5.3.1. #ib#Seitenweise formatieren#ie##ie(9)# +#goalpage("pageform")##goalpage ("autopageform")# +#free(1.0)# + #on("i")# + 'pageform'/'autopageform' formatiert eine Datei seitenweise und erledigt Routine­ + arbeiten wie die Plazierung von Fußnoten, Seitennumerierung usw. + #off("i")# +#free(1.0)# + +Das Programm 'pageform' können Sie mit dem Kommando + +____________________________________________________________________________ + + gib kommando: + pageform ("dateiname") + +____________________________________________________________________________ + + + +aufrufen. 'pageform' erzeugt aus der Eingabedatei (z.B.: "dateiname") eine Druck­ +datei, deren Name durch ein angehängtes '.p' gebildet wird (z.B.: "dateiname.p"). + +Die von 'pageform' erzeugte Druckdatei besteht aus der Eingabedatei mit ggf. neu +eingefügten Zeilen. Die eingesetzten Zeilen stammen aus \#head\#-, \#bottom\#- oder +\#foot\#-Anweisungen. Dadurch erhöht sich die Zeilenanzahl der Datei. + +Sie können in Kopf- oder Fußzeilen Seitennummern aufnehmen. Diese Seiten­ +nummern werden von 'pageform'/'autopageform' bei Seitenwechseln automatisch +erhöht und an eine von Ihnen gekennzeichnete Stelle eingesetzt. Fußnoten können +auch durch Nummern gekennzeichnet werden. Querverweise sind ebenfalls möglich. +#page# +Nachdem 'pageform' eventuelle Kopf-, Fuß- und Fußnotenzeilen eingefügt hat, +berechnet es die Anzahl von Zeilen, die auf eine Seite passen, aus den Angaben für +Seitenlänge und Zeilenvorschub und aus der Höhe der eingestellten Schrifttypen +(\#type\#-Anweisung). Dann zeigt 'pageform' das errechnete Seitenende auf dem Bild­ +schirm an. Das Seitenende kann interaktiv verschoben werden, um es an eine ge­ +wünschte Stelle zu plazieren und es können Leerzeilen eingefügt/gelöscht werden, um +Seiten gleich lang zu machen. Zusätzlich können Sie Seiten in Spalten ("Zeitungs­ +druck") aufteilen und diese interaktiv formatieren. + +Bei mehreren Schrifttypen innerhalb einer Zeile wird als Zeilenhöhe automatisch die +des größten Schrifttyps genommen. Dabei müssen Sie bedenken, daß zu Beginn der +Zeile immer der Schrifttyp der vorherigen Zeile eingeschaltet ist. +#page# + +#ib(9)#5.3.1.1. #ib#Automatische Seitenformatierung#ie(9)##ie# +#free(1.0)# + + #on("i")# + 'autopageform' arbeitet wie 'pageform', jedoch werden die Seitenenden automa­ + tisch plaziert. + #off("i")# +#free(1.0)# +'autopageform' sucht zuerst das rechnerische Seitenende. Ist dort ein Absatz vor­ +handen, wird die Seite an dieser Stelle beendet. Falls nicht, sucht 'autopageform' +nach oben in den nächsten vier Zeilen nach einem Absatz. Wird keiner gefunden, +wird die Seite am rechnerischen Seitenende beendet. + +Ist die \#pageblock\#-Anweisung gegeben, wird zuerst nach oben in den vier letzten +Zeilen nach einem Absatz gesucht, um dort die Seite zu beenden. Ist dort keiner +vorhanden, wird auch über das rechnerische Seitenende hinweg versucht, die Seiten­ +länge zu plazieren (4 Zeilen). 'autopageform' beachtet in einem solchen Fall die +'pagelength'-Anweisung, indem der Zeilenabstand gestaucht wird. +#page# + +#ib(9)#5.3.1.2. #ib#Seitenende interaktiv verschieben#ie# #ie(9)# +#free(1.0)# + #on("i")# + In diesem Abschnitt wird beschrieben, welche interaktiven Möglichkeiten Ihnen + 'pageform' bietet, Seiten zu gestalten. + #off("i")# +#free(1.0)# +Auf dem Bildschirm wird das von 'pageform' errechnete jeweilige Seitenende unter +Angabe der aktuellen Seitennummer angezeigt. Das Seitenende erscheint ungefähr in +der Mitte des Bildschirmes und wird durch eine von 'pageform' erzeugte Zeile ge­ +kennzeichnet, die auch - nach erfolgter Seitenformatierung - in der Druckdatei zu +sehen ist. Der EUMEL-Drucker druckt diese Zeile nicht. + +____________________________________________________________________________ + +Mehrere Fußnoten innerhalb einer Seite werden von 'pageform'/­ +'autopageform' in der Reihenfolge ihres Auftretens gesammelt und +am Ende der Seite plaziert. Für eine entsprechende Trennung der +Fußnoten voneinander (z.B. durch Leerzeilen) müssen Sie selbst +sorgen. +\#page\#\#--------------------- Ende Seite 215 --------\# +Unter Umständen paßt die Fußnote nicht mehr auf die aktuelle +Seite und muß deshalb von 'pageform'/'autopageform' auf die näch­ +ste Seite gebracht werden. 'pageform'/'autopageform' geht davon +aus, daß die Kennzeichnung der Fußnote in der Zeile unmittelbar +vor der Fußnote steht und bringt diese Zeile ebenfalls auf die +neue Seite. + + +____________________________________________________________________________ + + +Über der Markierung erscheinen die letzten Zeilen der bereits verarbeiteten Seite, +darunter die ersten Zeilen der nächsten Seite. Sie können nun mit Hilfe der Positio­ +nierungstasten die Markierung und damit das Seitenende nach oben verschieben. +Damit vermeiden Sie, daß ein logisch zusammengehöriger Text auseinandergerissen +wird und sogenannte "Waisenkinder" entstehen (letzte Zeile eines Abschnittes kommt +auf die neue Seite). + +Bei der interaktiven #ib#Formatierung#ie (1, " für Seiten")# können Sie die Markierung nicht über das errech­ +nete Ende einer Seite nach unten oder über das vorherige, bereits verarbeitete Seiten­ +ende nach oben verschieben. + +Haben Sie jedoch zu Beginn die #ib#\#pageblock\##ie(1,"-Anweisung")#-Anweisung (siehe S. 5-91) gegeben, +ist es erlaubt, die Seitenende-Markierung auch einige Zeilen über das rechnerische +Seitenende hinaus zu bewegen. Betätigen Sie dann , wird der Drucker (sofern +möglich) den Zeilenabstand auf dieser Seite stauchen. In diesem Fall sollten Sie +darauf achten, daß das Seitenende bei einem Absatz immer #on("b")##on("i")#vor#off("b")##off("i")# eventuell vorhan­ +dene Leerzeilen plaziert wird. Andernfalls werden die Leerzeilen am Ende der Seite +als Textzeile mitgezählt und es bleibt entsprechender Platz frei! + +Innerhalb einer Fußnote kann die Markierung nicht verschoben werden. In diesem Fall +wird interaktiv angefragt, ob die Fußnote auf der nächsten Seite fortgesetzt werden +soll. Verneinen Sie die Anfrage, positioniert 'pageform' vor die Fußnote. Von dieser +Stelle aus können Sie das Seitenende wie gewohnt verschieben. + +Bejahen Sie dagegen die Anfrage nach dem Fußnotenumbruch, plaziert 'pageform' +das Seitende an dieser Stelle innerhalb der Fußnote. Der restliche Teil der Fußnote +kommt auf die nächste Seite mit einer Anmerkung ('Forts. von letzter Seite')#u##count#)#e#. +#foot# +#u##value#)#e# Bei fremdsprachlichen Texten sollten Sie nach 'pageform' diese Anmerkungen + in der '.p'-Datei ändern. +#end# + +Entstehen bei der Seitenformatierung am Anfang einer Seite #ib#Leerzeilen#ie(1, " am Seitenanfang")# (z.B. durch +Plazierung des Seitenendes zwischen zwei Absätzen), so werden diese von 'page­ +form' automatisch aus der Druckdatei entfernt. Möchten Sie #ib#Leerzeilen am Anfang +einer Seite#ie#, dann sollten Sie die \#free\#-Anweisung in Verbindung mit der \#page\#- +Anweisung verwenden. + +Zusätzlich können Sie Leerzeilen in eine Seite der Druckdatei einfügen und/oder +beliebige Zeilen löschen (vergl. b). +#page# +Folgende Operationen stehen Ihnen bei der interaktiven Seitenformatierung zur Ver­ +fügung: + +#on("b")#a) #ib#Seitenende verschieben#ie#:#off("b")# + +'pageform' berechnet das "rechnerische" Seitenende und zeigt dieses auf dem Bild­ +schirm durch die Markierung an. Die Markierung kann interaktiv verschoben werden: + + #on("b")#Taste Bedeutung#off("b")# + + Seitenende an diese Stelle plazieren. + + + <^> Seitenende eine Zeile nach oben verschieben. + + + Seitenende eine Zeile nach unten verschieben (wenn + vorher nach oben verschoben bzw. wenn \#pageblock\#- + Anweisung gegeben ist). + + + <^> Seitenende um einen Bildschirm nach oben verschieben. + + + Seitenende um einen Bildschirm nach unten verschieben. + + + Abbruch der Seitenformatierung. + + + +#on("b")#b) #ib#Leerzeilen einfügen#ie# und/oder #ib#Zeilen löschen#ie##off("b")# + +Ist nach den Berechnungen von 'pageform' der Text ungünstig auf der Seite plaziert, +können Sie in die Seite (der Druckdatei!) Leerzeilen einfügen und/oder Zeilen löschen. +Dies kann beispielsweise sinnvoll sein, wenn durch die Löschung einer Zeile ein +Absatz noch auf die Seite passen würde oder durch die Einfügung von Leerzeilen ein +Absatz auf der letzten Zeile der Seite endet. Oft ist es auch sinnvoll, daß alle Seiten +gleich lang sind. In diesem Fall sollten vor Kapiteln und Absätzen Leerzeilen eingefügt +oder gelöscht werden. + +Um Leerzeilen einzufügen und/oder Zeilen zu löschen, müssen Sie die Markierung +wie unter a) beschrieben an die Stelle plazieren, an der die Änderung vorgenommen +werden soll. + + + #on("b")#Taste Bedeutung#off("b")# + + + Leerzeilen einfügen. Anstatt der Markierung können + durch (u.U. mehrmaliges) Leerzeilen eingefügt + werden. beendet den Vorgang (wie + Zeileneinfügen im Editor). + + Zeile löschen. Die Zeile unmittelbar oberhalb der + Markierung wird gelöscht. + + + +Anschließend berechnet 'pageform' die Seite erneut. + + + +#on("b")#c) #ib(9)##ib#\#page\#-Anweisung bestätigen/löschen#ie(9)##ie##off ("bold")# + +Wird von der Prozedur 'pageform' eine #ib#\#page\#-Anweisung#ie# angetroffen, so wird das +gewünschte Seitenende auf Ihrem Bildschirm angezeigt. Die \#page\#-Anweisung +können Sie entweder bestätigen oder löschen. + + #on("b")#Taste Bedeutung#off("b")# + + + Seitenende bestätigen. + + \#page\#-Anweisung ignorieren. Die Prozedur 'pageform' + bearbeitet in diesem Fall die Datei weiter, als ob keine + \#page\#-Anweisung angetroffen wurde. + + Abbruch der Seitenformatierung. +#page# + +#ib(9)#5.3.2. #ib#Seitenlänge einstellen#ie##ie(9)# +#goalpage("pagelength")# +#free(0.7)# + #on("i")# + 'pageform'/'autopageform' ist auf ein Schreibfeld von 25.0 cm eingestellt (ent­ + spricht einem DIN A4-Schreibfeld). Wünschen Sie eine andere Seitenlänge, + müssen Sie die #ib#\#pagelength\#-Anweisung#ie# in den Text einfügen. + #off("i")# +#free(0.7)# +____________________________________________________________________________ + + \#pagelength (20.0)\# + +____________________________________________________________________________ + + +stellt die Seitenlänge auf 20 cm ein. + +Beachten Sie, daß + +1. die neu eingestellte Seitenlänge immer erst ab der nächsten Seite gilt (die bislang + eingestellte Seitenlänge gilt noch für die aktuelle Seite). + +2. die eingestellte Seitenlänge am Anfang der Datei (also vor der ersten Textzeile) für + die erste Seite gilt. +#mark ("", "")# + +3. der Dezimalpunkt bei der Seitenlänge mit angegeben werden muß. + +Die folgende Tabelle gibt die Seitenlänge für die am häufigsten gewählten Papier­ +größen an: + + #on("b")#Format Seitenlänge oberer und + (in cm) unterer Rand#off("b")# + + DIN A4 25.0 je 2.35 cm + + DIN A5 18.0 je 2.15 cm + + DIN A4 quer 16.0 je 2.50 cm +#page# + +#ib(9)#5.3.3. #ib#Zeilenabstand einstellen#ie##ie(9)# +#goalpage ("linefeed")# +#free(1.0)# + #on("i")# + Mit der #ib#\#linefeed\#-Anweisung#ie# stellen Sie einen #ib#Zeilenvorschub#ie# relativ zu der + #ib#Schrifthöhe#ie# des eingestellten Schrifttyps ein. + #off("i")# +#free(1.0)# +'pageform'/'autopageform' berechnet die Anzahl der Zeilen pro Seite immer in Ab­ +hängigkeit von dem eingestellten Schrifttyp. Haben Sie z.B. eine Schrift gewählt, die +doppelt so hoch wie eine Schreibmaschinenschrift ist, bekommen Sie auch entspre­ +chend weniger Zeilen auf eine Seite. Um diesen Berechnungsvorgang brauchen Sie +sich in der Regel nicht zu kümmern. + +Anders verhält es sich, wenn ein anderer #ib#Zeilenabstand#ie# als der "normale" Abstand +zwischen Zeilen eingestellt werden soll. In diesem Fall wird die \#linefeed\#- +Anweisung eingesetzt. Der Parameter gibt an, um welchen Faktor eine Zeilenhöhe #on("i")##on("b")#ab +der nächsten druckbaren Zeile#off("b")##off("i")# erhöht oder verringert werden soll. + +____________________________________________________________________________ + + \#linefeed (2.0)\# + +____________________________________________________________________________ + + +druckt die folgenden Zeilen mit doppeltem Zeilenabstand. Nach Antreffen dieser An­ +weisung wird die Zeilenhöhe durch 2 * eingestellte Schrifttypgröße errechnet. Es wird +also der Zeilenabstand zwischen den Zeilen entsprechend vergrößert, da die Schrift­ +größe gleich bleibt. Dies entspricht dem zweizeiligen Schreiben bei einer Schreib­ +maschine (wenn man davon absieht, daß auch hier unterschiedliche Schrifthöhen +möglich sind). Ein 1 1/2 zeiliges Schreiben wäre mit + +____________________________________________________________________________ + + \#linefeed (1.5)\# + +____________________________________________________________________________ + + +einzustellen. + +____________________________________________________________________________ + + \#linefeed (0.5)\# + +____________________________________________________________________________ + + +stellt die Zeilenhöhe = 1/2 * eingestellte Schrifthöhe ein, so daß die Zeilen teilweise +ineinander gedruckt werden (was bei manchen Druckern zu nicht lesbaren Resultaten +führt). Bei \#linefeed (0.0)\# werden Zeilen übereinander gedruckt (druckerabhängig). + +Beachten Sie, daß die Angabe in der \#linefeed\#-Anweisung relativ erfolgt. Bei allen +anderen Anweisungen der Textkosmetik werden Angaben in Zentimetern verlangt. Die +\#linefeed\#-Anweisung bildet somit eine Ausnahme. +#page# + +#ib(9)#5.3.4. #ib#Platz freihalten#ie# #ie(9)# +#goalpage ("free")# +#free(1.0)# + #on("i")# + Mit der #ib#\#free\#-Anweisung#ie# können Sie einen zusammenhängenden Teil auf einer + Seite freihalten. + #off("i")# +#free(1.0)# +Die \#free\#-Anweisung setzen Sie an solchen Stellen im Text ein, an denen - nach +dem Druck - Zeichnungen, Tabellen und ähnliches eingeklebt werden sollen. Sie +können sie auch zwischen Absätzen, Kapiteln usw. einsetzen, wenn der Abstand nicht +gleich dem Vielfachen der Zeilenhöhe ist. Es wird der in der \#free\#-Anweisung +angegebene Platz freigehalten. + +____________________________________________________________________________ + +\#free (2.0)\# + +____________________________________________________________________________ + + +hält zwei Zentimeter frei. Paßt der angeforderte Platz nicht mehr auf die Seite, so wird +er auf der nächsten Seite reserviert ('pageform'/'autopageform' plaziert das Seiten­ +ende vor die \#free\#-Anweisung). + + + +#on("i")##on("b")#Praktischer Tip:#off("b")##off("i")# +Sie sollten eine \#free\#-Anweisung allein auf eine Zeile schreiben, damit Sie sie u.U. +durch 'pageform' interaktiv entfernen können, wenn die \#free\#-Anweisung ungünstig +an den Seitenanfang oder das Seitenende kommt. +#page# + +#ib(9)#5.3.5. #ib#Neue Seite beginnen#ie##ie(9)# +#goalpage("page")# +#free(1.0)# + #on("i")# + An einigen Stellen im Text, z.B. zu Beginn eines neuen Kapitels, möchten Sie + unbedingt eine neue Seite anfangen. Dies erreichen Sie mit der #ib#\#page\#- + Anweisung#ie#. + #off("i")# +#free(1.0)# +'pageform' meldet in diesem Fall, nach wie vielen Zentimetern auf der Seite die An­ +weisung angetroffen wurde. Sie können nun mit das Seitenende bestätigen oder +die Anweisung (in der Druckdatei) löschen. Im letzteren Fall berechnet 'pageform' die +Seite neu, als ob die \#page\#-Anweisung nicht dagewesen wäre. + +Gleichzeitig können Sie mit Hilfe der #ib#\#page\#-Anweisung#ie(1, ", mit neuer Seitenummer")# eine neue Seitennummer +für die neue Seite einstellen (vergl. Sie dazu die nächsten Abschnitte). +#page# + +#ib(9)#5.3.6. #ib#Kopf- und Fußzeilen#ie##ie(9)# +#goalpage("head")##goalpage("bottom")# +#free(1.0)# + #on("i")# + Mit den #ib#\#head\#-#ie(1, "Anweisung")# und #ib#\#bottom\#-Anweisung#ie#en können Sie Zeilen am Anfang und + Ende jeder Seite einfügen. + #off("i")# +#free(1.0)# +Sie schreiben Zeilen am Anfang ("#ib#Kopfzeilen#ie#") und Ende ("#ib#Fußzeilen#ie#") jeder Seite nur +einmal und kennzeichnen sie mit Anweisungen. Diese Zeilen fügt 'pageform'/­ +'autopageform' dann an den entsprechenden Stellen ein. + +____________________________________________________________________________ + + \#head\# + Unser EUMEL-Benutzerhandbuch + + \#end\# + +____________________________________________________________________________ + + +Diese Zeile (also die zwischen den \#head\#- und #ib#\#end\#-Anweisung#ie#en eingeschlos­ +sene Zeile) wird von 'pageform'/'autopageform' an den Anfang jeder Seite in die +Druckdatei plaziert. + +Entsprechendes gilt für Fußzeilen, die zwischen \#bottom\# und \#end\# eingeschlossen +werden müssen: + +____________________________________________________________________________ + + \#bottom\# + + Autor: I. Listig + \#end\# + +____________________________________________________________________________ + + +#on("b")#Praktischer Tip#off("b")#: + +Fügen Sie mindestens eine Leerzeile am Ende eines \#head\# bzw. am Anfang eines +\#bottom\# ein, um den eigentlichen Text von den Kopf- bzw. Fußzeilen abzuheben. + + +'pageform'/'autopageform' zählt die Seiten, beginnend mit der Seitennummer '1'. (Wie +man Seitennummern in die Kopf- und Fußzeilen bekommt, erfahren Sie im nächsten +Abschnitt). Sie können nun getrennte Kopf- und Fußzeilen für gerade und ungerade +Seiten gestalten (wie in diesem Benutzerhandbuch). Dies erfolgt mit den Anweisungen +\#headeven\# und \#headodd\# für Seiten mit geraden und ungeraden Seitennummern; +ebenso \#bottomeven\# und \#bottomodd\#. Diese Anweisungen müssen ebenfalls jeweils +mit einer \#end\#-Anweisung beendet werden. + +Sie haben die Möglichkeit, Kopf- und Fußzeilen mehrmals innerhalb einer Datei zu +wechseln, um unterschiedliche Beschriftungen zu erhalten (z.B. kapitelweise). Dies ist +jedoch nur sinnvoll, wenn es auf einer neuen Seite erfolgt, also unmittelbar #on("b")##on("is")#nach#off("b")##off("is")# einer +\#page\#-Anweisung. + +____________________________________________________________________________ + + \#page\# + \#head\# + Neuer Seitenkopf + + \#end\# + +____________________________________________________________________________ + + +Kopf- und Fußzeilen sollen überall gleiches Aussehen haben, unabhängig davon, +welche Anweisungen im restlichen Text gegeben werden. Darum werden die bei der +Definition einer Kopf- und Fußzeile aktuellen Werte für + + + limit + type + linefeed + + +bei dem Einsetzen der Zeilen berücksichtigt. Für Kopf- oder Fußzeilen können Sie +einen anderen Schrifttyp als im restlichen Text verwenden, indem Sie die \#type\#- +Anweisung innerhalb eines \#head\#- oder \#bottom\#-Bereiches geben. Beachten Sie, +daß nach \#head\#-, \#bottom\# und auch \#foot\#-Bereichen die oben genannten An­ +weisungen nicht automatisch zurückgestellt werden. Darum sollten Sie vor der +\#end\#-Anweisung wieder auf die im übrigen Text verwendeten Werte zurückstellen. + +____________________________________________________________________________ + + \#bottom\# + \#type ("klein")\# + Autor: I. Listig + (Schrifttyp + zurückstellen): + \#type ("normal")\# + \#end\# + +____________________________________________________________________________ + + +#page# + +#ib(9)#5.3.7. #ib#Seiten numerieren#ie##ie(9)# +#free(1.0)# + #on("i")# + In den Kopf- und Fußzeilen steht das #ib#'%'-Zeichen#ie# für die aktuelle Seiten­ + nummer. + #off("i")# +#free(1.0)# +Erscheint das '%'-Zeichen innerhalb eines Kopf- oder Fußbereiches, wird von +'pageform'/'autopageform' beim Einsetzen dieser Zeilen auf jeder Seite die aktuelle +#ib#Seitennummer#ie# eingesetzt (sind mehrere '%'-Zeichen vorhanden, wird die Seiten­ +nummer mehrmals eingesetzt). + +____________________________________________________________________________ + + \#head\# + Seite: - % - + + \#end\# + +____________________________________________________________________________ + + +Wenn Sie die Seitenzahl in der Zeilenmitte oder am rechten Rand plazieren möchten, +können Sie die Anweisungen \#center\# (siehe S. 5-93) oder \#right\# (siehe S. 5-94) +verwenden. + +Durch das Einrichten eines Fußbereiches können Sie die Seitennummern auch am +unteren Ende einer Seite erzeugen. Beachten Sie, daß sich bei mehrstelligen Seiten­ +nummern die Zeilenlänge durch das Einsetzen vergrößert. + +Um zum Beispiel das #ib#Vorhandensein einer Folgeseite#ie# in einem Fußbereich zu kenn­ +zeichnen, müssen Sie das '%'-Zeichen zweimal direkt hintereinander schreiben. + +____________________________________________________________________________ + + \#bottom\# + + \#right\# %% + \#end\# + +____________________________________________________________________________ + + +In dem Beispiel oben wird die Seitenzahl rechtsbündig gedruckt. + + +Manchmal ist es notwendig und sinnvoll, einen Text in mehreren Dateien zu halten. +Bei einer Folgedatei müssen Sie die Seitennummer dann neu setzen. Das erfolgt mit +der \#pagenr\#- oder der \#page\#-Anweisung. + +____________________________________________________________________________ + + \#page (4)\# + +____________________________________________________________________________ + + +bewirkt eine neue Seite. Die Seitennummer der neuen Seite ist '4'. + +#goalpage("pagenr")# + +Bei einigen Spezialanwendungen benötigen Sie unter Umständen mehr als eine +Seitennummer. Beispielsweise soll ein Text nicht nur absolut, sondern auch jede Seite +in jedem Kapitel separat durchgezählt werden. + +____________________________________________________________________________ + + \#page (4711)\# + \#pagenr ("$", 1)\# + \#head\# + Mein Buch Seite: % Kapitelseite: $ + + \#end\# + +____________________________________________________________________________ + + +Die Anweisung #ib#\#pagenr#ie# ("$",1)\# veranlaßt, daß ab der nächsten Seite eine neue +Numerierung durchgeführt wird. Dabei steht '$' stellvertretend für die neue Zahl. Die +'1' bedeutet, daß bei der Numerierung mit '1' begonnen wird. 'pageform'/­ +'autopageform' erhöht bei jeder neuen Seite das Zeichen um '1' und setzt es ggf. in +die Kopf- und Fußzeilen. Es sind zwei zusätzliche Seitenzeichen (neben dem '%') +möglich. + +Beachten Sie, daß die neuen Seitennummern immer erst ab der nächsten Seite gel­ +ten. Geben Sie die \#page (...)\#- oder die \#pagenr (...,...)\#-Anweisung am Anfang +der Datei (also vor der ersten Textzeile), gelten die neuen Seitennummern für die +erste Seite. +#page# + +#ib(9)#5.3.8. #ib#Fußnoten#ie# schreiben#ie(9)# +#goalpage("foot")# +#free(1.0)# + #on("i")# + Fußnoten werden direkt im Text durch die Anweisungen \#foot\# und \#end\# + gekennzeichnet. Die Fußnoten plaziert 'pageform'/'autopageform' an das Ende + einer Seite. + #off("i")# +#free(1.0)# +#ib#Fußnoten#ie# schreiben Sie direkt in den Text, am besten an der Stelle, an der später die +Fußnote aufgerufen werden soll. Die Fußnote wird von 'pageform'/'autopageform' an +das Ende einer Seite, ggf. vor die Fußzeilen, plaziert. Für die Kennzeichnung von +Fußnoten und die entsprechende Markierung im Text sind Sie selbst zuständig. Aller­ +dings werden von 'pageform'/'autopageform' bei dem Einsetzen einer Fußnote am +Ende einer Seite Unterstriche vor die Fußnoten eingefügt, damit Fußnoten vom lau­ +fenden Text abgehoben werden. + +____________________________________________________________________________ + + \#foot\# + *) Das ist die erste Anmerkung auf dieser Seite. + \#end\# + +____________________________________________________________________________ + + +Druckbild: + +______ +*) Das ist die erste Anmerkung auf dieser Seite. + + +Mehrere Fußnoten innerhalb einer Seite werden von 'pageform'/'autopageform' in der +Reihenfolge ihres Auftretens gesammelt und am Ende der Seite plaziert. Für eine +entsprechende Trennung der Fußnoten voneinander (z.B. durch Leerzeilen) müssen +Sie selbst sorgen. + +Unter Umständen paßt die Fußnote nicht mehr auf die aktuelle Seite und muß deshalb +von 'pageform'/'autopageform' auf die nächste Seite gebracht werden. 'pageform'/­ +'autopageform' geht davon aus, daß die Kennzeichnung der Fußnote in der Zeile +unmittelbar vor der Fußnote steht und bringt diese Zeile ebenfalls auf die neue Seite. + +____________________________________________________________________________ + +Es ist auch möglich, eine Fußnote innerhalb eines Abschnitts zu +schreiben, wie z.B. in dieser Zeile\#u\#*)\#e\#.\#foot\# +\#u\#*)\#e\# Fußnote in einem Abschnitt! +\#end\# +Sie fahren anschließend ohne Unterbrechung mit dem Schreiben +Ihres Textes fort. + +____________________________________________________________________________ + + +Druckbild (nach lineform): + +Es ist auch möglich, eine Fußnote innerhalb eines Abschnitts zu schreiben, wie z.B. +in dieser Zeile#u#*)#e#. Sie fahren anschließend ohne Unterbrechung mit dem Schreiben#foot# +#u#*)#e# Fußnote in einem Abschnitt! +#end# +Ihres Textes fort. + + +In diesem Fall ist es wünschenswert, daß 'lineform' die Zeile, die \#foot\# vorausgeht, +mit der Zeile, die \#end\# folgt, auffüllt. Dies geschieht unter folgenden Bedingungen: + +1. Hinter \#foot\# darf nichts mehr stehen, also auch kein Absatzzeichen. + +2. Es werden so lange Worte von der Zeile nach \#end\# vor die \#foot\#-Anweisung + plaziert, bis die Zeile gefüllt oder die Zeile nach \#end\# leergeräumt ist. + +3. Beachten Sie, daß Textkosmetik-Anweisungen ebenfalls mit über die Fußnote + genommen werden. Handelt es sich beispielsweise um eine \#type\#-Anweisung, + kann sich das Aussehen der Fußnote verändern! Darum ist es angeraten, even­ + tuelle Anweisungen, die die Fußnote verändern sollen, innerhalb der Fußnote zu + plazieren. + +Sie sollten vermeiden, umfangreiche Texte in Fußnoten zu schreiben (beispielsweise +längere Zitate). Aus programmtechnischen Gründen begrenzt 'pageform'/'autopage­ +form' die maximale Länge von Fußnoten auf einer Seite auf 85% des effektiven +Schreibfeldes (effektives Schreibfeld: Seitenlänge minus Länge von \#head\#- bzw. +\#bottom\#-Zeilen). Nimmt eine Fußnote einen größeren Raum ein, bricht 'pageform'/ +'autopageform' die Seitenformatierung mit einer Fehlermeldung ab. +#page# + +#ib(9)#5.3.8.1. #ib#Fußnoten numerieren#ie##ie(9)# +#goalpage("count")##goalpage("value")# +#free(1.0)# + #on("i")# + Gleichartige Textteile wie Lehrsätze, Beispiele, Fußnoten usw. werden i. allg. + durchnumeriert. Da Sie bei der Abfassung eines längeren Textes ihre genaue + Anzahl meist nicht vorausplanen können, übernimmt 'pageform'/'autopageform' die + Zählung. + #off("i")# +#free(1.0)# +Durch die #ib#\#count\#-Anweisung#ie# wird 'pageform'/'autopageform' veranlaßt, einen +internen Zähler (beginnend bei dem Wert 0) zu erhöhen und diesen Wert statt der +\#count\#-Anweisungen in den Text einzusetzen. + +____________________________________________________________________________ + + \#count\# + +____________________________________________________________________________ + + +setzt den Wert 1 statt der Anweisung ein. Jede weitere \#count\#-Anweisung erhöht +den internen Zähler und der Zählerwert wird wiederum eingesetzt: + +____________________________________________________________________________ + + \#count\# + +____________________________________________________________________________ + + +setzt den Wert 2 ein usw. Dadurch ist es möglich, beliebige Textteile (Kapitel, +mathematische Sätze u.a.m.) fortlaufend zu numerieren, ohne auf die Numerierung +beim Schreiben und Ändern des Textes zu achten. + +Anmerkung: +Trifft 'lineform' auf eine \#count\#-Anweisung, so wird die Zeile berechnet, als ob drei +Ziffern anstatt der Anweisung im Text ständen. + +Mit der \#value\#-Anweisung können Sie den #on("b")##on("i")#letzten#off("i")##off("b")# erreichten count-Wert nochmals +einsetzen. Das ist insbesondere für Fußnoten sinnvoll einsetzbar. + +____________________________________________________________________________ + + Text ....... (\#count\#) + \#foot\# + (\#value\#) Text der Fußnote + \#end\# + Text ....... + +____________________________________________________________________________ + + +Das Resultat sähe folgendermaßen aus: + + Text ....... (3) + Text ....... + ............... + ______ + (3) Text der Fußnote + +Beachten Sie, daß in diesem Fall die \#value\#-Anweisung der \#count\#-Anweisung +folgen muß, ohne daß eine weitere \#count\#-Anweisung dazwischen steht. Das liegt +- wie bereits oben erwähnt - daran, daß die \#value\#-Anweisung immer den letzten +\#count\#-Wert einsetzt. + +Das können Sie umgehen, indem Sie die \#count\#- und \#value\#-Anweisungen mit +einem TEXT-Parameter versehen, der als Kennzeichnung dient. + +____________________________________________________________________________ + + \#count ("Merk1")\# + +____________________________________________________________________________ + + +\#count ("Merk1")\# arbeitet ebenso wie \#count\# ohne Parameter und setzt für unser +Kapitel hier den Wert 4 ein. Zusätzlich zu dem fortlaufend gezählten Wert (fortlau­ +fende Numerierung der Fußnoten) vermerkt 'pageform'/'autopageform' einen Wert, der +bei Bedarf an irgendeiner anderen Stelle im Text durch \#value ("Merk1")\# wieder +aufgerufen werden kann, zum Beispiel, wenn Sie auf eine andere Fußnote verweisen +möchten. + +____________________________________________________________________________ + + \#count\#\#count\# + \#value("Merk1")\# + +____________________________________________________________________________ + + +Die ersten zwei \#count\#-Anweisungen produzieren - in unserem Kapitel - die +Werte 5 bzw. 6. Die \#value\#-Anweisung dagegen setzt den vermerkten Wert 4 ein. + +Dies ist insbesondere sinnvoll, wenn Sie im Text auf eine Fußnote verweisen möch­ +ten. + +Beispiel: + +Sie schreiben einen mehrseitigen Prospekt über ein neues Produkt. Auf Seite 5 möch­ +ten Sie auf eine Fußnote verweisen, die auf einer anderen Seite steht. Dann fügen Sie +'siehe auch Anmerkung (\#value("liefertermin")\#) in Ihren Text ein und fahren mit dem +Schreiben fort. 'pageform'/'autopageform' setzt später die entsprechende Zahl für den +Verweis ein. + +Auf der Seite, auf die Sie Bezug nehmen, sieht das ganze folgendermaßen aus: + +____________________________________________________________________________ + + Der Textverarbeitungskurs ist ein Lernprogramm für Anfänger. + \#(count)("Liefertermin")\#) + \#foot\# + (\#(value)("Liefertermin")\#) + Der Textverarbeitungskurs wird ab August erhältlich sein. + \#end\# + Das Programm ist auf den neuesten Erkenntnissen der Lehr­ + forschung aufgebaut. Der Kurs umfaßt Lehrbuch, Arbeitsbuch und + sechs Kassetten. + +____________________________________________________________________________ + + +#page# +Soll die Zahl für den Verweis bzw. für die Fußnote hochgestellt werden, fügen Sie die +Anweisungen \#u\# und \#e\# hinzu. + +____________________________________________________________________________ + + \#u\# (\#value("Liefertermin")\#)\#e\# + +____________________________________________________________________________ + + + + +Im gedruckten Prospekt sähe es (nach 'lineform') wie folgt aus: + +Der Textverarbeitungskurs ist ein Lernprogramm für Anfänger#u##count#)#e#.#foot# +#u##value#)#e#Der Textverarbeitungskurs wird ab August erhältlich sein. +#end# +Das Programm ist auf den neuesten Erkenntnissen der Lehrforschung aufgebaut. Der +Kurs umfaßt Lehrbuch, Arbeitsbuch und sechs Kassetten. + +Manchmal ist es notwendig (ebenso wie bei der Seitennummer), den internen Zähler +neu zu setzen. + +____________________________________________________________________________ + + \#setcount (13)\#\#count\# + +____________________________________________________________________________ +#goalpage("setcount")# + +produziert den Wert 13. +#page# + +#ib(9)#5.3.9. #ib#Querverweise#ie# #ie(9)# +#goalpage("topage")##goalpage("goalpage")# +#free(1.0)# + #on("i")# + Mit den Anweisungen #ib#\#topage\##ie(1,"-Anweisung")# und #ib#\#goalpage\##ie(1,"-Anweisung")# sind Querverweise möglich, die + von 'pageform'/'autopageform' in die Druckdatei eingefügt werden. + #off("i")# +#free(1.0)# +Mit Hilfe von Querverweisen soll auf andere Stellen im Text verwiesen werden, was +nur bei längeren Texten üblich ist. Um dem Leser die mühselige Suche nach der +Textstelle zu ersparen, gibt man in der Regel die Seitennummer an. Normalerweise +steht die Seitennummer vor der Fertigstellung des Textes noch nicht fest. Auch in +diesem Fall kann 'pageform'/'autopageform' helfen. Die \#topage\#-Anweisung ver­ +weist auf eine andere Seite im Text, an der sich eine Anweisung \#goalpage\# befinden +muß. Statt der Anweisung \#topage\# wird die Seitennummer der Seite eingesetzt, auf +der sich \#goalpage\# befindet. Damit jedes \#topage\# auch sein entsprechendes \#goal­ +page\# findet, geben Sie bei beiden Anweisungen einen TEXT-Parameter an. + + +____________________________________________________________________________ + + ... siehe auch auf Seite \#topage("Funktionstasten")\# ... + + +____________________________________________________________________________ + + +Auf einer anderen Seite befindet sich + +____________________________________________________________________________ + + ... \#goalpage("Funktionstasten")\# + +____________________________________________________________________________ + + +Nach 'Seite' wird die entsprechende Seitennummer eingesetzt. + +Es ist möglich, mehrmals auf die gleiche (Ziel-)Seite zu verweisen. Sie müssen nur +darauf achten, daß Sie immer das gleiche Merkmal (TEXT-Parameter) verwenden. +Beachten Sie auch, daß die \#goalpage\#-Anweisungen sich in den Zeilen befinden +müssen, die tatsächlich gedruckt werden. Setzen Sie sie nicht in die ersten Zeilen +einer Seite oder eines Textes, die Anweisungen für das Layout enthalten. + +Die Zahl der Querverweise darf 300 nicht übersteigen. #page# + +#ib(9)#5.3.10. Kombination von Tabellen, Fußnoten + und Kopf- bzw. Fußzeilen#ie(9)# +#free(1.0)# + #on("i")# + In Fußnoten, \#head\#- oder \#bottom\#-Bereichen können Tabellen untergebracht + werden. + #off("i")# +#free(1.0)# +____________________________________________________________________________ + +\#head\# +\#lpos(0.0)\#\#cpos(5.0)\#\#rpos(11.0)\# +\#table\# +Korrekturen EUMEL-Benutzerhandbuch S.007 + +\#table end\# +\#end\# + + +____________________________________________________________________________ + + + +Die obigen Eingaben schreiben an jeden Seitenanfang folgenden Text: + +#lpos(0.0)##cpos(5.0)##rpos(11.0)# +#table# +Korrekturen EUMEL-Benutzerhandbuch S.007 +#table end##clear pos# + +Die Tabelle sollte also vollständig in den oben erwähnten Bereichen enthalten sein. +#page# + +#ib(9)#5.3.11. #ib#Formatierung von Spalten#ie##ie(9)# +#goalpage("columns")# +#free(1.0)# + #on("i")# + Mit der \#columns\#-Anweisung ist es möglich, einen Text in #ib#Spalten#ie(1,"formatierung")# zu formatie­ + ren ("Zeitungsdruck"). + #off("i")# +#free(1.0)# +Durch die Angabe der \#columns\#-Anweisung wird 'pageform'/'autopageform' auf­ +gefordert, den Text in Spalten zu formatieren. Die Spaltenbreite müssen Sie mit der #ib# +\#limit\#-Anweisung#ie (1, " für Spalten")# einstellen. + +____________________________________________________________________________ + + \#limit (18.0)\# + ... + \#columns (2, 2.0)\# + \#limit (8.0)\# + ... + +____________________________________________________________________________ + + + +Anfangs schreiben Sie mit einer Zeilenbreite von 18 cm. Dann fordern Sie mit der +\#columns\#-Anweisung zweispaltigen Druck an (zwischen den Spalten sollen 2 cm +Abstand sein). Somit muß die \#limit\#-Anweisung (sie gilt für beide Spalten) auf 8 cm +eingestellt werden. + +Die interaktive #ib#Spaltenformatierung#ie# wird von 'pageform' wie gewohnt vorgenommen. +Auf dem Bildschirm erscheint nun das Spaltenende, wobei die Nummer der Spalte +angezeigt wird. Fußnoten werden spaltenweise eingeordnet und müssen somit die +gleiche Zeilenbreite haben wie die restlichen Spalten. + +'pageform'/'autopageform' erzeugt in der Druckdatei die Spalten hintereinander. Das +folgende Beispiel zeigt einen Ausschnitt aus der Druckdatei mit Kopf- und Fußzeilen +bei einem zweispaltigen Druck: + +____________________________________________________________________________ + + head-Zeilen + xx + xx + xx + bottom-Zeilen + \#page\#\#------- Ende Seite 1 Spalte 1 ----\# + xx + xx + xx + \#page\#\#------- Ende Seite 1 Spalte 2 ----\# + +____________________________________________________________________________ + + +Die zweite Spalte erscheint also ohne Kopf- und Fußzeilen, die jedoch bei der +Berechnung berücksichtigt werden. Beachten Sie, daß die Kopf- und Fußzeilen über +die Spalten gehen können. Dies erreichen Sie durch geeignete \#limit\#-Anweisungen +in den genannten Bereichen. + +Die meisten Drucker plazieren die zweite Spalte im Druckbild neben die erste. Bei +einigen wenigen Druckern müssen Sie die Spalten nebeneinander kleben. + +Alle Anweisungen funktionieren beim spaltenweisen Formatieren wie üblich. Die +\#free\#-Anweisung z.B. hält entsprechenden Platz in einer Spalte frei. Eine Aus­ +nahme bildet die #ib#\#page\#-Anweisung#ie (1, " für Spaltenende")#. Sie vollzieht hier ein #ib#Spaltenende#ie#. Die +\#page\#-Anweisung mit einem Parameter (welcher die Seitennummer der nächsten +Seite angibt) vollzieht dagegen ein Seitenende. + +Die #ib#\#columns end\#-Anweisung#ie# beendet die spaltenweise #ib#Formatierung#ie(1, " spaltenweise")#. Sie wirkt wie +eine \#page\#-Anweisung. + +#ib#Überschriften#ie (1, " in Spalten")# (bzw. Textblöcke) über mehrere Spalten hinweg sind nur auf der ersten +Seite direkt hinter der \#columns\#-Anweisung möglich. + +____________________________________________________________________________ + + \#page\# + \#limit (10.0)\# + Überschriften (bzw. Textblöcke) über mehrere Spalten hinweg + sind nur auf der ersten Seite direkt hinter der \#columns\#- + Anweisung möglich. + + + \#columns (2,2.0)\# + \#limit (4.0)\# + Die erste Spalte soll nur wenige Zeilen beinhalten. Das vor­ + zeitige Beendigen der Spalte erreicht man mit der \#page\#- + Anweisung. + \#page\# + In der zweiten Spalte kann dann mit dem Schreiben des Textes + fortgefahren werden. + ..................... + ..................... + ..................... + ..................... + ..................... + \#columns end\# + +____________________________________________________________________________ + + +#page# +Druckbild (mit 'lineform' bearbeitet): + + + + Überschriften (bzw. Textblöcke) über mehrere Spalten hinweg sind nur auf + der ersten Seite direkt hinter der \#columns\#-Anweisung möglich. + #columns (2,2.0)# + + Die erste Spalte soll nur + wenige Zeilen beinhalten. + Das vorzeitige Beendigen + der Spalte erreicht man mit + der \#page\#-Anweisung. + #page# + + + In der zweiten Spalte kann + dann mit dem Schreiben + des Textes fortgefahren + werden. + ..................... + ..................... + ..................... + +#columns end# + + + + +Die Zeilen für die zweispaltige Überschrift werden berücksichtigt. Dies gilt jedoch nur +unmittelbar hinter der \#columns\#-Anweisung. Möchten Sie diesen Effekt nochmals +erzeugen, beenden Sie mit \#columns end\#, schreiben die breite Überschrift und +schalten die \#columns\#-Anweisung wieder ein (jeweils unter richtiger Setzung von +\#limit\#). +#page# + +#ib(9)#5.4. #ib#Index#ie##ie(9)# +#free(1.0)# +#ib(9)#5.4.1. Stichwort- und/oder#ib# + Inhaltsverzeichnis#ie#se erstellen#ie(9)# +#free(1.0)# + + #on("i")# + Mit dem Programm '#ib#index#ie(1, "-Kommando")#' können Sie Stichwort- und Inhaltsverzeichnisse er­ + stellen. #ib#Stichwortverzeichnis#ie#se können sortiert werden. Mehrere Stichwortverzeich­ + nisse können Sie durch 'index merge' zusammenführen. + #off("i")# +#free(1.0)# +Durch den Aufruf von: + +____________________________________________________________________________ + + gib kommando: + index ("dateiname.p") + +____________________________________________________________________________ + + + +werden durch #ib#Indexanweisungen#ie# gekennzeichnete Worte in Dateien, den sogenannten +Indexdateien, gespeichert. + +Die Worte, die in einen Index übernommen werden sollen, müssen Sie in der Druck­ +datei für 'index' durch Anweisungen kennzeichnen. Solche #ib(1,"ff")#Indexanweisungen#ie# werden +von den anderen Textbe- und -verarbeitungs-Programmen ('lineform', 'pageform', +EUMEL-Drucker) ignoriert. Sie können also bei dem Schreiben mit dem Editor +gleich festlegen, welche Worte in einen Index aufgenommen werden sollen. + +Solche Verzeichnisse von Worten werden im EUMEL-System allgemein als #ib#Index#ie# +bezeichnet. 'index' kann ebenfalls benutzt werden, um ein #ib#Inhaltsverzeichnis#ie# und/oder +ein Verzeichnis aller Abbildungen zu erstellen oder Literaturhinweise zu überprüfen. + +Nachdem eine oder mehrere Indexdateien aus einer Druckdatei erstellt sind, werden +die Indexdateien auf Anfrage alphabetisch sortiert. Bei einem Inhaltsverzeichnis sollten +Sie die Sortierung natürlich ablehnen. Nach der Sortierung werden gleiche Einträge +automatisch zusammengefaßt und die entsprechenden Seitennummern nacheinander +aufgeführt. + + + +#on("b")##on("i")#Praktischer Tip:#off("b")##off("i")# +Möchten Sie nur eine Sortierung, aber keine Zusammenfassung von Einträgen, dann +lehnen Sie die Sortieranfrage ab. Anschließend können Sie die Indexdatei mit '#ib#lex sort#ie# +("indexdateiname")' sortieren. Hierbei bleiben gleiche Einträge erhalten. + + + +Das Programm + +____________________________________________________________________________ + + gib kommando: + index merge ("dateiname.i1", "dateiname.i2") + +____________________________________________________________________________ + + + +erlaubt es Ihnen, zwei durch 'index' erzeugte Verzeichnisse zusammenzuführen und +- nach Anfrage - wieder zu sortieren. +#page# + +#ib(9)#5.4.1.1. #ib#Worte für 'index' kennzeichnen#ie##ie(9)# #goalpage ("ib")##goalpage("ie")# +#free(1.0)# + #on("i")# + Worte, die in einen Index übernommen werden sollen, kennzeichnen Sie mit \#ib\# + und \#ie\#. + #off("i")# +#free(1.0)# +Da in einem Index - neben dem eigentlichen Worteintrag - die #ib#Seitennummer#ie# +enthalten sein soll, arbeitet das Programm 'index' nur mit einer #ib#Druckdatei#ie#, d.h. einer +Ausgabedatei von 'pageform'/'autopageform'. Die Indexworte werden in #ib#Indexdateien#ie# +gesammelt. Die Indexdateien erhalten den Namen der bearbeiteten Datei, an den ".i" +und die Nummer des Index angefügt wird. + +____________________________________________________________________________ + + ... Hier wird eine Eigenschaft des \#ib(1)\#EUMEL- + Systems\#ie(1)\# beschrieben. ... + +____________________________________________________________________________ + + +Die durch die Anweisungen #ib#\#ib\##ie(1,"-Anweisung")# und #ib#\#ie\##ie(1,"-Anweisung")# gekennzeichneten Worte werden mit der +dazugehörigen Seitennummer in die erste Indexdatei geschrieben. + +Die Einträge in einer Indexdatei werden von den Seitennummern durch mindestens +drei Punkte getrennt. Werden diese nicht gewünscht, können Sie sie leicht mit dem +Editor entfernen. + + +Sie haben die Möglichkeit, bis zu neun unterschiedliche Indexdateien zu erstellen, +z.B. gehen durch + +____________________________________________________________________________ + + \#ib (1)\# und \#ie (1)\# + +____________________________________________________________________________ + + +gekennzeichnete Worte in die Indexdatei mit der Nummer 1, durch + +____________________________________________________________________________ + + \#ib (9)\# und \#ie (9)\# + +____________________________________________________________________________ + + +gekennzeichnete Worte gehen in die Indexdatei mit der Nummer 9. Wenn Sie nur +einen Index erstellen müssen, dürfen die \#ib\#- und \#ie\#-Anweisungen ohne Para­ +meter benutzt werden, was gleichbedeutend ist mit \#ib (1)\# und \#ie (1)\#. + + + +Die durch \#ib\#- und \#ie\#-Anweisungen gekennzeichneten Worte können auch über +Zeilengrenzen (mit Silbentrennungen) gehen. + +____________________________________________________________________________ + + .... \#ib\#viele Index­ + Anweisungen\#ie\# ... + +____________________________________________________________________________ + + +'index' zieht getrennte Worte zusammen (hier: 'viele Index-Anweisungen'). Möchten +Sie einige Worte in verschiedenen Indexdateien haben, dürfen Sie die \#ib\#- und +\#ie\#-Anweisungen auch "schachteln". Dies können Sie besonders bei Kapitelüber­ +schriften nutzen. + + + +____________________________________________________________________________ + + \#ib(9)\#Eine Anweisung: die '\#ib\#limit\#ie\#'-Anweisung\#ie(9)\# + +____________________________________________________________________________ + + +In diesem Beispiel wird das Inhaltsverzeichnis in die Indexdatei '9' gebracht, während +der "allgemeine" Index in der Indexdatei '1' gesammelt wird. +#page# + +#ib(9)#5.4.1.2. #ib#Nebeneinträge erzeugen#ie##ie(9)# + +#free(1.0)# + #on("i")# + Sie haben die Möglichkeit, an die Seitennummer eines Eintrags einen beliebigen + Text anfügen zu lassen. + #off("i")# #free(1.0)# +Beispiel: + + + EUMEL-System ... 27ff. + Monitor ........ 13(Def.) + + + + + +Dies wird durch eine weitere Form der \#ib\#-Anweisung ermöglicht: + +____________________________________________________________________________ + + ... der \#ib(1,"(Kap.4)")\#EUMEL-Editor\#ie\# ist gut + geeignet, Texte zu erstellen ... + +____________________________________________________________________________ + + + +erzeugt den folgenden Eintrag: + + + +Druckbild: + + EUMEL-Editor ... 1(Kap.4) + + +An einen Eintrag können Sie einen weiteren Text angefügen, um etwa Untereinträge +zu bilden: + +Druckbild: + + EUMEL-System .................................. 27 + + EUMEL-System, komplexes ....................... 29 + + +Das wird ebenfalls durch eine andere Form der \#ib\#-Anweisung ermöglicht: + +____________________________________________________________________________ + + ... ist das \#ib\#EUMEL-System\#ie(1,", benutzerfreundliches")\# + wirklich ein benutzerfreundliches System ... + +____________________________________________________________________________ + + +erzeugt den folgenden Eintrag: + +Druckbild: + + EUMEL-System, benutzerfreundliches ............ 28 + + + +Nach der Erstellung einer Indexdatei können - nach interaktiver Anfrage - die +Einträge sortiert werden. Die Sortierung erfolgt alphabetisch nach DIN 5007, Abschnitt +1 und 3.2 (Umlaute werden "richtig" eingeordnet). + + + +Wie bereits erwähnt, können Sie 'index' vielseitig einsetzen: + +a) Erstellung von Stichwortverzeichnissen: + Wie bereits beschrieben. + +b) Erstellung von Inhaltsverzeichnissen: + Kapitelüberschriften mit eigenen Indexanweisungen klammern und durch 'index' + wie beschrieben verarbeiten. + + ____________________________________________________________________________ + + \#ib(9)\#6.1. Eine Datei drucken\#ie(9)\# + + _________________________________________________________________________ + + + Dann sind Sie sicher, daß das Inhaltsverzeichnis bezüglich Seitennummern und + Kapitelüberschriften korrekt ist. + +c) Erstellung von #ib#Abbildungsverzeichnisse#ie#n: + Abbildungsüberschriften- bzw. -unterschriften wie Kapitelüberschriften verarbei­ + ten. + +d) Überprüfung von Literaturhinweisen auf Vollständigkeit: + Sie klammern alle Literaturhinweise mit gesonderten Indexanweisungen. + + ____________________________________________________________________________ + + \#ib(8)\#/Meier82/\#ie(8)\#) + + _________________________________________________________________________ + + und überprüfen dann mit Hilfe dieser Indexdatei die Literaturverweise. So können + Sie sichergehen, daß alle Literaturverweise im Text auch in der Literaturaufstellung + stehen. +#page# + +#ib(9)#5.4.1.3. #ib#Indexdateien zusammenführen#ie##ie(9)# +#free(1.0)# + #on("i")# + Durch das Programm '#ib#index merge#ie(1,"-Kommando")#' können Sie eine Indexdatei in eine zweite + "einmischen". + #off("i")# +#free(1.0)# +Es ist somit möglich, einen Index zu erstellen, der sich über mehrere Dateien er­ +streckt, indem Sie 'index' die Druckdateien dieser Dateien bearbeiten und an­ +schließend die entstandenen Indexdateien mit 'index merge' zusammenfassen lassen. +Indexdateien können ggf. mit dem Editor bzw. 'lineform' und/oder 'pageform'/­ +'autopageform' bearbeitet und anschließend gedruckt werden. + + +____________________________________________________________________________ + + gib kommando: + index merge ("1.kapitel.i1", "2.kapitel.i1") + +____________________________________________________________________________ + + + + +Hier wird die Indexdatei des 1. Kapitels in die Indexdatei des 2. Kapitels eingeordnet +und auf Wunsch sortiert. +#page# + +#ib(9)#5.5. #ib#Outline#ie##ie(9)# +#goalpage("outline")# +#free(1.0)# +#ib(9)#5.5.1. Eine#ib# Strukturübersicht#ie# oder + #ib#Zusammenfassung#ie# erstellen#ie(9)# +#free(1.0)# + #on("i")# + Das Programm 'outline' erstellt aus einem Text eine Zusammenfassung aller + (Kapitel-) Überschriften und Stichworte, sofern diese mit #ib#Index-Anweisungen#ie# + gekennzeichnet sind. + #off("i")# +#free(1.0)# +Manchmal sollen Stichworte oder das Inhaltsverzeichnis aus einem Text herausgeholt +werden, ohne vorher 'pageform' durchlaufen zu müssen. Das ist dann nützlich, wenn +Sie + +- Stichworte auf Korrektheit und Vollständigkeit überprüfen möchten; +- die Reihenfolge von Kapiteln überprüfen müssen; +- eine Übersicht durch Kapitel-Überschriften und Stichworte anfertigen möchten; +- einen Text auf logische Zusammenstellung überprüfen. + + +In solchen Fällen hilft das Programm 'outline', das mit dem Monitor-Kommando + +____________________________________________________________________________ + + gib kommando: + outline ("dateiname") + +____________________________________________________________________________ + + + +aufgerufen wird. 'outline' arbeitet ähnlich wie 'index', indem es alle mit \#ib\# und \#ie\# +markierten Textteile in eine Datei mit dem Zusatz 'outline' schreibt. Im Unterschied zu +'index' muß die Eingabe-Datei keine Druckdatei ('.p'-Zusatz) sein. + +Das Programm 'outline' fragt zuerst, mit welcher Indexnummer das Inhaltsverzeichnis +versehen ist. Das ist notwendig, weil die Kapitelüberschriften gegenüber Stichwörtern +in der 'outline'-Datei hervorgehoben werden (Einrückungen). + +Eingabe-Datei ("dateiname"): + +____________________________________________________________________________ + + ... + \#ib(9)\#1. Kapitel\#ie(9)\# + ... + ...\#ib\#Stichwort 1\#ie\# + \#ib\#Stichwort 2\#ie\#... + + \#ib(9)\#1.1. Kapitel\#ie(9)\# + ... + \#ib\#Stichwort 3\#ie\# + usw... + +____________________________________________________________________________ + + + +Druckbild der erzeugten Datei ("dateiname.outline"): + + 1. Kapitel + Stichwort 1 + Stichwort 2 + 1.1. Kapitel + Stichwort 3 + + +In diesem Beispiel werden alle Indizes mit Ausnahme der Kapitelüberschrift jeweils in +einer Zeile aufgeführt und gegenüber der Kapitelüberschrift eingerückt. Ein neues +Kapitel, sofern es dezimal gekennzeichnet ist, wird gegenüber einem Kapitel mit +höherer Ordnung eingerückt. +#page# + +#ib(9)#5.6. #ib#Print#ie##ie(9)##goalpage("print")# +#free(1.0)# + #on("i")# + Der #ib#EUMEL-Drucker#ie#, der mit dem #ib#'print'#ie(1,"-Kommando")#-Kommando angesprochen wird, ist + eine Software-Schnittstelle zu einem angeschlossenen Drucker. In diesem Kapitel + wird erklärt, wie Sie mit dem EUMEL-Drucker eine Datei drucken können und + welche speziellen Anweisungen den Drucker steuern. + #off("i")# +#free(1.0)# +Jeder Drucker erbringt "hardwaremäßig" unterschiedliche Leistungen (z.B. Typen und +Modifikationen). Diese Leistungen werden durch Eingabe spezieller Zeichenfolgen +veranlaßt, die herstellerspezifisch sind. + +Um vom EUMEL-System unterschiedliche Drucker auf gleiche Weise ansprechen zu +können, wurde eine Software-Schnittstelle geschaffen, die #ib#EUMEL-Drucker#ie# ge­ +nannt wird. Der EUMEL-Drucker akzeptiert eine Datei und veranlaßt, daß diese in +geeigneter Weise gedruckt wird. Weiterhin beachtet der EUMEL-Drucker die An­ +weisungen der Textkosmetik. Die Form der Anweisungen der Textkosmetik und des +EUMEL-Druckers sind identisch. +#page# + +#ib(9)#5.6.1. #ib#Eine Datei drucken#ie##ie(9)# +#free(1.0)# + #on("i")# + Mit dem Kommando '#ib#print#ie#' können Sie dem EUMEL-Drucker eine Datei zum + Drucken übergeben. + #off("i")# +#free(1.0)# +____________________________________________________________________________ + + gib kommando: + print ("dateiname") + +____________________________________________________________________________ + + +In der Regel ist im EUMEL-System (Multi-User) ein "Spooler" installiert, so daß Sie +sofort mit der Arbeit fortfahren können. Der EUMEL-Drucker arbeitet in diesem Fall +parallel zu Ihren anderen Arbeiten. +#page# + +#ib(9)#5.6.2. #ib#Anweisungen für den EUMEL-Drucker#ie##ie(9)# +#free(1.0)# +Ein Text (eine Datei) kann vom Drucker auch ohne Anweisungen gedruckt werden, +etwa für Probedrucke. Für diesen Fall hat der Drucker vernünftige Voreinstellungen. +Für einen "normalen" Text brauchen Sie keine speziellen Druckeranweisungen in den +zu druckenden Text einzufügen, denn die Anweisungen für die Textkosmetik reichen +zur Druckersteuerung aus. Nur wenn besondere Leistungen verlangt werden, wie z.B. +Blocksatz oder den gedruckten Text an eine bestimmte Stelle zu plazieren, sind +Druckeranweisungen notwendig. + +Werden vom Drucker Leistungen verlangt, die hardwaremäßig nicht vorhanden sind, +so sorgt der EUMEL-Drucker dafür, daß eine möglichst äquivalente Leistung erbracht +wird. Fordern Sie beispielsweise einen nicht vorhandenen Schrifttyp an, wird mit +dem Standard-Schrifttyp der jeweiligen Installation gedruckt. Damit ist es Ihnen +möglich, einen Text, der eigentlich für einen anderen Drucker bestimmt ist, auf einem +Drucker zu drucken, der die geforderte Type nicht kennt. + +Wie bereits erwähnt, beachtet der EUMEL-Drucker die gleichen Anweisungen wie +die Textkosmetik-Programme, aber einige Anweisungen sind nur für den Drucker +implementiert. Eine #ib#\#type\#-Anweisung#ie# beispielsweise, die einen bestimmten Schrift­ +typ anfordert, wird vom EUMEL-Drucker als Befehlsfolge an den angeschlossenen +Hardware-Drucker übergeben, sofern der Schrifttyp auf dem Drucker vorhanden ist. +Wie die Anweisungen geschrieben werden müssen, wurde in der Beschreibung der +Textkosmetik geschildert. + +Anweisungen werden nicht gedruckt. Besteht eine Zeile nur aus Anweisungen, so wird +diese Zeile vom EUMEL-Drucker nicht gedruckt. Im Gegensatz zu den Programmen +der Textkosmetik werden unbekannte oder #ib#fehlerhafte Anweisungen#ie# vom EUMEL­ +Drucker ohne Fehlermeldung "verschluckt". + +Neben den "normalen" Anweisungen, die nur in "\#"-Zeichen eingeschlossen wer­ +den, gibt es noch eine andere Form: + +Kommentar-#ib#Anweisungen#ie(1,", Kommentar-")#: + + Werden in "\#-" und "-\#"-Zeichen eingeschlossen. Solche Anweisungen wer­ + den ignoriert. + +____________________________________________________________________________ + + .......................... + Text...................... + .......................... + Kommentar-Anweisungen werden + beim Drucken ignoriert. + \#---- Ende der Seite 1 ---\# + +____________________________________________________________________________ + + + +Die letze Zeile erscheint im gedruckten Text nicht. +#page# +#goalpage("block")# +#ib(9)#5.6.3. #ib#Blocksatz#ie# #ie(9)# +#free(1.0)# +#ib(9)#5.6.3.1. #ib#Randausgleich#ie##ie(9)# +#free(1.0)# + #on("i")# + Die Anweisung #ib#\#block\##ie(1,"-Anweisung")# bewirkt einen Blocksatz beim Druck. + #off("i")# +#free(1.0)# +Fügen Sie in den Text (meist am Anfang einer Datei) die Anweisung + +____________________________________________________________________________ + + \#block\# + +____________________________________________________________________________ + + +ein, druckt der Drucker ab dieser Stelle alle Zeilen, die nicht mit einem Absatzkenn­ +zeichen versehen sind, im #ib#Blocksatz#ie#. Das heißt, daß durch Vergrößern der Wort­ +abstände alle Zeilen an der gleichen Position enden (rechter #ib#Randausgleich#ie#). Preis­ +werte Drucker können dies nur durch Einfügen ganzer Leerzeichen zwischen den +Worten vornehmen, was sich oft beim Lesen störend bemerkbar macht. Bei qualitativ +hochwertigen Druckern wird dagegen der Blocksatz durch Einfügen kleinerer Abstän­ +de zwischen den Worten erreicht. + +Der Text einer Zeile wird durch Vergrößern der #ib#Wortlücken#ie(1, ", Vergrößern der")# auf die Zeilenlänge, die +durch die \#limit\#-Anweisung eingestellt ist, verbreitert. + + +a) Es werden nicht verbreitert: + + - Absatzzeilen; + - der Text bis zum letzten #ib#Mehrfachblank#ie#; + - führende Leerzeichen (#ib#Einrückung#ie#); + - ein Leerzeichen hinter einer Aufzählung (siehe dazu b); + - geschützte Blanks. + + + +b) #ib#Aufzählungen#ie# gibt es nur nach einer Absatzzeile: + + - "Spiegelstrich" (Bindestrich und Leerzeichen am Anfang der Zeile); + - Doppelpunkt als Ende des ersten Wortes (Position < 20); + - schliessende Klammer oder Punkt als Ende des ersten Wortes (Position < 7), + z.B. 1) oder 1. +#page# +#goalpage ("pageblock")# + +#ib(9)#5.6.3.2. #ib#Seitenausgleich#ie##ie(9)# +#free(1.0)# + #on("i")# + Mit der #ib#\#pageblock\#-Anweisung#ie# wird der Drucker veranlaßt, einen Seiten­ + ausgleich (ähnlich wie bei der \#block\#-Anweisung für den rechten Rand­ + ausgleich) vorzunehmen. + #off("i")# +#free(1.0)# +Durch die automatische oder interaktive Seitenformatierung oder durch einen Fuß­ +notenumbruch von 'pageform'/'autoform' bleiben oft am Ende einer Seite Zeilen leer. +Dies können Sie durch die \#pageblock\#-Anweisung verhindern. Sie veranlaßt den +Drucker, Zwischenräume (Fachbegriff: Durchschuß) zwischen den Zeilen einzufügen, +so daß alle letzten Zeilen auf allen Seiten auf gleicher Höhe abschließen. Ebenso wie +beim Randausgleich hängt die Güte des Druckergebnisses jedoch von den Fähig­ +keiten des angeschlossenen Druckers ab. + +Beachten Sie jedoch, daß manche Verlage so bearbeitete Seiten nicht wünschen, weil +bei Verwendung von zu dünnem Papier beim Druck Zeilen "durchscheinen" können, +so daß das Lesen erschwert wird. + +Ist die Anweisung \#pageblock\# gegeben, können Sie in 'pageform' die Seitengrenze +auch über das rechnerische Seitenende hinaus plazieren. In diesem Fall werden die +Zeilen vom Drucker gestaucht. +#mark ("", "")# + + +____________________________________________________________________________ + +PAGEFORM für x Zeilen: dateiname ---> dateiname.p + +____________________________________________________________________________ + + +____________________________________________________________________________ + + Seitenende verschieben: UP, DOWN / bestaetigen: RETURN / Abbruch: ESC + +____________________________________________________________________________ + + +#page# + +#ib(9)#5.6.4. #ib#Schreibfeld verschieben#ie##ie(9)# #goalpage("start")# +#free(1.0)# + #on("i")# + Durch die Anweisung #ib#\#start\# #ie(1,"-Anweisung")#ist es Ihnen möglich, das #ib#Schreibfeld#ie# beim Druck auf + dem Papier an eine andere Stelle zu plazieren. + #off("i")# +#free(1.0)# +Der EUMEL-Drucker plaziert das Schreibfeld auf einem Drucker automatisch derart, +daß ein genügender Rand verbleibt. Die Wirkung dieser Voreinstellung ist natürlich +abhängig vom Drucker und der Installation. Mit der \#start\#-Anweisung können Sie +die automatische Einstellung verändern. + + +____________________________________________________________________________ + + \#start (1.0, 2.0)\# + +____________________________________________________________________________ + + +legt die linke, obere Ecke des Schreibfeldes fest (vom linken Rand 1 cm, vom oberen +Rand 2 cm). Die standardmäßige Voreinstellung ist \#start (2.54, 2.35)\#. Die \#start +(...)\#-Anweisung können Sie nur einmal pro Seite geben. +#page# + diff --git a/doc/user/benutzerhandbuch.5c b/doc/user/benutzerhandbuch.5c new file mode 100644 index 0000000..010cacd --- /dev/null +++ b/doc/user/benutzerhandbuch.5c @@ -0,0 +1,711 @@ +#start(5.0,1.5)##pagenr("%",93)##setcount(1)##block##pageblock##count per page# +#headeven# +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# + EUMEL-Benutzerhandbuch +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#headodd# +#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")# +#table# + Teil 5: Textkosmetik und Druck +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#bottomeven# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +5 - % GMD +#tableend##clearpos# +#end# +#bottomodd# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +GMD 5 - % +#tableend##clearpos# +#end# +#goalpage("center")# +#ib(9)#5.6.5. #ib#Zentriert drucken#ie##ie(9)# +#free(1.0)# + #on("i")# + Mit der #ib#\#center\#-Anweisung#ie# können Sie einen Text in der Mitte der Zeile drucken + lassen. + #off("i")# +#free(1.0)# + +Die \#center\#-Anweisung zentriert den Text einer Absatzzeile. + + +____________________________________________________________________________ + + \#center\#Diese Zeile wird zentriert gedruckt. + +#mark ("", "")# + +____________________________________________________________________________ + + +Druckbild: + + #center#Diese Zeile wird zentriert gedruckt. +#page# + +#ib(9)#5.6.6. #ib#Rechtsbündig drucken#ie##ie(9)# +#goalpage("right")# +#free(1.0)# + #on("i")# + Mit der #ib#\#right\#-Anweisung#ie# können Sie einen Teil einer Absatzzeile rechtsbündig + drucken. + #off("i")# +#free(1.0)# + +Die \#right\#-Anweisung veranlaßt, daß der nachfolgende Text rechtsbündig gedruckt +wird. + +____________________________________________________________________________ + + \#head\# + \#center\#Diese Zeile wird zentriert\#right\#% + + \#end\# + +____________________________________________________________________________ + + + +Hierbei wird die Seitenzahl rechtsbündig gedruckt. + +Beachten Sie, daß die \#center\#- und die \#right\#-Anweisung zusammen verwendet +werden können. Beide Anweisungen wirken jedoch nur, wenn sie in einer Absatzzeile +stehen. + +#mark ("", "")# +#page# + +#ib(9)#5.6.7. #ib#Übereinander drucken#ie##ie(9)# +#goalpage ("b")# +#free(1.0)# + #on("i")# + Mit der #ib#\#b\#-Anweisung#ie# können Sie zwei Zeichen übereinander drucken. + #off("i")# + +#free(1.0)# +Die \#b\#-Anweisung veranlaßt, daß zwei aufeinanderfolgende Zeichen, die durch die +\#b\#-Anweisung verbunden sind, übereinander gedruckt werden. + + +____________________________________________________________________________ + +... 0\#b\#/ ... + +____________________________________________________________________________ + + + + +Druckbild: + +... 0#b#/ ... + + +Das Zeichen '/' wird über das Zeichen '0' gedruckt. 'lineform'/'autoform' nimmt für die +Zeilenberechnung nur ein Zeichen. Beachten Sie, daß direkt vor oder nach der +\#b\#-Anweisung keine Anweisung oder kein Blank stehen darf. +#mark ("", "")# +#page# + +#ib(9)#5.7. #ib#Textkosmetik-Makros#ie##ie(9)# +#free(1.0)# + #on("i")# + #ib#Makros#ie# verkürzen Ihren Arbeitsvorgang bei immer wiederkehrenden Textteilen + und/oder Anweisungen. + #off("i")# +#free(1.0)# +Unter 'Makro' verstehen wir eine "große" Anweisung, die aus vielen kleinen besteht +und die Sie mit Hilfe des Makronamens aufrufen können. + +Textkosmetik-Makros kommen zum Einsatz bei: + +- immer wiederkehrenden Textteilen; +- immer wiederkehrenden Anweisungssequenzen; +- bei der Erstellung von Manuskripten, deren endgültige Form Sie anfänglich noch + nicht kennen oder die Sie noch ändern möchten; +- oder bei Folgen von direkten Drucker-Anweisungen, die bestimmte Leistungen + erbringen. + +Die Definition von einem oder mehreren #ib#Makros#ie# wird mit dem Editor vorgenommen. +Diese #ib#Makro-Datei#ie# wird dann geladen. Von diesem Augenblick an "kennen" 'line­ +form'/'autoform' und 'pageform'/'autopageform' die Makros, d.h. die Textzeilen und/ +oder Anweisungen, die sich unter dem #ib#Makronamen#ie# "verbergen". + +'lineform'/'autoform' beachtet die Anweisungen, die ggf. in den Makros enthalten sind. +Sie erscheinen jedoch nicht in der Datei. Erst 'pageform'/'autopageform' setzt diese in +die Druckdatei ein. +#page# + +#ib(9)#5.7.1. Ein Makro-Beispiel#ie(9)# +#free(1.0)# + #on("is")# + Hier wird Ihnen ein einfaches Beispiel für einen Briefkopf gezeigt. + #off("is")# +#free(1.0)# +Angenommen, Sie schreiben mit dem EUMEL-System Ihre Geschäftsbriefe. Sie +haben einen Drucker zur Verfügung, mit dem Sie auch die Briefköpfe erstellen kön­ +nen. Für den #ib#Briefkopf#ie# schreiben Sie ein Makro \#kopf\# in eine Datei "macro defini­ +tionen": + +____________________________________________________________________________ + + \#*kopf\# + \#type("fett und gross")\#Firmenname + \#type("fett")\#Softwareprodukte + \#type("klein")\#Straße + Stadt + \#type ("normal")\# + \#*macro end\# + +____________________________________________________________________________ + + +Der Name des Makros ist \#kopf\#. Beachten Sie, daß eine #ib#Makro-Definition#ie# mit dem +Namen des Makros beginnen muß. Der #ib#Makroname#ie# muß dabei mit einem #on("b")#*#off("b")# gekenn­ +zeichnet werden, um ihn von "normalen" Text-Anweisungen unterscheiden zu kön­ +nen. Jedes Makro wird mit einer \#*macro end\#-Anweisung beendet. Sie dürfen +mehrere Makros hintereinander in die Datei schreiben. + +Nun müssen Sie das so definierte Makro 'laden': + +____________________________________________________________________________ + + gib kommando: + #ib#load macros#ie# ("macro definitionen") + +____________________________________________________________________________ +#goalpage("load macros")##goalpage("list macros")# + + +Zur Kontrolle können Sie sich die geladenen Makros in das Notizbuch ausgeben +lassen: + +____________________________________________________________________________ + + gib kommando: + #ib#list macros#ie# + +____________________________________________________________________________ +#mark ("", "")# + + + +Nun haben Sie von jetzt an eine neue Anweisung (mit dem Namen \#kopf\#) zur Ver­ +fügung, mit der Sie einen Briefkopf in jeden Brief drucken können. Sie schreiben nun +folgenden Brief: + +____________________________________________________________________________ + + \#kopf\# + + Sehr geehrter Herr .... + + usw. + +____________________________________________________________________________ + + +Beachten Sie hierbei, daß das Makro in Ihrem Text als Anweisung ohne #on("b")#*#off("b")# steht. Der +#ib#Aufruf eines Makros#ie#, welches z.B. in einer von 'lineform' zu bearbeitenden Datei +steht, unterscheidet sich also nicht von einer "normalen" Textanweisung. + +Nachdem Sie mit 'lineform' den Brief zeilenweise formatiert haben, kontrollieren Sie +die formatierte Datei. Hier hat sich noch nichts verändert. Die neue Anweisung \#kopf\# +steht unverändert in der Datei. 'lineform' beachtet zwar alle Anweisungen und Text­ +zeilen eines Makros, setzt diese jedoch nicht in die Datei ein. Allerdings ist 'lineform' +nicht in der Lage, die \#type\#- und \#limit\#-Anweisungen eines Makros zu erkennen, +wenn es an erster Stelle in einer Datei steht und in dessen Definition gleich zu +Anfang diese Anweisungen korrekt aufgeführt sind. Stattdessen fragt 'lineform' an­ +fangs 'type' und 'limit' an. Das können Sie umgehen, indem Sie mittels 'CR' die +Abfrage in 'lineform' ignorieren. + +Nun formatieren Sie die Datei, die den Brief enthält, mit 'pageform'/'autopageform'. In +der Druckdatei ist nun die Anweisung \#kopf\# verschwunden. Dort stehen nun die +Zeilen des #ib#Makrorumpf#ie#es. 'pageform'/'autopageform' setzt die Zeilen des Makros in +die Druckdatei ein: + +____________________________________________________________________________ + + \#type("fett und gross")\#Firmenname + \#type("fett")\#Softwareprodukte + \#type("klein")\#Straße + Stadt + \#type ("normal")\# + + + Sehr geehrter Herr ... + usw. + + +____________________________________________________________________________ + + + +#on("b")##on("i")#Anmerkung:#off("b")##off("i")# +Makros, die den gleichen Namen haben, aber sich durch die Anzahl der Parameter +unterscheiden, sind nicht erlaubt. Es ist auch nicht gestattet, Makros innerhalb einer +Makro-Definition aufzurufen. + +Beachten Sie ferner, daß Makro-Texte so verwendet werden, wie sie mit 'load +macros' geladen werden. + +____________________________________________________________________________ + + \#*textanfang\# + \#limit(11.0)\# + \#block\# + \#pageblock\# + \#type("trium8")\# + \#*macro end\# + +____________________________________________________________________________ + + +Betätigen Sie in der Makro-Datei nach jeder Zeile die #taste1(" CR ")#-Taste (Absatz), dann +erhalten Sie nach jedem \#...\# einen Absatz, was zum Beispiel bei Kapitelüberschriften +wünschenswert ist, nicht jedoch bei kleineren Anweisungen, bei denen dann mitten im +Satz ein Absatz erschiene. In solchen Anwendungen sollten Sie Makros ohne Absätze +speichern. Beachten Sie ferner, daß aus programmtechnischen Gründen eine \#foot\#- +oder die abschließende \#end\#-Anweisung einer Fußnote nicht in einem Makro ent­ +halten sein darf. +#page# + +#ib(9)#5.7.2. Ein Beispiel mit #ib#Makro-Parameter#ie#n#ie(9)# +#free(1.0)# + #on("i")# + Makro-Parameter erlauben es Ihnen, immer wiederkehrende Textteile, die sich + nur geringfügig voneinander unterscheiden, zu erzeugen. + #off("i")# +#free(1.0)# +Ihnen fällt nun auf, daß Sie Ihr Makro noch etwas verbessern können. Sie möchten +das Datum mit in den Briefkopf aufnehmen. Somit editieren Sie Ihre Makro-Datei +folgendermaßen (beachten Sie die '$'-Zeichen): + +____________________________________________________________________________ + + \#*kopf ($1)\# + \#type("gross")\#Firmenname + \#type("fett")\#Softwareprodukte + \#type("klein")\#Straße + Stadtname + \#type ("normal")\# + + Stadtname, den $1 + \#*macro end\# + +____________________________________________________________________________ + + +Damit haben Sie dem \#kopf\#-Makro einen Parameter gegeben: '$1'; die Parameter +werden numeriert. Ein zweiter Parameter würde '$2' heißen usw.. + +Bei der Erstellung eines Briefes müssen Sie die Anweisung \#kopf\# mit dem jeweiligen +Datum in einen Brief schreiben: + +____________________________________________________________________________ + + \#kopf ("20.8.1986")\# + +____________________________________________________________________________ + + +'pageform'/'autopageform' setzt nun das angegebene Datum direkt hinter 'Stadtname, +den' in den Briefkopf ein (in der Druckdatei). Beachten Sie, daß alle Parameter einer +Makro-Anweisung in Anführungszeichen stehen müssen (auch Zahlen). +#page# + +#ib(9)#5.7.3. #ib#Makros für Manuskripte#ie##ie(9)# +#free(1.0)# + #on("i")# + Hier wird gezeigt, wie Sie mit Makros Anweisungen formulieren können, die + aussagen, um was es sich bei einem Text handelt, und nicht, in welchem Format + er gedruckt wird. + #off("i")# +#free(1.0)# +Bei Manuskripten für Artikel, Bücher und Manuals wissen Sie oft vorher nicht, in +welchem Format das Manuskript gedruckt werden wird. Zu diesem Zweck ist es +ebenfalls nützlich, Makros zu verwenden. + +____________________________________________________________________________ + + \#*kapitelanfang ($1)\# + \#free (2.0)\# + \#type ("gross")\#\#ib (9)\#$1\#ie (9)\#\#type ("normal")\# + + \#*macro end\# + +____________________________________________________________________________ + + +In diesem Beispiel wird ein Makro für den Anfang eines Kapitels definiert. Zwischen +zwei Kapiteln sollen hier zwei Zentimeter Zwischenraum bleiben, die Kapitel- +Überschrift (als Parameter) wird in einer größeren Schrift gedruckt. Zusätzlich wird die +Überschrift für ein Inhaltsverzeichnis in den 9. Index aufgenommen. Nach der Über­ +schrift wird eine Leerzeile eingeschoben, bevor der eigentliche Text anfängt. + +Der Anwender dieses Makros schreibt also z.B. folgende Anweisung: + +____________________________________________________________________________ + + \#kapitelanfang ("Ein Beispiel fuer Manuskripte")\# + +____________________________________________________________________________ + + + +Beachten Sie, daß die Kapitel-Überschrift nicht länger als eine Textzeile sein darf. +Das liegt daran, daß 'lineform'/'autoform' zwar die Zeile bearbeitet, aber nicht in den +Text einsetzt. 'pageform'/'autopageform' setzt also die unveränderte - nicht umge­ +brochene - Textzeile ein. + +Sie können nun Makros für die meisten Textstrukturen definieren. Schreibkräfte +brauchen dann in der Regel die meisten Text-Anweisungen nicht zu kennen, son­ +dern nur noch eine Anzahl von einfachen Makro-Anweisungen. + +Die Makro-Definitionen können jederzeit geändert werden, um wechselnden Bedürf­ +nissen angepaßt zu werden, z.B. wenn ein Verlag ein bestimmtes Schreibformat +verbindlich vorschreibt. In diesem Fall brauchen nicht alle Text-Dateien geändert zu +werden, sondern nur die Makro-Definitionen. + +Ein weiterer Vorteil einer solchen Vorgehensweise ist, daß die Makro-Anweisungen in +diesem Fall angeben, #on("i")##on("b")#was#off("i")##off("b")# eine bestimmte Text-Struktur ist, und nicht, #on("i")##on("b")#wie#off("i")##off("b")# die +Struktur behandelt werden soll. + +#on("b")#Anmerkung#off("b")#: +In eine Makro-Definition sollten Sie ggf. \#limit\#-, \#type\#- und \#linefeed\#- +Angaben einsetzen, um die Makros unabhängig von der Aufrufstelle zu machen. Ggf. +sollten Sie auch die Datei vorher mit 'lineform' bearbeiten, um Trennungen vorzu­ +nehmen. +#page# + +#ib(9)#5.8. Textkosmetik für Spezialisten#ie(9)# +#free(1.0)# + #on("i")# + In diesem Abschnitt werden Ihnen Kommandos und Anweisungen vorgestellt, die + in der Regel nur für Spezialfälle benötigt werden. + #off("i")# +#free(1.0)# + +#ib(9)#5.8.1. Schalter-Anweisungen für + #ib#Kopf- und Fußbereiche#ie(1, "Schalter-Anweisungen für")##ie(9)# +#goalpage("head off")##goalpage("bottom off")# +#free(1.0)# + +Mit den Textkosmetik-Anweisungen + +____________________________________________________________________________ + + #ib#\#head off\##ie# + + #ib#\#bottom off\##ie# + +____________________________________________________________________________ + + + +können Sie die Erzeugung von Kopf- oder Fußzeilen abschalten. Mit + + +____________________________________________________________________________ + + #ib#\#head on\##ie# + + #ib#\#bottom on\##ie# + +____________________________________________________________________________ + + +können Sie diese wieder erzeugen. Beachten Sie, daß diese Anweisungen an der +Stelle beachtet werden, an der sie im Text stehen, d.h. diese Anweisungen gelten +bereits für die Seite, auf der sie sich bei der 'pageform'-Bearbeitung befinden. Möch­ +ten Sie die Kopfzeilen für eine Seite abschalten, dann sollten Sie an dieser Stelle die +#ib#\#head off\#-Anweisung#ie# geben. Um die Kopfzeilen für die nächste Seite wieder einzu­ +schalten, sollten Sie die #ib#\#head on\#-Anweisung#ie# an einer Stelle plazieren, von der Sie +sicher sind, daß sie auf die folgende Seite gelangt (im Zweifelsfall nach einer +\#page\#-Anweisung). +#mark ("", "")# +#page# + +#ib(9)#5.8.1.1. #ib#Kopf- und Fußbereiche abstellen#ie##ie(9)# +#goalpage ("first head")##goalpage("last bottom")# +#free(1.0)# + #on("i")# + Mit '#ib#first head#ie#' bzw. '#ib#last bottom#ie#' können Sie Kopf- oder Fußbereiche auf der + ersten (letzten) Seite ab- oder wieder anschalten. + #off("i")# +#free(1.0)# +Manchmal ist es notwendig, die Erzeugung von 'head'-Zeilen auf der ersten Seite +(z.B. weil dort ein Briefkopf erscheint) und/oder 'bottom'-Zeilen auf der letzten Seite +(weil keine Folgeseite existiert) zu verhindern. Mit dem Monitor-Kommando + +____________________________________________________________________________ + + gib kommando: + #ib#first head (FALSE)#ie# + +____________________________________________________________________________ + + +können Sie bei 'pageform' die Erzeugung von 'head'-Zeilen auf der ersten Seite +jeder Druckdatei abschalten. Die Erzeugung bleibt so lange abgeschaltet, bis sie +wieder durch + +____________________________________________________________________________ + + gib kommando: + #ib#first head (TRUE)#ie# + +____________________________________________________________________________ + + +angeschaltet wird. Das gleiche gilt analog für 'bottom'-Zeilen auf der letzten Seite: +Ein- und Ausschalten durch + +____________________________________________________________________________ + + gib kommando: + #ib#last bottom (FALSE)#ie# + +____________________________________________________________________________ +#mark("","")# + +bzw. + +____________________________________________________________________________ + + gib kommando: + #ib#last bottom (TRUE)#ie# + +____________________________________________________________________________ +#page# + +#ib(9)#5.8.2. Textzeilen markieren#ie(9)# +#goalpage("mark")# +#free(1.0)# +Mit der Anweisung + + +____________________________________________________________________________ + + \#mark("markierungszeichen links","markierungszeichen rechts")\# + +____________________________________________________________________________ + + + +können Sie einen Textabschnitt an den Rändern (außerhalb des Schreibfeldes!) mit +Texten markieren, wie z.B. im folgenden mit der Anweisung + +#mark ("", "")# + +____________________________________________________________________________ + + \#mark ("> ", " <")\# + +____________________________________________________________________________ + + +#mark ("> ", " <")# +Dabei gilt der erste Parameter für den linken und der zweite für den rechten Rand. +Beachten Sie, daß Sie einen genügenden Zwischenraum zwischen der Markierung +und dem Rand mit angeben müssen. + +Die Markierung ist insbesondere für Manuals interessant, wo Änderungen gegen­ +über der letzten Version hervorgehoben werden. Das Markierungszeichen wird neben +den linken und rechten Rand gedruckt (also außerhalb des von \#start\# und \#limit\# +begrenzten Textfeldes). Für das Drucken der Markierung wird der/die Schrifttyp/ Modi­ +fikationen benutzt, die an der Stelle der \#mark\#-Anweisung eingeschaltet ist. Der +eigentliche Text bleibt selbstverständlich unberührt. +#mark ("", "")# + +Um nur einen Rand zu markieren, kann auch ein leerer Parameter angegeben +werden. + +____________________________________________________________________________ + + \#type ("pica")\#\#mark ("", " |")\#\#type ("normal")\# + +____________________________________________________________________________ + + + +Mit der speziellen #ib#\#mark\#-Anweisung#ie# + +____________________________________________________________________________ + + \#mark ("", "")\# + +____________________________________________________________________________ + + +wird die Markierung ausgeschaltet. + +Soll ein Kopf-, Fuß-, Fußnoten- oder Tabellenbereich markiert werden, sollten sich +die Markierungsein- und ausschalt-Anweisungen vollständig in dem Bereich be­ +finden. +#page# + +#ib(9)#5.8.3. #ib#Fußnoten pro Seite zählen#ie##ie(9)# +#goalpage("countperpage")# +#free(1.0)# +Manchmal wird gewünscht, daß die Fußnoten für jede Seite separat - also für jede +Seite von 1 ab - gezählt werden. Das können Sie mit der Textkosmetik-Anweisung + + +____________________________________________________________________________ + + \#count per page\# + +____________________________________________________________________________ + + +erreichen. Sie schaltet von einer fortlaufenden Zählung auf eine seitenweise Zählung +um. Diese Anweisung sollte am Dateianfang stehen. Sie kann für die betreffende +Datei nicht mehr abgeschaltet werden. +#page# + +#ib(9)#5.8.4. Behandlung falscher #ib#Silbentrennungen#ie(1, ", Behandlung von falschen")#: + #ib#Ausnahmelexikon#ie##ie(9)# +#free(1.0)# + #on("i")# + In das Ausnahmelexikon können fehlerhaft getrennte Worte aufgenommen + werden. + #off("i")# +#free(1.0)# +Es kann vorkommen, daß das Silbentrenn-Programm der Textkosmetik einige Worte +immer wieder falsch trennt. Um dies zu vermeiden, können Sie diese Worte in ein +#on("b")##on("i")#Ausnahmelexikon#off("b")##off("i")# speichern. Die Worte des Ausnahme-Lexikons werden bei einer +Silbentrennung zuerst durchsucht. Wird ein Wort im Lexikon gefunden, dann wird das +eigentliche Silbentrenn-Programm nicht mehr ausgeführt. + +Die Ausnahmen müssen Sie - wie unten beschrieben - in einer Datei notieren und +mit dem Monitor-Kommando + +____________________________________________________________________________ + + gib kommando: + #ib#lade ausnahmen#ie# ("dateiname") + +____________________________________________________________________________ +#goalpage("lade ausnahmen")# + + +in das Lexikon laden. Die Ausnahmen müssen Sie folgendermaßen in die Datei +schreiben: + +____________________________________________________________________________ + + Sprech-stun-de + ins-be-son-de-re + Raum + Bei-spiel + ... + +____________________________________________________________________________ + + +Sie können jederzeit neue Ausnahmen in das Lexikon hinzuladen (wiederum mit 'lade +ausnahmen'). In diesem Fall wird angefragt, ob das Lexikon überschrieben werden +soll. + + + +Um zu kontrollieren, welche oder wie viele Ausnahmen sich im Lexikon befinden, +können Sie + +____________________________________________________________________________ + + gib kommando: + #ib#entlade ausnahmen#ie# ("dateiname") + +____________________________________________________________________________ + #goalpage("entlade ausnahmen")# + +geben. Das Lexikon wird dann in "dateiname" geschrieben. Auch hier können Sie +weitere Ausnahmen hinzufügen und diese neu laden (aber diesmal überschreiben). +#mark ("", "")# +#page# + +#ib(9)#5.8.5. #ib#Voreinstellungen ändern#ie#: + Einige Monitor-Kommandos#ie(9)# +#free(1.0)# +#ib(9)#5.8.5.1. Wenige oder viele #ib#Silbentrennung#ie#en: + #ib#Trennpunkt einstellen#ie##ie(9)# +#goalpage ("hyphenation width")# +#free(1.0)# + #on("i")# + Mit dem Kommando 'hyphenation width' können Sie bestimmen, an welchem + Punkt Worte zur Trennung angeboten werden. Die Trennbreite können Sie + zwischen 4 und 20 Prozent der Zeilenbreite einstellen. + #off("i")# +#free(1.0)# +Viele Silbentrennungen in einem Text erschweren das Lesen. Nehmen Sie keine +Silbentrennungen vor, wird der rechte Rand stark "ausgefranst" oder beim Blocksatz +("rechter Randausgleich") müssen viele Zwischenräume zwischen den Worten ein­ +gefügt werden. Durch das Monitor-Kommando + +____________________________________________________________________________ + + gib kommando: + #ib#hyphenation width#ie# (prozentuale angabe) + +____________________________________________________________________________ + + +unmittelbar vor dem Aufruf von 'autoform' oder 'lineform' können Sie den Punkt, an +dem die Silbentrennung einsetzen soll, einstellen. Die Klammern enthalten eine ganze +Zahl, die für Prozent der Zeilenbreite steht. Minimum sind 4, Maximum 20 Prozent. +Beispielsweise stellt 'hyphenation width (5)' den Trennpunkt auf 5% der Zeilenbreite +ein (voreingestellt ist 7). Bei einer Angabe von 20 werden somit sehr wenige Worte +zur Silbentrennung angeboten, d.h. je größer die Prozentangabe, desto weniger Worte +werden zur Trennung angeboten. Die Einstellung des Trennpunktes bestimmt also, ab +wann ein Wort zur Silbentrennung untersucht wird. Andererseits bestimmt die Ein­ +stellung auch, wieviel Zwischenraum zwischen Worten eingefügt werden muß, um +einen rechten Randausgleich zu erzielen. +#page# + +#ib(9)#5.8.5.2. Anzahl #ib#Leerzeilen vor Fußnoten#ie# + einstellen#ie(9)# +#goalpage("number empty")# +#free(1.0)# + #on("i")# + '#ib#number empty lines before foot#ie#' stellt die Anzahl der Leerzeilen vor Fußnoten ein. + #off("i")# +#free(1.0)# +Die Anzahl der Leerzeilen vor #ib#Fußnoten#ie(1, ", Leerzeilen davor")# (voreingestellt ist eine Leerzeile) können Sie +durch das Monitor-Kommando 'number empty lines before foot' einstellen. + + + +____________________________________________________________________________ + + gib kommando: + number empty lines before foot (3) + +____________________________________________________________________________ + + +stellt drei Leerzeilen vor dem Fußnotenblock ein. Beachten Sie, daß diese Einstellung +so lange gilt, bis Sie das Monitor-Kommando erneut geben. +#mark("","")# + diff --git a/doc/user/benutzerhandbuch.5d b/doc/user/benutzerhandbuch.5d new file mode 100644 index 0000000..8a61f29 --- /dev/null +++ b/doc/user/benutzerhandbuch.5d @@ -0,0 +1,211 @@ +#start(5.0,1.5)##pagenr("%",116)##setcount(1)##block##pageblock##count per page# +#headeven# +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# + EUMEL-Benutzerhandbuch +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#headodd# +#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")# +#table# + Teil 5: Textkosmetik und Druck +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#bottomeven# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +5 - % GMD +#tableend##clearpos# +#end# +#bottomodd# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +GMD 5 - % +#tableend##clearpos# +#end# + +#ib(9)#5.9. Übersicht über die Anweisungen und + Kommandos der EUMEL-Textkosmetik#ie(9)# +#free(1.0)# + #on ("i")# + Zuerst werden die am häufigsten benutzten Kommandos/Anweisungen beschrie­ + ben. Danach sind (durch einen Strich getrennt) Kommandos/Anweisungen auf­ + geführt, die seltener benötigt werden. + #off ("i")# +#free(1.0)# +#on("b")# +#ib#Kommandos#ie##off("b")# +#free(1.0)# + #on("i")# + Kommandos werden im Monitor gegeben ('gib kommando :'). + #off("i")# +#free(1.0)# +#lpos(0.0)##lpos(4.6)# +#table# +#on("b")#Kommando Bedeutung#off("b")# +#free(1.0)# +#clearpos# +#lpos(0.0)##lpos(4.6)# +lineform ("x") Formatieren von Zeilen mit interaktiver Silben­ + trennung. +autoform ("x") Wie lineform, jedoch werden Silbentrennungen + automatisch vorgenommen. +pageform ("x") Interaktives Formatieren von Seiten, mit Behand­ + lung von Fußnoten, Kopf- und Fußzeilen, Seiten­ + numerierung, Seitenquerverweisen usw. Erzeugt + eine Druckdatei (Zusatz '.p'). +autopageform ("x") Wie pageform, jedoch werden die Seitengrenzen + automatisch plaziert. +print ("x") Datei drucken. +print ("x.p") Eine mit 'pageform' bearbeitete Datei drucken. +---------------- ---------------- +#page# +index ("x.p") Erstellt aus einer Druckdatei ein Stichwort- + und/oder Inhaltsverzeichnis. +index merge ("a.i1","b.i1") Führt Indexdateien zusammen. +outline ("x") Erstellt eine Übersicht aus Kapitelüberschriften + und Stichworten. +hyphenation width (int) Stellt die Trennbreite für die Silbentrennung ein. +load macros ("x") Lädt Makros. +list macros Zeigt geladene Makros. +lade ausnahmen ("x") Lädt Wörter, die von der Trennhilfe nicht korrekt + getrennt werden, in einen Ausnahme-Speicher. +entlade ausnahmen ("x") Entlädt die Worte aus dem Ausnahme-Speicher + in die angegebene Datei. +first head (false) Schaltet Kopfzeilen auf erster Seite aus. +first head (true) Schaltet Kopfzeilen auf erster Seite wieder ein. +last bottom (false) Schaltet Fußzeilen auf letzter Seite aus. +last bottom (true) Schaltet Fußzeilen auf letzter Seite wieder ein. +number empty lines before foot Stellt die Anzahl der Leerzeilen vor einer Fußnote +before foot ein. +#tableend##clearpos# +#page# +#on("b")# +#ib#Anweisungen#ie##off("b")# +#free(1.0)# + #on ("i")# + Anweisungen werden in die Datei geschrieben. Jede Anweisung muß in Anwei­ + sungszeichen eingeschlossen werden. Als Parameter (diese werden in Klammern + eingeschlossen) kommen in Frage: + 'int' bedeutet eine ganze Zahl: 17, 1, 311; + 'real' bedeutet eine Zahl mit Dezimalpunkt (meist cm-Angabe): 0.5, 1.25; + 'text' bedeutet eine Zeichen-Angabe. Muß in Anführungszeichen eingeschlos­ + sen werden: "%", "meine datei". + #off ("i")# +#free(1.0)# +#lpos(0.0)##lpos(4.6)# +#table# +#on("b")#Anweisung Bedeutung#off("b")# +#clearpos# +#lpos(0.0)##lpos (4.6)# + +type (text) Schrifttyp einstellen: \#type("trium8")\# +limit (real) Zeilenbreite einstellen: \#limit (16.0)\# +on (text) Modifikation einschalten: \#on("bold")\#. Erlaubt + sind: b(bold), r(everse), i(talic), u(nderline) +off (text) Modifikation ausschalten (siehe 'on'). +block Blocksatz (Randausgleich) einschalten. +head Kopfzeilen (für Seiten mit geraden/ungeraden +(bzw. headeven/headodd) Seitennummern) definieren. +... -%- Platzhalter für Seitenzahl. +end Kopfzeilen-Ende (pageform). +bottom Wie oben, jedoch für Fußzeilen. +(bzw. +bottomeven/bottomodd) +... +end Fußzeilen-Ende +pagenr (text, int) Seitennummer einstellen bzw. zusätzliches Sei­ + enzeichen ab nächster Seite einführen: + \#pagenr ("%", 17)\# +foot Fußnoten-Anfang. +... +end Fußnoten-Ende. +free (real) Platz freihalten (in cm): \#free (1.27)\# +page Neue Seite: \#page\# +page (int) Neue Seite mit Seitennummer 17: \#page (17)\# +linefeed (real) Zeilenhöhe relativ zum eingeschalteten Schrifttyp + verändern: \#linefeed (1.25)\# +pagelength (real) Seitenlänge einstellen (ab nächster Seite in cm): + \#pagelength (24.0)\# Nachfolgenden Zeilentext +center zentriert drucken. +right Nachfolgenden Zeilentext rechtsbündig drucken. +u ... e (steht für up) Exponent schreiben: \#u\#123\#e\# +d ... e (steht für down) Index schreiben. +start (real, real) Schriftfeld (linke obere Ecke) einstellen: \#start + (1.0, 2.0)\# +------------ ------------ +b Zwei Zeichen übereinander drucken. +bottom off Schaltet Fußzeilen aus. +bottom on Schaltet Fußzeilen ein. +bpos (real, real) Der Text zwischen den angegebenen Tabellen­ + positionen wird im Blocksatz gedruckt. +clearpos Löscht alle Tabellenpositionen. +clearpos (real) Löscht die angegebene Tabellenposition. +columns (int, real) Formatieren von Spalten mit Zwischenraum: + \#columns (3, 1.0)\#, 3 Spalten mit 1 cm Zwischen­ + raum. +columnsend Beendigung der Spaltenformatierung. +count Interner Zähler für Fußnoten wird eingesetzt + (pageform). +count (text) Wie oben, aber der Wert des internen Zählers + wird vermerkt: \#count ("neue Zahl")\# +count per page Interner Zähler beginnt bei jeder Seite mit 1. +cpos (real) Zentrierende Tabellenposition. +dpos (real, text) Um den angegebenen Text zentrierende Tabel­ + lenposition, meist Dezimalzeichen: + \#dpos (13.0, 2.")\# +fillchar (text) Zwischenräume zwischen Tabellenpositionen wer­ + den mit dem angegebenen Text beim Drucken + ausgefüllt. Beachten Sie, daß das Ausschalten der + Füllzeichen durch 'niltext' erfolgt. +goalpage (text) Stelle, auf die obige Anweisung verweist: \#goal­ + page ("1.Kapitel")\# +head off Schaltet Kopfzeile(n) aus. +head on Schaltet Kopfzeile(n) ein. +ib Anfang eines Stichworts oder einer Kapitel­ + überschrift kennzeichnen (Ablegen in Indexdatei + mit Zusatz '.i1'): \#ib\#ein Stichwort oder eine + Kapitelüberschrift\#ie\# +ib (int) Wie oben, jedoch wird Stichwort in angegebener + Indexdatei abgelegt. +ib (int, text) Wie oben, jedoch erhält Eintrag in der Indexdatei + den angegebenen Text an die Seiten­ + nummer angefügt. +ie Beendigung der Stichwortmarkierung. +ie (int) Wie oben (int-Angabe muß der in der ib-An­ + weisung entsprechen). +ie (int, text) Wie oben, jedoch wird die Textangabe hinter das + markierte Stichwort angefügt. +lpos (real) Linksbündige Tabellenposition. +mark (text, text) Markierung rechts und links neben der Schreib­ + fläche ein-/ausschalten. +pageblock Einschalten des vertikalen Blocksatzes. Falls ein­ + geschaltet, kann mit 'pageform' auch über das + (rechnerische) Seitenende formatiert werden. +rpos (real) Rechtsbündige Tabellenposition. +setcount (int) Zählerwert setzen: \#setcount (17)\# +table Anfang einer Tabelle. +... +table end Ende einer Tabelle. +topage (text) Seitenverweis (die Seitennummer, auf die verwie­ + sen wird, wird eingesetzt): + \#topage ("1.Kapitel")\# +value Letzter Zählerwert wird eingesetzt. +value (text) Wie oben, jedoch wird ein vermerkter Zählerwert + eingesetzt: \#value ("Vermerk")\# +#tableend# + diff --git a/doc/user/benutzerhandbuch.5e b/doc/user/benutzerhandbuch.5e new file mode 100644 index 0000000..d515c6a --- /dev/null +++ b/doc/user/benutzerhandbuch.5e @@ -0,0 +1,223 @@ +#start(5.0,1.5)##pagelength(17.4)##pagenr("%",121)##setcount(1)##block##pageblock##count per page# +#headeven# +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# + EUMEL-Benutzerhandbuch +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#headodd# +#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")# +#table# + Teil 5: Textkosmetik und Druck +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#bottomeven# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +5 - % GMD +#tableend##clearpos# +#end# +#bottomodd# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +GMD 5 - % +#tableend##clearpos# +#end# + +#ib(9)#5.10. Fehlersituationen und Abhilfe#ie(9)# + +#free(1.0)# +Was können Sie machen, wenn + + +... bestimmte Anweisungen, die den Gesamttext betreffen, erst ab der zweiten + Seite wirksam werden? + + + Textkosmetik-Anweisungen, die ab der ersten Seite für den ganzen Text gelten + sollen, müssen Sie als erstes, d.h. in die erste Zeile einer Datei, schreiben. Dies + bezieht sich u.a. auf 'pagelength', 'start', 'block', 'pageblock' etc., die noch vor + \#head\#- oder \#bottom\#-Anweisungen gesetzt werden müssen. + + + + +... sich der Cursor nicht mehr bewegen läßt? + + + Eine Möglichkeit besteht darin, daß Sie versehentlich die 'STOP' -Taste + (='CTRL a' gleichzeitig, d.h. Anhalten der Bildschirmausgabe) betätigt haben. + In diesem Fall drücken Sie die 'WEITER' -Taste ('CTRL c' gleichzeitig, d.h. + Bildschirmausgabe fortführen). Alle Tastenanschläge, die Sie in der Zwischen­ + zeit vollzogen haben, werden jetzt ausgeführt. + + Eine andere Möglichkeit wäre, daß Sie Ihre Datei/Task nicht ordnungsgemäß + verlassen haben. Versuchen Sie über die 'SV'-Taste und 'ESC h' wieder auf + die Monitor-Ebene zu gelangen, so daß Sie dann auf die Aufforderung 'gib + kommando' hin, wieder in Ihre Datei gelangen können. + + + + +... Sie nur einen Dateiausschnitt löschen, duplizieren oder mit 'lineform' bearbeiten + möchten? + + + Der betreffende Ausschnitt muß markiert werden. Zum Löschen benutzen Sie + die Tasten 'ESC RUBOUT'. Der Ausschnitt ist hiermit aber noch nicht 'voll­ + ständig verschwunden', sondern Sie können ihn mit 'ESC RUBIN' an gleicher + oder anderer Stelle wieder hervorbringen, so lange bis Sie die Tasten erneut + benutzen. + + Das Duplizieren eines Textbereiches erfolgt nach dem Markieren durch das + Betätigen der Tastenfolge 'ESC d'. Hierbei bleibt der Originaltext erhalten und + kann beliebig oft dupliziert werden. Den duplizierten Text holen Sie sich mit + 'ESC g' an die gewünschte Stelle in Ihrer Datei. + + Möchten Sie 'lineform' nur auf einen Ausschnitt anwenden, markieren Sie + diesen und geben nach 'ESC ESC' das Kommando 'lineform'. + + + + +... beim Drucken die letzte bzw. die letzten beiden Zeilen auf einer gesonderten + Seite ausgedruckt werden? + + + a) Sie müssen die Fonttabelle noch einrichten. + + oder + + b) Sie setzen die \#pageblock\#-Anweisung zu Beginn des Textes und "stau­ + chen" um zwei Zeilen. + + oder + + c) Sie wählen eine kleineren Schrifttyp. + + + + +... in Ihrer Datei die Meldung + + _______________________________________________________________________ + + FEHLER: FILE-Überlauf + + gib kommando: + edit ("dateiname") + + _______________________________________________________________________ + + erscheint und das Abschicken des Kommandos mittels der 'CR'-Taste aber nur + zu einer identischen Meldung (siehe oben) führt? + + + Wenn Sie auf dem oben dargestellten Weg nach mehrmaligem Versuchen nicht + wieder in Ihre Datei gelangen, haben Sie die Möglichkeit, mit dem Kommando + + _______________________________________________________________________ + + gib kommando: + reorganize ("dateiname") + + _______________________________________________________________________ + + + Ihre Datei neu zu 'organisieren', um 'Lücken', die durch Einfügen oder Löschen + entstanden sind, zu eliminieren. Die Datei beansprucht dann in der Regel auch + weniger Speicherplatz. + + Sind Sie wieder in Ihrer Datei, empfiehlt es sich, die große Datei in mehrere + kleine aufzuteilen. Entweder Sie halbieren oder (besser) Sie dritteln Ihre Text­ + datei und verteilen den Text auf zwei bis drei Dateien. Zukünftig sollten Sie es + sich dann bei umfangreichen Texten zur Regel machen, nur ein logisch + zusammenhängendes Kapitel in einer Datei abzulegen. Sie sollten Ihre Datei nur + so groß halten, daß Ihnen noch genügend Raum zur Verfügung steht, Proze­ + duren wie z.B. 'pageform' durchzuführen, durch die sich der Umfang einer Datei + (z.T. wesentlich) vergrößert. + + + + +... bei Ihrem Text einige Wörter mit extrem großem Zwischenraum gedruckt + wurden? + + + Sie haben in diesem Fall wahrscheinlich vergessen, die Absatzmarkierung zu + setzen, so daß aufgrund der \#block\#-Anweisung ein rechter Randausgleich + erfolgte, den Sie an dieser Stelle nicht wünschten. + + + + +... eine Überschreibung erfolgt ist bzw. wenn 'lineform' eine Überschreibung + meldet? + + + Eine solche Überschreibung kann auftreten, wenn Sie mit einer besonders + großen Type in Fettdruck (z.B. triumb14) schreiben (vgl. Sie hierzu auch Kapitel + 5.2.6.). Um dies zu verhindern, können Sie zum einen die Anzahl der Blanks + zwischen den einzelnen Gliedern erhöhen oder zum anderen auch die + \#type\#-Anweisung in die vorhergehende Zeile setzen (n i c h t direkt v o r den + betreffenden Text). + + + + +... nach der erfolgten Prozedur 'lineform' Ihre Tabellen durcheinander geraten + sind? + + + Wenn Sie Tabellen schreiben, müssen Sie nach jeder Zeile die Absatzmarke + setzen. Sollen bei einigen Tabellenpositionen Spalten leer bleiben, müssen Sie + für diese Positionen ein geschütztes Blank einsetzen. + + + + +... bei der Prozedur 'pageform' das Seitenende nicht interaktiv verschoben werden + kann, obwohl am Anfang der Datei eine \#pageblock\#-Anweisung gegeben + wurde? + + + Eine \#page\#-Anweisung im Text bewirkt, daß Sie an dieser Stelle das Seiten­ + ende nur bestätigen, die Anweisung löschen oder als dritte Möglichkeit, die + Seitenformatierung abbrechen können. Für den Fall, daß die \#page\#- + Anweisung nicht mehr zutrifft bzw. falsch gesetzt wurde, sollten Sie die Anwei­ + sung löschen und das Seitenende interaktiv plazieren. + + + + +... Sie bei der Erstellung eines Inhaltsverzeichnisses oder eines Indexes keine + Füllzeichen zwischen Text und Seitenangabe haben möchten? + + + In diesem Fall gehen Sie mit 'ESC ESC' in den Kommandozustand und ändern + mit Hilfe von CA (Change All) die Füllzeichen in Leerzeichen um. Verwenden + Sie nicht nur einen Punkt, da sonst auch die Punkte zwischen den Ziffern der + Kapitelnumerierung verschwänden. Es kann bei einer ungeraden Anzahl von + Füllzeichen notwendig sein, nachträglich noch einige Punkte entfernen zu + müssen. + + _______________________________________________________________________ + + gib kommando: ".." CA " " + + _______________________________________________________________________ + diff --git a/doc/user/benutzerhandbuch.6 b/doc/user/benutzerhandbuch.6 new file mode 100644 index 0000000..5e035d2 --- /dev/null +++ b/doc/user/benutzerhandbuch.6 @@ -0,0 +1,474 @@ +#start(5.0,1.5)##pagenr("%",1)##setcount(1)##block##pageblock##count per page# +#headeven# +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# + EUMEL-Benutzerhandbuch +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#headodd# +#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")# +#table# + Teil 6: Spezialitäten +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#bottomeven# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +6 - % GMD +#tableend##clearpos# +#end# +#bottomodd# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +GMD 6 - % +#tableend##clearpos# +#end# + +#kap("TEIL 6: Spezialitäten")# +#free(1.0)# + +6.1. Notizbuch +#free(1.0)# + Das Notizbuch erlaubt es u.a., Fehlermeldungen zwischenzeitig zu speichern und + am Ende einer Verarbeitung die Fehlermeldungen zusammen mit dem bearbeiteten + Text im Fenstereditor anzuzeigen. +#free(1.0)# +Das #ib#Notizbuch#ie# wird von den Programmen 'lineform' und 'pageform' zum Sammeln +von Warnungen und Fehlermeldungen verwendet. Wenn das Fenster des Notizbuches +an Bildschirm eröffnet ist, können Sie es handhaben wie das gewohnte Editorfenster. + +Falls Sie das Notizbuch selbst beim Editieren für Notizen verwenden möchten, drük­ +ken Sie statt für den Fenstereditor die Tasten an beliebiger +Stelle des Bildschirms. Durch dieses Kommando wird das Notizbuch statt einer Datei +gezeigt. Sie sparen somit die Eingabe eines Dateinamens und können direkt mit allen +vorgestellten Editorfunktionen im Notizbuch arbeiten. + + +#page# +____________________________________________________________________________ + ................ handbuch teil6 .............. Zeile 56 +\#kap("6.2. EUMEL-Zeichensatz")\# +\#free(1.0)\# +\#zus\# + \#corner1("-5.0")\# + Das EUMEL-System definiert einen Zeichensatz, der gewähr­ + auf allen Maschinen überall gleich codiert werden. Dadurch ist + Dateien und Programme ohne Konvertierungen zwischen EUMEL-Syst + unterschiedlicher Hersteller zu übertragen. Der \#ib\#EUMEL- + dem ASCII-Zeichensatz (DIN 66 003) mit Erweiterungen. + \#box3("T","2","115.0")\# + + ................. notebook ................... Zeile 1 +FEHLER Zeile 55: Modifikation nicht angeschaltet bei off: b + >>> Anweisung in angegebener Zeilennummer überprüfen +WARNUNG Zeile 55: Umschaltung auf gleichen Schrifttyp: trium8 + >>> Schrifttyp wurde darum nicht verändert! +WARNUNG Zeile 75: Überschreibung nach >\#ib(9)\#6.2.< Fehlende + >>> Bitte fehlende Leerzeichen einfügen + +____________________________________________________________________________ +#page# +6.2. EUMEL-Zeichensatz +#free(1.0)# + + + Das EUMEL-System definiert einen Zeichensatz, der gewährleistet, daß Zeichen + auf allen Geräten gleich codiert werden. Dadurch ist es z.B. möglich, Dateien und + Programme ohne Konvertierungen zwischen EUMEL-Systemen unterschiedlicher + Hersteller zu übertragen. Der #ib#EUMEL-Zeichensatz#ie# beruht auf dem ASCII- + Zeichensatz (DIN 66 003) mit Erweiterungen. + +#free(1.0)# + +Die Darstellung der einzelnen Zeichen hängt vom Endgerät ab. Die hier aufgeführten +Zeichen sind i.A. auf allen Geräten vorhanden. Ein erweiterter Zeichensatz (mit ma­ +thematischen, diakritischen und griechischen Zeichen) ist nur auf Spezialgeräten +verfügbar und wird deshalb hier nicht angegeben. +#page# +Beispiele zum Lesen der Tabelle: + + code (" ") -> 32 + code ("m") -> 109 + | 0 1 2 3 4 5 6 7 8 9 +--+---------------------------------------- +3 | SP ! " \# $ % & ' + | +4 | ( ) * + , - . / 0 1 + | +5 | 2 3 4 5 6 7 8 9 : ; + | +6 | < = > ? § A B C D E + | +7 | F G H I J K L M N O + | +8 | P Q R S T U V W X Y + | +9 | Z [ ��\� ] ^ _ ` a b c + | +10| d e f g h i j k l m + | +11| n o p q r s t u v w + | +12| x y z | } ~ + | +13| + . + . + . +20| + | +21| Ä Ö Ü ä ö ü + | +22| k ­ \# SP + | +23| + | +24| + | +25| ß +#page# + + +Anmerkungen: + +1) SP bedeutet Leerzeichen ("blank"). + +2) Die Zeichen 'k', '-' und 'SP' mit den Codes 220, 221, 223 werden für die Zwecke + der Textkosmetik benötigt (Trenn-'k' bei der Umwandlung von 'ck' in 'kk'; Trenn­ + zeichen; geschütztes Leerzeichen). + +3) Das Zeichen '\#' (Code 222) ist druckbar, während das Zeichen '\#' (Code 35) nicht + druckbar ist (Einleitungszeichen für Anweisungen der Textkosmetik und Drucker). + +4) Das Zeichen SP (Code 223) wird zur besseren Identifizierung invers oder als + Unterstreichungsstrich auf dem Terminal dargestellt. In einem Ausdruck erscheint + es als ein Leerzeichen. + +Falls Sie Zeichen ausgeben möchten, die nicht auf der Tastatur sind, müssen Sie den +Code der gewünschten Zeichen zu Hilfe nehmen. + +Bewegen Sie den Cursor dazu an die Stelle der Datei, an die das Sonderzeichen +geschrieben werden soll und geben Sie nach ein: + + +____________________________________________________________________________ + ................. dateiname .................. Zeile 123 + + TABELLE 1 + _____________________ + | | + gib kommando : type(code(124)) + + + +____________________________________________________________________________ +#page# +6.3. Sortier-Programme +#free(1.0)# + + + Es stehen zwei verschiedene Sortier-Programme zur Verfügung: 'sort' (Sortierung + nach ASCII-Reihenfolge) und 'lex sort' (Sortierung nach deutschem Alphabet). + +#free(1.0)# + +Die Sortierprogramme sortieren eine Datei zeilenweise. + +Beispiel: + + +____________________________________________________________________________ + ................. dateiname ................. Zeile 1 + Berta ist eine Frau. + Adam ist ein Mann. + ... + +____________________________________________________________________________ + + +____________________________________________________________________________ +gib kommando : +#ib#sort#ie# ("dateiname") + +____________________________________________________________________________ + + + + +____________________________________________________________________________ + ................. dateiname ................. Zeile 1 + Adam ist ein Mann. + Berta ist eine Frau. + ... + +____________________________________________________________________________ + + + + +Dabei werden die Zeilen-Anfänge solange zeichenweise miteinander verglichen, bis +ein Unterschied auftritt und dann ggf. umgeordnet. Werden zwei ungleich lange Zeilen +(Anzahl Zeichen/Zeile) miteinander verglichen, dann kann man sich die kürzere Zeile +mit Leerzeichen auf die Länge der längeren Zeile verlängert denken. + +Die Reihenfolge, in der die Zeilen sortiert werden, erfolgt nach dem ASCII- +Zeichensatz in aufsteigender Reihenfolge (vergl EUMEL-Zeichencode): + + + das Leerzeichen + einige Sonderzeichen + die Ziffern + einige Sonderzeichen + große Buchstaben + einige Sonderzeichen + kleine Buchstaben + einige Sonderzeichen + die Umlaute und ß + + +Das bedeutet, daß z.B. folgendermaßen sortiert wird: + + +____________________________________________________________________________ + ................. dateiname ................. Zeile 1 + Adam + Ball + Zuruf + aber das ist ein Satz + niemals + Überlauf + +____________________________________________________________________________ + + + + +Um zu erreichen, daß große und kleine Buchstaben gleichwertig behandelt werden, +kann man das Kommando + +____________________________________________________________________________ +gib kommando : +#ib#lex sort#ie# ("dateiname") + +____________________________________________________________________________ + + + +geben. + +In diesem Fall würde die sortierte Datei folgendermaßen aussehen: + +____________________________________________________________________________ + ................. dateiname ................. Zeile 1 + aber das ist ein Satz + Adam + Ball + niemals + Überlauf + Zuruf + +____________________________________________________________________________ + + +Man beachte, daß der Umlaut 'Ü' wie 'Ue' behandelt wird (für die restlichen Umlaute +gilt eine analoge Behandlung; ebenso wird 'ß' wie 'ss' behandelt). Weiterhin werden +alle Sonderzeichen bei der Sortierreihenfolge ignoriert. + +6.4 Fonttabellen +#free(1.0)# + + + Eine Fonttabelle enthält Angaben zu den druckbaren Zeichen. + +#free(1.0)# + +Die Einstellung einer Fonttabelle#u#1)#e# erfolgt automatisch beim Einrichten der Drucker- +Task (siehe Anhang). Um den Namen der in der Task eingestellten Fonttabelle zu +erhalten geben Sie ein: +#foot# +1) Fonttabelle: Beschreibung der druckbaren Schrifttypen. +#end# + +____________________________________________________________________________ + +gib kommando: +put(fonttable) + +____________________________________________________________________________ + + +Die Ausgabe liefert den Namen der in der Task eingestellten Fonttabelle. + +____________________________________________________________________________ + +gib kommando: +put(fonttable) +agfa9 +gib kommando: + +____________________________________________________________________________ + + +Um eine neue oder andere Fonttabelle einzustellen, etwa weil verschiedene Drucker +benutzt werden können, geben Sie das 'fonttable' Kommando mit dem Namen der +gewünschten Fonttabelle als Parameter an: + +____________________________________________________________________________ + +gib kommando: +fonttable("name der fonttabelle") + +____________________________________________________________________________ + + + +Eine weitergehende Beschreibung der eingestellten Fonttabelle erhalten Sie durch das +Kommando 'list fonts': + +____________________________________________________________________________ + +gib kommando: +list fonts + +____________________________________________________________________________ + + +Durch dieses Kommando erhalten Sie in das Notizbuch eine Aufstellung der Schrift­ +typen mit Angaben zu Namen der verfügbaren Schrifttypen in der Fonttabelle, +Größenangaben zu den Schriftttypen etc. + +____________________________________________________________________________ + ................. notebook .................. Zeile 1 +FONTTABELLE : "agfa9"; + x einheit = 160.0; + y einheit = 160.0; + + FONT : "micro", "elanlist", "bulletin22"; + einrueckbreite = 20; + durchschuss = 7; + fonthoehe = 30; + fonttiefe = 8; + groesserer font = ""; + kleinerer font = ""; + + FONT : "trium10"; + einrueckbreite = 31; + durchschuss = 6; + fonthoehe = 54; + fonttiefe = 15; + groesserer font = "trium12"; + kleinerer font = "trium8"; + +____________________________________________________________________________ + + + +Anmerkung: + - Falls mehrere Namen für einen Schrifttyp angegeben sind, können Sie + einen beliebigen dieser Namen in der \#type\#-Anweisung benutzen. + + - Größenangaben sind in 'Mikroschritten', d.h. den kleinstmöglichen + Schritten des jeweiligen Druckers angegeben und nicht etwa in mm. + + - Weitere Informationen entnehmen Sie ggf. dem Systemhandbuch. + +#page# +6.5 Syntax der Kommandos +#free(1.0)# +code + TEXT PROC code (INT CONST zahl) + Wandelt 'zahl' in ein Zeichen um. Falls die Zahl kleiner als 32 oder größer als 254 + ist, (siehe Codetabelle) muß mit unerwarteten Ergebnissen gerechnet werden. + + + type(code(92)) + + + INT PROC code (TEXT CONST zeichen) + Wandelt 'zeichen' in die zugehörige EUMEL-Codierung um. Falls mehr als ein + Zeichen angegeben wird, ist das Resultat '-1'. + + + put(code(92)) + + + +list fonts + PROC list fonts + Listet die Fonts der eingestellten Tabelle ins #on("i")#notebook#off("i")#. + + PROC list fonts (TEXT CONST fonttable name) + Listet die Fonts der angegebenen Fonttabelle ins #on("i")#notebook#off("i")#. Die vorher eingestellte + Fonttabelle bleibt jedoch weiter eingestellt. + + + list fonts ("fonttab.alternativ") + + + +lex sort + PROC lex sort (TEXT CONST datei) + + Zeilenweise Sortierung nach (deutscher) lexikographischer Reihenfolge nach DIN + 5007. + + + lex sort ("telephonliste") + + + PROC lex sort (TEXT CONST datei, INT CONST anfang) + + Wie 'lex sort', jedoch wird bei der Sortierung bei 'anfang' jeder Zeile begonnen. + + + lex sort ("liste",20) + + +sort + PROC sort (TEXT CONST datei) + + Die Prozedur 'sort' sortiert die Datei 'datei' zeilenweise. Die Sortierung erfolgt + nach der Ordnung, die der EUMEL-Zeichencode vorschreibt. Beispielsweise + werden Zeilen ("Sätze"), die mit Ziffern beginnen, vor Sätzen, die mit Buchstaben + anfangen, eingeordnet. Sätze, die mit großen Buchstaben beginnen, werden vor + Sätzen mit kleinen Buchstaben einsortiert. Weiterhin werden die Umlaute und das + "ß" nach allen anderen Buchstaben eingeordnet. + + + sort ("liste") + + + PROC sort (TEXT CONST datei, INT CONST anfang) + + Sortiert eine Datei wie obige Prozedur, jedoch wird bei der Sortierung nicht der + Anfang eines Satzes beachtet, sondern die Position 'anfang'. + + + sort ("liste",10) + + + +type + PROC type (TEXT CONST zeichenkette) + + Fügt 'zeichenkette' in die aktuelle Position der editierten Datei ein. Besonders + nützlich in Verbindung mit der Prozedur 'code', um nicht auf der Tastatur enthal­ + tene Zeichen in den Text zu bringen. + + + type(code(200)) + diff --git a/doc/user/benutzerhandbuch.anhang b/doc/user/benutzerhandbuch.anhang new file mode 100644 index 0000000..5a58f95 --- /dev/null +++ b/doc/user/benutzerhandbuch.anhang @@ -0,0 +1,484 @@ +#start(5.0,1.5)##pagenr("%",1)##setcount(1)##block##pageblock##count per page# +#headeven# +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# + EUMEL-Benutzerhandbuch +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#headodd# +#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")# +#table# + Anhang +#fillchar(" ")# +#on("u")# #off("u")# +#table end##clear pos# + +#end# +#bottomeven# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +A - % GMD +#tableend##clearpos# +#end# +#bottomodd# + +#lpos(0.0)##cpos(5.5)##rpos(11.0)# +#table# +#fillchar(" ")# +#on("u")# #off("u")# +#fillchar(" ")# +GMD A - % +#tableend##clearpos# +#end# +Aufbau und Installation +#free(0.5)# + Diese Installationsanleitung dient nur als Beispiel und soll nicht die Anleitung zu + dem von Ihnen benutzten Gerät ersetzen. Insbesondere die hier beschriebene + Möglichkeit der Partitionierung ist kein Standard! +#free(0.5)# +Allgemeines über das Betriebssystem EUMEL +#free(0.5)# + +Zum besseren Verständnis des Installierungsvorganges sei hier kurz der Aufbau des +Betriebssystems EUMEL erläutert (Der EUMEL-Kenner mag diesen Abschnitt über­ +springen) : + +Das System besteht im wesentlichen aus den folgenden Komponenten : + + - SHard (#on("i")##on("b")#S#off("b")##off("i")#oftware - #on("i")##on("b")#Hard#off("b")##off("i")#ware Interface) + - Systemkern (EUMEL-0) + - darauf aufbauende Systemteile + +Das #on("b")##ib#SHard#ie##off("b")# ist der #on("u")#hardwareabhängige#off("u")# Teil des Betriebssystems. Dieser Teil ist ver­ +antwortlich für den Informationsfluß zwischen der virtuellen Maschine EUMEL-0 und +den einzelnen Hardwarekomponenten (Tastatur, Diskettenlaufwerk, Schnittstellen, +usw.). + +Der #on("b")#Systemkern#off("b")# (auch mit EUMEL-0 oder Urlader bezeichnet) ist der #on("u")#prozessorab­ +hängige#off("u")# Teil des Systems. Er bestimmt im wesentlichen die Leistung des Betriebssy­ +stems, da er als virtueller Prozessor den Befehlsumfang für den ELAN-Compiler +definiert. Dieser Befehlsumfang wird dann auf den tatsächlichen Befehlsvorrat des +hardwaremäßig vorhandenen Prozessors abgebildet. + +Die auf dem Kern (EUMEL-0) #on("b")#aufbauenden Systemteile#off("b")# sind #on("u")#hardware- und prozes­ +sorunabhängig#off("u")#. Sie beinhalten den ELAN-Compiler und alle Tasks, Texte, insertier­ +ten ELAN-Pakete, benannte und unbenannte Datenräume eines EUMEL-Systems. +Diese Systemteile bilden zusammen mit dem Systemkern EUMEL-0 den #goalpage("v2")##on("b")#EUMEL- +Hintergrund#off("b")#, d.h. EUMEL-0 ist Teil des #ib#EUMEL-Hintergrundes#ie#. Momentan werden +je nach Rechnertyp Diskette und Festplatte als Hintergrundspeichermedium für +EUMEL unterstützt. + +Der Begriff EUMEL-Hintergrund (HG) resultiert aus dem Konzept des virtuellen +Speichers. Bei diesem Konzept wird der RAM-Speicherbereich der Hardware nur als +Pufferbereich nach dem Demand-Paging-Verfahren benutzt, mit Ausnahme der +residenten Systemteile (SHard und EUMEL-0). Das macht den Benutzer bezüglich +seiner Programme und Daten unabhängig von der eigentlichen Größe des RAM- +Speichers. Diese bestimmt lediglich den Durchsatz (Performance) des Systems, d.h. je +größer der RAM-Bereich Ihres Rechners ist, desto schneller arbeitet das EUMEL- +System. + +EUMEL-0 befindet sich auf der ersten Hintergrunddiskette. Das Laden von +EUMEL-0 und des restlichen EUMEL-Hintergrundes kann daher in einem Arbeits­ +gang geschehen. + +Der Auslieferungs-Hintergrund ist noch nicht konfiguriert und stellt ausschließlich die +im Handbuch beschriebenen Leistungen des Betriebssystems zur Verfügung. Er +besteht im wesentlichen aus insertierten ELAN-Paketen, die den Leistungsumfang +des Systems bestimmen (Single- oder Multiuser, mit oder ohne Textverarbeitung). +Steht dieser Hintergrund auf mehreren Disketten (Multiuser-Hintergründe), dann sind +diese fortlaufend numeriert. Die erste Hintergrunddiskette hat die Nummer 0, um +daran zu erinnern, daß sich auf dieser Diskette auch der Systemkern EUMEL-0 +befindet. + +Ein Hintergrund kann natürlich auch die Systemsicherung eines größeren Systems mit +z.B. mehreren Megabytes sein. Sollten Sie später einmal Ihr bestehendes System +durch ein anderes ersetzen wollen (Hintergrund überschreiben), so brechen Sie wäh­ +rend des Hochfahrens beim Speichertest das System durch Tastendruck ab und laden +durch Anwahl von 2 'neuen Hintergrund vom Archiv laden' im Startdialog das neue +System. + +#on("i")##on("u")#ACHTUNG:#off("u")##off("i")# Dabei gehen alle Daten des alten Systems unwiederbringlich verloren! + (Siehe dazu auch 'Laden eines EUMEL-Hintergrundes'.) + +Zur besseren Verständlichkeit sollen an dieser Stelle noch die Begriffe 'Systemstart' +und 'Systemabschaltung' des EUMEL-Systems erläutert werden : + +#on("i")##on("b")##ib#Systemstart#ie# :#off("b")##off("i")# +Wenn ein EUMEL-System gestartet wird (auch 'Hochfahren' genannt), und dies gilt +auch für kleinere Diskettensysteme wie den 'Generierungseumel' (siehe Seite #topage("v1")#), +wird zunächst das SHard geladen; dazu erscheint auf dem Bildschirm eine entspre­ +chende Meldung. Das SHard versucht nun den Systemkern vom Archivmedium (in der +Regel Diskette) zu laden. Ist keine entsprechende Diskette eingelegt, so wird ver­ +sucht, EUMEL-0 vom Hintergrundmedium (Festplatte) zu laden. + +Danach wird EUMEL-0 aktiv; auf dem Bildschirm erscheinen Angaben zu verfügba­ +ren Kanälen, RAM- und Hintergrundspeicher-Größe. Dann führt EUMEL-0 einen +Speichertest durch, was daran zu erkennen ist, daß eine Folge von Sternchen (*) auf +den Schirm geschrieben wird. Wird währenddessen eine beliebige Taste gedrückt, +dann gelangt man nach dem Speichertest in den 'Startdialog'. + +Nach dem Speichertest bzw. nach Wahl von <1> 'Systemstart' im Startdialog wird der +Hintergrund aktiviert, was je nach Größe des Systems und Art des Hintergrundmedi­ +ums unterschiedlich lange dauert. + +#on("i")##on("b")##ib#Systemabschaltung#ie# :#off("b")##off("i")# +Bevor man den Rechner ausschaltet, sollte jedes EUMEL-System ordnungsgemäß +abgeschaltet werden. Das geschieht durch den Befehl 'shutup', den man in der Multi­ +user-Version von EUMEL im privilegierten Zweig des Taskbaumes erteilen muß. Nur +dann ist gewährleistet, daß der aktuelle Zustand Ihres Systems gesichert ist. + +Andernfalls gilt das System als abgebrochen, was daran zu erkennen ist, daß sich das +System beim nächsten Systemstart mit 'RERUN' meldet. Dann kann nur am letzten +Fixpunkt wieder aufgesetzt werden, und Ihre in letzter Zeit (normalerweise ca. 15 +Minuten) gesammelten Daten können verloren sein. + +Installation des EUMEL-Systems +#free (1.0)# + +#goalpage("a1")#A: Erforderliche Disketten + + - EUMEL-Systemdiskette : "Generierungseumel XY"#u#1)#e# + - EUMEL-Hintergrunddisketten : "HG0" ... "HGn" + - EUMEL-Archivdisketten : "std..." + - EUMEL-Archivdiskette : "XY" (Typabhängig) + - MS-DOS-Diskette : "EUMELstart" + +#foot# +1) XY steht für die Typbezeichnung eines Rechners wie: XT, AT, M24 usw. + Die Anzahl der ausgelieferten Disketten ist auch typabhängig, da z.B. + 'EUMELstart' nur benötigt wird, falls tatsächlich eine Partitionierung möglich ist. +#end# + +Die Diskette #goalpage("v1")##on("u")#"Generierungseumel XY"#off("u")# ist ein kleines, jedoch vollständiges EUMEL- +System. Auf diesem System laufen nach dem Hochfahren Programme ab, die im +Dialog mit dem Benutzer die Generierung einer oder mehrerer EUMEL-Partitionen +ermöglichen, diese Bereiche bezüglich schlechter Spuren untersuchen und das SHard +auf der jeweiligen Partition installieren. #on("b")#Bei der Generierung darf diese Diskette nicht +schreibgeschützt sein !#off("b")# + +Die #on ("u")#Hintergrunddisketten "HG0" ... "HGn"#off ("u")# beinhalten das eigentliche Betriebssystem +EUMEL. Es sind dies der Systemkern EUMEL-0 und die darauf aufbauenden Sy­ +stemteile (siehe Seite #topage("v2")#). + +Die #on ("u")#Standardarchivdisketten "std..."#off ("u")# beinhalten ELAN-Programmpakete und Fontta­ +bellen, die Sie nach erfolgter Installation des Betriebssytems z.B. zum Zwecke einer +Druckerinstallation oder erweiterter Rechenfunktionen benötigen werden. Sie finden +dazu detaillierte Informationen in Ihrem Benutzer- und Systemhandbuch. + +Die #on("u")#Archivdiskette "XY"#off ("u")# beinhaltet ELAN-Programmpakete, die Funktionen, die nicht +zu den Standardleistungen von EUMEL bzw. der vorliegenden SHard-Version zählen. + +Die Diskette #on("u")#"EUMELstart"#off("u")# ist eine MS-DOS Diskette und beinhaltet Kommando- +Dateien. Falls Sie auch eine MS-DOS Partition eingerichtet haben, dann gewährlei­ +sten diese das Aktivieren einer EUMEL Partition mit gleichzeitigem Systemstart von +MS-DOS aus. +#free (1.0)# + +#goalpage("a2")#B: Partitionieren der Festplatte / Installation des SHard + + +Wenn Sie bereits ein Betriebssystem auf Ihrer Festplatte installiert haben, müssen Sie +darauf achten, daß noch ausreichend Platz für ein EUMEL-System übrig ist. Da z.B. +MS-DOS standardmäßig die gesamte Festplatte belegt, muß dieses System gesi­ +chert, mit dem MS-DOS-Kommando 'fdisk' gelöscht und entsprechend kleiner neu +eingerichtet werden. Sie können auch bei der EUMEL-Installation alle bereits beste­ +henden Systeme löschen; dazu bietet Ihnen der Generierungseumel die Option +#on("i")#Löschen der gesamten Partitionstabelle #off("i")# an. Dabei gehen jedoch alle bestehenden +Daten verloren. Achten Sie also darauf, daß sie alle Daten vorher gesichert haben ! + +#on("u")##on("i")#Hinweis:#off("i")##off("u")# Bei Festplatten mit einer Kapazität über 32 Megabyte kann die Installa­ + tion des SHard zu Problemen führen (Fehlermeldung #on("i")#Platte kann nicht + gelesen werden#off("i")# bei der Suche nach schlechten Spuren). Richten Sie + daher Ihre EUMEL-Partition(en) auf den ersten 32 Megabyte ein. + +Um nun die Partitionierung für Ihr EUMEL-System vorzunehmen, legen Sie die +Diskette 'Generierungseumel' in das Boot-Laufwerk. Sollte die Diskette mit einer +Schreibschutzmarke versehen sein, dann müssen Sie diese vorher entfernen. + +Schalten Sie nun den Rechner ein bzw. betätigen Sie den Tastatur-RESET, wenn Ihr +Gerät bereits eingeschaltet ist, indem Sie die Tasten gleichzeitig +betätigen. + +Der Generierungseumel meldet sich zunächst mit folgender SHard-Meldung: + + + +____________________________________________________________________________ + +Setup - SHard für EUMEL auf XY und Kompatiblen V x.x +Copyright (C) 1985,86 +EUMEL wird vom Hintergrund geladen + +____________________________________________________________________________ + + + +Danach erscheinen die EUMEL-0 Meldungen zu HG-, RAM- und Pufferkapazität, +bezogen auf den Diskettenhintergrundes des Generierungseumel. + +#on("i")##on("u")#ACHTUNG:#off("u")##off("i")# Der Generierungseumel soll während des Speichertests (Sternchen) + nicht unterbrochen werden. Geschieht dies versehentlich doch, dann + fahren Sie fort, indem Sie im Startdialog die Taste <1> für Systemstart + betätigen. Dann wird normal mit der Installation fortgefahren. Wählen + Sie keinesfalls <2> 'neuen Hintergrund vom Archive laden', solange sich + die Diskette 'Generierungseumel' im Archivlaufwerk befindet. + +Nach dem Hochfahren des 'Generierungseumel' wird Ihnen eine Tabelle angezeigt, +der Sie entnehmen können, ob bereits Partitionen auf der Festplatte eingerichtet und +wie diese spezifiziert sind. + +Angezeigt werden neben Größe, Start- und Endspur der einzelnen Partitionen auch +eine Typ-Nr.; für EUMEL-Partitionen werden in aufsteigender Reihenfolge die +Typ-Nummern 69 bis 72, für MS-DOS je nach Größe der eingerichteten Partition +die Nummer 1 oder 4 vergeben. Die Typ-Nummern der eingerichteten Partitionen +sollten Sie sich merken, da diese Angaben später von Bedeutung sind, wenn das +Gesamtsystem für Partitionswechsel vorbereitet wird. Richten Sie mehrere EUMEL- +Partitionen ein, dann können Sie diese ausschließlich über die Typ-Nummern identi­ +fizieren ! + +Außerdem wird die gerade aktive Partition durch einen entsprechenden Eintrag in der +Tabelle kenntlich gemacht. #on("b")#"Aktiv" ist die Partition, die nach dem nächsten Einschal­ +ten des Rechners bzw. nach dem nächsten Tastatur-RESET gebootet würde.#off("b")# + +Sie können nun eine der folgenden Funktionen auswählen : + + - Generieren einer EUMEL-Partition + - Aktivieren einer Partition + - Löschen einer EUMEL-Partition + - Löschen der gesamten Partitionstabelle + - Generierung beenden + +Beim Generieren einer EUMEL-Partition werden lediglich Angaben zu Größe und +Startzylinder abgefragt. Dafür werden Vorgaben gemacht, die Sie bestätigen können, +indem Sie die Taste betätigen. + +Beim Neueinrichten orientiert sich die Vorgabe für die Partitionsgröße an dem größten +zusammenhängenden Freiraum auf Ihrer Platte, die Vorgabe für den Startzylinder +orientiert sich dann an dem kleinsten zusammenhängenden Freiraum, auf dem eine +Partition der gewählten Größe eingerichtet werden kann. + +#on("i")##on("u")#ACHTUNG:#off("u")##off("i")# Soll eine EUMEL-Version installiert werden, die nur 16 Megabyte + verwalten kann (1.7.3 bzw. 1.8.0), dann darf die Partition nicht größer + eingerichtet werden. Es kann hier keine generelle Aussage über die + Anzahl der zu reservierenden Spuren gemacht werden, da sehr ver­ + schiedene Plattenaufteilungen angeboten werden. Entnehmen Sie die + entsprechenden Angaben bitte dem Festplatten-Handbuch Ihres Hard­ + wareherstellers. + +Das Löschen einer EUMEL-Partition geschieht nur logisch, nicht physisch, das heißt +es wird nur der Eintrag in der Partitionstabelle gelöscht. Sollten Sie später an gleicher +Stelle eine neue Partition einrichten und vorher diesen Bereich physisch nicht über­ +schrieben haben, dann würde nach dem Hochfahren des Rechners das alte System +wieder gestartet. Die Meldung 'kein EUMEL-System gefunden'(siehe unten) erscheint +dann nicht. + +Haben Sie Ihre EUMEL-Partition(en) eingerichtet, dann achten Sie darauf, daß Sie +Ihren Generierungseumel ordnungsgemäß wieder verlassen, da es sich hier, wie +bereits erwähnt, um ein vollständiges EUMEL-System mit Fixpoint/Rerun-Logik +handelt. Das 'shutup' wird automatisch ausgeführt, wenn Sie die Funktion '0. Gene­ +rierung beenden' wählen. + +Wenn die Meldung 'ENDE' auf Ihrem Bildschirm erscheint, ist dieser Schritt der +Installation beendet. Sie haben nun eine (oder mehrere) EUMEL-Partitionen einge­ +richtet und das SHard installiert. Bitte entfernen Sie jetzt die Diskette 'Generierungs­ +eumel' aus dem Diskettenlaufwerk. +#free (1.0)# +Laden eines EUMEL-Hintergrundes + +#free(1.0)# +Im nächsten Schritt wird auf Ihrer Festplatte das EUMEL-System installiert, d.h. es +wird ein Hintergrund auf der Festplatte erzeugt. + +Dazu müssen Sie nach dem ordnungsgemäßen Beenden des Generierungseumel und +Entfernen der Diskette aus dem Laufwerk den Tastatur-RESET betätigen. Dies +geschieht entweder durch gleichzeitiges Betätigen der Tasten +auf der Tastatur oder durch AUS- und wieder EIN-Schalten des Rechners (Bitte +warten Sie einen Augenblick zwischen dem AUS- und EIN-Schalten). + +Das System meldet sich nach kurzer Zeit mit folgender SHard-Meldung: + + +____________________________________________________________________________ + +SHard für EUMEL auf XY, V x.x +Copyright (C) 1985,86 +kein EUMEL-System gefunden + +____________________________________________________________________________ + + + +Sie legen nun die Hintergrunddiskette HG0 in das Boot-Laufwerk und betätigen eine +Taste. + +Der Systemkern wird nun geladen und es erscheinen die bereits oben erwähnten +Angaben zu HG-, RAM- und Pufferkapazität, sowie zu den angeschlossenen +Kanälen, diesmal jedoch bezogen auf die eingerichtete Festplatten-Partition. Wäh­ +rend des Speichertests drücken Sie bitte erneut eine Taste, um in den Startdialog zu +gelangen und damit zu verhindern, daß EUMEL-0 versucht, das System zu starten. +Sollten Sie dies versäumen, so erscheint die Meldung 'HG ungültig'. Sie haben dann +erneut die Möglichkeit, durch Betätigen einer Taste in den Startdialog zu gelangen. + +Hier wählen Sie den Menupunkt <2> 'neuen Hintergrund vom Archiv laden' und bestä­ +tigen die Frage 'Alten Hintergrund überschreiben' mit für 'ja'. + +Es erscheint ein Zähler auf dem Bildschirm, der die gelesenen Blöcke anzeigt. Verteilt +sich Ihr Hintergrund auf mehrere Disketten, dann müssen Sie bei bei der Frage +'Neues HG-Archiv eingelegt' die nächste Diskette einlegen und mit # #off("i")# quittieren. +Bitte beachten Sie dabei genau die Numerierung der HG-Disketten ! + +Es können bei beschädigten Disketten Lesefehler auftreten; dann gibt das System +eine der Meldungen 'Harter Lesefehler' bzw. 'Softerror' aus. Bei letzterem konnte der +entsprechende Sektor nach mehrmaligem Versuch noch gelesen werden. Bei einem +harten Lesefehler können Sie die Diskette nicht verwenden. + +Wenn alle Disketten eingelesen sind, müssen Sie ein letztes mal den Tastatur- +RESET betätigen, um das System zu starten. Vergessen Sie nicht, vorher die Hinter­ +grunddiskette aus dem Diskettenlaufwerk zu entfernen. + +Wenn Sie jetzt während des Hochfahrens keine Taste drücken, dann startet der Lader +durch und das EUMEL-System meldet sich mit 'System aufgebaut'. Dies dauert +beim Auslieferungshintergrund wenige Sekunden, kann jedoch bei größeren Systemsi­ +cherungen auch mehrere Minuten in Anspruch nehmen; verlieren Sie dann bitte nicht +allzu schnell die Geduld. + +Da der Auslieferungs-Hintergrund unkonfiguriert ist, gelangt das System beim ersten +Hochfahren nach der Installation sofort in den 'configurator'. Sie müssen jetzt den +Kanal 1 entsprechend der vorhandenen Tastatur als "PC.german" oder "PC.ascii" +konfigurieren. Sollten Sie eine EUMEL-Version 1.7.3 benutzen und diesen Konfigura­ +tionsdatenraum nicht zur Verfügung haben, dann konfigurieren Sie den Kanal 1 als +"PC" und Terminal. Näheres dazu finden Sie im Systemhandbuch (Teil 1). +#page# + Die einzelnen Schritte der Installation im Überblick +#free (0.5)# +#linefeed(1.5)# + 1. Die Diskette 'Generierungseumel' in das Laufwerk stecken + 2. Rechner einschalten oder Tastatur-RESET mit , + 3. EUMEL-Partition einrichten + 4. Generierung beenden und auf 'ENDE'-Meldung warten + 5. Diskette 'Generierungseumel' entnehmen + 6. Tastatur-RESET + 7. Die Meldung 'Kein EUMEL-System gefunden' abwarten. Wenn die Meldung + 'EUMEL wird vom Hintergrund geladen' erscheint, dann weiter bei 9. + 8. Erste Hintergrunddiskette (HG0) einlegen und Taste drücken + 9. Beim Speichertest eine Taste betätigen, um in den Startdialog zu gelangen. + 10. Menupunkt <2> anwählen : Neuen Hintergrund vom Archiv laden + 11. Eventuell weitere HG-Disketten nach entsprechender Aufforderung einlegen + und mit quittieren + 12. Tastatur-RESET nach entsprechender Aufforderung + 13. Nach dem Hochfahren des Systems Konfiguration lt. Systemhandbuch + vornehmen + 14. Ggf. in der Task 'SYSUR' ELAN-Pakete für Partitionswechsel insertieren. + #linefeed (1.0)# + Dazu - Falls eine EUMEL-Version 1.7.3 benutzt wird, zunächst das + Kommando #on("i")#free global manager#off("i")# in der Task 'configurator' absetzen + - Archivdiskette "XY" einlegen und anmelden : #on("i")#archive �("XY")#off("i")# + - Datei "XY install" von Archivdiskette lesen : + #on("i")#fetch ("XY install", archive)#off("i")# + - Insertierung starten : #on("i")#run#off("i")# +Druckersoftware einrichten + +#free(0.5)# +Um mit Ihrem EUMEL-System einen Drucker betreiben zu können, müssen Sie +außer dem Anschluß des Druckers mit einem passenden Kabel auch die passende +Software für diesen Drucker zur Verfügung stellen. Zu diesem Zweck dienen die +Druckeranpassungen. + +Das Standardarchive "std.printer" enthält Druckeranpassungen für die Ansteuerung +diverser gebräuchlicher Druckertypen. Soll einer dieser Drucker an das EUMEL- +System angeschlossen werden, so muß zuerst eine Task "#ib#PRINTER#ie#" als Sohntask +von "SYSUR" mit dem Supervisorkommando + +#linefeed (1.18)# + begin ("PRINTER", "SYSUR") +#linefeed (1.0)# + +eingerichtet werden. In dieser Task müssen dann die folgenden Schritte vollzogen +werden: + +- Archiv anmelden: +#linefeed (1.18)# + archive ("std.printer") +#linefeed (1.0)# + +- Druckeranpassung vom Archiv holen: +#linefeed (1.18)# + fetch ("printer.druckertyp", archive) +#linefeed (1.0)# + +- Zeilennummergenerierung bei der Insertierung abschalten: +#linefeed (1.18)# + check off +#linefeed (1.0)# + +- Druckeranpassung insertieren: +#linefeed (1.18)# + insert ("printer.druckertyp") +#linefeed (1.0)# + +Beispiel: +#linefeed (1.18)# + archive ("std.printer") + fetch ("printer.epson.fx", archive); + check off; + insert ("printer.epson.fx") +#linefeed (1.0)# + +Nach der Insertierung wird zuerst nach dem #ib#Druckerkanal#ie# gefragt. Dieser sollte mit +der Gerätetabelle 'transparent' konfiguriert sein. Dann werden ggf. druckerspezifische +Fragen zur Papierbreite, Positionierungsart oder ähnlichem gestellt, die mit 'j' oder 'n' +beantwortet werden müssen. Dabei werden alle Alternativantworten zu der jeweili­ +gen Frage hintereinander angeboten, bis eine Alternative mit 'j' beantwortet wird. + +Als letzter Schritt kommt die Aufforderung das Archiv mit der passenden Fonttabelle +einzulegen. Diese Fonttabelle, eine Beschreibung aller darstellbaren Zeichen in allen +druckbaren Schrifttypen, ist meistens auf derselben Diskette wie die Druckeranpas­ +sung. + +Wenn die Generierung beendet ist, muß im Multi-User Betrieb in allen bestehenden +Tasks - insbesondere in der Task 'PUBLIC' - die Fonttabelle mit dem fonttable- +Kommando eingestellt werden. + +Beispiel: + +#linefeed (1.18)# + fonttable("fonttab.epson.fx") +#linefeed (1.0)# + +Von jeder Task aus kann danach mit dem Kommando + +#linefeed (1.18)# + print ("dateiname") +#linefeed (1.0)# + +wird eine Datei ausgedruckt werden. + +Das Einstellene einer Fonttabelle ist insbesondere Voraussetzung für 'lineform', 'page­ +form' etc. + +Befindet sich keine passende Druckeranpassung für den anzuschließenden Drucker­ +typ auf dem Standardarchiv "std.printer", so sollte die Druckeranpassung "printer.std" +benutzt werden. Diese Druckeranpassung ist eine universelle Druckeranpassung für +alle Drucker, die mit ASCII-Code 13 ein 'Carriage Return' (d.h. Bewegung des +Druckkopfes an den linken Rand) und mit ASCII-Code 10 eine Zeilenschaltung von +1/6 Zoll vornehmen. Mit ihr kann dann in einem Schrifttyp (entweder 10 oder 12 +Zeichen pro Zoll, je nachdem welche Fonttabelle eingestellt ist) gedruckt werden. So +erhält man wenigstens eine Minimalansteuerung des Druckers. + + + +Druckersoftware im Single-User einrichten + + +Die Installation der Druckersoftware im Single-User erfolgt ähnlich wie die im Mul­ +ti-User. Hier brauchen nur die Schritte durchgeführt zu werden, die im Multi-User +in der Task "PRINTER" druchgeführt werden müssen. Eine Task "PRINTER" braucht +nicht eingerichtet zu werden. + diff --git a/doc/warenhaus/Anhang Warenhaus b/doc/warenhaus/Anhang Warenhaus new file mode 100644 index 0000000..9388ceb --- /dev/null +++ b/doc/warenhaus/Anhang Warenhaus @@ -0,0 +1,65 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (100)# +#headodd# +#center#gs-Warenhaus#right#% + +#end# +#headeven# +%#center#gs-Warenhaus + +#end# +#center#1 + +#center##on("b")##Anhang#off("b")# + +#on("b")##center#Muster für Codekarten#off("b")# + + +-------------------+ + | O O O O O O O O | + | | + | | + | | + | | + | | + | | + | | + | ----------------- | + +-------------------+ + + + + +--------------------+ + | | + | O O O O | + | | + | | + |W A R E N K A R T E | + | | + | | + | Artikel | + | ---------------- | + | | + +--------------------+ + +#page# + + + +------------------------+ + | | + | O O O O O O | + | | + | K U N D E N K A R T E | + | | + | | + | Name | + | ---------------------- | + | | + | | + +------------------------+ + + + + + + diff --git a/doc/warenhaus/Inhalt Warenhaus b/doc/warenhaus/Inhalt Warenhaus new file mode 100644 index 0000000..a9b720d --- /dev/null +++ b/doc/warenhaus/Inhalt Warenhaus @@ -0,0 +1,50 @@ +#limit (11.5)##pagelength (16.5)##pageblock# +#start (1.8,0.0)# +Inhaltsverzeichnis + + +1 Was kann gs-Warenhaus 1-1 + +2 Aufbau von gs-Warenhaus 2-1 + +3 Installation von gs-Warenhaus 3-1 +3.1 Voraussetzungen 3-1 +3.2 Lieferumfang 3-1 +3.3 Installation 3-2 +3.4 Einrichten mehrerer Hauptstellen 3-8 + +4 Anschluß eines Codekartenlesers 4-1 +4.1 Hardware-Voraussetzungen 4-1 +4.2 Verwendung des MUFI 4-2 +4.2.1 Einstellungen am MUFI 4-3 +4.2.2 MUFI im Terminalkanal 4-5 +4.2.3 MUFI als Endgerät 4-6 +4.3 Verwendung des AKTRONIC-Adapters 4-7 +4.4 Konfiguration der seriellen Schnittstelle 4-8 +4.5 Verbindung der Hardware-Komponenten 4-10 + +5 Beschreibung der Menufunktionen 5-1 +5.1 Kurzhinweise zur Bedienung des Menus 5-1 +5.2 Menufunktionen zum Oberbegriff 'Info' 5-4 +5.3 Menufunktionen zum Oberbegriff 'Eingabeart' 5-7 +5.4 Menufunktionen zum Oberbegriff 'Kommandos' 5-9 +5.5 Menufunktionen zum Oberbegriff 'Programme' 5-18 +5.6 Menufunktionen zum Oberbegriff 'Filialdaten' 5-24 +5.7 Menufunktionen zum Oberbegriff 'Archiv' 5-28 + +6 Beschreibung der Programmierschnittstelle 6-1 +6.1 Schreibweisen und Syntaxregeln in GRIN-Programmen 6-4 +6.2 Kontrollstrukturen 6-8 +6.3 Detailbeschreibung der Warenhaus-Grundbefehle 6-13 + +7 Weitere Kommandos (für Systembetreuer) 7-1 + +Anhang: Muster für Codekarten + + + + + + + + diff --git a/doc/warenhaus/gs-Warenhaus handbuch.impressum b/doc/warenhaus/gs-Warenhaus handbuch.impressum new file mode 100644 index 0000000..3fbb371 --- /dev/null +++ b/doc/warenhaus/gs-Warenhaus handbuch.impressum @@ -0,0 +1,89 @@ +____________________________________________________________________________ + + +#on("b")##on ("u")# +#center#Betriebssystem E U M E L +#off ("u")# + + +#center#gs-Warenhaus + + + + +#off("b")# +#center#Lizenzfreie Software der +#on ("b")# + +#center#Gesellschaft für Mathematik und Datenverarbeitung mbH, +#center#5205 Sankt Augustin + + +#off("b")# +#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für +#center#nichtkommerzielle Zwecke gestattet. + +#center#Gewährleistung und Haftung werden ausgeschlossen + + +____________________________________________________________________________ +#page# + +#free (4.0)##on("b")# +#center#gs-Warenhaus + + +#center#Benutzerhandbuch + + +#center#Version 1.0 + + +#off("b")##center#copyright +#center#Eva Latta-Weber +#center#Software- und Hardware-Systeme, 1988 +#center#ERGOS GmbH, 1990 +#page# +#block# +#center#____________________________________________________________________________ + + +Copyright:  ERGOS GmbH   März 1990 + + Alle Rechte vorbehalten. Insbesondere ist die Überführung in + maschinenlesbare Form sowie das Speichern in Informations­ + systemen, auch auszugsweise, nur mit schriftlicher Einwilligung + der ERGOS GmbH gestattet. + + +#center#____________________________________________________________________________ + +Es kann keine Gewähr übernommen werden, daß das Programm für eine +bestimmte Anwendung geeignet ist. Die Verantwortung dafür liegt beim +Anwender. + +Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrektheit und +Vollständigkeit der Angaben kann keine Gewähr übernommen werden. Das +Handbuch kann jederzeit ohne Ankündigung geändert werden. + +Texterstellung :  Dieser Text wurde mit der ERGOS-L3 Textverarbeitung + erstellt und aufbereitet und auf einem Kyocera Laser­ + drucker gedruckt. + + + + +#center#___________________________________________________________________________ + + + +Ergonomic Office Software GmbH + +Bergstr. 7 Telefon: (02241) 63075 +5200 Siegburg Teletex: 2627-2241413=ERGOS + Telefax: (02241) 63078 + + +#center#____________________________________________________________________________ + + diff --git a/doc/warenhaus/gs-Warenhaus-1 b/doc/warenhaus/gs-Warenhaus-1 new file mode 100644 index 0000000..ca79094 --- /dev/null +++ b/doc/warenhaus/gs-Warenhaus-1 @@ -0,0 +1,124 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (3)# +#headodd# +#center#gs-warenhaus#right#% + +#end# +#headeven# +%#center#gs-warenhaus + +#end# +#center#1  Was kann gs-Warenhaus + + +Das Programmpaket #on("b")#gs-Warenhaus#off("b")# entstand auf der Grundlage der projekt­ +orientierten Unterrichtseinheit "WARENHAUS", die vom 'Landesinstitut für Schule +und Weiterbildung' (LSW) in Soest für den Bereich der 'Informations- und +kommunikationstechnologischen Grundbildung' (kurz: GRIN) entwickelt wurde. + +Unter #on("b")#1.1 Thema und Ziele #off("b")# ist in dem zugehörigen Begleitheft folgendes zu +finden: + +#i1#"Die Schülerinnen und Schüler sollen in dieser Unterrichtseinheit die An­ +wendungen neuer Technologien im Warenhaus kennenlernen und dabei sowohl +die grundlegenden technologischen Zusammenhänge erarbeiten als auch die +Auswirkungen reflektieren, die sich durch ihren Einsatz ergeben. Sie werden +dabei nicht nur die Rolle der Kunden einnehmen, sondern auch die Interessen +der Angestellten und die der Geschäftsleitung in ihre Beurteilung mit einbe­ +ziehen. + +Diese komplexen Zusammenhänge werden den Schülerinnen und Schülern im 8. +Schuljahr nähergebracht, indem sie veranlaßt werden, in einem Modell-Waren­ +haus selbst schrittweise das Modell eines Warenwirtschaftssystems aufzubauen +und damit zu arbeiten. + +In diesem Modell-Warenhaus kommt dem Umgang mit dem Computer eine +besondere Bedeutung zu. Mit Hilfe des Rechners, an den ein Codekartenleser +angeschlossen ist, und des zugehörigen Programms werden die wesentlichen +Bestandteile eines modernen Kassensystems abgebildet. + +Mit dem Codekartenleser kann das Merkmal des automatischen Dateneinlesens +vereinfacht dargestellt werden. Programmabläufe, Bildschirmausgaben werden +nicht nur über Tastatureingaben der Benutzer beeinflußt, sondern auch durch +das Lesen verschlüsselter Informationen. Am Beispiel des Lesegerätes wird zum +#page# +einen der Rationalisierungseffekt an der Kasse verdeutlicht, es lassen sich zum +anderen aber auch Fragen der Zugangsberechtigung durch maschinenlesbare +Ausweiskarten ansprechen. + +Das zur Verfügung stehende Programm erlaubt es, daß die Schülerinnen und +Schüler schrittweise die zentralen Funktionen eines modernen Warenwirtschafts­ +systems kennenlernen. Neben der maschinellen Datenerfassung mit Hilfe des +Lesegeräts und der Decodierung von Informationen sind dies z.B.: + +- automatische Abrechnung, +- Speicherung von Warendaten, +- Kontrolle des Lagerbestandes, +- Informationen über Verkaufszahlen, +- automatische Nachbestellung, +- Speicherung von Kundendaten, +- Zusammenfassung von Informationen aus verschiedenen Filialen, +- Erstellen von Übersichten. + +Die Schülerinnen und Schüler arbeiten dabei mit einer benutzerfreundlichen +Programmierumgebung. Diese bietet einerseits die Möglichkeit, die Befehle direkt +aufzurufen, mit denen alle Funktionen dieses vereinfachten Warenwirtschafts­ +systems ausgeführt werden können, wie etwa Dateien aufbauen, einkaufen und +Listen erstellen. Andererseits stellt die Programmierumgebung weitere Befehle +zur Verfügung, mit denen einige dieser Funktionen auch 'programmiert' werden +können."#off("b")# + +Soweit zu Thema und Zielen dieser Unterrichtseinheit. Für weitere didaktisch- +methodische Informationen zu dieser Reihe verweisen wir auf das entsprechende +Begleitheft des LSW. +(Vertrieb: Soester Verlagskontor, Jakobistraße 46, 4770 Soest; Bestellnummer 1710) +#page# +Da bei der Software-Entwicklung für GRIN vom LSW das Betriebssystem EUMEL nicht +mit berücksichtigt wird, erscheint es notwendig, durch Eigeninitiativen wenigstens +einige GRIN - Projekte unter EUMEL zur Verfügung zu stellen, um den Schulen, die +mit EUMEL arbeiten, nicht gänzlich den Zugang zu GRIN zu verwehren. + +Das Projekt WARENHAUS bietet sich dabei besonders an, weil die Vernetzungen +innerhalb eines Warenwirtschaftssystems mit einem Mehrplatz-System und der +Möglichkeit der Intertask-Kommunikation wesentlich wirklichkeitsnäher aufzeigbar +sind als mit einem reinen Einzelplatz-System wie z.B. MS DOS, bei dem die +Kommunikation nur über den Transport von Disketten geregelt wird. (Ein Netzwerk +ist in der Software der LSW nicht vorgesehen.) + +#on("b")#gs-Warenhaus#off("b")# umfaßt die wesentlichen Funktionen der vom LSW für MS DOS +erstellten Programmierumgebung WARENHAUS-2. Es ist jedoch keine genaue 'Nach­ +bildung' dieser Software, sondern eher eine Realisierung des 'Vorbildes' unter +Berücksichtigung der besonderen Gegebenheiten des EUMEL-Systems, wobei sowohl +am äußeren Erscheinungsbild als auch inhaltlich Änderungen und Erweiterungen +vorgenommen wurden. Eingebettet ist #on("b")#gs-Warenhaus#off("b")# in die menüorientierte +Benutzerschnittstelle #on("b")#gs-DIALOG#off("b")#. + +Ein Codekartenleser kann in Verbindung mit einem Interface (z.B. dem MUFI der +Firma BICOS) verwendet werden, ist für die Nutzung des Programmes aber nicht +unbedingt erforderlich. + +Da zur Zeit der Entstehung dieses Programms GRIN an den Schulen noch nicht +etabliert ist und man mit (vorerst) nur einem Projekt dem Ansatz von GRIN sicher +nicht gerecht werden kann, ist #on("b")#gs-Warenhaus#off("b")# flexibel angelegt. Es enthält neben +einer Programmierumgebung, in der die vom LSW für GRIN entwickelten Befehle und +Syntaxregeln benutzt werden, eine weitere, in der in gewohnter ELAN-Syntax ge­ +arbeitet werden kann, so daß es z.B. ebenfalls für den Unterricht in Klasse 9/10 (für +spezielle Fragestellungen evtl. auch in der Sek. II) verwendbar ist. +#page# +Natürlich ist #on("b")#gs-Warenhaus#off("b")# #i1#kein#off("b")# Verwaltungsprogramm für 'echte' Warenhäuser +oder gar ganze Warenwirtschaftssysteme, es ist vielmehr ein Simulationsprogramm, +das die Vorgänge in solch einem System anhand eines stark vereinfachten Modells +klarmachen soll. Aus diesem Grunde werden Ihnen beim Umgang mit diesem Pro­ +gramm wahrscheinlich eine ganze Reihe von Erweiterungsmöglichkeiten und +Funktionen einfallen, die das Programm nicht bietet. Denken Sie dabei bitte aber +immer daran, daß #on("b")#gs-Warenhaus#off("b")# in erster Linie für den Einsatz in GRIN oder im +WP-Unterricht konzipiert wurde, vornehmlich also von absoluten 'Anfängern' auf dem +Gebiet des Umgangs mit Rechnern genutzt wird, die von einer zu großen Fülle von +Programmfunktionen nur verwirrt würden. + +Wir werden Ihnen in den folgenden Kapiteln dieses Handbuchs den Umgang mit den +Funktionsangeboten von #on("b")#gs-Warenhaus#off("b")# erklären, auf die Umsetzungsmöglichkeiten +der am Anfang dieses Kapitels erwähnten Ziele im Unterricht gehen wir jedoch nicht +ein. Beschaffen Sie sich dafür bitte das bereits oben angegebene Begleitheft des LSW. + diff --git a/doc/warenhaus/gs-Warenhaus-2 b/doc/warenhaus/gs-Warenhaus-2 new file mode 100644 index 0000000..f3f1284 --- /dev/null +++ b/doc/warenhaus/gs-Warenhaus-2 @@ -0,0 +1,72 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (5)# +#headodd# +#center#gs-warenhaus#right#% + +#end# +#headeven# +%#center#gs-warenhaus + +#end# +#center##on("b")#2  Aufbau von gs-Warenhaus#off("b")# + +#on("b")#gs-Warenhaus#off("b")# bietet die Möglichkeit, nicht nur #us#ein#use# Warenhaus, sondern eine +Warenhaus-Kette im Modell nachzubilden. Solch eine Warenhauskette besteht hier +stets aus einer #us#Hauptstelle#use# und einer oder mehrerer (bis zu 10) #us#Filialen#use#. Damit die +Filialen auf die zentralen Daten der Warenhauskette zugreifen können, verfügt jede +Hauptstelle über eine #us#Zentrale#use#, die jederzeit angerufen werden kann. Für die +Kommunikation untereinander gehört zu jeder Filiale eine (Filial-) #us#Verwaltung#use#, bei +der die aktuellen Filialdaten erfragt werden können. + + +Realisiert wird dieser Aufbau durch verschiedene Tasks und der Möglichkeit der +Intertask-Kommunikation. Unter einer Task, in der #on("b")#gs-Warenhaus#off("b")# insertiert ist, +können eine oder mehrere Tasks als Hauptstellen angemeldet werden (siehe '3.3 +Installation' und '7 Weitere Kommandos'). So kann man z.B. für verschiedene +Klassen gleichzeitig Warenhausketten einrichten. Zu beachten ist, daß verschiedene +Ketten untereinander völlig unabhängig sind und dadurch #us#nicht#use# miteinander +kommunizieren können. + + +Jede Hauptstellen-Task richtet sich automatisch eine Sohn-Task als Zentrale ein. +Werden nun Sohn-Tasks einer Hauptstellen-Task angemeldet, so werden diese zu +Filialen der entsprechenden Hauptstelle, wobei ihnen automatisch eine Filialnummer +zugeteilt wird, die identisch ist mit der Kanalnummer des benutzten Terminals. +(Steht keine Mehrplatzanlage zur Verfügung, so läßt sich nur #us#eine#use# Filiale einrichten; +die Filialnummer ist dann in der Regel 1.) + + +Die Filial-Tasks ihrerseits legen beim Starten von #on("b")#gs-Warenhaus#off("b")# automatisch jeweils +eine Sohn-Task als (Filial-) Verwaltung an. +#page# +Insgesamt ergibt sich folgender schematischer Aufbau (die Pfeile zeigen die +Kommunikationsmöglichkeiten an): + + +#on("b")# + W A R E N H A U S + / | \ + Hauptstelle A Hauptstelle B Hauptstelle C . . . + + / | \ +Zentrale A Filiale A1 Filiale A2 . . . + ^ + | + | Verwaltg.A1 Verwaltg.A2 . . . + | ^ ^ + | | | + --------------------------- . . . +#off("b")# + + + + + + + + + + + + diff --git a/doc/warenhaus/gs-Warenhaus-3 b/doc/warenhaus/gs-Warenhaus-3 new file mode 100644 index 0000000..ffef881 --- /dev/null +++ b/doc/warenhaus/gs-Warenhaus-3 @@ -0,0 +1,309 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (7)# +#headodd# +#center#gs-Warenhaus#right#% + +#end# +#headeven# +%#center#gs-Warenhaus + +#end# +#center#1 + +#center##on("b")#3  Installation von gs-Warenhaus#off("b")# + + +Bevor Sie #on("b")#gs-Warenhaus#off("b")# auf Ihrem Computer benutzen können, müssen Sie das +Programm zunächst installieren. Wenn #on("b")#gs-Warenhaus#off("b")# auf Ihrem System schon zur +Verfügung steht, können Sie dieses Kapitel ruhig überspringen. + + + +#on("b")#3.1  Voraussetzungen#off("b")# + +Um #on("b")#gs-Warenhaus#off("b")# auf Ihrem Computer betreiben zu können, muß das EUMEL- +Betriebssystem installiert sein. #on("b")#gs-Warenhaus#off("b")# setzt die Multi-User-Version voraus +und ist lauffähig ab Version 1.8.0. #on("b")#gs-Warenhaus#off("b")# setzt weiterhin voraus, daß auf +Ihrem Computer bereits das Programm #on("b")#gs-DIALOG#off("b")# (ab Version 1.1) installiert ist. + + + +#on("b")#3.2  Lieferumfang#off("b")# + +#on("b")#gs-Warenhaus#off("b")# wird auf einer Diskette geliefert, die alle notwendigen Programme +enthält (die Installation von #on("b")#gs-DIALOG#off("b")# wird dabei vorausgesetzt!). Um den Inhalt +der Diskette feststellen zu können, starten Sie Ihr System und bringen es dazu, daß +'gib kommando:' erscheint. Dann legen Sie die Diskette ein und geben das +Kommando: + + +#on("b")#archive("gs-Warenhaus"); list(archive); release(archive) #off("b")# +#page# +Anschließend erscheint eine Übersicht der auf dem Archiv vorhandenen Programme. +Folgende Dateinamen sollten sich in der Übersicht befinden: + + "gs-MENUKARTE:Warenhaus" + "gs-Warenhaus 0: ohne Kartenleser" + "gs-Warenhaus 0: mit Kartenleser an AKTRONIC-Adapter" + "gs-Warenhaus 0: mit Kartenleser an MUFI als Endgerät" + "gs-Warenhaus 0: mit Kartenleser an MUFI im Terminalkanal" + "--------------------------------------------" + "gs-Warenhaus 1" + "gs-Warenhaus 2" + "gs-Warenhaus 3" + "gs-Warenhaus 4" + "gs-Warenhaus 5" + "gs-Warenhaus/gen" + +Eventuell können noch weitere Namen auf der Diskette vorhanden sein. Wenn Sie den +Inhalt der Diskette kontrolliert haben und diese Dateien auf der Diskette vorhanden +sind, können Sie #on("b")#gs-Warenhaus#off("b")# installieren. + +Sollten Sie statt der Übersicht eine Fehlermeldung erhalten, überprüfen Sie bitte, ob +die Diskette das richtige Format besitzt oder ob Ihr Diskettenlaufwerk Probleme +macht. Sollten dagegen Programme fehlen, so reklamieren Sie die Diskette. + + + +#on("b")#3.3  Installation#off("b")# + +#on("b")#gs-Warenhaus#off("b")# muß in einer Task installiert werden, in der bereits das Programm +#on("b")#gs-DIALOG#off("b")# zur Verfügung steht. Alle Söhne und Enkel der neuen Task können +anschließend das Warenhaus-Modell aufrufen. Richten Sie also eine Task als Sohn +#page# +der Task ein, in der auf Ihrem Computer bereits #on("b")#gs-DIALOG#off("b")# installiert ist. Wir +nehmen hier an, daß #on("b")#gs-DIALOG#off("b")# in der Task 'MENU' installiert ist und die neue +Task den Namen 'WARENHAUS' erhalten soll. (Sie können für die Task auch einen +beliebigen anderen Namen wählen): + +#on("b")# + (Supervisor - Taste) + +#off("b")# + --> gib supervisor kommando: +#on("b")# + begin ("WARENHAUS","MENU") +#off("b")# + + --> gib kommando: + +(Arbeiten mehrere Personen mit dem Computer, dann ist es sinnvoll, diese Task vor +unbefugtem Zugriff durch ein Passwort zu schützen. Wie das gemacht wird, können +Sie in Ihrem EUMEL-Benutzerhandbuch erfahren.) + +Legen Sie dann die Archivdiskette ein, auf der sich #on("b")#gs-Warenhaus#off("b")# befindet, und +geben Sie die folgenden Kommandos: + +#on("b")# + archive ("gs-Warenhaus") + + fetch (ALL archive, archive) + + release (archive) + + run ("gs-Warenhaus/gen") +#off("b")# + +Sie haben damit das Installationsprogramm gestartet und können die Diskette wieder +aus dem Laufwerk nehmen. (Natürlich können Sie die Dateien auch mit Hilfe von +#on("b")#gs-DIALOG#off("b")# von der Diskette holen. Achten Sie dann bitte darauf, daß sie #on("b")#alle#off("b")# oben +angegebenen Dateien von der Diskette in Ihre Task holen). +#page# +Zunächst werden Sie nun aufgefordert, eine Interface-Anpassung für den Codekarten­ +leser auszuwählen. Dazu erscheint das folgende Menu auf dem Bildschirm: + ++----------------------------------------------------------------------+ +|center#Auswahl einer Interface-Anpassung für den Codekartenleser | +|center#Wenn kein Kartenleser benutzt wird, tippen! | +| | +| Auswahl  e i n e r  Datei durch Ankreuzen | +| | +| ==> � gs-Warenhaus 0: mit Kartenleser an AKTRONIC-Adapter | +| � gs-Warenhaus 0: mit Kartenleser an MUFI als Endgerät | +| � gs-Warenhaus 0: mit Kartenleser an MUFI im Terminalkanal | +| | +| | +| | +| | +| Info:  Fertig:  Abbrechen:  | +| | ++----------------------------------------------------------------------- +Soll kein Kartenleser benutzt werden, tippen Sie einfach . Sonst fahren +Sie den Pfeil mit den Cursor-Tasten in die gewünschte Zeile und drücken +. Welche der angegebenen Anpassung für welchen Zweck die geeignete +ist, wird in Kapitel 4 ("Anschluß eines Codekartenlesers") genauer beschrieben. + +Daraufhin wird die Installation automatisch durchgeführt. Haben Sie die Anpassung +für den 'AKTRONIC-Adapter' oder für das 'MUFI als Endgerät' ausgewält, so erscheint +nach der Insertierung dieser Datei die Aufforderung + +#center##on("b")#Gib Interface-Kanal:#off("b")# + +Hier muß angegeben werden, an welchen Kanal (serielle Schnittstelle) das Interface +angeschlossen werden soll (vgl. wiederum Kapitel 4). Der Interface-Kanal läßt sich +auch später noch umstellen (vgl. Kapitel 7). + +Wenn der Insertierungs-Vorgang abgeschlossen ist, müssen Sie noch einige Fragen +beantworten: + +#on("b")#Frage 1:#off("b")# #on("b")#Version für GRIN (j/n)?#off("b")# + +Tippen Sie hier ein , so werden später in der Programmierumgebung die +'Soester' Befehle und Syntax-Regeln benutzt, ein liefert die Programmier­ +umgebung für ELAN. Die Versions-Einstellung kann auch noch später geändert +werden (vgl. Kapitel 7, Befehl 'grin'). + +#on("b")#Frage 2:#off("b")# #on("b")#Soll diese Task Warenhaus-Hauptstelle sein (j/n)?#off("b")# + +Das Tippen von macht Ihre momentan benutzte Task zur (einzigen!) Waren­ +haus-Hauptstelle; Sie können dann (nach Beantwortung mindestens einer weiteren +Frage, s.u.) in Söhnen dieser Task das Warenhaus-Programm starten. Allerdings ist es +dann nicht mehr möglich, Sohntasks dieser Task zu Hauptstellen zu machen! + +Möchten Sie aber mehrere Hauptstellen (evtl. für verschiedene Lerngruppen) ein­ +richten, so müssen Sie hier ein tippen. In diesem Fall ist die Installation +zunächst beendet und es erscheint der EUMEL-Eingangsbildschirm. Was Sie dann +noch tun müssen, erfahren Sie in Kapitel 3.4; die folgenden Ausführungen können +Sie überschlagen. + +#on("b")#Frage 3:#off("b")# #on("b")#Mit Direktstart (j/n)?#off("b")# + +Wenn Sie vor dem Benutzer die 'gib kommando:'-Ebene verbergen wollen, können +Sie das System durch Tippen eines so einstellen, daß sich sofort nach Ein­ +richten einer Sohntask das Menusystem meldet. Für den Anfänger kann das die +Arbeit durchaus erleichtern. Wenn Sie das nicht möchten, tippen Sie hier ein . +Haben Sie die Frage mit beantwortet, so erscheint noch eine (letzte) Abfrage: + +#on("b")#Frage 4:#off("b")# #on("b")#Mit automatischem Löschen (j/n)?#off("b")# + +Durch Tippen eines legen Sie fest, daß in den Sohntasks nach Verlassen des +Menus die jeweilige Task automatisch gelöscht wird. Tippen Sie ein , dann wird +nach Verlassen des Menus angefragt, ob die Task gelöscht werden soll. Wird die Frage +bejaht, wird gelöscht - sonst wird die Task abgekoppelt (break) und kann durch +'continue' wieder angekoppelt werden. + +#on("b")#Anmerkung:#off("b")# In Tasks, in denen Sie die Frage nach dem Direktstart mit beant­ +wortet haben, sollte nicht das Kommando 'monitor' gegeben werden, da Sie durch +dieses Kommando auch diese Task zu einer Task machen, die sich direkt mit dem +Menu meldet und ggf. bei Verlassen des Menus automatisch gelöscht wird! + + +Nachdem der EUMEL-Eingangsbildschirm zu sehen ist, können Sie nun #on("b")#gs-Waren­ +haus#off("b")# starten. Nehmen wir an, die Task 'WARENHAUS' sei Hauptstellen-Task. Sie ist +damit automatisch Managertask, Sie können also Sohntasks anmelden: + +#on("b")# + (Supervisor - Taste) + +#off("b")# + --> gib supervisor kommando: +#on("b")# + begin ("Test","WARENHAUS") +#off("b")# + +Statt 'Test' können Sie der Sohntask natürlich auch einen beliebigen anderen Namen +geben. Wenn Sie einen Direktstart eingerichtet haben, erscheint nun sofort das +#on("b")#gs-DIALOG#off("b")#-Emblem. + + +------------------------+ + | gs-DIALOG | + +---------------------------+ | + | Version 1.1 | | + +-----------------------------+ | | + | (C) 1987/88 Eva Latta Weber | | | + +-------------------------------+ | |-----+ + | (C) 1988 ERGOS GmbH | | | + | | |---+ + +------------------------------+ | | + | gggggggg ssssssss | |-------+ + | ggg sss sss | | + | ggg sss | --------+ + | ggg gggg ssssssss | + | ggg ggg sss | + | ggg ggg sss | + | gggggggggg sssssssss | + +------------------------------+ + + W A R E N H A U S + + Filiale 1 +#off("b")# +Andernfalls erscheint + +#on("b")# + gib kommando: +#off("b")# + +Mit dem Kommando + + #on("b")#warenhaus #off("b")# + +starten Sie #on("b")#gs-Warenhaus#off("b")# und erhalten zunächst ebenfalls das obige Emblem auf +dem Bildschirm. Links unten sehen Sie, unter welcher Filialnummer diese Task nun +von #on("b")#gs-Warenhaus#off("b")# geführt wird. Diese Nummer ist identisch mit der Kanalnummer, +unter der das EUMEL-System Ihren Arbeitsplatz verwaltet. + +Kurze Zeit später erscheint das WARENHAUS-Eingangsmenu. Wie Sie nun weiter mit +#on("b")#gs-Warenhaus#off("b")# arbeiten können, erfahren Sie in Kapitel 5. + + + +#on("b")#3.4  Einrichten mehrerer Hauptstellen#off("b")# + +Wir gehen hier davon aus, daß Sie die Installation von #on("b")#gs-Warenhaus#off("b")# gemäß den +Beschreibungen in Kapitel 3.3 bereits durchgeführt und dabei die Frage 2 ("Soll diese +Task Warenhaus-Hauptstelle sein (j/n)?") mit 'nein' beantwortet haben. (Falls Sie +Frage 2 mit 'ja' beantwortet haben und nun den Hauptstellen-Status der Task wieder +rückgängig machen wollen, so lesen Sie zunächst in Kapitel 7 nach.) + +Die Task, in der die Installation stattfand (wir nehmen weiterhin an, daß sie den +Namen 'WARENHAUS' hat), wurde automatisch zur Managertask, das heißt, daß +Söhne von ihr eingerichtet werden können. Bevor Sie in diesem Fall das Programm +nutzen können, müssen Sie nun noch mindestens eine Sohntask zur Hauptstelle +machen. Gehen Sie dabei folgendermaßen vor: + +#on("b")# + (Supervisor - Taste) + +#off("b")# + --> gib supervisor kommando: +#on("b")# + begin ("Hauptstelle A","WARENHAUS") +#off("b")# + + --> gib kommando: + + +Mit dem Kommando + +#center##on("b")#warenhaus hauptstelle (TRUE) #off("b")# + +wird die Task 'Hauptstelle A' zur Warenhaus-Hauptstelle. + +Zu beantworten sind dabei eine oder zwei Fragen; es sind dieselben, die auftauchen, +wenn bei der Abfrage 'Soll diese Task Warenhaus-Hauptstelle sein (j/n)?' ein +getippt wird. Lesen Sie deshalb nun weiter in Kapitel 3.3 bei der Frage 3: 'Mit Direkt­ +start (j/n)?'. + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/warenhaus/gs-Warenhaus-4 b/doc/warenhaus/gs-Warenhaus-4 new file mode 100644 index 0000000..2c5d7dc --- /dev/null +++ b/doc/warenhaus/gs-Warenhaus-4 @@ -0,0 +1,378 @@ +limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (11)# +#headodd# +#center#gs-Warenhaus#right#% + +#end# +#headeven# +%#center#gs-Warenhaus + +#end# +#center#1 + +#center# #on("b")#4  Anschluß eines Codekartenlesers#off("b")# + + +Ein 'echter' Scanner oder Barcodeleser ist als automatisches Lesegerät für den Ein­ +satz im Unterricht nicht geeignet und kann unter EUMEL/ELAN unseres Wissens nach +auch nicht angesteuert werden. #on("b")#gs-Warenhaus#off("b")# benutzt stattdessen (ebenso wie die +Soester Software) den von der Firma AKTRONIC vertriebenen Codekartenleser für +einfache 8-Bit-Lochkarten (siehe Anhang). + +Die Verwendung eines Codekartenlesers ist für die Bedienung des Programms zwar +nicht unbedingt notwendig, bietet jedoch beim Einsatz von #on("b")#gs-Warenhaus#off("b")# im Unter­ +richt neben den didaktischen Hintergründen (Modell für Scanner-Kasse) auch noch +mancherlei Vorteile bezüglich des "Datenschutzes" (Änderungen an Kunden- oder +Artikeldaten sowie Zugriffe auf Auskunftsfunktionen nur mit entsprechender Code­ +karte möglich), so daß sein Anschluß sehr empfohlen werden muß. + +Allerdings ist solch ein Gerät nur mittels eines (relativ teuren) Interface-Systems +anschließbar, dessen Anschaffung sich nur lohnt, wenn das System auch sonst noch +zum Messen, Steuern, Regeln (= "Prozeßdatenverarbeitung", "PDV") im Unterricht +genutzt wird. (#on("b")#ERGOS#off("b")# bietet mit #on("b")#"gs-Prozess"#off("b")# auch ein Programmpaket zur PDV +unter EUMEL/ELAN an!) + + + +#on("b")#4.1  Hardware-Voraussetzungen#off("b")# + +Der Codekartenleser wird an einen Steckplatz des Interface-Systems MODUL-BUS der +Firma AKTRONIC angeschlossen, wobei ein Einzel- oder Mehrfachsteckplatz mit +Kombi- oder E/A-Karte oder eine Compact-Box benutzt werden können. + +Da Eingaben von externen Geräten unter EUMEL in der Regel nur über eine serielle +Schnittstelle möglich sind, benötigt man neben dem Kartenleser und dem MODUL- +#page# +BUS-Steckplatz noch einen 'Adapter', der die parallelen Signale des MODUL-BUS- +Systems in serielle Signale wandelt, die der Computer über eine serielle Schnittstelle +(auch RS232- oder V24-Schnittstelle genannt) empfangen kann. Für erfahrene +Elektronik-Bastler ist das Erstellen solch eines Adapters sicher eine lösbare Aufgabe, +unter den fix und fertig kaufbaren Geräten haben wir allerdings nur zwei geeignete +gefunden: das 'Multifunktionale Interface' (kurz: MUFI) der Firma BICOS und den +'RS232-Adapter für das MODUL-BUS-System' der Firma AKTRONIC. Diese beiden +Geräte werden auch von #on("b")#gs-Warenhaus#off("b")# unterstützt. + +Die erforderliche Hardware-Konstellation stellt sich im Überblick also folgender­ +maßen dar: + +#on("b")# + Computer <----> Adapter <----> Interface <----> Kartenleser + + (mit se- ('MUFI' ('MODUL- + rieller oder BUS'- + Schnitt- 'AKTRONIC- Steck- + stelle) Adapter') platz) +#off("b")# + + +#on("b")#4.2  Verwendung des MUFI#off("b")# + +Das MUFI ist speziell für die Arbeit in einem Mehrplatz-System entwickelt worden. Es +benötigt keine zusätzliche serielle Schnittstelle am Rechner, sondern kann einfach +zwischen Rechner und Terminal 'in den Terminalkanal gesteckt' werden, sodaß man +von diesem Terminal aus optimal auf das Interface-System zugreifen kann. Im Ideal­ +fall sollte jeder Arbeitsplatz mit der oben genannten Hardware ausgestattet sein, was +aber momentan sicher nicht für jede Schule finanzierbar ist. Haben Sie zunächst nur +ein (oder wenige) MUFI(s) zur Verfügung und möchten von verschiedenen Terminals +(abwechselnd) auf ein Interface-System zugreifen oder verfügen Sie gar nicht über +ein Terminal, sondern nur über einen Monitor (z.B. bei IBM-Kompatiblen), so +können Sie das MUFI auch 'als Endgerät' an einer separaten seriellen Schnittstelle +nutzen. +#page# +Für den Betrieb in einem Terminalkanal sollte das MUFI über eine sog. "Schnitt­ +stellen-Automatik" verfügen, die verhindert, daß das MUFI in ausgeschaltetem +Zustand oder mit abgezogenem Netzstecker den Datenfluß vom Rechner zum +Terminal unterbricht. Diese sehr sinnvolle Automatik wird von BICOS #on("b")#nicht#off("b")# +standardmäßig eingebaut. Sie sollten bei eventuellen Bestellungen darauf achten. + + +#on("b")#4.2.1  Einstellungen am MUFI#off("b")# + +Gleichgültig ob Sie das MUFI 'im Terminalkanal' oder 'als Endgerät' benutzen, +müssen Sie zunächst am MUFI einige Einstellungen per DIP-Schalter im Inneren des +MUFI vornehmen. Ziehen Sie dazu aber auf alle Fälle den Stecker aus der Steckdose! +Lösen Sie dann die 4 Schrauben an der Unterseite des Gehäuses, heben das Oberteil +vorsichtig ab und legen es neben das Unterteil, sodaß die Kabelverbindungen +zwischen Unter- und Oberteil nicht belastet werden. + + +---------------------------------------------------+ + | +-------+ +------------+ | + | | | | | +---------+ | + | +-------+ | | | DIP- | | + | +-------+ | | | Schalter| | +Rück- | | | | | +---------+ | Vorder- +seite | +-------+ | | +--------------+ | seite + | +-------+ | SCN68000 | | | | + | | | | | +--------------+ | + | +-------+ | | | + | +-------+ | | | + | | | | | | + | +-------+ +------------+ | + +---------------------------------------------------+ + + + +#center#Abb.1: MUFI geöffnet +#page# +Die kleine Plastikbox mit den DIP-Schaltern trägt die folgende Aufschrift: + +#center##on("b")#O N   +#center#1 2 3 4#off("b")# + +Heben Sie den Deckel mit Hilfe eines kleinen Schraubendrehers o.ä. an der rechten +Seite leicht an und klappen Sie ihn nach links um. Sie können nun die 4 DIP- +Schalter sehen. + + +---------------------------------------+ + | +-----+ +-----+ +-----+ +-----+ | + | |+++++| | | | | | | | + | |+++++| | | | | | | | ON + | |+++++| | | | | | | | + | |+++++| | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | | | | | | | | + | | | |+++++| |+++++| |+++++| | + | | | |+++++| |+++++| |+++++| | + | | | |+++++| |+++++| |+++++| | OFF + | | | |+++++| |+++++| |+++++| | + | +-----+ +-----+ +-----+ +-----+ | + +---------------------------------------+ + + 1 2 3 4 + +#center#Abb.2: Mögliche DIP-Schalter-Stellung beim MUFI + + Dabei haben die DIP-Schalter folgende Bedeutung: + + 1 ON : Modulbusbetrieb + OFF : Parallelportbetrieb + 2 ON : RTS/CTS-Hardware-Handshake + OFF : XON/XOFF-Protokoll + 3 ON : 9600 Baud + OFF : 19200 Baud + 4 ON : Even Parity + OFF : No Parity + +In jedem Fall muß der DIP-Schalter 1 in Stellung #on("b")#ON#off("b")# gebracht werden. +#page# +Wenn Sie das MUFI im Terminalkanal betreiben wollen, müssen Sie die anderen +Einstellungen so vornehmen, daß sie zu der Konfiguration des Terminals passen (vgl. +auch Kapitel 4.4). Beträgt die Übertragungsrate 19200 Baud, so sollten Sie unbedingt +mit dem XON/XOFF-Protokoll arbeiten - es sei denn, das Terminal unterstützt +RTS/CTS! Wenn Sie das MUFI an einer separaten seriellen Schnittstelle als Endgerät +betreiben wollen, #on("b")#muß#off("b")# der Datenaustausch mit dem RTS/CTS-Protokoll abgewickelt +werden (Schalter 2 auf 'ON'!). Vergewissern Sie sich, daß Ihr Schnittstellen-Kabel +auch darauf ausgelegt ist! Nach dieser Einstellung der DIP-Schalter ist das MUFI +betriebsbereit. Fügen Sie die beiden Gehäuseteile wieder zusammen und ver­ +schrauben Sie sie wieder. + + +#on("b")#4.2.2  MUFI im Terminalkanal#off("b")# + +Um das MUFI in den Terminalkanal einbauen zu können, müssen Sie zunächst am +Terminal die Zuleitung vom Rechner lösen. Auf der Rückseite des MUFIs befinden +sich zwei Stecker, die mit V24/1 und V24/2 bezeichnet sind. Stecken Sie an Stecker +V24/2 das Kabel, das ursprünglich vom Computer zum Terminal führte. Sie +benötigen jetzt noch ein weiteres (kurzes) V24-Kabel, um das MUFI mit dem +Terminal zu verbinden. Dieses wird einerseits auf Stecker V24/1 am MUFI gesteckt +und andererseits auf den Stecker am Terminal, von dem Sie das ursprüngliche Kabel +zwischen Rechner und Terminal abgezogen haben. + + +--------------------------+ + | +----------------------+ | + | | V24/1 V24/2 | | + | | | | | | + | +----|-----------|-----+ | + +------|-----------|-------+ + | | + | | + ZUM <-----+ +-----> ZUM + TERMINAL COMPUTER + + +#center#Abb.3: Einbau des MUFIs in den Terminalkanal +#page# +Die Verschaltung der V24-Kabel ist in der Bedienungsanleitung zum MUFI erläutert, +ggf. können Sie entsprechende Kabel von der Firma BICOS beziehen. + +Wenn alle Kabelverbindungen gesteckt sind, sollten Sie auf alle Fälle erst einmal #on("b")#bei +ausgeschaltetem MUFI#off("b")# prüfen, ob das Terminal sich noch bedienen läßt. Wenn dieses +keine Reaktion mehr zeigt, obwohl es vorher (ohne MUFI) reibungslos funktioniert +hat, dann haben Sie entweder ein MUFI ohne "Schnittstellen-Automatik" vor sich +(vgl. Kapitel 4.2, Seite 15), oder an den Kabelverbindungen stimmt irgendetwas nicht. +In diesem Fall sollten Sie noch einmal alle Anschlüsse und evtl. auch die interne +Verschaltung der Kabel überprüfen. + +Schalten Sie dann das MUFI ein. Bei ebenfalls eingeschaltetem Terminal können nun +einige Zeichen auf dem Bildschirm erscheinen, dieser Effekt ist normal. Funktioniert +Ihr Terminal bei eingeschaltetem MUFI reibungslos, so sind alle Einstellungen richtig +und Sie brauchen erst bei Kapitel 4.5 weiterzulesen. Andernfalls studieren Sie Kapitel +4.4 unter Beachtung von Kapitel 4.2.1! + + +#on("b")#4.2.3  MUFI als Endgerät#off("b")# + +Wenn Sie das MUFI als Endgerät an einer separaten seriellen Schnittstelle betreiben +wollen, dann stecken Sie das vom Computer kommende Kabel auf den mit V24/2 +bezeichneten Stecker des MUFI. + +Damit ein einwandfreier Betrieb gewährleistet ist, sollten Sie einen sog. 'Kurzschluß­ +stecker' auf den dann freien Stecker V24/1 des MUFIs stecken. Haben Sie einen +solchen nicht zur Hand, können Sie auch zwei provisorische Drahtbrücken einsetzen: +Verbinden Sie mit zwei kleinen Drähten einmal Pin (Öffnung) 2 mit Pin 3 und +außerdem Pin 4 mit Pin 5. + +Die Anpassung 'gs-Warenhaus 0: mit Kartenleser an MUFI als Endgerät' unterstützt +standardmäßig nur den Betrieb von #on("b")#einem#off("b")# MUFI als Endgerät. Wie Sie vorgehen +müssen, wenn Sie mehrere MUFIs in dieser Betriebsart benutzen wollen, erfahren Sie +in Kapitel 7. +#page# +#on("b")#4.3  Verwendung des AKTRONIC-Adapters#off("b")# + +Im Gegensatz zum MUFI ist der AKTRONIC-Adapter #on("b")#nicht#off("b")# für den Einbau in einen +Terminalkanal geeignet, sondern kann nur als Endgerät an einer separaten seriellen +Schnittstelle betrieben werden. Bevor Sie den Adapter an eine serielle Schnittstelle an­ +schließen, sollten Sie noch die eingestellte Baud-Rate überprüfen und gegebenenfalls +neu einstellen. + +Öffnen Sie dazu das Gehäuse des Adapters, indem Sie die vier Schrauben an der +Unterseite lösen. Drehen Sie den Adapter so vor sich, daß die 25-polige D-Sub­ +miniaturbuchse von Ihnen weg zeigt. Vorn rechts sind dann zwei parallele 8-polige +Pfostensteckerleisten sichtbar. + +#center#25-pol. D-Subminiatur-Stecker + + +---------------+ + | | + +---+ +---+ + | +------+ | + | | | | + | | | | + | | | | + | | | | + | +------+ | + | +------+ | + | | | +-------+ | + | +------+ | | | + | +------+ +-------+ | + | | | +-------+ | + | +------+ | <-|---------Jumperleiste + | +-------+ | + +---+ +---+ + | Baudrate | + +---------------+ + + +#center#Abb.4: AKTRONIC-Adapter geöffmet +#page# +Auf einem Pfostensteckerpaar steckt ein 'Jumper', der gegebenenfalls (passend zu +der Schnittstellen-Konfiguration im Computer, vgl. Kapitel 4.4) umgesteckt werden +muß. + + +---------+ + | ζ ζ | 300 + | ζ ζ | 600 + | ζ ζ | 1200 + | ζ ζ | 2400 + | ζ ζ | 4800 + | ζ ζ | 9600 + Jumper > | ζ ζ | 19200 + | ζ ζ | 38400 + +---------+ + Baudrate + + +#center#Abb.5: Mögliche Jumperposition beim AKTRONIC-Adapter + + +Am Adapter ist ein Kabel mit 25-poligem D-Subminiaturstecker bereits fest montiert. +Sollte der Stecker nicht an Ihren Rechner passen, so müßten Sie ein entsprechendes +Adapterkabel basteln oder kaufen. + +Die Anpassung 'gs-Warenhaus 0: mit Kartenleser an AKTRONIC-Adapter' unterstützt +standardmäßig nur den Betrieb von #on("b")#einem#off("b")# Adapter. Wie Sie vorgehen müssen, wenn +Sie mehrere dieser Adapter benutzen wollen, erfahren Sie in Kapitel 7. + + +#on("b")#4.4  Konfiguration der seriellen Schnittstelle#off("b")# + +Sie müssen nun noch dafür Sorge tragen, daß die Einstellungen am MUFI bzw. am +AKTRONIC-Adapter mit den Einstellungen im Computer übereinstimmen. +#page# +Koppeln Sie dazu die Task 'configurator' an Ihr Terminal an (mit 'continue +("configurator") ') und geben Sie dann das Kommando 'configurate +'. Für alle vorhandenen Kanäle werden Sie nun nacheinander gefragt, +ob Sie eine Konfiguration vornehmen wollen. Bei den "interessanten" Kanälen ant­ +worten Sie mit 'ja' (). Wollen Sie sich nur die aktuelle Konfiguration ansehen, so +beantworten Sie alle weiterhin gestellten Fragen zu diesem Kanal mit 'ja' (), +dann bleibt die aktuelle Einstellung erhalten. (Der Konfigurationsdialog ist im +EUMEL-Systemhandbuch auf den Seiten 6 - 8 detailliert beschrieben.) + +Benutzen Sie ein MUFI, so müssen auf alle Fälle #on("b")#8 Datenbits#off("b")# und #on("b")#1 Stopbit#off("b")# einge­ +stellt sein und außerdem je nach DIP-Schalter-Stellung im MUFI (vgl. Kapitel 4.2.1) +9600 oder 19200 Baud sowie 'no parity' oder 'even parity'. + +Benutzen Sie das MUFI im Terminalkanal, so müssen Sie bei einer eventuellen +Änderung der Konfiguration an diesen Stellen auch das entsprechende Terminal auf +diese Werte einstellen! + +Bei der Verwendung des MUFIs als Endgerät muß der Kanal, an den das MUFI ange­ +schlossen wird, darüberhinaus unbedingt auf die Betriebsarten + +#center#transparent und RTS/CTS-Protokoll + +eingestellt werden. + +Verwenden Sie einen AKTRONIC-Adapter, so müssen für den entsprechenden Kanal +folgende Konfigurationsmerkmale eingestellt werden: + +#center#transparent, 8 Bit, 2 Stopbit, #on("b")#kein#off("b")# Protokoll + +Die Baud-Rate ist gemäß der Jumper-Position im Adapter (vgl. Kapitel 4.3) einzu­ +stellen. + + + +#on("b")#4.5  Verbindung der Hardware-Komponenten#off("b")# + +Der Anschluß des Kartenlesers an den MODUL-BUS-Steckplatz ist denkbar einfach: +Stecken Sie den 8-poligen Platinenstecker des Codekartenlesers in die Buchse des +Digital-Einganges der Steckkarte bzw. Compact-Box und den 3-poligen Platinen­ +stecker in die passende Spannungsversorgungsbuchse (12 V) am Steckplatz bzw. auf +der Compact-Box, fertig. Bei eingeschalteter Betriebsspannung muß nun der Code­ +kartenleser beleuchtet sein. (Falls Sie einen Mehrfachsteckplatz benutzen, benötigen +Sie ein passendes Netzteil für diesen Steckplatz! Achten Sie auch darauf, daß in +diesem Fall die Kombi- oder E/A-Karte in Steckplatz (Slot) 1 installiert ist.) + +Nun müssen Sie noch die Verbindung zu dem verwendeten Adapter herstellen. Dabei +ist es gleichgültig, ob Sie eine Compact-Box, einen Einzel- oder einen Mehrfachsteck­ +platz benutzen, denn alle diese Geräte verfügen über ein Anschlußkabel mit dem +gleichen 25-poligen Stecker. + +Den AKTRONIC-Adapter können Sie damit direkt an den Steckplatz anschließen, +denn er verfügt bereits über eine entsprechende 25-polige Buchse. Hier müssen Sie +dann nur noch die Stromversorgung des Adapters sichern, indem Sie das Kabel mit +dem 3-poligen Platinenstecker in die passende Spannungsversorgungsbuchse (12 V) +am Steckplatz oder auf der Compact-Box stecken. (Damit Codekartenleser und +Adapter hier gleichzeitig versorgt werden können, ist in den Stecker eine Verzweigung +eingebaut.) + +Für das MUFI benötigen Sie ein weiteres Kabel, das an einem Ende einen 36-poligen +Centronics-Stecker besitzt und an dem anderen einen 25-poligen D-Subminiatur­ +stecker (von der Firma BICOS zu beziehen). + +Zum Ausprobieren des Kartenlesers benutzen Sie am besten die Menupunkte +'Dezimalwert lesen' und 'Bitmuster lesen' unter dem Oberbegriff 'Kommandos' des +Warenhaus-Menus. Eine Beschreibung dieser Punkte finden Sie in Kapitel 5.4. + + + + + + + + + + diff --git a/doc/warenhaus/gs-Warenhaus-5 b/doc/warenhaus/gs-Warenhaus-5 new file mode 100644 index 0000000..c1164ad --- /dev/null +++ b/doc/warenhaus/gs-Warenhaus-5 @@ -0,0 +1,1468 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (20)# +#headodd# +#center#gs-Warenhaus#right#% + +#end# +#headeven# +%#center#gs-Warenhaus + +#end# +#center#1 + +#center##on("b")#5  Beschreibung der Menufunktionen#off("b")# + + +Nach Aufruf meldet sich #on("b")#gs-Warenhaus#off("b")# zunächst mit dem #on("b")#gs-DIALOG#off("b")#-Emblem +(vgl. Kapitel 3.3). Kurze Zeit später erscheint das WARENHAUS-Eingangsmenu auf +dem Bildschirm: + + +------------------------------------------------------------------------+ + | WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv| + |------------------------------------------------------------------------| + | | b  Befehlsvorrat | | + | | ------------------ | | + | | a  Artikeldaten | | + | | k  Kundendaten | | + | +--------------------+ | + | | + | | + | | + |------------------------------------------------------------------------+ + | | + | Info:/ Wahl: Ausführen: Verlassen: | + +------------------------------------------------------------------------+ + +#off("b")# + + +Bevor wir Ihnen die Bedeutung der einzelnen Menu-Punkte erklären, geben wir erst +noch einige grundsätzliche Hinweise zur Bedienung des Menus für diejenigen Leser, +die im Umgang mit Menus unter #on("b")#gs-DIALOG#off("b")# nicht geübt sind. + + + +#on("b")#5.1  Kurzhinweise zur Bedienung des Menus#off("b")# + +Die Bedienung des Menus ist sehr einfach. Eine ausführliche Beschreibung dazu +finden Sie in den Unterlagen zum Programmsystem #on("b")#gs-DIALOG#off("b")#. An dieser Stelle +sollen nur die wesentlichen Bedienungsvorgänge beschrieben werden. +#page# +- Mit der Tastenfolge können Sie sich Informationen zur Bedienung + des Menusystems in das Menu einblenden lassen + +- Mit den Pfeiltasten und können Sie zwischen den "Ober­ + begriffen" in der Kopfzeile wählen. Der aktuelle Oberbegriff ist jeweils invers + dargestellt. Das ausgeklappte 'Pull-Down-Menu' bezieht sich auf diesen invers + dargestellten Oberbegriff. + +- Mit den Pfeiltasten und können Sie zwischen den Menu­ + funktionen wählen, die Ihnen im aktuellen Pull-Down-Menu zur Auswahl ange­ + boten werden. Die aktuell angewählte Menufunktion wird jeweils invers darge­ + stellt. Die Trennlinien, die in einigen Pull-Down-Menus sichtbar sind, dienen nur + der optischen Untergliederung; sie können nicht angewählt werden und werden + deshalb automatisch übersprungen. Die einzelnen Menupunkte sind "zyklisch + miteinander verknüpft", das heißt, man gelangt vom untersten Menupunkt + wieder zum obersten und umgekehrt. Menupunkte, vor denen ein Minuszeichen + steht ('-'), sind (zur Zeit) nicht aktivierbar; auch sie können nicht angewählt + werden und werden einfach übersprungen. + +- Durch Tippen der Fragezeichentaste () können Sie sich jeweils zur + aktuellen Menufunktion (invers im Pull-Down-Menu) Informationen in das Menu + einblenden lassen. + +- Um eine Menufunktion ausführen zu lassen, bewegen Sie sich mit den Pfeiltasten + auf die gewünschte Menufunktion im aktuellen Pull-Down-Menu und tippen + dann die -Taste. Steht vor dem gewünschten Menupunkt ein + einzelner Buchstabe oder eine Ziffer, so kann durch Tippen der entsprechenden + Taste diese Menufunktion dadurch direkt aufgerufen werden. Sobald eine Menu­ + funktion aufgerufen worden ist, erscheint davor ein Stern ('*'). Daraus können + Sie entnehmen, daß das System bereits den Auftrag ausführt. + +- An verschiedenen Stellen werden Fragen an Sie gerichtet, die Sie mit 'ja' oder + 'nein' beantworten müssen. Tippen Sie dazu entsprechend der Entscheidung die + Taste (für 'ja') bzw. (für 'nein'). + +- Werden Ihnen vom Menu aus Dateinamen zur Auswahl angeboten, so können Sie + den auf dem Bildschirm sichtbaren Pfeil vor den gewünschten Namen +#page# + positionieren. Mit den Tasten oder können Sie den Namen + ankreuzen. Ist die Auswahl mehrerer Dateinamen möglich, so können Sie den + Vorgang wiederholen. Mit den Tasten oder können Sie auch + ein Kreuz vor einem Namen wieder löschen. Daneben gibt es noch einige Tasten­ + funktionen, die für die Bedienung recht hilfreich sein können. Tippen Sie + während der Auswahl die Fragezeichentaste (), so werden Ihnen alle + Bedienungsmöglichkeiten auf dem Bildschirm angezeigt. Eine Auswahl, in der + mehrere Dateien angekreuzt werden dürfen, wird durch die Tastenfolge + verlassen. Anschließend wird die eingestellte Operation mit den + angekreuzten Dateien ausgeführt. Sind Sie versehentlich in eine solche Auswahl + gelangt, so können Sie den Vorgang durch die Tastenkombination + abbrechen. + +- An einigen Stellen werden Sie aufgefordert, eine Eingabe zu machen (z.B. einen + Dateinamen einzugeben). Wird Ihnen hier ein Vorschlag gemacht, den Sie + akzeptieren, so brauchen Sie zur Bestätigung nur die -Taste zu + tippen. Gefällt Ihnen der Vorschlag nicht oder wird Ihnen kein Vorschlag + gemacht, so machen Sie bitte die gewünschte Eingabe. Zum Schreiben stehen + Ihnen alle aus dem Editor bekannten Funktionen zur Verfügung. Mit der Taste + können Sie Buchstaben löschen, mit einfügen. Die + Eingabe wird durch Tippen der -Taste abgeschlossen. Ist der von + Ihnen gewünschte Name schon in Ihrer Task vorhanden und steht in der Fußzeile + der Hinweis 'Zeigen: ', dann können Sie sich auch alle vor­ + handenen Namen zur Auswahl anbieten lassen und durch Ankreuzen den beab­ + sichtigten Namen auswählen. + +- Ihnen können auch mehrere Alternativen angeboten werden, zwischen denen Sie + wählen müssen. In der untersten Zeile eines solchen Kastens, in denen Ihnen die + Alternativen auf dem Bildschirm eingeblendet werden, sind die Möglichkeiten + aufgeführt, die darüber beschrieben sind. Mit den Pfeiltasten können sie die + Markierung auf die gewünschte Alternative positionieren und dann durch die + -Taste zur Ausführung bringen. (Manchmal ist das auch durch + Tippen der den Alternativen vorangestellten Buchstaben oder Ziffern möglich). +#page# +- Durch die Tastenfolge kann das Menu insgesamt verlassen + werden. Damit das nicht versehentlich geschieht, wird jeweils die Frage gestellt, + ob Sie das Menu tatsächlich verlassen wollen. Diese Frage beantworten Sie bitte je + nach Wunsch mit 'ja' oder 'nein' durch Tippen der Tasten bzw. . + + +#on("b")#5.2  Menufunktionen zum Oberbegriff 'Info'#off("b")# + +Das auf dem Bildschirm sichtbare Pull-Down-Menu ist bereits oben abgebildet. + +#on("b")#b Befehlsvorrat#off("b")# + + Mit dieser Funktion können Sie sich die Befehle, die Ihnen von der jeweils + eingestellten Programmierumgebung zur Verfügung gestellt werden, auf dem + Bildschirm anzeigen lassen. Anhand dieser Informationen können Sie auch + feststellen, ob in dem System, das Ihnen zur Verfügung steht, die 'GRIN- + Version' oder die 'ELAN-Version' eingestellt ist. + + Je nach Version gelangen Sie zunächst in eines der folgenden beiden Auswahl­ + menus: +#on("b")# + GRIN-Version: + + + +-------------------------------------------------+ + | d   Datei - Bearbeitung | + | e   Einkaufen und Auskunft | + | k   Kontroll - Strukturen | + | | + | z   Zurück zum Hauptmenü | + | | + | Datei   Kaufen/Auskunft   Kontroll   Zurück | + | | + +-------------------------------------------------+ +#off("b")# +#page# +#on("b")# + ELAN-Version: + + +-------------------------------------------------+ + | d   Datei - Bearbeitung | + | e   Einkaufen und Auskunft | + | s   Sonstige Befehle | + | | + | z   Zurück zum Hauptmenü | + | | + | Datei   Kaufen/Auskunft   Sonstige   Zurück | + | | + +-------------------------------------------------+ + +#off("b")# + + Von hier aus können Sie zu jedem dort angegebenen Bereich eine Informa­ + tionstafel abrufen. + + Aus jeder dieser Tafeln gelangen Sie wieder in die Auswahl zurück. Verlassen + Sie die Auswahl selbst, gelangen Sie zurück ins Ausgangsmenu. + + +#on("b")#a Artikeldaten#off("b")# + + Bei Aktivierung dieses Menupunktes erhalten Sie eine Kurzinformation über + Aufbau und Umfang der Artikeldaten: +#on("b")# + +-------------------------------------------------------+ + | Ein Satz 'Artikeldaten' besteht aus: | + | | + | Artikelname | + | Preis | + | Mindestbestand | + | Bestand | + | | + | Es können Daten für maximal 15 Artikel gespeichert | + | werden. Die zugehörigen Artikelnummern sind 1...15. | + | | + +-------------------------------------------------------+ + + +#off("b")# + + In allen Filialen müssen zu einer Artikelnummer stets der Artikelname und + Preis identisch sein, Bestand und Mindestbestand können beliebig gewählt + werden. Artikeldateien werden nur in den jeweiligen Filialen gehalten und + nicht in der Zentrale. +#page# + Gegenüber der Soester Warenhaus-Version sind Artikeldaten um den Punkt + 'Mindestbestand' erweitert worden, weil sich damit unserer Meinung nach eine + realistischere Nachbestellung realisieren läßt (vgl. auch Kapitel 5.4, 'Nachbe­ + stellen'). + + Sollte Ihnen der Umfang des Warensortiments mit maximal 15 verschiedenen + Artikeln sehr gering vorkommen, so denken Sie bitte daran, daß die Artikel­ + daten an jedem Arbeitsplatz erst einmal eingegeben werden müssen, was bei + Computer-Anfängern recht lange dauert. Außerdem kommt es nur bei einem + genügend kleinen Sortiment zu den methodisch-didaktisch erwünschten + Einkaufshäufungen bei bestimmten Produkten. + + +#on("b")#k Kundendaten#off("b")# + + Bei Aktivierung dieses Menupunktes erhalten Sie eine Kurzinformation über + Aufbau und Umfang der Kundendaten: +#on("b")# + +----------------------------------------------------------+ + | Nachname | + | Vorname | + | Geschlecht | + | | + | Es können Daten für maxomal 31 Kunden gespeichert | + | werden. Die zugehörigen Kundennummern sind 129...159. | + | | + +----------------------------------------------------------+ +#off("b")# + + Die Zuordnung Kundennummer ---> Kunde muß in allen Filialen gleich sein. + Kundendateien werden von jeder Filiale und von der Zentrale geführt. + + Gegenüber der Soester Warenhaus-Version sind Kundendaten um die Punkte + 'Nachname' und 'Geschlecht' erweitert worden, um dem Begriff Kunden#on("b")#daten#off("b")# + etwas gerechter zu werden. Die maximale Kundenanzahl von 31 entspricht + etwa der Größe einer Klasse. +#page# +#on("b")#5.3  Menufunktionen zum Oberbegriff 'Eingabeart'#off("b")# + +Die Funktionen unter diesem Oberbegriff sind nur dann für Sie interessant, wenn Sie +einen Codekartenleser verwenden. +#on("b")# ++-------------------------------------------------------------------------+ +| WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv | +|-------------+-----------------+-----------------------------------------| +| | *  Anzeigen | | +| | --------------- | | +| | k  Kartenleser | | +| | t  Tastatur | | +| +-----------------+ | +| | +| | +| +------------------------+ | +| | Die Eingabeart ist auf | | +| | | | +| | Tastatur | | +| | | | +| | eingestellt | | +| +------------------------+ | +|-------------------------------------------------------------------------| +| Info:/ Wahl: Ausführen: Verlassen: | ++-------------------------------------------------------------------------+ +#off("b")# + +#on("b")#a Anzeigen#off("b")# + + Es wird die momentan eingestellte Eingabeart angezeigt. Möglich sind die + Eingabearten #on("b")#Tastatur#off("b")# und #on("b")#Kartenleser#off("b")#. Die Standardeinstellung ist + 'Tastatur'! + + +#on("b")#k Kartenleser#off("b")# + + Die Eingabeart 'Kartenleser' wird eingestellt. Alle Artikelnummern, Kunden­ + nummern und sonstige Codenummern (für Auskünfte) können danach nur + über den Kartenleser eingegeben werden. +#page# + Diese Eingabeart kann nur eingestellt werden, wenn ein Kartenleser mit + funktionstüchtigem Interface angeschlossen ist. Sonst erfolgt eine ent­ + sprechende Fehlermeldung. + + Fehlerfälle: + + - Kein Interface vorhanden! + Ursache: Bei der Installation von #on("b")#gs-Warenhaus#off("b")# wurde angegeben, daß + kein Kartenleser benutzt werden soll. + + - Interface meldet sich nicht! + Abhilfe: Überprüfen, ob der Adapter ordnungsgemäß angeschlossen und + eingeschaltet ist (vgl. Kapitel 4). Notfalls Eingabeart auf + 'Tastatur' schalten; wenn ein MUFI verwendet wird, MUFI aus- + und nach kleiner Pause wieder einschalten; noch einmal die + Eingabe 'Kartenleser' anwählen. + + - TASK für Interface ist besetzt! + (Kann nur beim Betrieb von MUFI als Endgerät oder bei AKTRONIC-Adapter + auftreten.) + Abhilfe: Wenn irgendeine andere Task die Eingabeart 'Kartenleser' ein­ + gestellt hat, dort auf 'Tastatur' umstellen. + + - Interface-Kanal belegt! + (Kann nur beim Betrieb von MUFI als Endgerät oder bei AKTRONIC-Adapter + auftreten.) + Abhilfe: Feststellen, welche Task an den Interface-Kanal angekoppelt ist + ('taskinfo (2)'), und diese dann abmelden ('break' oder 'end'). + Die Nummer des Interface-Kanals kann mit dem Befehl 'put + (interfacekanal)' erfragt werden. + + - TASK für Interface existiert nicht! + (Kann nur beim Betrieb von MUFI als Endgerät oder bei AKTRONIC-Adapter + auftreten.) + Abhilfe: Task löschen; in der Vatertask das Kommando 'init interface­ + channel' geben; Task neu anmelden. +#page# +#on("b")#t Tastatur#off("b")# + + Die Eingabeart 'Tastatur' wird eingestellt. Alle Artikelnummern, Kunden­ + nummern und sonstige Codenummern (für Auskünfte) können danach nur + über die Tastatur eingegeben werden. Ein etwa angeschlossener Codekarten­ + leser ist bei dieser Einstellung nicht mehr ansprechbar. + + + +#on("b")#5.4  Menufunktionen zum Oberbegriff 'Kommandos'#off("b")# + +Dieses ist das zentrale Menu für den Benutzer von #on("b")#gs-Warenhaus#off("b")#. Unter diesem +Oberbegriff finden Sie alle Funktionen, die notwendig sind, um die Abläufe innerhalb +des Modell-Warenhauses zu simulieren. (Die angebotenen Menufunktionen ent­ +sprechen etwa den "Direktbefehlen" der Soester Software.) +#on("b")# ++-------------------------------------------------------------------------+ +| WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv | +|---------------------+-------------------------------+-------------------| +| | w   Warendatei bearbeiten | | +| | k   Kundendatei bearbeiten | | +| | -------------------------- | | +| | e   Einkaufen | | +| | -------------------------- | | +| | a   Auskunft einholen | | +| | n   Nachbestellen | | +| | -------------------------- | | +| | -   Dezimalwert lesen | | +| | -   Bitmuster lesen | | +| +-------------------------------+ | +| | +|-------------------------------------------------------------------------| +| Info:/ Wahl: Ausführen: Verlassen:| ++-------------------------------------------------------------------------+ +#off("b")# + +Wird im Unterricht kein Kartenleser benutzt, so sind die eingegeben Daten völlig +ungeschützt. Vor allem bei der Kundendatei muß sichergestellt werden, daß dort +#page# +keine unsinnigen Eintragungen oder Änderungen vorgenommen werden, da alle +Neueintragungen und Änderungen in dieser Datei auch in der Warenhaus-Zentrale +wirksam werden und von dort aus auf Anfrage jeder Filiale mitgeteilt werden. +Korrekturen können dadurch sehr mühsam werden. Natürlich sind ohne Kartenleser +(und dem damit verbundenen 'Ausweis' Codekarte) auch jederzeit Einkäufe mit jeder +beliebigen Kundennummer möglich. Auch hier sollten Sie etwaigem Mißbrauch +vorbeugen. + + +#on("b")#w Warendatei bearbeiten#off("b")# + + Hiermit kann die Warendatei der Filiale aufgebaut und verändert werden. Der + Bildschirm sieht dabei wie folgt aus: +#on("b")# ++------------------------------------------------------------------------+ +|WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv | +|-----------------------------------+------------------------------------| +| | Artikelnummer : 1 | +| | | +| | | +| | Artikelname : Bier (Kasten)| +| | | +| | Preis : 16.85 | +| | | +| | Mindestbestand : 25 | +| | | +| | Bestand : 20 | +| | | +| | | +| | Alles richtig ? | +| | | +| | Ja    Nein | +|-----------------------------------+------------------------------------| +| Info:/ Wahl: Ausführen: Verlassen: | ++------------------------------------------------------------------------+ +#off("b")# + + Zunächst muß eine Artikelnummer (1...15) eingegeben werden (je nach + Einstellung über die Tastatur oder mittels einer Warenkarte über den Code­ + kartenleser). Unzulässige Artikelnummern werden dabei nicht akzeptiert. +#page# + Ist unter dieser Nummer bereits ein Artikel gespeichert, so werden die ent­ + sprechenden Artikeldaten in dem rechten oberen Bildschirmfenster gezeigt + und können dort geändert oder einfach übernommen werden. Gibt es noch + keinen Artikel mit dieser Nummer, so sind neue Artikeldaten einzugeben. + + Dieser Vorgang wird solange wiederholt, bis bei der Eingabe der Artikelnummer + die Tastenfolge gedrückt wird. + + Achten Sie darauf, daß in jeder Filiale der zu einer Artikelnummer gehörige + Artikel stets denselben Artikelnamen und -preis erhält. Bestand und Mindest­ + bestand können unterschiedlich sein. + + +#on("b")#k Kundendatei bearbeiten#off("b")# + + Hiermit kann die Kundendatei der Filiale aufgebaut und verändert werden. + Ähnlich wie bei der Funktion 'Warendatei bearbeiten' erfolgen die Eingaben im + rechten oberen Bildschirmfenster. + + Zunächst muß eine Kundennummer (129...159) eingegeben werden (je nach + Einstellung über die Tastatur oder mittels einer Kundenkarte über den Code­ + kartenleser). Unzulässige Kundennummern werden dabei nicht akzeptiert. + + Ist unter dieser Nummer bereits ein Kunde in der Filiale oder in der Zentrale + gespeichert, so werden die entsprechenden Kundendaten in dem rechten + oberen Bildschirmfenster gezeigt und können dort geändert oder einfach über­ + nommen werden. Gibt es noch keinen Kunden mit dieser Nummer, so sind + neue Kundendaten einzugeben. (Neueingaben und Änderungen werden sofort + der Zentrale, aber nicht automatisch den andern Filialen mitgeteilt!) + + Dieser Vorgang wird solange wiederholt, bis bei der Eingabe der Kunden­ + nummer die Tastenfolge gedrückt wird. +#page# +#on("b")#e Einkaufen#off("b")# + + Zunächst wird eine Kundennummer (129...159) erfragt. Wird die Nummer + eines Kunden eingegeben, dessen Daten in der Filiale oder Zentrale bereits + gespeichert sind, so erscheint im linken Bildschirmfenster der Rechnungskopf + mit dem Namen des Kunden. Ist unter der Nummer noch kein Kunde einge­ + tragen oder wird die Eingabe der Kundennummer durch die Tastenfolge + abgebrochen, so enthält der Rechnungskopf keinen Kunden­ + namen. + + Das eigentliche Einkaufen erfolgt nun durch die Eingabe von Artikelnummern + (1...15). Der zugehörige Artikelname und der Preis werden daraufhin in die + Rechnung eingetragen. +#on("b")# ++------------------------------------------------------------------------+ +|WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv | +|----------------------------------+-------------------------------------| +| RECHNUNG für Herrn B. Pollok | Artikelnummer :  1 | +| | | +| Bier (Kasten) 16.85 | | +| Tageszeitung 0.80 | | +| Pflaster 2.39 | | +| Mehl 0.79 | | +| Seife 1.80 | | +| Weinbrand 12.75 | | +| Zigaretten 3.80 | | +| Brot 2.29 | | +| Schallplatte 19.90 | | +| Geodreieck 2.35 |-------------------------------------| +| Videokassette 12.75 | Artikelnummer eingeben | +| Schulheft 0.85 | | +| | Stoptaste:   | +|----------------------------------+-------------------------------------| +| Einkaufen | ++------------------------------------------------------------------------+ +#off("b")# | + + Dieser Vorgang wird solange wiederholt, bis die Eingabe einer Artikelnummer + durch Tippen der Tastenfolge abgebrochen wird. + + Abschließend wird der Rechnungsgesamtbetrag ausgegeben und gefragt, ob die + Rechnung gedruckt werden soll. +#page# +#on("b")#a Auskunft einholen#off("b")# + + Mit Hilfe dieses Kommandos lassen sich nach Einlesen einer Codenummer (je + nach Einstellung über Tastatur oder Codekartenleser) verschiedene Auskünfte + über die gespeicherten Daten abrufen. Es können #on("b")#Einzelauskünfte#off("b")# oder + #on("b")#Listenauskünfte#off("b")# eingeholt werden. Bei Eingabe einer falschen Nummer wird + die Auskunft abgebrochen! + + + #on("b")#Einzelauskünfte:#off("b")# + + Codenummern 1...15 (Artikelnummern): + Die zugehörigen Artikeldaten werden im rechten oberen Bild­ + schirmfenster angezeigt. + + Codenummern 129...159 (Kundennummern): + Die zugehörigen Kundendaten werden im rechten oberen + Bildschirmfenster angezeigt. + + + #on("b")#Listenauskünfte:#off("b")# + + Hierbei liefern jeweils 3 benachbarte Codenummern von der Art her ähnliche + Auskunfts-Listen, die auf Wunsch auch ausgedruckt werden können. Die + mittlere Nummer bezieht die Auskünfte stets auf die eigene Filiale; die beiden + anderen sind nur effizient, wenn mehrere Filialen angemeldet sind. Dabei + werden bei Eingabe der linken Nummer die jeweiligen Daten #on("b")#aller#off("b")# Filialen + 'aufaddiert' und in #on("b")#einer#off("b")# Gesamtliste ausgegeben. Bei Eingabe der rechten + Nummer hingegen werden die jeweiligen Listen von allen angeschlossenen + Filialen der Reihe nach abgerufen und #on("b")#hintereinander#off("b")# in eine Datei ge­ + schrieben, sodaß man eine Zusammenstellung der entsprechenden #on("b")#Einzel#off("b")#- + Listen der Filialen erhält: +#page# + Codenummern 66, 67, 68: + Die bisherigen Verkaufszahlen der einzelnen Waren werden + gezeigt; die Listen sind sortiert nach diesen Zahlen ('Ver­ + kaufs-Hitlisten'). + + Codenummern 73, 74, 75: + Nach Eingabe einer Artikelnummer wird eine Liste aller + Käufer dieses Artikels ausgegeben. + + Codenummern 77, 78, 79: + Diese Codes liefern Kundenlisten der Filialen. + + Codenummern 84, 85, 86: + Nach Eingabe einer Kundennummer wird eine Liste aller von + diesem Kunden gekauften Artikel ausgegeben. + + Codenummern 89, 90, 91: + Diese Codes liefern die Lagerbestandslisten der Filialen. Sollte + sich bei der Auskunft '90' herausstellen, daß der Bestand + mehrerer Artikel unter den Mindestbestand abgesunken ist, ist + es sinnvoll, als nächstes den Menupunkt 'Nachbestellen' + anzuwählen (s.u.). +#page# + Beispiel: Der Code '90' liefert bei entsprechend eingegebener Warendatei + folgende Auskunft: +#on("b")# + +------------------------------------------------------------------------+ + | ............. Auskunft: Filiale 1 ................... Zeile 1 | + | | + | Lagerübersicht: | + | ---------------------------------------------------------------------- | + | ---------------------------------------------------------------------- | + | | Art.Nr.| Artikelname | Preis | Min.Best. | Bestand | | + | ---+---------+------------------+-------------+-----------+----------+ | + | | | | | | | | + | | 1 | Bier (Kasten) | 16.85 | 25 | 19 | | + | | 2 | Tageszeitung | 0.80 | 15 | 16 | | + | | 3 | Pflaster | 2.39 | 14 | 22 | | + | | 4 | Mehl | 0.79 | 32 | 58 | | + | | 5 | Seife | 1.80 | 27 | 49 | | + | | 6 | Weinbrand | 12.75 | 24 | 41 | | + | | 7 | Zigaretten | 4 +------------+--------+ | | + | | 8 | Brot | 2 | Auskunft drucken ?| | | + | | 9 | EMMA | 3 | | | | + | | 10 | Schallplatte | 19 | Ja     Nein | | | + | | 11 | Geodreieck | 2 +---------------------+ | | + | | | | | | | + | | | | | | | + | | | | | | | + |----------------------------------------------------------------------- | + | | Ändern:    Bestätigen:  | + + -----------------------------------------------------------------------+ + +#off("b")# + + Hinweis: Nur die zu den jeweils mittleren Codenummern gehörigen Aus­ + kunftsfunktionen arbeiten mit Daten, die in der eigenen Task + gespeichert sind. Bei den übrigen Auskünften müssen Daten aus + anderen Filialverwaltungs-Tasks oder der Zentrale geholt werden, + so daß die Erstellung solch einer Auskunft recht zeitaufwendig ist. + Um zu lange Wartezeiten zu vermeiden, sollten nicht mehrere + Filialen gleichzeitig Auskünfte dieser Art einholen. +#page# +#on("b")#n Nachbestellen#off("b")# + + Auf dem Bildschirm wird eine Bestelliste ausgegeben, die alle Artikel enthält, + deren Bestand innerhalb der Filiale den Mindestbestand unterschritten hat. + + Die Nachbestellung ist so bemessen, daß diese Artikel wieder mit ihrem + doppelten Mindestbestand vorrätig sind. Die neuen Bestände werden auto­ + matisch in die Warendatei der Filiale eingetragen. + + Auf Wunsch kann die Bestelliste ausgedruckt werden. + + +#on("b")#d Dezimalwert lesen#off("b")# + + Der aktuelle Wert, der vom Codekartenleser gelesen wird, wird (ähnlich wie bei + 'Bitmuster lesen', s.u.) auf dem Bildschirm ausgegeben, bis + gedrückt wird. Mit Hilfe dieses Kommandos kann man z.B. die Funktion des + Codekartenlesers testen und den Zusammenhang zwischen Bitmuster und + Dezimalwert klären. + + Dieser Menupunkt ist (ebenso wie der nächste) nur dann aufrufbar, wenn + unter #on("b")#Eingabeart#off("b")# der #on("b")#Kartenleser#off("b")# eingestellt ist. + + +#on("b")#b Bitmuster lesen#off("b")# + + Dieser Menupunkt ist nur dann aufrufbar, wenn unter #on("b")#Eingabeart#off("b")# der + #on("b")#Kartenleser#off("b")# eingestellt ist (vgl. Kapitel 5.3). + + Ist das der Fall, so wird hier das aktuelle Bitmuster, das vom Codekartenleser + gelesen wird, auf dem Bildschirm ausgegeben, bis gedrückt + wird. +#on("b")# ++-------------------------------------------------------------------------+ +| WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv | +|-----------------------------------+-------------------------------------| +| | | +| | | +| | Bitmuster :    0I00III0 | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | | +| | Lesen beenden mit | +| +-------------------------------------| +| | +| Bitmuster lesen | ++-------------------------------------------------------------------------+ +#off("b")# + + Ein Bitmuster besteht aus 8 Zeichen (z.B. 'OIOOIIIO'). Dabei zeigt jedes 'I' ein + Loch an der entsprechenden Stelle der Codekarte an, die sich gerade im + Kartenlesegerät befindet. Dieses Bitmuster entspricht der Dualzahl 01001110 + (im 'Zweiersystem'); zu ihr gehört die Dezimalzahl +#on("b")# + + 0 * 128 + 1 * 64 + 0 * 32 + 0 * 16 + 1 * 8 + 1 * 4 + 1 * 2 + 0 * 1 = 78. +#off("b")# + + Mit Hilfe dieses Kommandos können Sie z.B. die Funktion des Codekarten­ + lesers testen. Bei voller Beleuchtung aller 8 Sensoren muß das Bitmuster + 'IIIIIIII' geliefert werden. Decken Sie einige Sensoren mit den Fingern oder + einer Lochkarte ab, so muß sich das Bitmuster auf dem Bildschirm ent­ + sprechend verändern. Ist das nicht der Fall, so liegt ein Fehler vor. + + Prüfen Sie dann erst einmal, ob der Steckplatz mit Strom versorgt wird (Netz­ + kabel in der Steckdose? Compact-Box mit Netzteil richtig verbunden?) Ist dort + alles in Ordnung, so könnte der Fehler noch in der Verbindung zum Adapter + liegen. (Steckplatz ordnungsgemäß mit Adapter verbunden? Richtiges Kabel + verwendet?) +#page# + Sollten Sie auf diese Weise nicht zum Erfolg kommen, so verlassen Sie diesen + Menupunkt und wählen noch einmal den Oberbegriff 'Eingabeart' an. Stellen + Sie dort die Eingabeart zunächst auf 'Tastatur um' und dann wieder auf + 'Kartenleser'. Treten hier Fehlermeldungen auf, so lesen Sie in Kapitel 5.3 + nach. Läßt sich die Umstellung dagegen problemlos vornehmen, so müßte nun + auch das 'Bitmuster lesen' wieder funktionieren. + + +#on("b")#5.5  Menufunktionen zum Oberbegriff 'Programme'#off("b")# + +#on("b")# ++-------------------------------------------------------------------------+ +| WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv | +|---------------------+----------------------+----------------------------| +| | n  Neu erstellen | | +| | a  Ansehen/Ändern | | +| | ------------------ | | +| | s  Starten | | +| | w  Wiederholen | | +| | ------------------ | | +| | v  Verzeichnis | | +| | ------------------ | | +| | l  Löschen | | +| | d  Drucken | | +| | ------------------ | | +| | k  Kopieren | | +| | u  Umbenennen | | +| +----------------------+ | +|-------------------------------------------------------------------------| +| Info:/ Wahl: Ausführen: Verlassen: | ++-------------------------------------------------------------------------+ +#off("b")# + +#on("b")#n Neu erstellen#off("b")# + + Mit dieser Funktion können Sie eine neue Programmdatei anlegen und + beschreiben. + + Sie werden zunächst nach einem Namen für die #on("b")#neue#off("b")# Programmdatei gefragt. + Geben Sie einen beliebigen Namen (#on("b")#ohne Anführungszeichen (!)#off("b")#) ein und +#page# + schließen Sie die Eingabe durch ab. Daraufhin wird Ihnen auf + dem Bildschirm eine neue Datei zum Beschreiben angeboten. + + Sollte schon eine Programmdatei mit diesem Namen in der Task vorhanden + sein, so werden Sie darauf aufmerksam gemacht. + + Sie können sich während des Schreibens die wichtigsten Tastenfunktionen des + Editors einblenden lassen. Tippen Sie dazu die Tastenfolge . Es + erscheint dann das folgende Angebot aus dem Sie auswählen können: + +#on("b")# + +-----------------------------------------------------+ + | Der EUMEL - Editor | + | | + | b ... Beschreibung desEditors | + | w ... Wichtige Tasten | + | p ... Positionieren der Schreibmarke | + | k ... Korrigieren im Text (Einfügen/Löschen) | + | m ... Markierte Textpassagen bearbeiten | + | l ... Lernen im Editor | + | a ... Anweisungen im Editor (Kommandodialog) | + | | + | z ... Zurück in den Schreibmodus | + | | + | b   w   p   k   m   l   a   z | + | | + +-----------------------------------------------------+ +#off("b")# + Fehlerfälle: + - Eine Programm-Datei mit dem vorgeschlagenen Namen existiert schon. + + +#on("b")#a Ansehen/ändern#off("b")# + + Mit dieser Funktion können Sie sich Dateien, die schon in Ihrer Task + existieren, ansehen oder auch verändern. + + Sie werden zunächst gefragt, ob Sie #on("b")#die zuletzt bearbeitete Programmdatei#off("b")# + ansehen bzw. verändern möchten (sofern Sie schon vorher mit #on("b")#gs-Warenhaus#off("b")# + in der Task gearbeitet haben). +#page# + Bejahen Sie diese Frage, dann wird Ihnen diese Programmdatei zur Bear­ + beitung angeboten. Verneinen Sie die Frage dagegen, so gelangen Sie in die + 'Auswahl' (d.h es werden Ihnen alle Programmdateien in der Task zur Auswahl + angeboten). Nachdem Sie einen der Namen angekreuzt haben, wird Ihnen die + ausgewählte Programmdatei zur Bearbeitung auf dem Bildschirm angeboten. + + Fehlerfälle: + - In der Task existiert noch keine Programmdatei. + + +#on("b")#s Starten#off("b")# + + Mit dieser Menufunktion können Sie ein fertiggestelltes Programm übersetzen + und ausführen lassen. + + Sie werden zunächst gefragt, ob #on("b")#das zuletzt bearbeitete Programm#off("b")# ausgeführt + werden soll. Bejahen Sie die Frage, so wird dieses Programm gestartet; ver­ + neinen Sie die Frage dagegen, so gelangen Sie in die 'Auswahl'. Nach An­ + kreuzen des gewünschten Programmnamens wird das ausgewählte Programm + ausgeführt. + + Sind im Programm noch Fehler enthalten, so werden das Programm und die + Fehlermeldungen gleichzeitig auf dem Bildschirm dargestellt (Paralleleditor) + und zur Korrektur angeboten. Für die Programmkorrektur stehen ebenfalls alle + Editorfunktionen zur Verfügung. + + Sollte Ihnen beim Programmieren ein Fehler unterlaufen sein (z.B. eine + Endlosschleife), so kann mit der Tastenfolge der Programm­ + ablauf abgebrochen werden ("Notbremse"). +#page# +#on("b")#w Wiederholen#off("b")# + + Mit dieser Funktion können Sie den Ablauf des zuletzt ausgeführten + Programms wiederholen, ohne daß das Programm neu übersetzt wird. + + Beachten Sie aber bitte, daß Veränderungen am Programmtext, die seit dem + letzten Programmlauf vorgenommen wurden, #on("b")#nicht#off("b")# berücksichtigt werden; + dazu muß das Programm erneut mit der Menufunktion 'Starten' übersetzt + werden. + + Ist die Wiederholung eines Programmlaufs nicht möglich, so erfolgt ein Hin­ + weis darauf. + + +#on("b")#v Verzeichnis#off("b")# + + Mit dieser Funktion können Sie sich einen Überblick über die in Ihrer Task + vorhandenen Programmdateien verschaffen. + + Nach Aufruf dieser Funktion wird eine Liste der Programmdateien auf dem + Bildschirm ausgegeben, die sich in Ihrer Task befinden. Da die Liste selbst + eine Text-Datei ist, kann Sie mit der Tastenkombination ver­ + lassen werden - hierauf wird auch in der letzten Bildschirmzeile hingewiesen. + Falls nicht alle Namen auf den Bildschirm passen, können Sie das Fenster mit + und verschieben. + + +#on("b")#Löschen#off("b")# + + Mit dieser Funktion können Sie Programmdateien, die Sie nicht mehr + benötigen, die unnötig Platz belegen, löschen. Aber Vorsicht! Die Dateien + verschwinden durch diese Funktion unwiederbringlich! + + Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in + Ihrer Task befinden, zur Auswahl angeboten. Hier können Sie die gewünschten + Namen ankreuzen. Die Auswahl wird dann durch die Tastenfolge + verlassen. +#page# + Für jede einzelne Programmdatei wird noch einmal zur Sicherheit gefragt, ob + sie auch tatsächlich gelöscht werden soll. Zur Bestätigung tippen Sie bitte die + Taste ('ja') - zur Verhinderung ('nein'). + + Fehlerfälle: + - In der Task exsitiert noch keine Programmdatei + + +#on("b")#d Drucken#off("b")# + + Mit dieser Funktion können Sie Programmdateien über einen angeschlossenen + Drucker ausgeben lassen. + + Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in + Ihrer Task befinden, zur Auswahl angeboten. Hier können Sie die gewünschten + Namen ankreuzen. Die Auswahl wird dann durch die Tastenfolge + verlassen. + + Die angekreuzten Programmdateien werden anschließend zum Drucker ge­ + schickt. Der Vorgang wird auf dem Bildschirm protokolliert. + + Fehlerfälle: + - In der Task existiert noch keine Programmdatei. + - Der Drucker ist nicht funktionsbereit. + - Der Drucker wird nicht über die Task 'PRINTER' betrieben. + - Auf Ihrem System werden die Druckkosten abgerechnet. Sie müssen sich + mit einer Codenummer identifizieren. + + +#on("b")#k Kopieren#off("b")# + + Mit dieser Funktion können Sie sich eine Kopie einer bereits in der Task + vorhandenen Programmdatei anlegen. Das ist z.B. dann sinnvoll, wenn Sie sich + einen bestimmten 'Stand' aufbewahren wollen oder wenn Sie ein Programm + schreiben wollen, das einem bereits vorhandenen ähnelt. +#page# + Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in + Ihrer Task befinden, zur Auswahl angeboten. Nach Ankreuzen eines Namens + wird die Auswahl automatisch verlassen. + + Anschließend wird der angekreuzte Name angezeigt und der Name für die + Kopie erfragt. Es muß ein Name eingetragen werden, der in dieser Task noch + nicht für eine Programmdatei vergeben wurde; ansonsten erfolgt ein Hinweis + darauf und es wird nicht kopiert! + + Da man aber oft für die Kopie einen ähnlichen Namen wie für das Original + wählt, wird der 'alte' Name vorgeschlagen. Aus genannten Gründen muß er + aber verändert werden. Sie können diesen Namen mit den üblichen Editier­ + funktionen verändern oder mit löschen und ganz neu + eingeben. Sie sparen aber eine Menge Tipparbeit, wenn Sie einen langen + Namen nur an einer Stelle ändern wollen. + + Fehlerfälle: + - Eine Programmdatei mit dem gewünschten Namen existiert bereits in der + Task. + + +#on("b")#u Umbenennen#off("b")# + + Mit dieser Funktion können Sie einer bereits vorhandenen Programmdatei + einen neuen Namen geben. + + Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in + Ihrer Task befinden, zur Auswahl angeboten. Nach Ankreuzen eines Namens + wird die Auswahl automatisch verlassen. + + Anschließend wird dieser Name angezeigt und der zukünftige Name für die + Programmdatei erfragt. Es muß ein Name eingetragen werden, der in dieser + Task noch nicht für eine Programmdatei vergeben wurde - ansonsten erfolgt + ein Hinweis darauf und die Programmdatei wird nicht umbenannt! +#page# + Da man aber oft den 'neuen' Namen in Anlehnung an den 'alten' Namen + wählt, wird der 'alte' Name vorgeschlagen. Aus genannten Gründen muß er + aber verändert werden. Sie können diesen Namen mit den üblichen Editier­ + funktionen verändern oder mit löschen und ganz neu + eingeben. Sie sparen aber eine Menge Tipparbeit, wenn Sie einen langen + Namen nur an einer Stelle ändern wollen. + + Fehlerfälle: + - Eine Programmdatei mit dem gewünschten Namen existiert bereits in der + Task. + + + +#on("b")#5.6  Menufunktionen zum Oberbegriff 'Filialdaten'#off("b")# +#on("b")# ++-------------------------------------------------------------------------+ +| WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv | +|---------------------------------------+--------------------------+------| +| | e   Eintragen/ergänzen | | +| | z   Zusammenstellen | | +| | ----------------------- | | +| | v   Verzeichnis | | +| | ----------------------- | | +| | l   Löschen | | +| | u   Umbenennen | | +| +--------------------------+ | +| | +| | +|-------------------------------------------------------------------------| +| Info:/ Wahl: Ausführen: Verlassen:| ++-------------------------------------------------------------------------+ + +#off("b")# + +#on("b")#e Eintragen/ergänzen#off("b")# + + Mit diesem Menupunkt können Sie Filialdaten-Dateien, die Sie z.B. von der + Vatertask oder von der Diskette geholt haben, in Ihrer Task laden. +#page# + Ihnen werden zunächst alle vorhandenen Filialdaten-Dateien zur Auswahl + angeboten. Anschließend werden die angekreuzten Dateien in der Reihenfolge, + in der sie angekreuzt wurden, zur Filialverwaltung geschickt und die Daten + dort zu den bereits vorhandenen hinzugefügt. Gegebenenfalls wird auch die + zentrale Kundendatei ergänzt. Der Vorgang wird auf dem Bildschirm + protokolliert. + + Beachten Sie bitte, daß in der Filiale etwa vorhandene Daten dadurch nicht + überschrieben, sondern lediglich ergänzt werden. Ein gänzliches Beseitigen von + alten Daten gelingt nur durch Löschen der Filialtask. + + Fehlerfälle: + - In der Task exsitieren noch keine Filialdaten-Dateien. + + +#on("b")#z Zusammenstellen#off("b")# + + Mit dieser Funktion können Sie eine Datei anlegen, in der die aktuell in der + Filiale gehaltenen Daten zusammengestellt werden. Solch eine Datei kann man + sich jedoch nicht ansehen! + + Zunächst wird der Name der Datei erfragt, in die die Filialdaten geschrieben + werden sollen. Danach werden darin die aktuellen Daten gespeichert und es + wird eine 'Vollzugsmeldung' ausgegeben. + + Die Daten können dann später mit Hilfe der Archiv-Funktionen (vgl. Kapitel + 5.7) z.B. auf einer Diskette gespeichert werden, damit Sie beim eventuellen + Löschen der Filialtask nicht verlorengehen. Eine Verwechselung mit + Programmdateien ist nicht möglich, da Namen für Filialdaten-Dateien (intern) + automatisch mit dem Präfix 'Filialdaten:' versehen werden. + + Fehlerfälle: + - Eine Filialdaten-Datei mit dem gewünschten Namen existiert bereits in der + Task. +#page# +#on("b")#v Verzeichnis#off("b")# + + Mit dieser Funktion können Sie sich einen Überblick über die in Ihrer Task + vorhandenen Filialdaten-Dateien verschaffen. + + Nach Aufruf dieser Funktion wird eine Liste der Filialdaten-Dateien auf dem + Bildschirm ausgegeben, die sich in Ihrer Task befinden. Da die Liste eine + Text-Datei ist, kann Sie mit der Tastenkombination verlassen + werden - hierauf wird auch in der letzten Bildschirmzeile hingewiesen. Falls + nicht alle Namen auf den Bildschirm passen, können Sie das Fenster mit + und verschieben. + + +#on("b")#l Löschen#off("b")# + + Mit dieser Funktion können Sie Filialdaten-Dateien, die Sie nicht mehr + benötigen und die unnötig Platz belegen, löschen. Aber Vorsicht! Die Dateien + verschwinden durch diese Funktion unwiederbringlich! + + Nach Aufruf dieser Funktion werden Ihnen alle Filialdaten-Dateien, die sich in + Ihrer Task befinden, zur Auswahl angeboten. Hier können Sie die gewünschten + Namen ankreuzen. Die Auswahl wird dann durch die Tastenfolge + verlassen. + + Für jede einzelne Datei wird nachgefragt, ob sie auch tatsächlich gelöscht + werden soll. Zur Bestätigung tippen Sie bitte die Taste ('ja') - zur Ver­ + hinderung ('nein'). + + Fehlerfälle: + - In der Task exsitiert noch keine Filialdaten-Datei. +#page# +#on("b")#u Umbenennen#off("b")# + + Mit dieser Funktion können Sie einer bereits vorhandenen Filialdaten-Datei + einen neuen Namen geben. + + Nach Aufruf dieser Funktion werden Ihnen alle Filialdaten-Dateien, die sich in + Ihrer Task befinden, zur Auswahl angeboten. Nach Ankreuzen eines Namens + wird die Auswahl automatisch verlassen. + + Anschließend wird dieser Name angezeigt und der zukünftige Name für die + Datei erfragt. Es muß ein Name eingetragen werden, der in dieser Task noch + nicht für eine Filialdaten-Datei vergeben wurde - ansonsten erfolgt ein Hinweis + darauf und die Datei wird nicht umbenannt! + + Da man aber oft den 'neuen' Namen in Anlehnung an den 'alten' Namen + wählt, wird der 'alte' Name vorgeschlagen. Aus genannten Gründen muß er + aber verändert werden. Sie können diesen Namen mit den üblichen Editier­ + funktionen verändern oder mit löschen und ganz neu + eingeben. Sie sparen aber eine Menge Tipparbeit, wenn Sie einen langen + Namen nur an einer Stelle ändern wollen. + + Fehlerfälle: + - Eine Filialdaten-Datei mit dem gewünschten Namen existiert bereits in der + Task. +#page# +#on("b")#5.7  Menufunktionen zum Oberbegriff 'Archiv'#off("b")# +#on("b")# ++--------------------------------------------------------------------------+ +| WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv | +|---------------------------------------------+------------------------+---| +| | r  Reservieren | | +| | -  Neue Diskette | | +| | -------------------- | | +| | -  Schreiben | | +| | -  Checken | | +| | -  Kombination | | +| | -  Holen/Lesen | | +| | -  Löschen | | +| | -------------------- | | +| | -  Verzeichnis | | +| | -  Drucken | | +| | -------------------- | | +| +-----------------------+ | i  Initialisieren | | +| | Dateiaustausch mit: | | z  Zieltask einstellen| | +| | Archiv | +------------------------+ | +| | Archivname: | | +| | gs-Warenhaus | | +| +-----------------------+ | +|--------------------------------------------------------------------------| +| Info:/ Wahl: Ausführen: Verlassen: | ++--------------------------------------------------------------------------+ +#off("b")# + +In diesem Kapitel werden alle die Menufunktionen beschrieben, die Ihnen unter dem +Oberbegriff 'Archiv' im Menu angeboten werden. Mit den Funktionen in diesem Menu +können Sie aber nicht nur Dateien auf dem Archiv behandeln, sondern auch in +anderen Tasks im Multi-User-System oder über das EUMEL-Netz sogar auf anderen +Rechnern! + +Wenn Sie dieses Pull-Down-Menu gerade aufgeschlagen haben, sind nicht alle +Funktionen aktivierbar! Um weitere Funktionen zu aktivieren, muß erst einer der +aktivierbaren Menupunkte gewählt werden. + +Bei der Archivbehandlung werden Ihnen jeweils alle in der Task vorhandenen Dateien +zur Auswahl angeboten. Das System unterscheidet nicht von sich aus - wie unter den +#page# +Oberbegriffen 'Programme' und 'Filialdaten' - zwischen Programm- und Filial­ +daten-Dateien. In den hier gezeigten Listen können Sie aber Filialdaten-Dateien +daran erkennen, daß ihnen das Präfix 'Filialdaten:' vorangestellt ist. + + +#on("b")#r Reservieren#off("b")# (des Archivlaufwerks) + + Im EUMEL-Multi-User-System haben normalerweise mehrere Personen das + Zugriffsrecht auf das Archivlaufwerk. Allerdings muß der Zugriff so geregelt + werden, daß sich die Beteiligten dabei nicht gegenseitig "in die Quere + kommen". Ein Zugriff auf das Archivlaufwerk erfordert zunächst eine An­ + meldung. Ist diese Anmeldung erfolgt, kann von den anderen Beteiligten so + lange nicht mehr auf das Laufwerk zugegriffen werden, bis es wieder freige­ + geben worden ist. + + Diese Anmeldung des Archivlaufwerkes erfolgt über die Menufunktion 'r Reser­ + vieren'. Greift bereits eine andere Task auf das Laufwerk zu, so erhalten Sie + darüber einen Hinweis auf dem Bildschirm. Ansonsten wird an Sie die Frage + gestellt, ob die Diskette eingelegt und das Laufwerk geschlossen ist. + + Erst zu diesem Zeitpunkt ist sichergestellt, daß Sie den alleinigen Zugriff auf + das Laufwerk haben. Deshalb sollten Sie, wenn Sie mit mehreren Personen am + Computer arbeiten, erst zum Zeitpunkt der Fragestellung die Diskette ins Lauf­ + werk einlegen. + + Nachdem Sie die Diskette eingelegt und die Frage bejaht haben, ermittelt das + System selbständig den Namen der eingelegten Diskette, zeigt den Namen auf + dem Bildschirm (im kleinen Kasten links unten) an und aktiviert die anderen + Menupunkte des Pull-Down-Menus. + + Beim Verlassen des Pull-Down-Menus, wenn eine andere Zieltask eingestellt + wird oder wenn das Menu gänzlich verlassen wird, wird die Reservierung + automatisch aufgehoben! +#page# + Fehlerfälle: + - Das Laufwerk ist von einer anderen Task belegt. + - Die Diskette ist falsch eingelegt oder das Laufwerk ist nicht richtig ge­ + schlossen. + - Die Diskette ist nicht formatiert bzw. initialisiert. + - Die Diskette kann nicht gelesen werden (keine EUMEL-Diskette, Diskette + hat ein falsches Format, Diskette ist verschmutzt...). + + +#on("b")#n Neue Diskette#off("b")# (anmelden) + + Der Dateiaustausch mit einer Diskette ist nur dann möglich, wenn der im + System eingestellte Diskettenname (auf dem Bildschirm im kleinen Kasten + unten links sichtbar) mit dem tatsächlichen Namen der Diskette überein­ + stimmt. Nach einem Diskettenwechsel ist das aber in der Regel nicht mehr der + Fall. Greift man dann auf die neu eingelegte Diskette zu, so erscheint die + Fehlermeldung: 'Falscher Archivname! Bitte neue Diskette anmelden!'. + + Das Anmelden einer neuen Diskette - ohne einen neuen Reservierungsvorgang + - wird durch diese Menufunktion ermöglicht. Nach Aktivieren dieses Menu­ + punktes wird der Name der eingelegten Diskette ermittelt, im System eingestellt + und auf dem Bildschirm angezeigt. + + Im Gegensatz zur Menufunktion 'r Reservieren' greift das System ohne Anfrage + an den Benutzer auf das Archivlaufwerk zu (die Reservierung bleibt ja be­ + stehen). Ist das Archivlaufwerk reserviert, so ist die Neuanmeldung einer Dis­ + kette über diese Menufunktion weniger zeitaufwendig. + + Fehlerfälle: + - wie unter 'r Reservieren'. +#page# +#on("b")#s Schreiben#off("b")# (Kopieren) + + Alle Dateien der eigenen Task werden zur Auswahl angeboten. Wenn Sie die + Auswahl durch die Tastenfolge verlassen, überprüft das System + zunächst, ob die Dateien in der eingestellten Zieltask schon vorhanden sind. Ist + das der Fall, wird erfragt, ob die dort vorhandenen Dateien überschrieben, d.h. + gelöscht werden dürfen (s.u.). Anschließend werden alle angekreuzten Dateien + in der Reihenfolge, in der Sie sie angekreuzt haben, in die eingestellte Zieltask + kopiert. Der Vorgang wird auf dem Bildschirm protokolliert. Die Original­ + dateien in der eigenen Task bleiben dabei erhalten. + + Wenn in der Zieltask schon eine Datei existiert, die den gleichen Namen hat + wie eine Datei, die Sie dorthin kopieren möchten, so wird angefragt, ob die + vorher schon existierende Datei überschrieben (gelöscht!) werden soll. Bejahen + Sie diese Frage, so wird die bereits in der Zieltask existierende Datei (un­ + wiederbringlich) gelöscht und die gewünschte Datei dorthin transportiert. Ein + Überschreiben aus Versehen ist nicht möglich, wenn Sie die an Sie gestellte + Frage sorgfältig beantworten. + + Verneinen Sie die Frage, so wird die Datei auch nicht hinübertransportiert! Sie + können die Datei aber umbenennen (Menufunktion 'u Umbenennen' unter + den Oberbegriffen 'Programme' bzw. 'Filialdaten') und anschließend mit + anderem Namen hinüberschreiben. + + Beachten Sie, daß beim Überschreiben einer Datei auf einer Archivdiskette der + Speicherplatz der alten (überschriebenen) Version im allgemeinen nicht + wiederverwendet werden kann. In einem solchen Fall könnte die Diskette voll + geschrieben werden, obwohl eigentlich genügend Platz vorhanden wäre. Zur + Optimierung wird deshalb zuerst überprüft, ob die angekreuzten Dateien + schon in der Zieltask vorhanden sind und löscht diese, wenn Sie Ihr Einver­ + ständnis geben. Erst anschließend werden die Dateien insgesamt kopiert. +#page# + Normalerweise ist als Zieltask das Archivlaufwerk der eigenen Station einge­ + stellt. Mit der Menufunktion 'z Zieltask einstellen' kann diese Einstellung aber + verändert werden. + + Fehlerfälle: + - Die Diskette ist falsch eingelegt oder beschädigt. + - Die Diskette kann nicht beschrieben werden (Schreibfehler). + - Die Diskette ist voll. + - Sehen Sie auch unter 'r Reservieren' + 'z Zieltask einstellen'. + + +#on("b")#c Checken#off("b")# + + Diese Menufunktion kann nur ausgeführt werden, wenn der Dateiaustausch + mit einem Archiv(manager) erfolgt - ansonsten ist diese Menufunktion auch + nicht aktivierbar. Die Menufunktion dient dazu, auf Diskette geschriebene + Dateien auf Lesefehler hin zu prüfen. Es empfiehlt sich, diese Prüfroutine auf + neu auf die Diskette geschriebene Dateien anzuwenden. Sehen Sie dazu auch + 'k Kombination'. + + Alle Dateien der eingestellten Zieltask (Archiv) werden zur Auswahl angeboten. + Wenn Sie die Auswahl durch die Tastenfolge verlassen, werden + alle angekreuzten Dateien in der Reihenfolge, in der Sie sie angekreuzt haben, + "gecheckt", d.h. auf Lesefehler hin überprüft. Der Vorgang wird auf dem Bild­ + schirm protokolliert. + + Fehlerfälle: + - Lesefehler auf dem Archiv. + - Sehen Sie auch unter 'r Reservieren'. +#page# +#on("b")#k Kombination#off("b")# + + Diese Menufunktion ist eine Kombination aus den beiden Menufunktionen 's + Schreiben' und 'c Checken' (Sehen Sie weitere Informationen auch dort!). + + Alle Dateien der eigenen Task werden zur Auswahl angeboten. Wenn Sie die + Auswahl durch die Tastenfolge verlassen, werden alle ange­ + kreuzten Dateien in der Reihenfolge, in der Sie sie angekreuzt haben, in die + eingestellte Zieltask kopiert (gegebenenfalls müssen bereits vorhandene + Dateien gleichen Namens in der Zieltask gelöscht werden). Anschließend + werden alle Dateien, die gerade geschrieben wurden, gecheckt, d.h. auf Lese­ + fehler hin untersucht. Beide Vorgänge werden auf dem Bildschirm + protokolliert. + + Da die 'Check' - Operation nur bei Archivmanagern zulässig ist, ist diese Menu­ + funktionen ebenfalls nur bei Archivmanagern aktivierbar. Zur Erläuterung + sehen Sie bitte auch unter 'z Zieltask einstellen'. + + +#on("b")#h Holen/Lesen#off("b")# + + Die Menufunktion dient dazu, Dateien, die bereits auf einer Archivdiskette oder + in einer anderen Task existieren, in die eigene Task zu kopieren. + + Alle Dateien der eingestellten Zieltask werden zur Auswahl angeboten. An­ + schließend werden Kopien der angekreuzten Dateien in der Reihenfolge des + Ankreuzens in die eigene Task geholt. Das Original in der Zieltask bleibt dabei + unverändert! Der Vorgang wird auf dem Bildschirm protokolliert. + + Sind in der eigenen Task schon Dateien mit gleichem Namen vorhanden, so + wird gefragt, ob die 'alten' Dateien überschrieben (gelöscht) werden dürfen. + Nur wenn Sie zustimmen, werden die in Ihrer Task existierenden Dateien + (unwiederbringlich!) gelöscht und Kopien der gleichnamigen Dateien aus der + Zieltask angefertigt. +#page# + Stimmen Sie dem Löschvorgang nicht zu, dann bleiben die bisherigen Dateien + in Ihrer Task erhalten - die Dateien aus der Zieltask werden dann aber auch + nicht in Ihre Task kopiert! Um dennoch die Kopien zu erhalten, können Sie die + namensgleichen Dateien in Ihrer Task umbenennen und dann erst die Dateien + aus der anderen Task anfordern. + + Normalerweise werden die Dateien vom Archiv der eigenen Station geholt. Mit + dem Menupunkt 'z Zieltask einstellen' kann diese Einstellung verändert + werden. + + Fehlerfälle: + - Lesefehler auf dem Archiv. + - Sehen Sie auch unter 'r Reservieren' + 's Schreiben' + 'z Zieltask einstellen'. + + +#on("b")#l Löschen#off("b")# + + Die Menufunktion dient dazu, Dateien in der Zieltask (unwiederbringlich!) zu + löschen. Dazu werden alle Dateien der eingestellten Zieltask zur Auswahl ange­ + boten. Anschließend werden die angekreuzten Dateien in der Reihenfolge ihres + Ankreuzens gelöscht. Zur Sicherheit muß noch einmal für jede einzelne Datei + bestätigt werden, daß sie auch tatsächlich gelöscht werden soll. + + Beachten Sie, daß beim Löschen einer Datei auf einer Archivdiskette der + Speicherplatz im allgemeinen nicht wieder verwendet werden kann. In einem + solchen Fall könnte die Diskette voll geschrieben werden, obwohl eigentlich + genügend Platz vorhanden wäre. Diese Probleme treten bei anderen Tasks, die + keine Archivmanager sind, nicht auf, da deren Speicherplatz intelligenter + verwaltet wird. +#page# + Normalerweise ist als Zieltask das Archiv der eigenen Station eingestellt. Mit + dem Menupunkt 'z Zieltask einstellen' kann diese Einstellung verändert + werden. + + Fehlerfälle: + - Sehen Sie auch unter 'r Reservieren' + 's Schreiben' + 'z Zieltask einstellen'. + + +#on("b")#v Verzeichnis#off("b")# + + Mit dieser Menufunktion können Sie sich einen Überblick über die in der + Zieltask (z.B. auf dem Archiv) vorhandenen Dateien verschaffen. + + Nach Aufruf der Funktion wird eine Liste der Dateien auf dem Bildschirm + ausgegeben, die sich in der Zieltask (z.B. auf dem Archiv) befinden. Ist die + Zieltask ein Archiv(manager), so wird auch angezeigt, wieviel Platz auf der + Diskette belegt ist. Da die Liste selbst eine Datei ist, kann sie mit der Tasten­ + kombination verlassen werden. Falls nicht alle Dateinamen auf + den Bildschirm passen, können Sie das Fenster mit und + verschieben. + + Fehlerfälle: + - Sehen Sie unter 'z Zieltask einstellen'. + + +#on("b")#d Drucken#off("b")# + + Das Verzeichnis der Dateien in der Zieltask, das man mit der Menufunktion 'v + Verzeichnis' auf dem Bildschirm angezeigt bekommt, kann mit dieser Menu­ + funktion ausgedruckt werden. +#page# + Zur Sicherheit wird angefragt, ob wirklich ein solches Dateiverzeichnis der + Zieltask gedruckt werden soll. Bejaht man die Frage, so wird ein Dateiver­ + zeichnis erstellt und zum Drucker geschickt. + + Fehlerfälle: + - Der Drucker ist nicht funktionsbereit. + - Der Drucker wird nicht über die Task 'PRINTER' betrieben. + - Auf Ihrem System werden die Druckkosten abgerechnet. Sie müssen sich + mit einer Codenummer identifizieren. + + +#on("b")#i Initialisieren#off("b")# + + Diese Menufunktion gestattet es, frische Disketten zu formatieren, zu initiali­ + sieren bzw. beschriebene Disketten vollständig zu löschen und ggf. dabei + umzubenennen. Bei Aufruf dieser Menufunktion wird - sofern noch nicht + geschehen - das Archivlaufwerk automatisch reserviert. + + Wenn Sie eine fabrikneue Diskette aus der Verpackung nehmen, müssen Sie + diese zunächst #on("b")#formatieren#off("b")#. Dabei wird die Diskette auf ein festgelegtes + physikalisches Format eingestellt. Ohne daß diese Operation vorausgegangen + ist, kann eine Diskette weder beschrieben noch gelesen werden. + + Prinzipiell braucht eine Diskette nur ein einziges Mal formatiert zu werden. Sie + können Sie jedoch jederzeit wieder formatieren - z.B. wenn Sie Disketten + haben, von denen Sie nicht genau wissen, für welche Zwecke sie zuvor ver­ + wendet wurden. + + Wenn Sie diese Menufunktion aktivieren, werden Sie so zunächst gefragt, ob Sie + die Diskette auch formatieren wollen. Bejahen Sie die Frage, so werden Ihnen + mehrere Formate zur Auswahl angeboten: +#page# +#on("b")# + +----------------------------------------+ + | Formatieren einer Diskette | + | | + | Dies sind die möglichen Formate: | + | | + | 1 .... 40 Spur - 360 KB | + | 2 .... 80 Spur - 720 KB | + | 3 .... 5 1/4" - 1,2 MB | + | 4 .... 3 1/2" - 1,4 MB | + | s .... Standard - Format | + | | + | | + | 1   2   3   4   s | + +----------------------------------------+ + +#off("b")# + + Erkundigen Sie sich bei Ihrem Händler, welches Format Sie bei Ihrem Rechner + und den von Ihnen verwendeten Disketten einstellen müssen. Manche Rechner + unterstützen diese Operation innerhalb des EUMEL-Systems auch gar nicht, + das Formatieren muß dann irgendwie anders außerhalb des EUMEL-Systems + geschehen. + + Wenn Sie die Formatierung abgeschlossen oder auch übersprungen haben, + beginnt die eigentliche Initialisierung der Diskette. Dabei wird als erstes der + Archivname auf die Diskette geschrieben. Alle alten Daten, die sich ggf. auf der + Diskette befinden, werden bei diesem Vorgang unwiederbringlich (!) gelöscht. + + Zur Sicherheit überprüft das System in jedem Falle, ob es sich um eine EUMEL + - Diskette handelt, und erfragt Ihr Einverständnis, ob die Diskette wirklich + initialisiert werden soll. Geben Sie hierzu Ihr Einverständnis, dann wird noch + der (neue) Archivname erfragt. Hatte die Diskette schon einen Namen, dann + wird dieser zum Überschreiben angeboten. Wollen Sie den alten Archivnamen + beibehalten, so brauchen Sie nur die -Taste zu tippen, ansonsten + können Sie den Namen auch zuvor verändern oder einen ganz neuen Namen + hinschreiben. Anhand des ausgegebenen Namens können Sie auch über­ + prüfen, ob Sie die richtige Diskette eingelegt haben. +#page# + Das Initialisieren funktioniert natürlich nur, wenn Sie als Zieltask einen + Archivmanager eingestellt haben - ansonsten ist diese Menufunktion gesperrt + (nicht aktivierbar!). + + Fehlerfälle: + - Formatieren ist nicht auf dem System möglich. + - Sehen Sie auch unter 'r Reservieren' + 'z Zieltask einstellen'. + + +#on("b")#z Zieltask einstellen#off("b")# + + Mit dieser Menufunktion können Sie festlegen, mit welcher Zieltask Sie + kommunizieren, d.h. z.B. Dateien austauschen möchten. Normalerweise ist + hier das Archiv am eigenen Rechner eingestellt. Das wird auch nach Auf­ + klappen des Pull-Down-Menus im Kasten links unten angezeigt. + + Diese Menufunktion kann im Unterricht z.B. dazu genutzt werden, um fertig­ + gestellte Hausaufgaben in eine bestimmte Task zu schicken (Vatertask) oder + um von dort z.B. vorgefertigte Programme und/oder Filialdaten-Dateien abzu­ + holen. + + Sie können aber auch eine andere Task einstellen (z.B. die Vatertask oder die + Task 'PUBLIC'), um mit diesen Dateien auszutauschen oder um sich auch nur + einen Überblick über die dort vorhandenen Dateien zu verschaffen. Wenn Sie + mit Ihrem Rechner in ein EUMEL-Netz integriert sind, können Sie auch auf + Tasks anderer Rechner zugreifen oder auch Disketten von Laufwerken anderer + Rechner einlesen (z.B. wenn Sie Disketten anderer Formate haben, die von + Ihrem Rechner nicht gelesen werden können). + + Dabei werden zwei Anforderungen an die Zieltask gestellt: Sie muß existieren + und bereit für den Dateiaustausch sein, d.h es muß eine Managertask sein, auf + die Sie Zugriff haben. Versuchen Sie auf andere Tasks zuzugreifen, so erhalten + Sie entsprechende (Fehler-)Meldungen. +#page# + Zu beachten ist noch, daß es im EUMEL-System verschiedene Arten von + Managertasks gibt - Archivmanager und normale Dateimanager. Der Unter­ + schied besteht darin, daß ein Archivmanager vom Benutzer vor dem Zugriff + reserviert werden muß - anschließend hat nur dieser Benutzer (bis zur Aufga­ + be der Reservierung) ein Zugriffsrecht auf den Manager. Normale Datei­ + manager können dagegen von mehreren Benutzern in beliebiger Reihenfolge + angesprochen werden. + + Ein Archivmanager kann auch auf bestimmte Diskettenformate spezialisert + sein (z.B. auf das Lesen von DOS-Disketten). Manche Rechner haben auch + mehrere Archivmanager für verschiedene Laufwerke etc. Durch Einstellen + unterschiedlicher Archivmanager können Sie dann auf verschiedenen Lauf­ + werken archivieren. + + Nach Aktivieren dieses Menupunktes werden Ihnen die folgenden Alternativen + angeboten: +#on("b")# + +-------------------------------------------+ + | Dateiaustausch gewünscht mit: | + | | + | a ...    Archiv (Eigene Station) | + | | + | v ...   Vatertask | + | | + | p ...   'PUBLIC' (Eigene Station) | + | | + | s ...   Sonstige Task | + | | + | Archiv   Vatertask   PUBLIC   Sonstige | + +-------------------------------------------+ +#off("b")# + + Da der Dateiaustausch mit dem Standardarchiv der eigenen Station (Task: + 'ARCHIVE'), mit der Vatertask und der Task 'PUBLIC' recht häufig in Anspruch + genommen wird, sind diese drei Optionen unter den Alternativen direkt ange­ + geben. Entscheiden Sie sich für eine dieser drei Tasks, so nimmt das System + alle notwendigen Einstellungen vor. Möchten Sie dagegen in Kontakt mit einer +#page# + anderen Task treten, so wählen Sie die Alternative 's ... Sonstige Task'. + In diesem Falle haben Sie noch 3 Angaben zu machen: + + - Zunächst werden Sie nach dem Namen der Zieltask gefragt. Geben Sie den + Namen der Zieltask - ohne Anführungsstriche (!) - ein und schließen Sie + die Eingabe mit der -Taste ab. (Den ausgegebenen Namen der + z.Z. eingestellten Task können Sie dabei verändern bzw. überschreiben.) + + - Dann wird die Nummer der Station im EUMEL-Netz erfragt, auf der sich + die Zieltask befindet. Die Nummer Ihrer Station wird als Vorschlag ausge­ + geben. Wollen Sie mit einer Task auf Ihrem Rechner kommunizieren, so + brauchen Sie diesen Vorschlag nur durch Drücken der -Taste + bestätigen - ansonsten tragen Sie zuvor die entsprechende Stationsnummer + ein. Ist Ihr Rechner nicht in ein EUMEL-Netz integriert, so wird die + Stationsnummer 0 (Null) ausgegeben. Bitte bestätigen Sie diese Stations­ + nummer durch Tippen der -Taste. + + - Zum Abschluß müssen Sie noch angeben, ob die eingestellte Zieltask ein + Archivmanager ist oder nicht. + + Das System versucht dann den Kontakt herzustellen. Je nachdem, welche + Einstellung Sie vorgenommen haben, sind bestimmte Funktionen innerhalb + des Menus nicht aktivierbar. Das System läßt nur die Funktionen zu, die + aufgrund Ihrer Einstellungen zulässig sind. + + Im Kasten links unten auf dem Bildschirm wird jeweils angezeigt, welche + Zieltask eingestellt ist. Erscheint in diesem Kasten auch ein Hinweis auf den + Archivnamen, so haben Sie einen Archivmanager eingestellt. Ist dagegen vor + dem Namen der Zieltask noch eine Zahl und ein Schrägstrich angegeben, so + haben Sie eine Zieltask auf einem anderen Rechner eingestellt. + + Bedenken Sie, daß Operationen mit Tasks auf anderen Stationen länger an­ + dauern können - werden Sie nicht ungeduldig! +#page# + Sie können die Einstellung der Zieltask jederzeit wieder verändern! + + Fehlerfälle: + - Die eingestellte Zieltask existiert nicht. + - Die eingestellte Zieltask existiert zwar, ist aber nicht empfangsbereit, d.h. + ein Zugriff von Ihrer Task aus ist nicht möglich! + - Das Netz ist nicht funktionsbereit (Collector-Task fehlt). + - Die Kommunikation war nicht erfolgreich. + - Die gewünschte Operation kann mit der eingestellten Zieltask nicht ausge­ + führt werden (Zieltask ist z.B. gar kein Archivmanager - Sie aber ver­ + suchen, das Laufwerk zu reservieren). + + + + + + + + + diff --git a/doc/warenhaus/gs-Warenhaus-6 b/doc/warenhaus/gs-Warenhaus-6 new file mode 100644 index 0000000..3edf312 --- /dev/null +++ b/doc/warenhaus/gs-Warenhaus-6 @@ -0,0 +1,589 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (61)# +#headodd# +#center#gs-Warenhaus#right#% + +#end# +#headeven# +%#center#gs-Warenhaus + +#end# +#center#1 + +#center##on("b")#6  Beschreibung der Programmierschnittstelle#off("b")# + + +In allen GRIN-Projekten soll - zumindest als Erweiterung - der Aspekt des +"algorithmischen Problemlösens" mit in den Unterricht eingebracht werden. Deshalb +ist auch in dem Soester Programm zum Projekt WARENHAUS eine Programmier­ +schnittstelle realisiert, die es erlaubt, mit Hilfe eines eng begrenzten Befehlssatzes +kleine Programme zur Steuerung der Abläufe im Modell-Warenhaus zu schreiben. + +Wir haben lange überlegt, ob wir diese Programmierschnittstelle überhaupt nach­ +bilden sollten, weil wir der Meinung sind, daß beim Projekt WARENHAUS das +algorithmische Problemlösen, wenn überhaupt, nur eine sehr untergeordnete Rolle +spielt. Als Randproblematik kann man hier vielleicht untersuchen, wie die Menu- +Funktionen unter dem Oberbegriff 'Kommandos' (vgl. Kapitel 5.4) aufgebaut sind, +und man kann versuchen, diese in eigenen kleinen Programmen nach- oder umzu­ +bilden. + +Unser zweites Problem war, ob wir uns bei einer eventuellen Nachbildung der +Programmierschnittstelle auch wirklich streng an die Soester Vorgaben halten sollten, +auch wenn sie unseren Vorstellungen und Konzepten teilweise zuwiderlaufen. Eigent­ +lich sind wir der Meinung, daß uns mit der Programmiersprache ELAN bereits ein +ausgezeichnetes Hilfsmittel zur Verfügung steht, um auch in der Sekundarstufe I in +das algorithmische Problemlösen einzuführen. Gerade das Refinementkonzept - die +Methode der 'schrittweisen Verfeinerung' / der "Modularisierung im Kleinen" - +scheint uns besonders geeignet, typische Denkweisen des algorithmischen Problem­ +lösens offenzulegen. Lediglich die Konstruktion einer Zählschleife und den Umgang +mit den Fehlermeldungen des ELAN-Compilers halten wir bei Anfängern für etwas +problematisch. + +Wir haben uns deshalb entschlossen, Ihnen die Programmierschnittstelle in zwei +Versionen zur Verfügung zu stellen: In der 'ELAN-Version' können Sie in der üblichen +#page# +ELAN-Umgebung programmieren; das bietet sich z.B. an, wenn Sie #on("b")#gs-Warenhaus#off("b")# +im Wahlpflichtbereich bzw. im Differenzierungsbereich 9/10 einsetzen möchten. Es +ist dann dort nicht nötig, erst eine neue, weniger komfortable "Programmiersprache" +zu erlernen. + +Für den GRIN-Bereich enthält #on("b")#gs-Warenhaus#off("b")# eine weitere Programmierebene +('GRIN-Version'), die an die Soester Vorgaben angelehnt ist, und die es erlaubt, die +dort benutzten Schreibweisen von Befehlen und Kontrollstrukturen zu übernehmen. +Allerdings haben wir dabei eine grundsätzliche Änderung bezüglich der Modularisie­ +rungsmöglichkeit von 'GRIN-Programmen' vorgenommen, auf die wir in Kapitel 6.1 +näher eingehen werden. + +Ein 'GRIN-Programm' wird bei der Ausführung des Menupunktes 's Starten' (vgl. +Kapitel 5.5) zunächst in ein ELAN-Programm übersetzt und dabei auf formale +Korrektheit überprüft. Werden keine Fehler festgestellt, so wird nun seinerseits das +ELAN-Programm vom Compiler übersetzt und anschließend ausgeführt. Als Benutzer +werden Sie dabei nicht mit Fehlermeldungen des Compilers konfrontiert, da der +#on("b")#gs-Warenhaus#off("b")#-Übersetzer vorher alle formalen Fehler abfängt und zum Korrigieren +anbietet. + +Sollte das System nach erfolgreicher Übersetzung und/oder Compilation bei der +Ausführung des Programms einen Fehler "bemerken" (z.B. falscher Aufruf eines +Befehles), so wird das Programm automatisch abgebrochen und die entsprechende +Fehlermeldung mit der Nummer der Programmzeile, in der der Fehler bemerkt +wurde, im unteren Teil des Bildschirmes in einem 'notebook' gezeigt. Im oberen Teil +wird das Programm zum Verbessern angeboten, wobei der Cursor am Anfang der +fehlerhaften Zeile steht (gilt auch für die 'ELAN-Version'). + +In beiden Versionen der Programmierschnittstelle ist die Schreibweise der Befehle bis +auf die Groß- und Kleinschreibung identisch. Folgende Befehle stehen zu Verfügung: +#page# + GRIN-Version | ELAN-Version +------------------------+------------------------------ + Artikelnummer lesen | artikelnummer lesen + Artikeldaten eingeben | artikeldaten eingeben + Kundennummer lesen | kundennummer lesen + Kundendaten eingeben | kundendaten eingeben + neues Blatt | neues blatt + Rechnungskopf | rechnungskopf + Artikel kaufen | artikel kaufen + Abrechnung | abrechnung + Auskunft | auskunft + Bildschirm neu | bildschirm neu + | nachbestellen + | dezimalwert lesen + | bitmuster lesen + | + + +Die drei letzten Befehle der ELAN-Version haben wir in den GRIN-Befehlssatz nicht +mit aufgenommen, weil wir hier den Befehlssatz möglichst klein (und damit über­ +sichtlich) halten wollten und diese Befehle bereits unter dem Oberbegriff +'Kommandos' als Menu-Funktionen zur Verfügung stehen. (Ebenso könnte man bei +dem Befehl 'Auskunft' argumentieren. Die entsprechende Menu-Funktion 'Auskunft +einholen' liefert bei jeder Anwahl jedoch immer nur #on("b")#eine#off("b")# Auskunft; in einem +Programm kann man nun die Ausgabe mehrerer Auskünfte hintereinander +realisieren.) + +Die genaue Wirkung der Befehle werden wir in Kapitel 6.3 noch detailliert +beschreiben. Sie entsprechen im wesentlichen den Soester Befehlen, die im +WARENHAUS-Begleitheft des LSW (siehe Anhang) auf den Seiten 99/100 aufgelistet +sind. (Die anderen dort zu findenden Befehle gehören eigentlich nicht in die Befehls­ +liste der Programmierschnittstelle, weil sie nicht von Programmen aus sondern nur in +einem 'Direktbefehgs-Modus' als Kommando aufrufbar sind! Diese Befehle sind auch +#page# +#on("b")#keine#off("b")# Programmierbefehle im eigentlichen Sinne, sondern entweder "Macros" zum +"Handling" des Warenhausmodells oder Systemkommandos. #on("b")#gs-Warenhaus#off("b")# stellt +diese Befehle unter ähnlichen Namen als Menu-Funktionen zur Verfügung.) + + + +#on("b")#6.1  Schreibweisen und Syntaxregeln in GRIN-Programmen#off("b")# + +Die Regeln, die beim Schreiben eines ELAN-Programms zu beachten sind, werden im +EUMEL/ELAN-Benutzerhandbuch beschrieben; wir werden uns daher hier auf die +GRIN-Version konzentrieren. + +Beginnen wir mit einem Beispiel aus dem WARENHAUS-Begleitheft des LSW. Dort +finden Sie auf Seite 70 (unten) das folgende Programm: + +#on("b")# + PROGRAMM Rechnung schreiben + neues Blatt + Kundennummer lesen + WENN nicht Stoptaste gedrückt + Rechnungskopf + WIEDERHOLE + Artikelnummer lesen + WENN nicht Stoptaste gedrückt + Artikel kaufen + ENDE WENN + BIS Stoptaste gedrückt + Abrechnung + ENDE WENN + ENDE PROGRAMM #off("b")# + +Sie können dieses Programm ohne Änderungen übernehmen und starten, +#on("b")#gs-Warenhaus#off("b")# wird es ohne Beanstandungen ausführen. Bezüglich der Übersicht­ +lichkeit und des Programmierstils kann man hier sicher geteilter Meinung sein, +darauf gehen wir später noch ein. +#page# +Wir möchten Ihnen zunächst einige Regeln zur Schreibweise und Syntax in 'GRIN- +Programmen' aufzeigen, die sich im obigen Beispiel-Programm beobachten lassen: + +- In jeder Zeile darf nur #on("b")#ein#off("b")# Befehl stehen; Befehgs-Trennzeichen (wie etwa das + Semikolon in ELAN) werden deshalb nicht verwendet. Leerzeichen können + beliebig gesetzt werden, auch leere Zeilen sind zulässig, nicht jedoch + Kommentare. + +- Das Arbeiten mit Variablen (gleich welcher Art) ist #on("b")#nicht#off("b")# möglich; alle Befehle + sind datentypfrei. + +- Schlüsselworte für Kontrollstrukturen (wie z.B. WIEDERHOLE, WENN etc.) + werden in GROSSBUCHSTABEN geschrieben, Ausführungsbefehle und + Bedingungen hingegen klein und gemäß den Regeln der deutschen Sprache mit + großem Anfangsbuchstaben bei Substantiven. Diese Festlegung bezüglich der + Groß- und Kleinschreibung ist bei den von #on("b")#gs-Warenhaus#off("b")# zur Verfügung ge­ + stellten Befehlen #on("b")#verbindlich#off("b")#, d.h. alle Warenhaus-#on("b")#Grund#off("b")#befehle und Kontroll­ + strukturen müssen (bis auf Leerzeichen) genauso geschrieben werden, wie sie in + den Kapiteln 6.2 und 6.3 vorgegeben werden! (In der Soester Software können + dagegen Groß- und Kleinbuchstaben beliebig verwendet werden, sodaß dort z.B. + neben 'neues Blatt' auch 'neues blatt', "NEueS BlaTT" u.ä. als identisch ange­ + sehen werden.) + +- Jedes 'GRIN-Programm' beginnt mit dem 'Schlüsselwort' , + gefolgt von einem Programmnamen, der beliebig gewählt werden kann, jedoch + noch in diese Zeile passen muß. Sinnvoll ist es, hier z.B. den Namen der + Programmdatei einzutragen. + +- Jedes 'GRIN-Programm' endet mit der Zeile . Nach dieser + Zeile dürfen nur noch leere Zeilen folgen, es sei denn zwischen und wurden Befehle benutzt, die + nicht zum Warenhaus-Grundbefehlssatz gehören. Solche Befehle müssen in einer + 'Befehlserklärung' nach Programmende definiert werden. +#page# +Das obige Programm befriedigt vom äußeren Erscheinungbild her einen PASCAL- +Programmierer wahrscheinlich völlig, einen ELAN-Verwöhnten jedoch sicher nicht. +Die Soester WARENHAUS-Software bietet keinerlei Möglichkeit der Modularisierung +#on("b")#innerhalb#off("b")# eines Programms (Refinement-/Prozedurkonzept o.ä.). Es gibt dort nur die +Möglichkeit, fertiggestellte Programme unter dem Programmnamen dem Basis­ +befehlssatz "hinzuzufügen" - ein Vorgang, der dem Insertieren unter EUMEL/ELAN +ähnelt. Obwohl es unter EUMEL/ELAN ein leichtes gewesen wäre, diese Möglichkeit +ebenfalls zu realisieren, haben wir davon Abstand genommen, weil auf diese Weise an +jedem Arbeitsplatz eine "eigene" Programmierumgebung entstehen würde. Wir sind +der Meinung, daß für Schüler der Sekundarstufe I eine #on("b")#feste Modellumgebung als +Basis#off("b")# vorhanden sein muß. Außerdem erscheint uns bei der Programmierung "im +Kleinen" die "Bottom-Up"-Technik unangemessen und für den Anfänger viel zu +unübersichtlich zu sein; viel eher wäre hier die "Top-Down"-Methode angebracht. Wir +haben daher die Programmierumgebung in anderer Richtung erweitert und eine +Modularisierungsmöglichkeit realisiert, die dem Refinementkonzept nachempfunden +ist und damit unseren didaktisch-methodischen Vorstellungen viel eher entspricht. + +Bei #on("b")#gs-Warenhaus#off("b")# werden etwa benutzte 'eigene' Befehle #on("b")#innerhalb derselben#off("b")# +Programmdatei 'erklärt' und zwar #on("b")#nach#off("b")# dem Ende des eigentlichen 'Haupt­ +programms', d.h. also nach der Zeile . Mit Hilfe dieser Mög­ +lichkeit könnte das obige Programm besser strukturiert etwa so aussehen: + +#on("b")# + PROGRAMM Rechnung schreiben + neues Blatt + Kundennummer lesen + WENN nicht Stoptaste gedrückt + einkaufen mit Rechnung + ENDE WENN + ENDE PROGRAMM + + einkaufen mit Rechnung: + Rechnungskopf + WIEDERHOLE + Artikelnummer lesen + Artikel eventuell kaufen + BIS Stoptaste gedrückt + Abrechnung +#page# + Artikel eventuell kaufen: + WENN nicht Stoptaste gedrückt + Artikel kaufen + ENDE WENN +#off("b")# + + +Sie sehen, das Programm ist so zwar etwas länger, aber erheblich übersichtlicher +geworden. Für 'neue Befehle' und die zugehörigen 'Befehlserklärungen' gelten +folgende Grundsätze: + +- Die 'Befehlserklärungen' müssen #on("b")#nach#off("b")# aufgelistet + werden. Die Reihenfolge ist beliebig. + +- Eine 'Befehlserklärung' besteht aus dem zu erklärenden Befehl in (bis auf Leer­ + zeichen) völlig identischer Schreibweise (!) und einem nachfolgenden Doppel­ + punkt (:). + +- Ein 'neuer Befehl' darf alle möglichen Zeichen enthalten außer einem Doppel­ + punkt (:). Außerdem darf solch ein Befehl #on("b")#nicht#off("b")# mit einem 'Schlüsselwort' + beginnen (vgl. Kapitel 6.2). + +- In 'Befehlserklärungen' können neben den Grundbefehlen auch wieder 'neue + Befehle' benutzt werden, die dann wiederum erklärt werden müssen. + +- Befehle dürfen nur #on("b")#einmal#off("b")# erklärt werden, auch wenn sie mehrfach benutzt + werden. + +- Es dürfen nur Befehle erklärt werden, die irgendwo auch wirklich benutzt + werden. + +- Befehlserklärungen sind nur möglich für #on("b")#Ausführungs-Befehle#off("b")#. Es lassen sich + also z.B. keine neuen Bedingungen oder Kontrollstrukturen erklären! + +- Es dürfen innerhalb eines Programms maximal 20 verschiedene 'neue Befehle' + verwendet werden. (Diese Grenze dürfte in Warenhaus-Programmen kaum ein­ + mal erreicht werden!) +#page# +Formale Verstöße gegen diese Regeln werden bei dem Übersetzungsvorgang sofort +beim Auftauchen des ersten Fehlers zur Korrektur angeboten. Dabei wird in der +oberen Bildschirmhälfte das Programm editiert, wobei der Cursor an den Anfang der +Zeile gesetzt wird, in der sich der (erste) Fehler befindet. In der unteren Bildschirm­ +hälfte wird über den Paralleleditor in einem 'notebook' die Art des Fehlers mit An­ +gabe der Zeilennummer genauer beschrieben. + +In der Regel wird hier nur auf #on("b")#einen#off("b")# (nämlich den ersten auftauchenden) Fehler +hingewiesen, so daß Sie das Programm evtl. mehrfach starten müssen, bis alle Fehler +erkannt und beseitigt sind. Manchmal tauchen im Fehler-'notebook' aber auch +mehrere Fehlermeldungen auf (z.B. wenn 'neue Befehle' nicht erklärt oder erklärte +Befehle nicht benutzt wurden). In Extremfällen kann es dabei dazu kommen, daß +nicht mehr das ganze Fehler-'notebook' auf dem Bildschirm sichtbar ist. In diesem +Fall können Sie mit der Tastenfolge den Cursor zwischen den beiden +Bildschirmhälften hin- und herschalten und mit den Pfeiltasten evtl. nicht-sichtbare +Teile des 'notebooks' oder der Programmdatei auf den Bildschirm holen. (Für +genauere Informationen über den Umgang mit dem EUMEL-Editor lesen Sie bitte im +EUMEL-Benutzerhandbuch nach.) + + +#on("b")#6.2  Kontrollstrukturen#off("b")# + +Sowohl in ELAN-Programmen, als auch in GRIN-Programmen werden Kontroll­ +strukturen durch 'Schlüsselworte' gekennzeichnet, die grundsätzlich in +GROSSBUCHSTABEN geschrieben werden müssen, um sie deutlich gegenüber Aus­ +führungsbefehlen und Bedingungen abzuheben. In GRIN-Programmen gibt es +Schlüsselworte für den Anfang und das Ende eines Programms sowie für Schleifen +und einseitige Abfragen. Wir notieren hier nur die in GRIN-Programmen möglichen +Kontrollstrukturen und geben, wenn vorhanden, die zugehörige ELAN-Übersetzung in +Klammern an. + + +#on("b")#Programm-Anfang/Ende:#off("b")# + + #on("b")#PROGRAMM#off("b")# + + + . + . + #on("b")#ENDE PROGRAMM#off("b")# + + +Jedes GRIN-(Haupt-)Programm beginnt mit dem Schlüsselwort 'PROGRAMM', gefolgt +von einem frei wählbaren Programmnamen, der jedoch in dieselbe Zeile passen +muß. Die Zeile 'ENDE PROGRAMM' zeigt das Ende eines GRIN-(Haupt-)Programms +an. Sowohl 'PROGRAMM', als auch 'ENDE PROGRAMM' dürfen in einer Programm­ +datei nur #on("b")#einmal#off("b")# verwendet werden. Entsprechende Schlüsselworte in ELAN- +Programmen gibt es nicht. + + +#on("b")#Schleifen:#off("b")# + +Schleifen müssen innerhalb des Hauptprogramms oder der Befehlserklärung, in der +sie geöffnet werden, auch wieder geschlossen werden. Schachtelungen sind zwar +zulässig, sollten aber aus Gründen der Übersichtlichkeit vermieden werden. Soll +dennoch innerhalb einer Schleife eine weitere Schleife verwendet werden, so sollte die +innere Schleife über einen 'neuen Befehl' in eine Befehlserklärung 'ausgelagert' +werden. Folgende Schleifenarten sind möglich: + +a) Zählschleife: + + #on("b")#WIEDERHOLE#off("b")# #on("b")#MAL#off("b")# (ELAN: INT VAR i; + FOR i FROM 1 UPTO n REPEAT + . + . . + . . + #on("b")#ENDE WIEDERHOLE#off("b")# END REPEAT) + + +Die Anweisungen innerhalb der Schleife werden  - mal ausgeführt. + + +b) Schleife mit Ausgangsbedingung: + + + #on("b")#WIEDERHOLE#off("b")# (ELAN: REPEAT + . + . + . . + . . + #on("b")#BIS#off("b")# UNTIL bedingung END REPEAT) + + +Die Anweisungen innerhalb der Schleife werden mindestens einmal ausgeführt und +dann solange wiederholt, bis die Bedingung erfüllt ist. Bei der Programmierung ist +darauf zu achten, daß durch die Anweisungen die Bedingung erfüllt werden kann, +denn sonst ist das Resultat eine 'Endlosschleife', deren Ausführung nur durch einen +totalen Programmabbruch () beendet werden kann. + + +c) Zählschleife mit Ausgangsbedingung: + + + #on("b")#WIEDERHOLE#off("b")# #on("b")#MAL#off("b")# (ELAN: INT VAR i; + FOR i FROM 1 UPTO n REPEAT + . + . . + . . + #on("b")#BIS#off("b")# UNTIL bedingung END REPEAT) + + +Die Anweisungen innerhalb der Schleife werden -mal ausgeführt. Im Gegensatz +zur reinen Zählschleife können die Wiederholungen jedoch vorzeitig abgebrochen +werden, nämlich dann, wenn nach irgendeinem Schleifendurchlauf die Bedingung +erfüllt ist. + + +d) Endlosschleife: + + + #on("b")#WIEDERHOLE#off("b")# (ELAN: REPEAT + . + . + . . + . . + #on("b")#ENDE WIEDERHOLE#off("b")# END REPEAT) + + +Die Anweisungen innerhalb der Schleife werden immer wieder ausgeführt. Da keine +begrenzte Anzahl von Durchläufen und auch keine Abbruchbedingung angegeben ist, +kann diese Schleife nur durch einen totalen Programmabbruch () +beendet werden. + +(Die Schleifenarten c) und d) sind in der Soester WARENHAUS-Software nicht vor­ + handen, ergaben sich bei der Konstruktion des #on("b")#gs-Warenhaus#off("b")#-Übersetzers wegen + der analogen Strukturen in ELAN jedoch quasi "von selbst", so daß wir sie auch + zugelassen haben. Schleifen mit Eingangsbedingung (ELAN: WHILE bedingung + REPEAT ... END REPEAT) sind für GRIN-Programme jedoch nicht realisiert.) + + +#on("b")#Einseitige Abfragen:#off("b")# + + + #on("b")#WENN#off("b")# (ELAN: IF bedingung + THEN anweisung 1; + anweisung 2; + . . + . . + #on("b")#ENDE WENN#off("b")# END IF) + + +Die Anweisungen werden nur ausgeführt, wenn die Bedingung erfüllt ist. (Eine Ent­ +sprechung zu der in ELAN möglichen 'zweiseitigen Abfrage' (IF ... THEN ... ELSE ... +END IF) gibt es in der GRIN-Version nicht!) + +Eine im Hauptprogramm oder in einer Befehlserklärung begonnene Abfrage ('WENN +...') muß auch im selben Programmteil wieder beendet werden. Ähnlich wie bei +Schleifen ist die Schachtelung von Abfragen innerhalb des Hauptprogramms oder +einer Befehlserklärung zwar zulässig, führt aber zu unübersichtlichen Programmen. +Auch hier sollte man innerhalb einer Abfrage eventuell notwendige weitere Abfragen +durch 'neue Befehle' in Befehlserklärungen auslagern. + + +#on("b")#Zulässige Bedingungen:#off("b")# + +#on("b")#Stoptaste gedrückt#off("b")# (ELAN: stoptaste gedrückt) + + Die Bedingung ist erfüllt (d.h. liefert den Wert 'wahr'), wenn während des bis­ + herigen Programmablaufs die Tastenfolge getippt worden ist; + sonst ist sie nicht erfüllt (Wahrheitswert 'falsch'). (Das Tippen von + beim Verlassen einer Datei hat jedoch #on("b")#keinen#off("b")# Einfluß auf den Wahrheitswert der + Bedingung!) + + Bei jeder Ausführung der Befehle 'Artikelnummer lesen', 'Kundennummer lesen' + und 'Auskunft' wird der Wahrheitswert der Bedingung zunächst immer auf + 'falsch' gesetzt (siehe 6.3), so daß die Abfrage der Bedingung nach einem dieser + Befehle nur dann 'wahr' liefert, wenn #on("b")#während#off("b")# oder #on("b")#nach#off("b")# der letztmaligen Aus­ + führung eines der drei Befehle getippt wurde; ein etwa vorher + erfolgtes Tippen dieser Tastenfolge ist somit wirkungslos! + + +#on("b")#nicht Stoptaste gedrückt#off("b")# (ELAN: NOT stoptaste gedrückt) + + Dieses ist das logische Gegenteil von 'Stoptaste gedrückt': 'nicht Stoptaste ge­ + drückt' ist erfüllt, wenn 'Stoptaste gedrückt' #on("b")#nicht#off("b")# erfüllt ist und umgekehrt. + +Um Probleme bei der Arbeit mit Terminals zu vermeiden, die nicht über den +deutschen Zeichensatz verfügen (Umlaute!), ist bei beiden Bedingungen auch die +Schreibweise 'gedrueckt' erlaubt. + + + +#on("b")#6.3  Detailbeschreibung der Warenhaus-Grundbefehle#off("b")# + +Wie bereits in 6.1 erwähnt, ist die im folgenden vorgegebene Schreibweise der Grund­ +befehle bezüglich Groß- und Kleinschreibung verbindlich; Leerzeichen dagegen +können beliebig eingefügt oder auch weggelassen werden. Fett gedruckt steht immer +der GRIN-Befehl, in Klammern dahinter der zugehörige ELAN-Befehl. + + +#on("b")#Artikelnummer lesen#off("b")# (ELAN: artikelnummer lesen) + + - Der Wahrheitswert der Bedingung 'Stoptaste gedrückt' wird zunächst auf + 'falsch' gesetzt. + - Der Benutzer wird aufgefordert, eine Artikelnummer einzugeben. Je nach + Einstellung der 'Eingabeart' (vgl. Kapitel 5.3) erfolgt die Eingabe durch Ein­ + tippen einer Zahl über die Tastatur oder durch Einschieben einer Warenkarte + in das Lesegerät. Eingaben über die Tastatur sind mit abzu­ + schließen. Akzeptiert werden nur Werte von 1 bis 15, ansonsten erfolgt eine + Warnung, und die Eingabe wird wiederholt. + - Durch Tippen der Tastenfolge kann dieser Befehl abgebrochen + werden, ohne daß eine Artikelnummer eingelesen wird. In diesem Falle wird + der Wahrheitswert der Bedingung 'Stoptaste gedrückt' auf 'wahr' gesetzt, sonst + bleibt der Wert auf 'falsch'. + - Durch Tippen der Tastenfolge wird die Ausführung des + gesamten Programms abgebrochen. + + +#on("b")#Artikeldaten eingeben#off("b")# (ELAN: artikeldaten eingeben) + + - Der Befehl setzt voraus, daß zuvor eine Artikelnummer eingelesen wurde, + ansonsten erfolgt eine entsprechende Fehlermeldung. + - Die Angaben zu einem Artikel (Name, Preis, Mindestbestand, Bestand) können + eingegeben bzw. verändert werden. + - Alle Eingaben sind mit oder der Tastenfolge + abzuschließen. Durch wird der Wahrheitswert der Bedingung + 'Stoptaste gedrückt' auf 'wahr' gesetzt. + - Nach Abschluß der Eingaben werden die Artikeldaten in der Filial-Verwaltung + gespeichert, worauf auch kurz hingewiesen wird. + - Durch Tippen der Tastenfolge während der Eingaben wird die + Ausführung des gesamten Programms abgebrochen. + + +#on("b")#Kundennummer lesen#off("b")# (ELAN: kundennummer lesen) + + - Der Wahrheitswert der Bedingung 'Stoptaste gedrückt' wird zunächst auf + 'falsch' gesetzt. + - Der Benutzer wird aufgefordert, eine Kundennummer einzugeben. Je nach + Einstellung der 'Eingabeart' (vgl. Kapitel 5.3) erfolgt die Eingabe durch Ein­ + tippen einer Zahl über die Tastatur oder durch Einschieben einer Kundenkarte + in das Lesegerät. Eingaben über die Tastatur sind mit abzu­ + schließen. Akzeptiert werden nur Werte von 129 bis 159, ansonsten erfolgt eine + Warnung, und die Eingabe wird wiederholt. + - Durch Tippen der Tastenfolge kann dieser Befehl abgebrochen + werden, ohne daß eine Kundennummer eingelesen wird. In diesem Falle wird + der Wahrheitswert der Bedingung 'Stoptaste gedrückt' auf 'wahr' gesetzt, sonst + bleibt der Wert auf 'falsch'. + - Durch Tippen der Tastenfolge wird die Ausführung des + gesamten Programms abgebrochen. + + +#on("b")#Kundendaten eingeben#off("b")# (ELAN: kundendaten eingeben) + + - Der Befehl setzt voraus, daß zuvor eine Kundennummer eingelesen wurde, + ansonsten erfolgt eine entsprechende Fehlermeldung. + - Die Angaben zu einem Kunden (Name, Vorname, Geschlecht) können einge­ + geben bzw. verändert werden. + - Alle Eingaben sind mit oder der Tastenfolge + abzuschließen. Durch wird der Wahrheitswert der Bedingung + 'Stoptaste gedrückt' auf 'wahr' gesetzt. + - Nach Abschluß der Eingaben werden die Kundendaten sowohl in der Filial- + Verwaltung als auch in der Zentrale gespeichert, worauf auch kurz hingewiesen + wird. + - Durch Tippen der Tastenfolge während der Eingaben wird die + Ausführung des gesamten Programms abgebrochen. + + +#on("b")#neues Blatt#off("b")# (ELAN: neues blatt) + + - Das Rechnungsfenster auf dem Bildschirm wird gelöscht. + - Für die Ausgabe der nächsten Rechnung auf dem Drucker wird eine neue + Rechnungsdatei bereitgestellt. + + +#on("b")#Rechnungskopf#off("b")# (ELAN: rechnungskopf) + + - Ein Rechnungskopf wird auf dem Bildschirm ausgegeben. Falls zuvor eine + Kundenummer eingelesen worden ist, unter der bereits Kundendaten einge­ + geben wurden, erscheint der Name des betreffenden Kunden im Rechnungs­ + kopf. + - Der Rechnungskopf wird für einen eventuellen späteren Ausdruck in die + Rechnungsdatei geschrieben. + + +#on("b")#Artikel kaufen#off("b")# (ELAN: artikel kaufen) + + - Der Befehl setzt voraus, daß zuvor eine Artikelnummer eingelesen worden ist, + ansonsten erfolgt eine entsprechende Fehlermeldung. + - Artikelname und -preis werden auf den Bildschirm und in die Rechnungsdatei + geschrieben. + - Der Kauf wird intern in den entsprechenden Filial-Dateien registriert. + + +#on("b")#Abrechnung#off("b")# (ELAN: abrechnung) + + - Die Preise der gekauften Artikel werden addiert. + - Die Summe wird auf dem Bildschirm angezeigt und in die Rechnungsdatei + geschrieben. + - Der Benutzer wird gefragt, ob die Rechnung ausgedruckt werden soll. + + +#on("b")#Auskunft#off("b")# (ELAN: auskunft) + + - Der Wahrheitswert der Bedingung 'Stoptaste gedrückt' wird zunächst auf + 'falsch' gesetzt. + - Der Benutzer wird aufgefordert, eine Codenummer einzugeben. Je nach Ein­ + stellung der 'Eingabeart' (vgl. Kapitel 5.3) erfolgt die Eingabe durch Eintippen + einer Zahl über die Tastatur oder durch Einschieben einer Codekarte in das + Lesegerät. Eingaben über die Tastatur sind mit abzuschließen. + Akzeptiert werden nur zulässige Werte, ansonsten erfolgt eine Warnung, und + die Eingabe wird wiederholt. Die Bedeutungen der einzelnen Auskunftscodes + sind in Kapitel 5.4 unter der Menufunktion 'Auskunft einholen' beschrieben. + - Durch Tippen der Tastenfolge kann der Befehl abgebrochen + werden, ohne daß eine Codenummer eingelesen wird. In diesem Falle wird der + Wahrheitswert der Bedingung 'Stoptaste gedrückt' auf 'wahr' gesetzt, sonst + bleibt der Wert auf 'falsch'. + - Durch Tippen der Tastenfolge wird die Ausführung des + gesamten Programms abgebrochen. + + +#on("b")#Bildschirm neu#off("b")# (ELAN: bildschirm neu) + + - Der Programm-Eingangsbildschirm wird neu aufgebaut. Der Befehl wird + benötigt, wenn die Fenstereinteilung auf dem Bildschirm wiederhergestellt + werden soll (z.B. nach Ausgabe einer Liste bei dem Befehl 'Auskunft'). + - Der Befehl wird beim Starten eines GRIN-Programms automatisch ausgeführt; + bei ELAN-Programmen wird er automatisch am Anfang eines jeden Programms + eingefügt, wenn das Programm nicht mit diesem Befehl beginnt. + + +Neben diesen Befehlen stehen für ELAN-Programme noch drei weitere zur Verfügung, +die nicht zum GRIN-Befehlssatz gehören: + + nachbestellen, + dezimalwert lesen, + bitmuster lesen. + +Diese Befehle entsprechen in ihrer Wirkung den gleichnamigen Menufunktionen +unter dem Oberbegriff 'Kommandos', die in Kapitel 5.4 beschrieben sind. + + + diff --git a/doc/warenhaus/gs-Warenhaus-7 b/doc/warenhaus/gs-Warenhaus-7 new file mode 100644 index 0000000..3a55dfe --- /dev/null +++ b/doc/warenhaus/gs-Warenhaus-7 @@ -0,0 +1,235 @@ +#limit (11.0)##pagelength (16.5)##block# +#start (2.0,0.0)# +#page (69)# +#headodd# +#center#gs-Warenhaus#right#% + +#end# +#headeven# +%#center#gs-Warenhaus + +#end# +#center#1 + +#center##on("b")#7  Weitere Kommandos (für Systembetreuer)#off("b")# + + +Wenn Sie #on("b")#gs-Warenhaus#off("b")# installiert haben und mit dem Aufbau des Systems nach +der automatischen Generierung zufrieden sind, dann ist dieses Kapitel nicht wichtig +für Sie. Wir erklären Ihnen hier die Befehle, mit denen Sie die Einstellungen, die bei +der Installation vorgenommen wurden, auch nachträglich noch ändern können. +Beachten Sie bitte, daß aus Sicherheitsgründen eine Einstellungs#on("b")#änderung#off("b")# i.a. nur in +der Task möglich ist, in der die entsprechende Einstellung vorgenommen wurde, es +sei denn, dort wurde eine Einstellung gänzlich aufgehoben. Außerdem werden Ein­ +stellungsänderungen stets nur an Sohntasks weitergegeben ("vererbt"), die #on("b")#nach#off("b")# der +Änderung angemeldet werden! + +Die Standard-Installation sieht z.B. nur die Einrichtung #on("b")#einer#off("b")# Warenhaus-Hauptstelle +vor. Wenn Sie tatsächlich nur eine Hauptstelle eingerichtet haben, nun aber doch +mehrere Hauptstellen (für verschiedene Lerngruppen) betreiben wollen, so brauchen +Sie das Programm nicht erneut zu insertieren! Machen Sie besser in der bisherigen +Hauptstellen-Task den Hauptstellenstatus mit dem Kommando 'warenhaus haupt­ +stelle (FALSE)' rückgängig und richten Sie in Sohntasks mit dem Kommando 'waren­ +haus hauptstelle (TRUE)' wieder neue Hauptstellen ein. Außerdem können Sie in +Hauptstellen-Tasks die Version für die Programmierschnittstelle umstellen ('grin +(TRUE)' bzw. 'grin (FALSE)'). + +Ähnlich verhält es sich mit dem Betrieb eines Adapters für das Kartenleser-Interface. +Auch hier ist die Standard-Einstellung u.U. nur für den Betrieb #on("b")#eines#off("b")# Adapters ausge­ +legt. Möchten Sie mehrere Kartenleser anschließen, so sind bei der Verwendung von +MUFIs im Terminalkanal keine Änderungen nötig, da hier jede Filialtask sowieso nur +auf das MUFI zugreifen kann, das in den Kanal des Terminals geschaltet ist, an das +die Task gekoppelt ist. Möchten Sie jedoch mehrere Kartenleser über Adapter an +separaten seriellen Schnittstellen ansprechen, so müssen Sie dem System mehrere +Kanalnummern mitteilen, die für verschiedene Filialtasks ja durchaus unterschied­ +lich sein können. Am geschicktesten erscheint es in diesem Fall, unter einer Haupt­ +stelle mehrere "Zwischentasks" einzurichten, in diesen jeweils die Interface- +Kanalnummern festzulegen und die Filialtasks als Söhne dieser "Zwischentasks" +anzumelden. Benennen Sie die "Zwischentasks" so, daß die eingestellte Kanal­ +nummer aus dem Namen ersichtlich ist, so ist gleich bei der Anmeldung einer Filial­ +task klar, welcher Kartenleser von dieser Task aus angesprochen werden kann. + +Um diesen Aufbau zu realisieren, sollten Sie zunächst in der entsprechenden Haupt­ +stellentask einen etwa eingerichteten Direktstart mit dem Kommando 'warenhaus +direktstart (FALSE)' aufheben. Ebenfalls in der Hauptstellentask wird dann mit dem +Kommando 'init interface channel' eine etwa vorhandene Kanaleinstellung gelöscht, +wenn Sie bei der Aufforderung 'Gib Interface-Kanal:' eine '0' eingeben. Nun richten +Sie für jeden vorhandenen Adapter (natürlich müssen auch entsprechend viele freie +serielle Schnittstellen zur Verfügung stehen!) eine "Zwischentask" als Sohn der +Hauptstellentask ein (z.B. 'Kanal 5', 'Kanal 6' etc.) und geben dort jeweils wieder das +Kommando 'init interface channel'. Bei der Abfrage 'Gib Interface-Kanal:' geben Sie +dann die entsprechende Kanalnummer ein (in unserem Beispiel 5 oder 6 etc.). Alle +Söhne der Zwischentask 'Kanal 5' z.B. können dann (abwechselnd) den Kartenleser +benutzen, der an den Adapter an Kanal 5 angeschlossen ist. In diesen Zwischentasks +können Sie, wenn Sie möchten, mit dem Kommando 'warenhaus direktstart (TRUE)' +einen Direktstart für die neu anzumeldenden Sohntasks (Filialen) einrichten. +Ansonsten wird #on("b")#gs-Warenhaus#off("b")# in den Sohntasks aus der 'gib Kommando' - Ebene +mit dem Befehl 'warenhaus' gestartet (vgl. Kapitel 3.3). + +Sollten Sie beim Betrieb eines Codekartenlesers feststellen, daß die Wartezeit beim +Einlesen einer Codekarte zu kurz oder zu lang ist, so können Sie auch diese ändern. +Da die Wartezeit durch eine Schleife realisiert ist, in der laufend Werte vom Interface +gelesen werden, ist sie abhängig von der Geschwindigkeit des verwendeten Rechners +und von der gewählten Interface-Anpassung. Die Veränderung der Wartezeit erfolgt +mit dem Kommando 'eingabesicherheit (n)', wobei n eine 'Integer'-Zahl sein muß. +Bei sehr langsamen Systemen hat sich ein Wert von 3 als sinnvoll herausgestellt; bei +schnellen Rechnern muß n etwa 10 oder noch größer sein. Ermitteln Sie den für +Ihren Rechner geeigneten Wert bitte durch Ausprobieren. (Standardmäßig eingestellt +ist n = 5.) + +Mit Hilfe von drei Informationsprozeduren können Sie Informationen über den +Systemzustand einholen: 'put (hauptstellenname)' liefert den Namen der zu­ +ständigen Hauptstellen-Task, 'put (interface anpassung)' zeigt den Namen der bei +der Installation gewählten Interfaceanpassung für den Kartenleser, und 'put (inter­ +face channel)' liefert die Nummer des Kanals, über den ein Interface an separater +serieller Schnittstelle angesprochen wird. + + + +#on("b")#Detailbeschreibung der Befehle#off("b")#: + + +#on("b")#PROC eingabesicherheit (INT CONST n):#off("b")# + + - stellt die Wartezeit beim Einlesen einer Artikel-, Kunden- oder Auskunfts­ + codenummer in Abhängigkeit vom Absolutbetrag von n ein. Bei langsamen + Rechnern sollte abs(n) klein (ca. 3), bei schnellen Rechnern größer (ca. 10) + sein. + - Standardeinstellung ist 5. + - Der Befehl kann in jeder Task gegeben werden, in der #on("b")#gs-Warenhaus#off("b")# + insertiert ist. + + +#on("b")#PROC grin (BOOL CONST entscheidung):#off("b")# + + - ist nur in Hauptstellentasks aufrufbar und in Tasks, die keiner Hauptstellen­ + task untergeordnet sind. + - stellt die Version für die Programmierschnittstelle gemäß der 'entscheidung' + ein: + TRUE ---> GRIN-Version, FALSE ---> ELAN-Version. + + Fehlerfälle: + - Dieser Befehl darf nur von der Task '...' aus gegeben werden! + + +#on("b")#TEXT PROC hauptstellenname:#off("b")# + + - liefert den Namen der zuständigen Hauptstellentask. + - liefert 'niltext' (""), wenn in diesem Zweig des Taskbaumes noch keine + Hauptstelle existiert; es ist dann kein Warenhaus-Betrieb möglich! (vgl. + 'PROC warenhaus hauptstelle') + + +#on("b")#PROC init interfacechannel:#off("b")# + + - initialisiert eine unbenannte Sohntask ("-") zum Ansprechen des Interface­ + systems über eine separate serielle Schnittstelle und existiert deshalb nur bei + den Anpassungen für 'MUFI als Endgerät' und 'AKTRONIK-Adapter'. + - erfragt zunächst eine Kanalnummer ('Gib Interface-Kanal:'); zulässig sind + Eingaben von 0 bis 24. + - löscht eine evtl. bereits vorhandene unbenannte Sohntask ("-"). + - richtet bei Eingabe einer Kanalnummer > 0 eine neue unbenannte Sohntask + ein und sperrt dieses Kommando für Sohntasks, die danach angemeldet + werden. + - hebt eine etwa gesetzte Sperrung bei Eingabe von 0 als Kanalnummer wieder + auf. + + Fehlerfälle: + - Dieses Kommando kann nur von der Task '...' aus gegeben werden! + - Unzulässige Kanalnummer! + + +#on("b")#TEXT PROC interface anpassung:#off("b")# + + - liefert den Namen der bei der Installation ausgewählten Anpassung. Möglich + sind zur Zeit: + + "ohne Kartenleser", + "mit Kartenleser an AKTRONIC-Adapter", + "mit Kartenleser an MUFI als Endgerät", + "mit Kartenleser an MUFI im Terminalkanal". + + +#on("b")#INT PROC interface channel:#off("b")# + + - existiert nur bei den Anpassungen für den AKTRONIC-Adapter und MUFI als + Endgerät. + - liefert die Kanalnummer der seriellen Schnittstelle, über die das Interface­ + system angesprochen wird. + - wird der Wert 0 geliefert, so kann in der Task keine Eingabe über einen + Kartenleser erfolgen (siehe 'PROC init interfacechannel'). + + +#on("b")#PROC warenhaus:#off("b")# + + - ist nicht in Hauptstellentasks aufrufbar. + - startet #on("b")#gs-Warenhaus#off("b")# aus der 'gib Kommando' - Ebene oder wird bei einge­ + richtetem Direktstart automatisch aufgerufen. + - richtet eine Sohntask als Filialverwaltung ein und kennzeichnet damit die + eigene Task für das System als 'aktive' Filiale. Der Name dieser Sohntask + enthält den Namen der zuständigen Hauptstellentask und die Filialnummer, + unter der die Filiale geführt wird. Diese Filialnummer ist identisch mit der + Kanalnummer des angekoppelten Terminals. + - löscht die Filialverwaltungstask, wenn das Warenhaus-Menu geregelt mit + verlassen wird. Zu Kollisionen bezüglich der Filialnummer + kann es somit nur kommen, wenn an einem Arbeitsplatz das WARENHAUS- + Menu ungeregelt verlassen wird (z.B. durch Tippen der SV-Taste) und dann + an demselben Arbeitsplatz eine neue Filiale angemeldet werden soll. In + diesem Fall erhält die neue Task #on("b")#keine#off("b")# Filialverwaltung als Sohntask und ist + damit für den Warenhaus-Betrieb nicht brauchbar. Deshalb wird hier nach + Ausgabe einer Fehlermeldung sofort gefragt, ob die Task gelöscht werden soll. + + Fehlerfälle: + - Dieser Befehl darf nur von Söhnen dieser Task aus gegeben werden! + - Keine uebergeordnete Task ist 'warenhaus hauptstelle'! + - Filiale ist bereits besetzt durch TASK '...'! + Es ist so kein geregelter Warenhaus-Betrieb möglich! + + +#on("b")#PROC warenhaus direktstart (BOOL CONST entscheidung):#off("b")# + + - richtet gemäß dem Wahrheitswert der 'entscheidung' einen Direktstart ein + oder hebt ihn wieder auf. + Hat 'entscheidung' den Wert 'TRUE', so wird ein Direktstart eingerichtet. Es + erscheint zunächst die Frage 'Mit automatischem Löschen (j/n)?'. Durch den + Direktstart gelangt man beim Anmelden einer Sohntask nicht in die 'gib + Kommando' - Ebene, sondern sofort in das WARENHAUS-Menu. Wird die + obige Frage mit beantwortet, so werden Sohntasks nach dem Ausstieg + aus dem WARENHAUS-Menu sofort gelöscht; andernfalls wird erst noch ge­ + fragt, ob gelöscht werden soll. Bei Verneinung erfolgt ein 'break'. Die Ein­ + richtung eines Direktstarts wird vom System vermerkt und der Befehl darauf­ + hin in allen untergeordneten Tasks gesperrt. Sowohl der Direktstart als auch + die Sperrung sind nur wirksam für Sohntasks, die #on("b")#nach#off("b")# Ausführung dieses + Befehls angemeldet werden. + Hat 'entscheidung' den Wert 'FALSE', so wird ein etwa eingerichteter Direkt­ + start und die damit verbundene Sperrung des Befehls für neue Sohntasks + wieder aufgehoben. Die Aufhebung ist nur möglich in der Task, von der aus + der Direktstart eingerichtet wurde. + + Fehlerfälle: + - Der Direktstart kann nur aus der Task '...' geaendert werden! + + +#on("b")#PROC warenhaus hauptstelle (BOOL CONST entscheidung):#off("b")# + + - macht je nach Wahrheitswert der 'entscheidung' eine Task zur Hauptstellen­ + task ('TRUE') bzw. hebt diesen Status wieder auf ('FALSE'). Eine Task kann + nur Hauptstelle werden, wenn noch keine übergeordnete Task Hauptstelle ist. + Der Hauptstellenstatus kann danach auch nur in dieser Task wieder aufge­ + hoben werden. + - löscht bei der Einrichtung der Hauptstelle eine etwa bereits vorhandene + "Zentrale" und richtet automatisch eine neue "Zentrale" in Form einer Sohn­ + task ein, die den Namen der Vatertask mit dem Zusatz ".Zentrale" erhält und + in der später die zentrale Kundendatei gespeichert wird. Bei Aufhebung des + Hauptstellenstatus wird diese Task wieder gelöscht. + - fragt bei Einrichtung der Hauptstelle nach, ob ein Direktstart eingerichtet + werden soll ('Mit Direktstart (j/n)?') und ruft die Prozedur 'warenhaus + direktstart' entsprechend auf. + - Hebt bei Löschen des Hauptstellenstatus einen in der Task etwa einge­ + richteten Direktstart automatisch auf. + + Fehlerfälle: + - Hauptstelle ist bereits die Task '...'! + - Dieses Kommando darf nur in der Task '...' gegeben werden! + + -- cgit v1.2.3