home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1987 / 06 / etikett.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-05-18  |  24.1 KB  |  648 lines

  1. (* ---------------------------------------------------------------------- *)
  2. (*                            ETIKETT.PAS                                 *)
  3. (*     ein Programm zum Editieren, Speichern und Drucken von Etiketten    *)
  4. (* ---------------------------------------------------------------------- *)
  5.  
  6. PROGRAM et (Input, Output, fil);
  7.  
  8. CONST                                   { Abmessungen der Etiketten :      }
  9.   xmax   = 32;                          { Laenge des Etiketts horizontal   }
  10.   ymax   = 8;                           { Laenge des Etiketts vertikal     }
  11.   xoffs  = 4;                           { Abstand der Etiketten horizontal }
  12.   yoffs  = 1;                           { Abstand der Etiketten vertikal   }
  13.   colnum = 2;                           { Anzahl der Etiketten pro Zeile   }
  14.                                         { Cursorpositionen:                }
  15.   xhome  = 20;                          { X-Pos. vor der Etikettecke l. o. }
  16.   yhome  = 13;                          { Y-Pos. vor der Etikettecke l. o. }
  17.                                         { sonstige Konstanten:             }
  18.   max    = 50;                          { Anzahl der gepufferten Seiten    }
  19.   joker  = '#';                         { Jokerzeichen fuer Nummernfeld    }
  20.  
  21. TYPE
  22.   string20 = STRING[20];
  23.  
  24. VAR
  25.   etikett     : ARRAY [1..max, 1..ymax]
  26.                       OF STRING[xmax];              { Dateipuffer          }
  27.   pagebuffer  : ARRAY [1..ymax] OF STRING[xmax];    { Verschiebepuffer     }
  28.   marked      : ARRAY [1..max] OF BOOLEAN;          { Markierung zum Druck }
  29.   print_buffer: ARRAY [1..ymax] OF STRING[140];     { Etikettenzeile       }
  30.   i, j,                          { universelle Schleifenzaehler            }
  31.   bufcnt,                        { zaehlt Anzahl der Etiketten im Buffer   }
  32.   Page, maxpage,                 { aktuelle bzw. letzte beschriebene Seite }
  33.   first, last,                   { fuer Blockmarkierungen                  }
  34.   xcur, ycur  : INTEGER;         { Cursorposition 1..xmax bzw. 1..ymax     }
  35.   answ        : CHAR;
  36.   name        : string20;
  37.   fil         : TEXT;
  38.   ins, Exit   : BOOLEAN;
  39.  
  40. (* ---------------------------------------------------------------------- *)
  41. (*              Leeren des programm-internen Druckpuffers                 *)
  42.  
  43. PROCEDURE empty_buffer;
  44.   BEGIN
  45.     FOR i := 1 TO ymax DO
  46.     BEGIN
  47.       WriteLn (Lst, print_buffer[i]);  print_buffer[i]:='';
  48.     END;
  49.     FOR i := 1 TO yoffs DO WriteLn(Lst);
  50.     bufcnt := 0;
  51.   END;
  52.  
  53. (* ---------------------------------------------------------------------- *)
  54. (*      eine Zeile der aktuellen Seite im Etikettenpuffer loeschen        *)
  55.  
  56. PROCEDURE clear_line (Line: INTEGER);
  57.   BEGIN
  58.     Delete(etikett[Page][Line], 1, Length(etikett[Page,Line]));
  59.     FOR j := 1 TO xmax DO Insert(' ', etikett[Page,Line], 1);
  60.   END;
  61.  
  62. (* ---------------------------------------------------------------------- *)
  63. (*        die ganze aktuelle Seite im Etikettenpuffer loeschen            *)
  64.  
  65. PROCEDURE clear_page;
  66.   BEGIN  FOR i := 1 TO ymax DO clear_line(i);  END;
  67.  
  68. (* ====================================================================== *)
  69. (*                      Editor , Kern von ETIKETT                         *)
  70.  
  71. PROCEDURE edit;
  72.  
  73.   PROCEDURE clear_menu;                       (* Menu/Dialogfeld loeschen *)
  74.     VAR i: INTEGER;
  75.     BEGIN
  76.       GotoXY(1,2);                      (* Zeilen bis Zeilenende loeschen *)
  77.       FOR i := 1 TO 4 DO BEGIN  ClrEol;  WriteLn;  END;
  78.       GotoXY(1,2);  LowVideo;
  79.     END;
  80.  
  81.   PROCEDURE show_page;                           { aktuelle Seite anzeigen }
  82.     VAR i: INTEGER;
  83.     BEGIN
  84.       IF marked[Page] THEN LowVideo; { andere Schriftintensitaet o. invers }
  85.       FOR i := 1 TO ymax DO
  86.         BEGIN
  87.           GotoXY (Succ(xhome), yhome+i);  Write (etikett[Page,i]);
  88.         END;
  89.       IF marked[Page] THEN NormVideo;             { wieder normale Schrift }
  90.       GotoXY(20,1);  Write('Datei: ',name);
  91.       GotoXY(50,1);  Write('Seite ', Page:2, '(', maxpage:2, ')');
  92.     END;
  93.  
  94.   PROCEDURE clear_all_markings;
  95.     BEGIN
  96.       FOR i := 1 TO max DO marked[i] := FALSE;
  97.       first := Succ(max);  last := 0;
  98.     END;
  99.  
  100.   PROCEDURE screen;            { Rahmen zeichnen und aktuelle Seite zeigen }
  101.     BEGIN
  102.       FOR i := 1 TO ymax DO   { Rahmen zeichnen. Die Zeichen fuer den Rand }
  103.         BEGIN                 { koennen nach Geschmack geaendert werden:   }
  104.           GotoXY(xhome-1, yhome+i);     Write('!');  { linke Begrenzung    }
  105.           GotoXY(xhome+xmax+2,yhome+i); Write('!');  { rechte Begrenzung   }
  106.         END;
  107.       FOR i := 1 TO xmax+2 DO
  108.         BEGIN
  109.           GotoXY(xhome+i-1,yhome);        Write('-');{ obere Begrenzung    }
  110.           GotoXY(xhome+i-1,yhome+ymax+1); Write('-');{ untere Begrenzung   }
  111.         END;
  112.       GotoXY(xhome-1, yhome);  Write('+');             { Ecke links  oben  }
  113.       GotoXY(xhome-1, yhome+ymax+1);  Write('+');      { Ecke links unten  }
  114.       GotoXY(xhome+xmax+2,yhome);  Write('+');         { Ecke rechts oben  }
  115.       GotoXY(xhome+xmax+2,yhome+ymax+1);  Write('+');  { Ecke rechts unten }
  116.       FOR i := 1 TO ymax DO print_buffer[i] := '';  { Druckpuffer initial. }
  117.       bufcnt := 0;  show_page;
  118.     END; { screen }
  119.  
  120. (* ---------------------------------------------------------------------- *)
  121. (*                   elementare Editorfunktionen:                         *)
  122.  
  123.     PROCEDURE cursor_up;
  124.       BEGIN
  125.         IF ycur > 1 THEN ycur := Pred(ycur) ELSE ycur := ymax
  126.       END;
  127.  
  128.     PROCEDURE cursor_down;
  129.       BEGIN
  130.         IF ycur < ymax THEN ycur := Succ(ycur) ELSE ycur := 1;
  131.       END;
  132.  
  133.     PROCEDURE cursor_left;
  134.       BEGIN
  135.         IF xcur > 1 THEN xcur := Pred(xcur)
  136.         ELSE
  137.           BEGIN                                            { Zeilenwechsel }
  138.             xcur := xmax;  cursor_up
  139.           END;
  140.       END;
  141.  
  142.     PROCEDURE cursor_right;
  143.       BEGIN
  144.         IF xcur < xmax THEN xcur := Succ(xcur)
  145.         ELSE
  146.           BEGIN                                            { Zeilenwechsel }
  147.             xcur := 1;  cursor_down
  148.           END;
  149.       END;
  150.  
  151. (* ---------------------------------------------------------------------- *)
  152. (*                Editorfunktionen mit ganzen Seiten:                     *)
  153.  
  154.     PROCEDURE page_up;
  155.       BEGIN
  156.         xcur := 1;  ycur := 1;
  157.         IF Page > 1 THEN
  158.           BEGIN
  159.             Page := Pred(Page);    show_page
  160.           END
  161.       END;
  162.  
  163.     PROCEDURE page_down;
  164.       BEGIN
  165.         xcur := 1;  ycur := 1;        { Cursor links oben auf die n. Seite }
  166.         IF Page < max THEN                 { wenn noch nicht am Pufferende }
  167.           IF (maxpage = Page) AND ins THEN { im INS-Mode hinter der letzt. }
  168.             BEGIN                          { Seite eine n. Seite aufmachen }
  169.               Page := Succ(Page);  maxpage := Page;  clear_page;  show_page;
  170.             END
  171.           ELSE IF maxpage > Page THEN           { oder nur weiterblaettern }
  172.             BEGIN
  173.               Page := Succ(Page);  show_page
  174.             END
  175.       END;
  176.  
  177.     PROCEDURE first_page;                   { auf die erste Seite springen }
  178.       BEGIN
  179.         Page := 1;  show_page
  180.       END;
  181.  
  182.     PROCEDURE last_page;                   { auf die letzte Seite springen }
  183.       BEGIN
  184.         Page := maxpage;  show_page
  185.       END;
  186.  
  187.     PROCEDURE delete_page;                      { aktuelle Seite entfernen }
  188.       VAR i, j: INTEGER;
  189.       BEGIN
  190.         IF maxpage > 1 THEN maxpage := Pred(maxpage);
  191.         IF Page > maxpage THEN Page := maxpage
  192.         ELSE
  193.           BEGIN
  194.             FOR j := Page TO maxpage DO
  195.               BEGIN
  196.                 FOR i := 1 TO ymax DO etikett[j,i] := etikett[Succ(j),i];
  197.                 marked[j] := marked[Succ(j)];
  198.               END;
  199.           END;
  200.         show_page
  201.       END;
  202.  
  203.     PROCEDURE copy_page;                       { aktuelle Seite verdoppeln }
  204.       VAR i, j: INTEGER;
  205.       BEGIN
  206.         maxpage := Succ(maxpage);  Page := Succ(Page);
  207.         FOR j := maxpage DOWNTO Page DO
  208.           BEGIN
  209.             FOR i := 1 TO ymax DO etikett[j,i] := etikett[Pred(j),i];
  210.             marked[j] := marked[Succ(j)]
  211.           END;
  212.         show_page
  213.       END;
  214.  
  215.     PROCEDURE move_page;       { verschiebt alle markierte Seiten in ihrer }
  216.       VAR i, j,                { Reihenfolge vor die aktuelle Seite        }
  217.           aktpage     : INTEGER;
  218.           markedbuffer: BOOLEAN;
  219.  
  220.       BEGIN
  221.         FOR aktpage := maxpage DOWNTO 1 DO { von hinten n. vorn durchgehen }
  222.           IF marked[aktpage] THEN
  223.             BEGIN
  224.               FOR i := 1 TO ymax DO
  225.                 pagebuffer[i] := etikett[aktpage,i];       { Seite puffern }
  226.               IF aktpage < Page THEN              { nach vorne verschieben }
  227.                 FOR j := aktpage TO Pred(Page) DO
  228.                   FOR i := 1 TO ymax DO etikett[j,i] := etikett[Succ(j),i]
  229.               ELSE                               { nach hinten verschieben }
  230.                 FOR j := aktpage DOWNTO Succ(Page) DO
  231.                   FOR i := 1 TO ymax DO etikett[j,i] := etikett[Pred(j),i];
  232.               FOR i := 1 TO ymax DO
  233.                 etikett[Page,i] := pagebuffer[i];     { Seite zurueckholen }
  234.               markedbuffer := marked[aktpage];    { Marker mit verschieben }
  235.               marked[aktpage] := marked[Page];
  236.               marked[Page] := markedbuffer;
  237.               show_page
  238.             END
  239.       END;
  240.  
  241. (* ---------------------------------------------------------------------- *)
  242. (*                 weitere einfache Editorfunktionen:                     *)
  243.  
  244.     PROCEDURE insert_char;                             { Zeichen einfuegen }
  245.       VAR i: INTEGER;
  246.         BEGIN
  247.           Delete(etikett[Page,ycur], xmax, 1);
  248.           Insert(answ, etikett[Page,ycur], xcur);
  249.           FOR i := xcur TO xmax DO Write(etikett[Page,ycur][i]);
  250.           cursor_right;
  251.         END;
  252.  
  253.     PROCEDURE overwrite_char;                     { Zeichen ueberschreiben }
  254.       BEGIN
  255.         etikett[Page,ycur][xcur] := answ;  Write(answ);  cursor_right;
  256.       END;
  257.  
  258.     PROCEDURE delete_char;                             { Zeichen entfernen }
  259.       VAR i: INTEGER;
  260.       BEGIN
  261.         Delete(etikett[Page,ycur], xcur, 1);
  262.         Insert(' ', etikett[Page,ycur], xmax);
  263.         FOR i := xcur TO xmax DO Write(etikett[Page,ycur][i]);
  264.       END;
  265.  
  266.     PROCEDURE backspace;                         { Zeichen links entfernen }
  267.       VAR i: INTEGER;
  268.       BEGIN
  269.         IF xcur > 1 THEN
  270.           BEGIN
  271.             xcur := Pred(xcur);  GotoXY(xhome+xcur,yhome+ycur);
  272.             Delete(etikett[Page,ycur], xcur, 1);
  273.             Insert(' ', etikett[Page,ycur], xmax);
  274.             FOR i := xcur TO xmax DO Write(etikett[Page,ycur][i]);
  275.           END
  276.       END;
  277.  
  278.     PROCEDURE delete_line;                               { Zeile entfernen }
  279.       VAR i: INTEGER;
  280.       BEGIN
  281.         FOR i := ycur TO Pred(ymax) DO
  282.           etikett[Page,i] := etikett[Page,Succ(i)];
  283.         FOR i := 1 TO xmax DO etikett[Page,ymax][i] := ' ';
  284.         FOR i := ycur TO ymax DO
  285.           BEGIN
  286.             GotoXY(Succ(xhome),yhome+i);  Write(etikett[Page,i]);
  287.           END;
  288.         xcur := 1;
  289.       END; { delete_line }
  290.  
  291.     PROCEDURE carriage_return;  { zur naechsten Zeile oder Zeile einfuegen }
  292.       VAR i: INTEGER;
  293.       BEGIN
  294.         IF ins THEN
  295.           BEGIN
  296.             FOR i := ymax DOWNTO Succ(ycur) DO
  297.               etikett[Page,i] := etikett[Page,Pred(i)];
  298.             FOR i := 1 TO xmax DO etikett[Page,ycur][i] := ' ';
  299.             FOR i := ycur TO ymax DO
  300.               BEGIN
  301.                 GotoXY(Succ(xhome),yhome+i);  Write(etikett[Page,i]);
  302.               END;
  303.             xcur := 1;
  304.           END
  305.         ELSE
  306.           BEGIN
  307.             cursor_down;  xcur := 1;
  308.           END;
  309.       END; { carriage_return }
  310.  
  311.     PROCEDURE change_insert_mode;                  { Wechsel INS/OVERWRITE }
  312.       BEGIN
  313.         ins := NOT ins;  GotoXY (70,1);
  314.         IF ins THEN Write('insert    ') ELSE Write('overwrite');
  315.       END; { change_insert_mode }
  316.  
  317.     PROCEDURE change_marking; { Wechsel der Markierung der aktuellen Seite }
  318.       BEGIN
  319.         marked[Page] := NOT marked[Page];  show_page;
  320.       END; { change_marking }
  321.  
  322.     PROCEDURE first_marking;                { Blockanfang, nur seitenweise }
  323.       VAR i: INTEGER;
  324.       BEGIN
  325.         first := Page;
  326.         FOR i := first TO last DO marked[i] := TRUE;
  327.         show_page;
  328.       END;
  329.  
  330.     PROCEDURE last_marking;                   { Blockende, nur seitenweise }
  331.       VAR i: INTEGER;
  332.       BEGIN
  333.         last := Page;
  334.         FOR i := first TO last DO marked[i] := TRUE;
  335.         show_page;
  336.       END;
  337.  
  338. (* ---------------------------------------------------------------------- *)
  339. (*                       zentrale Druckroutine:                           *)
  340.  
  341.   PROCEDURE print;
  342.     VAR
  343.       xnum     : ARRAY [0..5] OF INTEGER;  { Spaltenpositionen der Ziffern }
  344.       ynum,                                { Zeilenposition    der Ziffern }
  345.       posnum,                              { Anzahl der Spaltenpositionen  }
  346.       anz, i, j, k,                        { Anzahl der Exemplare, Indizes }
  347.       anfnum,                              { Anfangs- und                  }
  348.       endnum,                              { Endzahl bei Ausgabe           }
  349.       lfdnr,                               { laufende Nummer des Etiketts  }
  350.       x, y, n      : INTEGER;
  351.       any_marking,
  352.       found        : BOOLEAN;              { Platzhalter gefunden          }
  353.  
  354.   (* -------------------------------------------------------------------- *)
  355.   (*              Routine zum Suchen und Ersetzen der Joker:              *)
  356.  
  357.     PROCEDURE search_num_fields ;
  358.       VAR i : INTEGER;
  359.          tmp: STRING[xmax];
  360.  
  361.       BEGIN
  362.         i := 1;  found := FALSE;  posnum := 0;  ynum := 0;
  363.         WHILE (i <= ymax) AND NOT found DO
  364.           BEGIN
  365.             tmp := etikett[Page,i];  found := (Pos(joker,tmp)<>0);
  366.             i := Succ(i);
  367.           END;
  368.         IF found THEN
  369.           BEGIN                            { Abfrage, falls nirgends Joker }
  370.             ynum := Pred(i);
  371.             FOR i := xmax DOWNTO 1 DO
  372.               BEGIN
  373.                 IF tmp[i] = joker THEN
  374.                   BEGIN
  375.                     xnum[posnum] := i;  posnum := Succ(posnum)
  376.                   END;
  377.               END; { for }
  378.           END; { if }
  379.       END; { search_num_fields }
  380.  
  381.   (* -------------------------------------------------------------------- *)
  382.   (*              Umwandlung Integerzahl in ASCII-Zeichen:                *)
  383.  
  384.     FUNCTION ziffer (zahl, stelle: INTEGER): INTEGER;
  385.                               { Liefert einzelne Ziffern von zahl zurueck,
  386.                                 z.B. fuer stelle = 0 die Einerziffer.      }
  387.       BEGIN
  388.         ziffer := (Trunc(zahl/Exp(stelle*Ln(10))) MOD 10)
  389.       END;
  390.  
  391.   (* -------------------------------------------------------------------- *)
  392.   (*               Einsetzen der Ziffern in den Druckpuffer:              *)
  393.  
  394.     PROCEDURE fillnums;
  395.       VAR i: INTEGER;
  396.       BEGIN
  397.         FOR i := Pred(posnum) DOWNTO 0 DO
  398.           BEGIN
  399.             etikett[Page,ynum][xnum[i]] := Chr(Ord('0')+ziffer(lfdnr,i));
  400.             GotoXY(xhome+xnum[i],yhome+ynum);
  401.             Write(etikett[Page,ynum][xnum[i]]);
  402.           END;
  403.       END; { fillnums }
  404.  
  405.   (* -------------------------------------------------------------------- *)
  406.   (*                     ein einzelnes Etikett drucken:                   *)
  407.  
  408.     PROCEDURE print_one_etikett;
  409.       BEGIN
  410.         fillnums;  bufcnt := Succ(bufcnt);         { ein Etikett dazuladen }
  411.         FOR y := 1 TO ymax DO
  412.           BEGIN
  413.             print_buffer[y] := Concat(print_buffer[y], etikett[Page,y]);
  414.             IF bufcnt <> colnum THEN
  415.               FOR i := 1 TO xoffs DO
  416.                 print_buffer[y] := Concat(print_buffer[y], ' ');
  417.           END; { for y }
  418.         IF bufcnt = colnum THEN empty_buffer;
  419.       END; { print_one_etikett }
  420.  
  421.   (* -------------------------------------------------------------------- *)
  422.   (*               Ausdruck fuer eine ganze Seite besorgen:               *)
  423.  
  424.     PROCEDURE print_page;
  425.       BEGIN
  426.         show_page;  search_num_fields;
  427.         IF NOT found THEN
  428.           BEGIN
  429.             anfnum := 1;  endnum := 1;
  430.           END;
  431.         lfdnr := anfnum;
  432.         WHILE lfdnr <= endnum DO
  433.           BEGIN
  434.             i := 1;
  435.             WHILE i <= anz DO
  436.             BEGIN
  437.               print_one_etikett;
  438.               IF KeyPressed THEN
  439.                 BEGIN
  440.                   GotoXY(1,5); Write('Druck abbrechen (j/n) ?'); Read(answ);
  441.                   IF answ IN ['j','J'] THEN
  442.                     BEGIN
  443.                       i := anz;  lfdnr := endnum;  Page := maxpage;
  444.                     END;
  445.                   GotoXY(1,5);  ClrEol;  (* Zeile bis Zeilenende loeschen *)
  446.                 END;
  447.               i := Succ(i);
  448.             END;
  449.             lfdnr := Succ(lfdnr);
  450.           END;
  451.         FOR j := posnum-1 DOWNTO 0 DO        { Bildschirm wiederherstellen }
  452.           BEGIN
  453.             GotoXY(xhome+xnum[j],yhome+ynum);  Write(joker);
  454.             etikett[Page,ynum][xnum[j]] := joker;
  455.           END;
  456.       END;
  457.  
  458.  
  459.     BEGIN { print }
  460.       clear_menu;
  461.       Write('Wieviele Exemplare ? ');  ReadLn(anz);
  462.       Write('       Anfangszahl ? ');  ReadLn(anfnum);
  463.       Write('           Endzahl ? ');  ReadLn(endnum);
  464.       k := Page;  any_marking := FALSE;
  465.       FOR Page := 1 TO maxpage DO
  466.         IF marked[Page] THEN
  467.           BEGIN  any_marking := TRUE;  print_page  END;
  468.       Page := k;
  469.       IF NOT any_marking THEN print_page;
  470.       clear_menu;  NormVideo;  show_page;
  471.     END; { print }
  472.  
  473. (* ---------------------------------------------------------------------- *)
  474. (*                      Etiketten in Datei speichern:                     *)
  475.  
  476.   PROCEDURE save;
  477.     VAR i, j: INTEGER;
  478.     BEGIN
  479.       Assign (fil, name);  ReWrite (fil);  (* Datei zum schreiben oeffnen *)
  480.       FOR j := 1 TO maxpage DO
  481.         FOR i := 1 TO ymax DO WriteLn (fil, etikett[j,i]);
  482.         Close (fil);
  483.     END;
  484.  
  485. (* ---------------------------------------------------------------------- *)
  486. (*                               Menues:                                  *)
  487.  
  488. PROCEDURE mmenu;
  489. BEGIN
  490.   clear_menu;
  491.   WriteLn
  492.   ('Zeichen- ^E: hoch    ^X: runter  ^S: links   ^D: rechts  ^G: loesch.');
  493.   WriteLn('         ^H: Rueckschritt');
  494.   WriteLn
  495.   ('Zeile  - ^W: erste   ^Z: letzte  ^A: Anfang  ^F: Ende    ^Y: loesch.');
  496.   WriteLn
  497.   ('andere - ^Q ^K                                   Einf. - ^I: ein/aus');
  498.   NormVideo;  GotoXY(1,1);  Write('   ');
  499. END;
  500.  
  501. PROCEDURE kmenu;
  502. BEGIN
  503.   clear_menu;
  504.   WriteLn('Datei -  D: Beenden    Q: Abbrechen     S: Sichern und weiter');
  505.   WriteLn('Block -  B: Anfang     K: Ende          H: vergessen');
  506.   WriteLn('Druck -  P: aktuelle Seite oder alle markierte Seiten drucken');
  507.   Write  ('(LEERTASTE - weiter)');
  508.   NormVideo;  GotoXY(3,1);
  509. END;
  510.  
  511. PROCEDURE qmenu;
  512. BEGIN
  513.   clear_menu;
  514.   WriteLn
  515.   ('Seite  -  E: vorher.  X: naechs.  R: erste    C: letzte   Y: loesch.');
  516.   WriteLn
  517.   ('          K: kopie.   V: versch.  M: Markierung ein/aus');
  518.   Write  ('(LEERTASTE - weiter)');
  519.   NormVideo;  GotoXY(3,1);
  520. END;
  521.  
  522. (* ---------------------------------------------------------------------- *)
  523. (*                     Etiketten editieren:                               *)
  524.  
  525.   BEGIN  { edit }
  526.     Page := 1;  ins := FALSE;  xcur := 1; ycur := 1; Exit := FALSE;
  527.     mmenu;  clear_all_markings;  screen;  change_insert_mode;
  528.     REPEAT
  529.       GotoXY(xhome+xcur,yhome+ycur);
  530.       REPEAT UNTIL KeyPressed;            (* auf einen Tastendruck warten *)
  531.               (* gedrueckte Taste ohne Bildschirmecho von Tastatur lesen: *)
  532.       Read(Kbd, answ);
  533.  
  534. (*             WORDSTAR - aehnliche       Cursor - Steuertasten           *)
  535. (* das Zeichen '^' vor einem Buchstaben bedeutet druecken der Control-    *)
  536. (* Taste in Verbindung mit der entsprechenden Taste. '^S' bedeutet also   *)
  537. (* 'Control-S', ASCII-Code = 19                                           *)
  538.  
  539.       CASE answ OF
  540.         ' '..'z': IF ins THEN insert_char          (* normale Textzeichen *)
  541.                   ELSE overwrite_char;
  542.         ^S      : cursor_left;
  543.         ^D      : cursor_right;
  544.         ^E      : cursor_up;
  545.         ^X      : cursor_down;
  546.         ^A      : xcur := 1;
  547.         ^F      : xcur := xmax;
  548.         ^W      : ycur := 1;
  549.         ^Z      : ycur := ymax;
  550.         ^I      : change_insert_mode;
  551.         ^G      : delete_char;
  552.         ^H      : backspace;
  553.         ^Y      : delete_line;
  554.         ^M      : carriage_return;
  555.         ^K      : BEGIN
  556.                     GotoXY(1,1);  Write('^K');  kmenu;
  557.                     REPEAT UNTIL KeyPressed;  Read(Kbd,answ);  Write(answ);
  558.                     CASE answ OF
  559.                       'd','D',^D : BEGIN  save;  Exit := TRUE;  END;
  560.                       'q','Q',^Q : Exit := TRUE;
  561.                       's','S',^S : save;
  562.                       'b','B',^B : first_marking;
  563.                       'k','K',^K : last_marking;
  564.                       'h','H',^H : BEGIN
  565.                                      clear_all_markings;  show_page;
  566.                                    END;
  567.                       'p','P',^P : print;
  568.                       ELSE ;     (* manche Compiler verlaufen sich sonst! *)
  569.                     END; { case }
  570.                     mmenu;
  571.                   END; { ^K }
  572.         ^Q      : BEGIN
  573.                     GotoXY(1,1);  Write('^Q');  qmenu;
  574.                     REPEAT UNTIL KeyPressed;  Read(Kbd,answ);  Write(answ);
  575.                     CASE answ OF
  576.                       'e','E',^E : page_up;
  577.                       'x','X',^X : page_down;
  578.                       'r','R',^R : first_page;
  579.                       'c','C',^C : last_page;
  580.                       'y','Y',^Y : delete_page;
  581.                       'k','K',^K : copy_page;
  582.                       'v','V',^V : move_page;
  583.                       'm','M',^M : change_marking;
  584.                       ELSE ;
  585.                     END; { case }
  586.                     mmenu;
  587.                   END; { ^Q }
  588.         ELSE ;
  589.       END; { case }
  590.     UNTIL Exit
  591.   END; { edit }
  592.  
  593. (* ---------------------------------------------------------------------- *)
  594. (*            Funktion testet Vorhandensein einer Datei:                  *)
  595. (*         Achtung: Turbo-Pascal spezifisch! Also anpassen.               *)
  596.  
  597. FUNCTION existfile (name: string20): BOOLEAN;
  598.   VAR   Dummy: FILE OF BYTE;
  599.   BEGIN
  600.     Assign(Dummy, name);
  601.     {$I-}         (* I/O-Fehlerbehandlung durch Laufzeitsystem anschalten *)
  602.     ReSet(Dummy);                            (* Datei zur Probe eroeffnen *)
  603.     {$I+}                                    (* ... und wieder aktivieren *)
  604.     existfile := (IOResult = 0);    (* wenn Datei vorh., ist 'IoRes. = 0' *)
  605.     Close(Dummy);
  606.   END; { existfile }
  607.  
  608. (* ---------------------------------------------------------------------- *)
  609. (*                      Datei in Speicher laden:                          *)
  610.  
  611. PROCEDURE load;
  612.   BEGIN
  613.     maxpage := 0;  Assign(fil, name);  ReSet(fil);
  614.     WHILE NOT Eof(fil) DO
  615.       BEGIN
  616.         maxpage := Succ(maxpage);
  617.         FOR i := 1 TO ymax DO
  618.           IF NOT Eof(fil) THEN  ReadLn(fil, etikett[maxpage,i])
  619.           ELSE  clear_line(i);          (* zu "kurze" Etiketten ergaenzen *)
  620.       END;
  621.     Close (fil);
  622.   END;
  623.  
  624. BEGIN { main program }
  625.   ClrScr;                                            { Bildschirm loeschen }
  626.   Write('Name der Etikettendatei ? ');  ReadLn(name);
  627.   IF name <> '' THEN
  628.   BEGIN
  629.     IF Pos('.', name) = 0 THEN
  630.       name := Concat(name,'.eti');         { Standarderweiterung anhaengen }
  631.     answ := 'j';
  632.     IF existfile(name) THEN load
  633.     ELSE
  634.       BEGIN
  635.         Write('Datei ',name,' ist neu. Weitermachen ? ');
  636.         ReadLn(answ);  maxpage := 1;  Page := 1;  clear_page;
  637.       END;
  638.     IF answ IN ['j','J'] THEN
  639.       BEGIN
  640.         ClrScr;
  641.         edit;
  642.         IF bufcnt <> 0 THEN
  643.           empty_buffer;           { uebrige Etiketten nach Beenden drucken }
  644.         ClrScr;
  645.       END;
  646.   END;
  647. END. { main program }
  648. (* ---------------------------------------------------------------------- *)