home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 11 / tricks / input.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-08-07  |  5.8 KB  |  229 lines

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