home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 03 / leser / input.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-12-11  |  5.8 KB  |  230 lines

  1. (* ------------------------------------------------------ *)
  2. (*                       INPUT.PAS                        *)
  3. (*     Komfortable Stringeingabe mit Editierfunktionen    *)
  4. (*                (c) 1990 Marcel Kreuter                 *)
  5. (* Update 11.12.90: Fixed Bug in Procedure Is_Delete (ga) *)
  6. (* ------------------------------------------------------ *)
  7. UNIT Input;                   { txKeys }
  8.  
  9. INTERFACE
  10.  
  11. USES Crt, Dos;
  12.  
  13. TYPE
  14.   CharSet = SET OF CHAR;
  15.  
  16. VAR
  17.   InsMode : BOOLEAN;
  18.  
  19.   FUNCTION ReadStr(zeichen       : CharSet;
  20.                    laenge, platz : BYTE) : STRING;
  21.     { ReadStr wartet auf eine Tastatureingabe und liefert }
  22.     { dann das Ergebnis in Form eines Strings zurück      }
  23.  
  24. IMPLEMENTATION
  25.  
  26.   FUNCTION ReadStr(zeichen       : CharSet;
  27.                    laenge, platz : BYTE) : STRING;
  28.   VAR
  29.     ch                       : CHAR;
  30.     s                        : STRING;
  31.     z, n, x, anfang, zanfang : INTEGER;
  32.  
  33.     PROCEDURE WritePart(l : Byte);
  34.        { WritePart schreibt den gerade aktuellen Teil des }
  35.        { Strings in den vorbestimmten Bildschirmbereich   }
  36.     BEGIN
  37.       WHILE (l <= Length(s)) AND
  38.             (WhereX < anfang + platz) DO BEGIN
  39.         Write(s[l]);
  40.         Inc(l);
  41.       END;
  42.     END;
  43.  
  44.     PROCEDURE Is_Escape;
  45.     BEGIN
  46.       ReadStr := #27;
  47.     END;
  48.  
  49.     PROCEDURE Is_Enter;
  50.     BEGIN
  51.       IF Length(s) = 0 THEN ReadStr := ^M;
  52.     END;
  53.  
  54.     PROCEDURE Is_Backspace;
  55.     BEGIN
  56.       x := WhereX;
  57.       IF (Length(s) > 0) AND (z > 1) THEN BEGIN
  58.         Dec(z);
  59.         Delete(s, z, 1);
  60.         IF (zanfang > 1) AND
  61.            (Length(s) < zanfang + platz) THEN BEGIN
  62.           Dec(zanfang);
  63.           GotoXY(anfang, WhereY);
  64.           WritePart(zanfang);
  65.         END ELSE BEGIN
  66.           GotoXY(anfang, WhereY);
  67.           WritePart(zanfang);
  68.           IF Length(s) < zanfang + platz THEN Write(' ');
  69.           Dec(x);
  70.         END;
  71.       END;
  72.       GotoXY(x, WhereY);
  73.     END;
  74.  
  75.     PROCEDURE Is_Home;
  76.     BEGIN
  77.       zanfang := 1;
  78.       z       := 1;
  79.       GotoXY(anfang, WhereY);
  80.       WritePart(zanfang);
  81.       GotoXY(anfang, WhereY);
  82.     END;
  83.  
  84.     PROCEDURE Is_CursorLeft;
  85.     BEGIN
  86.       IF z <= Length(s) THEN BEGIN
  87.         IF (WhereX + 1 = anfang + platz) AND
  88.            (z < Length(s)) THEN BEGIN
  89.           x := WhereX;
  90.           Inc(zanfang);
  91.           GotoXY(anfang, WhereY);
  92.           WritePart(zanfang);
  93.           GotoXY(x, WhereY);
  94.         END ELSE
  95.           GotoXY(WhereX+1, WhereY);
  96.         Inc(z);
  97.       END ELSE
  98.         ch := #254;
  99.     END;
  100.  
  101.     PROCEDURE Is_CursorRight;
  102.     BEGIN
  103.       IF z > 1 THEN BEGIN
  104.         IF (zanfang > 1) AND (WhereX = anfang) THEN BEGIN
  105.           x := WhereX;
  106.           Dec(zanfang);
  107.           WritePart(zanfang);
  108.           GotoXY(x, WhereY);
  109.         END ELSE
  110.           GotoXY(WhereX-1, WhereY);
  111.         Dec(z)
  112.       END ELSE
  113.         ch := #254;
  114.     END;
  115.  
  116.     PROCEDURE Is_End;
  117.     BEGIN
  118.       zanfang := Length(s) - platz + 1;
  119.       z       := Length(s) + 1;
  120.       GotoXY(anfang, WhereY);
  121.       WritePart(Length(s) - platz + 1);
  122.       GotoXY(anfang + platz, WhereY);
  123.     END;
  124.  
  125.     PROCEDURE Is_Insert;
  126.     BEGIN
  127.       InsMode := NOT InsMode;
  128.     END;
  129.  
  130.     PROCEDURE Is_Delete;
  131.     VAR
  132.       n : BYTE;
  133.     BEGIN
  134.       x := WhereX;
  135.       Delete(s, z, 1);
  136.       IF Length(s) > platz THEN BEGIN
  137.         WritePart(z);
  138.         IF length(s) < zanfang + platz - 1 THEN Write(' ');
  139.       END ELSE BEGIN
  140.         FOR n := z TO Length(s) DO
  141.           Write(s[n]);
  142.         IF Length(s) + 1 < zanfang + platz THEN Write(' ');
  143.       END;
  144.       GotoXY(x, WhereY);
  145.     END;
  146.  
  147.     PROCEDURE Is_Zeichen;
  148.     BEGIN
  149.       IF InsMode AND (Length(s) < laenge) THEN BEGIN
  150.         x := WhereX;
  151.         Insert(ch, s, z);
  152.         IF (z < Length(s)) OR
  153.            (WhereX = anfang + platz) THEN BEGIN
  154.           IF (WhereX = anfang + platz) OR
  155.              ((WhereX + 1 = anfang + platz) AND
  156.              (z < Length(s))) THEN
  157.             Inc(zanfang)
  158.           ELSE
  159.             Inc(x);
  160.           GotoXY(anfang, WhereY);
  161.           WritePart(zanfang);
  162.         END ELSE BEGIN
  163.           Write(ch);
  164.           Inc(x);
  165.         END;
  166.         GotoXY(x, WhereY);
  167.         Inc(z);
  168.       END ELSE IF NOT InsMode THEN BEGIN
  169.         x := WhereX;
  170.         IF z <= Length(s) THEN BEGIN
  171.           s[z] := ch;
  172.           IF WhereX + 1 = anfang + platz THEN BEGIN
  173.             Inc(zanfang);
  174.             GotoXY(anfang, WhereY);
  175.             WritePart(zanfang);
  176.           END ELSE BEGIN
  177.             Write(ch);
  178.             Inc(x);
  179.           END;
  180.         END ELSE IF (z > Length(s)) AND
  181.                     (Length(s) < laenge) THEN BEGIN
  182.           s := s + ch;
  183.           IF WhereX = anfang + platz THEN BEGIN
  184.             Inc(zanfang);
  185.             GotoXY(anfang, WhereY);
  186.             WritePart(zanfang);
  187.           END ELSE BEGIN
  188.             Write(ch);
  189.             Inc(x);
  190.           END;
  191.         END;
  192.         GotoXY(x, WhereY);
  193.         IF z <= laenge THEN Inc(z);
  194.       END;
  195.     END;
  196.  
  197.   BEGIN
  198.     s       := '';
  199.     z       := 1;
  200.     zanfang := 1;
  201.     anfang  := WhereX;
  202.     REPEAT
  203.       ch := ReadKey;
  204.       CASE ch OF
  205.         #27 : Is_Escape;
  206.         #13 : Is_Enter;
  207.         #08 : Is_Backspace;
  208.         #00 : BEGIN
  209.                 ch := ReadKey;
  210.                 CASE ch OF
  211.                   #71 : Is_Home;
  212.                   #77 : Is_CursorLeft;
  213.                   #75 : Is_CursorRight;
  214.                   #79 : Is_End;
  215.                   #82 : Is_Insert;
  216.                   #83 : Is_Delete;
  217.                 END;
  218.               END
  219.       ELSE
  220.         IF ch IN zeichen THEN Is_Zeichen;
  221.       END;
  222.     UNTIL ch = #13;
  223.     ReadStr := s;
  224.   END;
  225.  
  226. BEGIN
  227.   InsMode := TRUE;   { Standardvorgabe }
  228. END.
  229. (* ----------------------------------------------------- *)
  230. (*                  Ende von INPUT.PAS                   *)