home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / sonderh1 / setup.pas < prev    next >
Pascal/Delphi Source File  |  1987-04-15  |  21KB  |  557 lines

  1. {---------------------------------------------------------------------------}
  2. {                             SETUP.PAS                                     }
  3. {               Ein Werkzeug zur Druckerinitialisierung                     }
  4. {            fuer Panasonic KX-P1092 und Epson-Kompatible.                  }
  5. {                                                                           }
  6. {---------------------------------------------------------------------------}
  7.  
  8. PROGRAM SetUp;
  9.  
  10. CONST
  11.   max   = 10;                        { maximale Anzahl Betriebsarten/Gruppe }
  12.   Bell  = ^G;                        { ASCII-Zeichen laesst Ton ertoenen    }
  13.   up    = ^E;                        { Control-Zeichen zur Cursorsteuerung  }
  14.   down  = ^X;
  15.   right = ^D;
  16.   left  = ^S;
  17.   enter = ^M;
  18.   esc   = #27;
  19.   backspace = ^H;
  20.  
  21. TYPE
  22.   Arten  = (Schriften,ZeilenVor,PapierVor,ZeichenSt,Divers);
  23.   str20  = STRING[ 20];
  24.   str128 = STRING[128];
  25.  
  26.   Beschreiber =
  27.     RECORD
  28.       Text  : str20;          { Betriebsarten Beschreibung                  }
  29.       Init  : STRING[6];      { Betriebsarten Initialsierung-Sequenz        }
  30.       DeInit: STRING[6];      { Betriebsarten Deinitialisieruns-Sequenz     }
  31.       Parm  : BYTE;           { wenn zur Initialisierung ein Parameter      }
  32.                               { erfragt werden soll ist dieser Wert<>0      }
  33.       Grp   : BYTE;           { Priority der Beriebsart:
  34.                                 0=Default Wert einer Gruppe,
  35.                                   nach dem Reset anzuzeigen
  36.                                 1=nach dem Reset der Bertiebsart selektiere
  37.                                   den Default-Wert der Gruppe
  38.                                 2=Diese Betriebsart kann normal gesetzt
  39.                                   und rueckgesetzt werden
  40.                                 3=Definiertes Ruecksetzten nicht moeglich
  41.                                 4=Nach dem Reset setzen. Wird benutzt bei
  42.                                   Betriebsarten anstatt Grp=0
  43.                                 7=fluechtige Betriebsart Einstellung z.b LF
  44.                                 8=reserviertes Feld, nicht benutzt
  45.                                 9=General Reset, IN allen Gruppen Default
  46.                                   Werte anzeigen                            }
  47.       Aktv  : BOOLEAN;        { Status der Betriebsart valid/invalid        }
  48.     END;
  49.  
  50.   Menue =
  51.     RECORD
  52.       Kopf  : str20;                      { Titel eines Untermenues         }
  53.       Anzahl: INTEGER;                    { Betriebsarten eines Untermenues }
  54.       Xpos  : BYTE;                       { Anzeige eines Untermenues, an   }
  55.       Ypos  : BYTE;                       { Bildschirmposition X,Y          }
  56.       Rumpf : ARRAY[1..max] OF Beschreiber;
  57.     END;
  58.  
  59. CONST
  60.   Menuefeld : ARRAY[Arten] OF Menue =
  61.    ((Kopf  :'** SCHRIFTARTEN **'  ; Anzahl:9; Xpos:2; Ypos:5;
  62.      Rumpf :
  63.      ((Text:'Pica              ';Init:#27#80    ;DeInit:#0
  64.                                 ;Parm:0         ;Grp:0         ;Aktv:TRUE),
  65.       (Text:'Elite             ';Init:#27#77    ;DeInit:#27#80
  66.                                 ;Parm:0         ;Grp:1         ;Aktv:FALSE),
  67.       (Text:'Komprimiert       ';Init:#15       ;DeInit:#18
  68.                                 ;Parm:0         ;Grp:1         ;Aktv:FALSE),
  69.       (Text:'Fett              ';Init:#27#69    ;DeInit:#27#70
  70.                                 ;Parm:0         ;Grp:2         ;Aktv:FALSE),
  71.       (Text:'Breit             ';Init:#27#87#1  ;DeInit:#27#87#0
  72.                                 ;Parm:0         ;Grp:2         ;Aktv:FALSE),
  73.       (Text:'Kursiv-Schrift    ';Init:#27#52    ;DeInit:#27#53
  74.                                 ;Parm:0         ;Grp:2         ;Aktv:FALSE),
  75.       (Text:'NLQ-Schrift       ';Init:#27#110   ;DeInit:#27#80
  76.                                 ;Parm:0         ;Grp:1         ;Aktv:FALSE),
  77.       (Text:'Proport. Schrift  ';Init:#27#111   ;DeInit:#27#80
  78.                                 ;Parm:0         ;Grp:1         ;Aktv:FALSE),
  79.       (Text:'Proport. Abstand  ';Init:#27#112#1 ;DeInit:#27#112#0
  80.                                 ;Parm:0         ;Grp:2         ;Aktv:FALSE),
  81.       (Text:''                  ;Init:''        ;DeInit:''
  82.                                 ;Parm:0         ;Grp:8       ;Aktv:FALSE))),
  83.     (Kopf  :'** ZEILENSPRUNG **'; Anzahl:5; Xpos:22; Ypos:5;
  84.      Rumpf :
  85.      ((Text:'2,47mm (7/72i)    ';Init:#27#49    ;DeInit:#27#50
  86.                                 ;Parm:0         ;Grp:1         ;Aktv:FALSE),
  87.       (Text:'3,2 mm (1/8 i)    ';Init:#27#48    ;DeInit:#27#50
  88.                                 ;Parm:0         ;Grp:1         ;Aktv:FALSE),
  89.       (Text:'4,2 mm (1/6 i)    ';Init:#27#50    ;DeInit:#0
  90.                                 ;Parm:0         ;Grp:0         ;Aktv:TRUE ),
  91.       (Text:'[xx]/72 i         ';Init:#27#65    ;DeInit:#27#50
  92.                                 ;Parm:1         ;Grp:1         ;Aktv:FALSE),
  93.       (Text:'[xxx]/216i        ';Init:#27#51    ;DeInit:#27#50
  94.                                 ;Parm:1         ;Grp:1         ;Aktv:FALSE),
  95.       (Text:''                  ;Init:''        ;DeInit:''
  96.                                 ;Parm:0         ;Grp:8         ;Aktv:FALSE),
  97.       (Text:''                  ;Init:''        ;DeInit:''
  98.                                 ;Parm:0         ;Grp:8         ;Aktv:FALSE),
  99.       (Text:''                  ;Init:''        ;DeInit:''
  100.                                 ;Parm:0         ;Grp:8         ;Aktv:FALSE),
  101.       (Text:''                  ;Init:''        ;DeInit:''
  102.                                 ;Parm:0         ;Grp:8         ;Aktv:FALSE),
  103.       (Text:''                  ;Init:''        ;DeInit:''
  104.                                 ;Parm:0         ;Grp:8       ;Aktv:FALSE))),
  105.     (Kopf  :'** DRUCKBEREICH **'; Anzahl:3; Xpos:22; Ypos:12;
  106.      Rumpf :
  107.      ((Text:'[xxx] Ueber Perfor';Init:#27#78    ;DeInit:#27#79
  108.                                 ;Parm:1         ;Grp:2         ;Aktv:FALSE),
  109.       (Text:'[xxx] Rand rechts ';Init:#27#81    ;DeInit:#0
  110.                                 ;Parm:1         ;Grp:3         ;Aktv:FALSE),
  111.       (Text:'[xxx] Rand links  ';Init:#27#108   ;DeInit:#0
  112.                                 ;Parm:1         ;Grp:3         ;Aktv:FALSE),
  113.       (Text:''                  ;Init:''        ;DeInit:''
  114.                                 ;Parm:0         ;Grp:8         ;Aktv:FALSE),
  115.       (Text:''                  ;Init:''        ;DeInit:''
  116.                                 ;Parm:0         ;Grp:8         ;Aktv:FALSE),
  117.       (Text:''                  ;Init:''        ;DeInit:''
  118.                                 ;Parm:0         ;Grp:8         ;Aktv:FALSE),
  119.       (Text:''                  ;Init:''        ;DeInit:''
  120.                                 ;Parm:0         ;Grp:8         ;Aktv:FALSE),
  121.       (Text:''                  ;Init:''        ;DeInit:''
  122.                                 ;Parm:0         ;Grp:8         ;Aktv:FALSE),
  123.       (Text:''                  ;Init:''        ;DeInit:''
  124.                                 ;Parm:0         ;Grp:8         ;Aktv:FALSE),
  125.       (Text:''                  ;Init:''        ;DeInit:''
  126.                                 ;Parm:0         ;Grp:8       ;Aktv:FALSE))),
  127.     (Kopf  :'** ZEICHENSATZ  **'; Anzahl:10; Xpos:42; Ypos:5;
  128.      Rumpf :
  129.      ((Text:'USA               ';Init:#27#82#0  ;DeInit:#27#82#0
  130.                                 ;Parm:0         ;Grp:0         ;Aktv:TRUE ),
  131.       (Text:'England           ';Init:#27#82#3  ;DeInit:#27#82#0
  132.                                 ;Parm:0         ;Grp:1         ;Aktv:FALSE),
  133.       (Text:'Deutschland       ';Init:#27#82#2  ;DeInit:#27#82#0
  134.                                 ;Parm:0         ;Grp:1         ;Aktv:FALSE),
  135.       (Text:'Frankreich        ';Init:#27#82#1  ;DeInit:#27#82#0
  136.                                 ;Parm:0         ;Grp:1         ;Aktv:FALSE),
  137.       (Text:'Italien           ';Init:#27#82#6  ;DeInit:#27#82#0
  138.                                 ;Parm:0         ;Grp:1         ;Aktv:FALSE),
  139.       (Text:'Schweden          ';Init:#27#82#5  ;DeInit:#27#82#0
  140.                                 ;Parm:0         ;Grp:1         ;Aktv:FALSE),
  141.       (Text:'Spanien           ';Init:#27#82#7  ;DeInit:#27#82#0
  142.                                 ;Parm:0         ;Grp:1         ;Aktv:FALSE),
  143.       (Text:'Japan             ';Init:#27#82#8  ;DeInit:#27#82#0
  144.                                 ;Parm:0         ;Grp:1         ;Aktv:FALSE),
  145.       (Text:'Norwegen          ';Init:#27#82#9  ;DeInit:#27#82#0
  146.                                 ;Parm:0         ;Grp:1         ;Aktv:FALSE),
  147.       (Text:'Daenemark         ';Init:#27#82#10 ;DeInit:#27#82#0
  148.                                 ;Parm:0         ;Grp:1       ;Aktv:FALSE))),
  149.     (Kopf  :'**  STEUERUNG   **'; Anzahl:8; Xpos:62; Ypos:5;
  150.      Rumpf :
  151.      ((Text:'Reset             ';Init:#27#64    ;DeInit:#0
  152.                                 ;Parm:0         ;Grp:9         ;Aktv:FALSE),
  153.       (Text:'Zeilenvorschub    ';Init:#10       ;DeInit:#0
  154.                                 ;Parm:0         ;Grp:7         ;Aktv:FALSE),
  155.       (Text:'Seitenvorschub    ';Init:#12       ;DeInit:#0
  156.                                 ;Parm:0         ;Grp:7         ;Aktv:FALSE),
  157.       (Text:'Halbe Geschwindkt ';Init:#27#115#1 ;DeInit:#27#115#0
  158.                                 ;Parm:0         ;Grp:2         ;Aktv:FALSE),
  159.       (Text:'Druck in e.Richtng';Init:#27#85#1  ;DeInit:#27#85#0
  160.                                 ;Parm:0         ;Grp:2         ;Aktv:FALSE),
  161.       (Text:'Papierendekennung ';Init:#27#57    ;DeInit:#27#56
  162.                                 ;Parm:0         ;Grp:4         ;Aktv:TRUE ),
  163.       (Text:'Testbetrieb       ';Init:#27#105#1 ;DeInit:#27#105#0
  164.                                 ;Parm:0         ;Grp:2         ;Aktv:FALSE),
  165.       (Text:'Probedruck'        ;Init:''        ;DeInit:''
  166.                                 ;Parm:255       ;Grp:7         ;Aktv:FALSE),
  167.       (Text:''                  ;Init:''        ;DeInit:''
  168.                                 ;Parm:0         ;Grp:8         ;Aktv:FALSE),
  169.       (Text:''                  ;Init:''        ;DeInit:''
  170.                                 ;Parm:0         ;Grp:8      ;Aktv:FALSE))));
  171.  
  172. VAR
  173.   Xalt, Yalt: INTEGER;                         { fuer SHARP vom Type BYTE ! }
  174.   Ch        : CHAR;
  175.   f         : INTEGER;
  176.   P         : Arten;
  177.   Init      : BOOLEAN;
  178.  
  179. {---------------------------------------------------------------------------}
  180.  
  181. PROCEDURE DruckerReset;
  182.  
  183. BEGIN  Write(Lst, esc, '@');  END;
  184.  
  185. {---------------------------------------------------------------------------}
  186.  
  187. PROCEDURE Merke_alte_Position;
  188.  
  189. { Version fuer SHARP MZ 80A unter CP/M 2.2:
  190.  
  191. VAR  CurHor: BYTE ABSOLUTE $0048;
  192.      CurVer: BYTE ABSOLUTE $0049;
  193.  
  194. BEGIN
  195.   Xalt := Succ(CurHor);
  196.   Yalt := Succ(CurVer);
  197. END;
  198.  
  199.   und hier fuer MS-DOS:                                                     }
  200.  
  201. BEGIN
  202.   Xalt := WhereX;
  203.   Yalt := WhereY;
  204. END;
  205.  
  206. {---------------------------------------------------------------------------}
  207.  
  208. PROCEDURE Setze_alte_Position;
  209.  
  210. BEGIN  GotoXY(Xalt,Yalt);  END;
  211.  
  212. {---------------------------------------------------------------------------}
  213.  
  214. PROCEDURE ZeigeAn (x, y: BYTE; inverse: BOOLEAN; Text: str128);
  215.  
  216. BEGIN
  217.   GotoXY(x,y);
  218.   IF inverse THEN
  219.     HighVideo;
  220.   Write(Text);
  221.   LowVideo;
  222. END;
  223.  
  224. {---------------------------------------------------------------------------}
  225.  
  226. PROCEDURE Status_Aendern (Gruppe: Arten; feld: INTEGER);
  227.  
  228. BEGIN
  229.   Merke_alte_Position;
  230.   WITH Menuefeld[Gruppe].Rumpf[feld] DO
  231.     Aktv := NOT Aktv;
  232.   WITH Menuefeld[Gruppe] DO
  233.     ZeigeAn(Xpos, Ypos+feld, Rumpf[feld].Aktv, Rumpf[feld].Text);
  234.   Setze_alte_Position;
  235. END;
  236.  
  237. {---------------------------------------------------------------------------}
  238.  
  239. PROCEDURE Wait_for_Ready;
  240.  
  241. VAR Stbyte      : BYTE;
  242.     hell, PReady: BOOLEAN;
  243.  
  244. BEGIN
  245.   Merke_alte_Position;
  246.   REPEAT
  247.     Stbyte := Port[$FE];  Stbyte := Stbyte AND $03;
  248.     hell := NOT hell;
  249.     CASE Stbyte OF
  250.       1: BEGIN
  251.            PReady := FALSE;
  252.            ZeigeAn(1, 23, hell, '++Fehler: Drucker ONLINE  schalten !');
  253.            Delay(150);                           { 150 Millisekunden warten }
  254.          END;
  255.       2: PReady := TRUE;
  256.       3: BEGIN
  257.            PReady := FALSE;
  258.            ZeigeAn(1, 23, hell, '++Fehler: Drucker einschalten !');
  259.            Delay(150);
  260.          END;
  261.     END;
  262.   UNTIL PReady;
  263.   GotoXY(1,23);  ClrEol;                          { bis Zeilenende loeschen }
  264.   Setze_alte_Position;
  265. END;
  266.  
  267. {---------------------------------------------------------------------------}
  268.  
  269. PROCEDURE Zeiger (x, y: BYTE; Mark: BOOLEAN);
  270.  
  271. VAR marker: STRING[2];
  272.  
  273. BEGIN
  274.   Merke_alte_Position;
  275.   IF Mark THEN
  276.     marker := '><'
  277.   ELSE
  278.     marker := '  ';
  279.   GotoXY(Pred(x),y);  Write(marker[1]);
  280.   GotoXY(x+18,y);     Write(marker[2]);
  281.   Setze_alte_Position;
  282. END;
  283.  
  284. {---------------------------------------------------------------------------}
  285.  
  286. PROCEDURE Waehle_Betriebsart;
  287.  
  288. TYPE  Str80 = STRING[80];
  289.  
  290. VAR   j        : Arten;
  291.       i        : INTEGER;
  292.       parameter: INTEGER;
  293.       satz     : Str80;
  294.  
  295.   {-------------------------------------------------------------------------}
  296.  
  297.   PROCEDURE GetParameter (VAR paramt: INTEGER);
  298.  
  299.   VAR   n,a,e, err: INTEGER;
  300.         c         : CHAR;
  301.         tmp       : STRING[6];
  302.  
  303.   BEGIN
  304.     Merke_alte_Position;
  305.     GotoXY(1,23);  Write('Parameter eingeben: ');
  306.     WITH Menuefeld[P].Rumpf[f] DO
  307.     BEGIN
  308.       e := Pos(']', Text);
  309.       a := Pos('[', Text);
  310.       n := Pred(e-a);
  311.       tmp := '';
  312.       REPEAT
  313.         Read(Kbd, c);                { Zeichen von Tastatur ohne Echo lesen }
  314.         IF c IN ['0'..'9'] THEN
  315.           BEGIN
  316.             Write(c);  tmp := tmp+c;
  317.           END
  318.         ELSE IF (c = backspace) AND (Length(tmp) > 0) THEN
  319.           BEGIN
  320.             Write(c);  tmp[0] := Chr(Pred(Length(tmp)));
  321.           END
  322.         ELSE IF c <> enter THEN
  323.           Write(Bell);
  324.       UNTIL (c = ^M) OR (Length(tmp) = n);
  325.       Val(tmp, paramt, err);
  326.       Text := '['+Copy('000', 1, n-Length(tmp))+tmp+']'+
  327.                   Copy(Text, Succ(e), Succ(Length(Text)-e));
  328.     END; { WITH }
  329.     GotoXY(1,23);  ClrEol;
  330.     Setze_alte_Position;
  331.   END;
  332.  
  333.   {-------------------------------------------------------------------------}
  334.  
  335.   PROCEDURE GetString (VAR Satz: Str80);
  336.  
  337.   BEGIN
  338.     Merke_alte_Position;
  339.     GotoXY(1,23);  Write('String: ');
  340.     ReadLn(Satz);
  341.     GotoXY(1,23);  ClrEol;
  342.     Setze_alte_Position;
  343.   END;
  344.  
  345.   {-------------------------------------------------------------------------}
  346.  
  347. BEGIN { Waehle_Betriebsart }
  348.   WITH Menuefeld[P].Rumpf[f] DO
  349.     CASE Grp OF
  350.       0: IF Aktv THEN
  351.            Write(Bell)
  352.          ELSE
  353.            BEGIN
  354.              Write(Lst, Bell, Init);
  355.              Status_Aendern(P, f);
  356.              FOR i := 1 TO max DO
  357.                WITH Menuefeld[P].Rumpf[i] DO
  358.                  IF (Grp = 1) AND Aktv THEN
  359.                    Status_Aendern(P, i);
  360.            END;
  361.       1: IF Aktv THEN
  362.            BEGIN
  363.              Write(Lst, Bell, DeInit);
  364.              Status_Aendern(P, f);
  365.              FOR i := 1 TO max DO
  366.                WITH Menuefeld[P].Rumpf[i] DO
  367.                  IF (Grp = 0) AND NOT Aktv THEN
  368.                    Status_Aendern(P, i);
  369.            END
  370.          ELSE
  371.            BEGIN
  372.              IF Parm = 0 THEN
  373.                Write(Lst, Bell, Init)
  374.              ELSE
  375.                BEGIN
  376.                  GetParameter(parameter);
  377.                  Write(Lst, Bell, Init, Chr(parameter));
  378.                END;
  379.              Status_Aendern(P, f);
  380.              FOR i := 1 TO max DO
  381.                WITH Menuefeld[P].Rumpf[i] DO
  382.                  IF (Grp IN [0..1]) AND Aktv AND (i <> f) THEN
  383.                    Status_Aendern(P, i);
  384.            END;
  385.    2, 4: BEGIN
  386.            IF Aktv THEN
  387.              Write(Lst, Bell, DeInit)
  388.            ELSE
  389.              BEGIN
  390.                IF Parm = 0 THEN
  391.                  Write(Lst, Bell, Init)
  392.                ELSE
  393.                  BEGIN
  394.                    GetParameter(parameter);
  395.                    Write(Lst, Bell, Init, Chr(parameter));
  396.                  END;
  397.              END;
  398.            Status_Aendern(P, f);
  399.          END;
  400.       3: IF NOT Aktv THEN
  401.            BEGIN
  402.              IF Parm = 0 THEN
  403.                Write(Lst, Bell, Init)
  404.              ELSE
  405.                BEGIN
  406.                  GetParameter(parameter);
  407.                  Write(Lst, Bell, Init, Chr(parameter));
  408.                END;
  409.              Status_Aendern(P, f);
  410.            END
  411.          ELSE
  412.            BEGIN
  413.              Merke_alte_Position;
  414.              Write(Bell, Bell, Bell);
  415.              GotoXY(1,23);  HighVideo;
  416.              Write('++Fehler:Benutze RESET zum Ruecksetzen ');
  417.              Write('dieser Betriebsart');
  418.              Delay(2000);
  419.              LowVideo;  GotoXY(1,23);  ClrEol;
  420.              Setze_alte_Position;
  421.            END;
  422.       7: IF NOT Aktv THEN
  423.            IF Parm = 255 THEN
  424.              BEGIN
  425.                GetString(Satz);
  426.                WriteLn(Lst, Satz);
  427.              END
  428.            ELSE
  429.              BEGIN
  430.                Status_Aendern(P, f);
  431.                Write(Lst, Bell, Init);
  432.                Delay(150);
  433.                Status_Aendern(P, f);
  434.              END;
  435.       9: BEGIN
  436.            DruckerReset;
  437.            Status_Aendern(P, f);
  438.            FOR j := Schriften TO Divers DO
  439.              FOR i := 1 TO max DO
  440.                WITH Menuefeld[j].Rumpf[i] DO
  441.                  IF ((Grp = 0) OR (Grp = 4)) AND NOT Aktv THEN
  442.                    Status_Aendern(j, i)
  443.                  ELSE IF (Grp IN [1..3]) AND Aktv THEN
  444.                    Status_Aendern(j, i);
  445.              Status_Aendern(P, f);
  446.          END;
  447.     END; { CASE }
  448. END;
  449.  
  450. {---------------------------------------------------------------------------}
  451.  
  452. PROCEDURE Baueauf;
  453.  
  454. CONST  limiter = '==================';
  455.  
  456. VAR    i: INTEGER;
  457.        z: Arten;
  458.  
  459. BEGIN
  460.   LowVideo;
  461.   ZeigeAn(25, 1, FALSE, '** DRUCKER-SETUP Ver 1.01 **');
  462.   ZeigeAn(27, 2, FALSE, '(c) PASCAL International');
  463.   ZeigeAn(1, 21, FALSE, '<CURSOR>=Auswahl der Betriebsart ');
  464.   ZeigeAn(34,21, FALSE, '/ <CR>=Setzen der Betriebsart / <ESC>=Ende');
  465.   WriteLn;
  466.   FOR z := Schriften TO Divers DO
  467.     WITH Menuefeld[z] DO
  468.     BEGIN
  469.       ZeigeAn(Xpos, Ypos, FALSE, Kopf);
  470.       FOR i := 1 TO Anzahl DO
  471.         WITH Rumpf[i] DO
  472.           ZeigeAn(Xpos, Ypos+i, Aktv, Text);
  473.       ZeigeAn(Xpos, Succ(Ypos+Anzahl), FALSE, limiter);
  474.     END;
  475.     GotoXY(1,22);  Write('CMD>');
  476. END;
  477.  
  478. {---------------------------------------------------------------------------}
  479.  
  480. PROCEDURE NeuesFeld (c: CHAR);
  481.  
  482.  
  483. BEGIN
  484.   WITH Menuefeld[p] DO
  485.     CASE c OF
  486.       down : IF f < Anzahl THEN
  487.                BEGIN
  488.                  Zeiger(Xpos, Ypos+f, FALSE);
  489.                  f := Succ(f);
  490.                  Zeiger(Xpos, Ypos+f, TRUE);
  491.                END
  492.              ELSE IF Ord(p) = 4 THEN
  493.                Write(Bell)
  494.              ELSE
  495.                BEGIN
  496.                  Zeiger(Xpos, Ypos+f, FALSE);
  497.                  p := Succ(p);
  498.                  f := 1;
  499.                  Zeiger(Menuefeld[p].Xpos, Menuefeld[p].Ypos+f, TRUE);
  500.                END;
  501.       up   : IF f > 1 THEN
  502.                BEGIN
  503.                  Zeiger(Xpos, Ypos+f, FALSE);
  504.                  f := Pred(f);
  505.                  Zeiger(Xpos, Ypos+f, TRUE);
  506.                END
  507.              ELSE IF Ord(p) = 0 THEN
  508.                Write(Bell)
  509.              ELSE
  510.                BEGIN
  511.                  Zeiger(Xpos, Ypos+f, FALSE);
  512.                  p := Pred(p);
  513.                  f := Menuefeld[p].Anzahl;
  514.                  Zeiger(Menuefeld[p].Xpos, Menuefeld[p].Ypos+f, TRUE);
  515.                END;
  516.       left : IF Ord(p) > 0 THEN
  517.                BEGIN
  518.                  Zeiger(Xpos, Ypos+f, FALSE);
  519.                  p := Pred(p);
  520.                  f := 1;
  521.                  Zeiger(Menuefeld[p].Xpos, Menuefeld[p].Ypos+f, TRUE);
  522.                END
  523.              ELSE
  524.                Write(Bell);
  525.       right: IF Ord(p) < 4 THEN
  526.                BEGIN
  527.                  Zeiger(Xpos, Ypos+f, FALSE);
  528.                  p := Succ(p);
  529.                  f := 1;
  530.                  Zeiger(Menuefeld[p].Xpos, Menuefeld[p].Ypos+f, TRUE);
  531.                END
  532.              ELSE
  533.                Write(Bell);
  534.     END; { CASE c }
  535. END;
  536.  
  537. {---------------------------------------------------------------------------}
  538.  
  539. BEGIN { SetUp }
  540.   ClrScr;
  541.   Baueauf;
  542. { Wait_for_Ready;                                         s. Begleitartikel }
  543.   DruckerReset;
  544.   p := Schriften;
  545.   f := 1;
  546.   Zeiger(Menuefeld[p].Xpos, Menuefeld[p].Ypos+f, TRUE);
  547.   REPEAT
  548.     Read(Kbd, Ch);
  549.     CASE Ch OF
  550.       up, down, right, left: NeuesFeld(Ch);
  551.       enter                : Waehle_Betriebsart;
  552.     ELSE
  553.       Write(Bell);
  554.     END;
  555.   UNTIL Ch = esc;
  556. END.
  557.