[Back to ENTRY SWAG index]  [Back to Main SWAG index]  [Original]

> Does anyone know how to make the input line a certain number of lines
> only!...sya the user only gets to us 3 characters....

Here is the input routine that I use for all of my programs.  You may
not need it so precise, so you can cut out anything you don't feel is
necessary but here goes:
}

UNIT KeyInput;

INTERFACE

USES CRT,CURSOR;

PROCEDURE GetInput(VAR InStr;                    {String Passed}
                       WhatWas: String;          {Old value to Remember}
                       Len: Byte;                {Length of String Max=255}
                       XPosition,                {X Cursor Position}
                       YPosition,                {Y Cursor Position}
                       BackGroundColor,          {Background Color}
                       ForeGroundColor: Integer; {Foreground Color}
                       BackGroundChar: Char;     {Echoed Character on BkSp}
                       Caps: Boolean);           {CAPS?}
IMPLEMENTATION

PROCEDURE GetInput(VAR InStr;
                       WhatWas: String;
                       Len: Byte;
                       XPosition,
                       YPosition,
                       BackGroundColor,
                       ForeGroundColor: Integer;
                       BackGroundChar: Char;
                       Caps: Boolean);

CONST
   BkSp: Char = Chr($08);

VAR
   InsertKey: Byte Absolute $0040:$0017;
   Temp: String;
   Ch2,
   C: Char;
   A,
   U,
   B: Byte;
   FirstChar,
   InsertOn,
   NoAdd: Boolean;
   NewString: String Absolute InStr;

BEGIN
   InsertKey := InsertKey OR $80; {changes to insert mode}
   IF (InsertKey AND $80 > 0) THEN
    BEGIN
       InsertOn := TRUE;
       ShowCursor;
    END
   ELSE
    BEGIN
       InsertOn := FALSE;
       BigCursor;
    END;
   FirstChar := TRUE;
   NewString := '';
   Temp := '';
   GotoXY(XPosition,YPosition);
   TextBackGround(BackGroundColor);
   TextColor(ForeGroundColor);
   FOR U := 1 TO Len DO
    BEGIN
       Write(BackGroundChar); {shows how many characters are available}
    END;
   GotoXY(XPosition,YPosition);
   C := Chr($00); {null character input}
   TextBackGround(ForeGroundColor);
   TextColor(BackGroundColor);
   NewString := WhatWas; {starts with previous value in memory}
   Write(NewString); {writes previous value to screen for editing}
   B := Length(WhatWas);
   A := B;
   TextBackGround(BackGroundColor);
   TextColor(ForeGroundColor);
   WHILE (C <> Chr($0D)) AND (C <> Chr($1B)) DO {not CR or ESC}
    BEGIN
       NoAdd := FALSE;
       IF Caps THEN C := UpCase(ReadKey) {if Caps read uppercase else...}
       ELSE C := ReadKey;
       CASE C OF
          Chr($08): IF B >= 1 THEN {backspace}
                     BEGIN
                        IF FirstChar THEN
                         BEGIN
                            FirstChar := FALSE;
                            GotoXY(XPosition,YPosition);
                            Write(NewString);
                         END;
                        Delete(NewString,B,1);
                        Write(BkSp,BackGroundChar,BkSp);
                        Dec(B);
                        GotoXY(XPosition+B,WhereY);
                        FOR U := B TO Length(NewString) DO
                         BEGIN
                            IF B <> U THEN Temp := Temp + NewString[U]
                            ELSE Temp := '';
                         END;
                        Write(Temp);
                        FOR U := Length(NewString)+1 TO Len DO
                         BEGIN
                            Write(BackGroundChar);
                         END;
                        GotoXY(XPosition+B,WhereY);
                        NoAdd := TRUE;
                        Dec(A);
                     END;
          Chr($1B): BEGIN {Escape}
                       NoAdd := TRUE;
                       NewString := WhatWas;
                    END;
          Chr($19): BEGIN {^Y = clear the editing line}
                       NoAdd := TRUE;
                       NewString := '';
                       GotoXY(XPosition,YPosition);
                       FOR U := 1 TO Len DO
                        BEGIN
                           Write(BackGroundChar);
                        END;
                       FirstChar := FALSE;
                       GotoXY(XPosition,YPosition);
                       B := 0;
                       A := 0;
                    END;
          Chr($0D): NoAdd := TRUE; {enter <CR>}
          Chr($00): BEGIN {extended keys always start with null character}
                       NoAdd := TRUE;
                       IF FirstChar THEN
                        BEGIN
                           FirstChar := FALSE;
                           GotoXY(XPosition,YPosition);
                           Write(NewString);
                        END;
                       C := UpCase(ReadKey);
                       CASE C OF
                          Chr(77): BEGIN {right arrow}
                                    IF B <= Length(NewString)-1 THEN
                                     BEGIN
                                        GotoXY(XPosition+B+1,WhereY);
                                        Inc(B);
                                     END;
                                 END;
                          Chr(75): BEGIN {left arrow}
                                      IF B >= 1 THEN
                                       BEGIN
                                          GotoXY(XPosition+B-1,WhereY);
                                          Dec(B);
                                       END;
                                   END;
                          Chr(71): BEGIN {home}
                                      GotoXY(XPosition,YPosition);
                                      B := 0;
                                   END;
                          Chr(79): BEGIN {end}
                                      GotoXY(XPosition+Length(NewString),YPosition);
                                      B := Length(NewString);
                                   END;
                          Chr(82): BEGIN {insert}
                                      IF InsertOn THEN
                                       BEGIN
                                          InsertOn := FALSE;
                                          BigCursor;
                                       END
                                      ELSE
                                       BEGIN
                                          InsertOn := TRUE;
                                          ShowCursor;
                                       END;
                                   END;
                          Chr(83): BEGIN {del}
                                      IF (B < Length(NewString)) AND (B >= 0) THEN
                                       BEGIN
                                          Delete(NewString,B+1,1);
                                          FOR U := B TO Length(NewString) DO
                                           BEGIN
                                              IF U <> B THEN Temp := Temp + NewString[U]
                                              ELSE Temp := '';
                                           END;
                                          GotoXY(XPosition+B,WhereY);
                                          Write(Temp);
                                          Write(BackGroundChar);
                                          GotoXY(XPosition+B,WhereY);
                                          Dec(A);
                                       END;
                                   END;
                       END;
                       WHILE Keypressed DO C := ReadKey;
                    END;
       END;
       IF ((A < Len) AND (NoAdd = FALSE) AND (C <> Chr($08))) OR ((FirstChar) AND
          (NOT(NoAdd)) AND (C <> Chr($08))) THEN
        BEGIN
           IF FirstChar THEN {if first character typed is a real character,then
                             string is removed to start new one else...}
            BEGIN
               Delete(NewString,1,Length(NewString));
               GotoXY(XPosition,YPosition);
               B := 0;
               A := 0;
               FOR U := 1 TO Len DO
                BEGIN
                   Write(BackGroundChar);
                END;
               GotoXY(XPosition,YPosition);
               FirstChar := FALSE;
            END;
           Inc(B);
           Inc(A);
           IF InsertOn THEN
            BEGIN
               Insert(C,NewString,B);
               FOR U := B TO Length(NewString) DO
                BEGIN
                   IF B <> U THEN Temp := Temp + NewString[U]
                   ELSE Temp := '';
                END;
               GotoXY(XPosition+B-1,WhereY);
               Write(C);
               Write(Temp);
               GotoXY(XPosition+B,WhereY);
            END
           ELSE
            BEGIN
               Insert(C,NewString,B);
               Delete(NewString,B+1,1);
               Write(C)
            END;
        END;
    END;
    TextBackGround(0);
END;


BEGIN
END.


[Back to ENTRY SWAG index]  [Back to Main SWAG index]  [Original]