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

Procedure ReadS (Var NewIn : String; OldIn : String; X,Y,Colr,MaxLen : Byte;
                 ValidChars : ChSet; FChar : Char);

              (* NewIn      = String entered by user, or default string if
                              nothing new entered.  Self-modified.
                 OldIn      = Default or old data entered
                 X,Y        = Coordinates of beginning point to read
                 Colr       = Color of input
                 MaxLen     = Maximum length of input
                 ValidChars = A Set of Char that outlines which keys can be
                              used in entering string.  ie: ['A'..'Z','a'..'z']
                 FChar      = Filler character for End-of-String
              *)

  (* When called, prompt should be on screen.  NewIn var will be modified only
     at exit of ReadS, otherwise will return nothing.  If ESC is pressed, NewIn
     will again be blank, otherwise will contain the user input or default
     string.


  ** NOTE **  There are certain functions required to make this entire
              procedure work.  They are not necessary, but make it nicer to
              use.  These are:

                    GetCursor
                    SetCursor
                    WriteS (fast writes to screen, see next few posts)

  *)

  (* Standard disclaimer: I'm not liable for anything this procedure does
                          outside the original purpose of the procedure.  If
                          something bad happens, let me know, but that's all
                          I can do.
  *)

Var
   CurX, StLen                          : Byte;
   OldCursor                            : Word;

Begin
     NewIn := '';
     InsOn := True;
     InStr := OldIn;
     StLen := Length (OldIn);
     Colr := CheckColor (Colr);
     For I := StLen To MaxLen-1 Do
         WriteS (FChar,X+I,Y,Colr);
     WriteS (OldIn,X,Y,HiColr);
     CurX := Length (InStr)+X;
     ValidChars := ValidChars + [#8,#13,#210,#211] + HKeySet + FuncKeys;
{arrowk     OldCursor := GetCursor;
     Repeat
           If InsOn Then
              SetCursor (DefaultCursor)
           Else
               SetCursor (BlockCursor);
           GotoXY (CurX,Y);
           StLen := Length (InStr);
           For I := StLen To MaxLen-1 Do
               If Colr < 112 Then
                  WriteS (FChar,X+I,Y,HiColr)
               Else
                   WriteS (FChar,X+I,Y,Colr);
           Repeat
                 Repeat
                       Ch := ReadKey;
                 Until (Ch <> #13) Or ((Ch = #13) And (InStr <> ''));
           Until (Ch In ValidChars);
           Case Ch Of
                #8:
                Begin
                     If (CurX > X) And (Length (InStr) > 0) Then
                     Begin
                          Dec (CurX);
                          If InsOn Then
                             Delete (InStr,(CurX-X)+1,1)
                          Else
                              InStr[(CurX-X)+1] := #32;
                     End;
                End;
                #203: { Left arrow }
                      If CurX > X Then
                         Dec (CurX);
                #205: { Right arrow }
                      If CurX < X+Length (InStr) Then
                         Inc (CurX);
                #199: { Home }
                      CurX := X;
                #207: { End }
                      CurX := X+Length (InStr);
                #210: { Insert }
                      InsOn := InsOn XOr True;
                #211: { Delete }
                      Delete (InStr,(CurX-X)+1,1);
                #65..#90,
                #97..#122, { Alphabet }
                #48..#57,  { Numbers }
                #91..#96,
                #32..#47,
                #58..#64:  { Other chars }
                Begin
                     If (CurX-X < MaxLen) And (Length (InStr) < MaxLen) Then
                     Begin
                          InStr[0] := Chr (Ord (InStr[0])+1);
                          InStr[Length (InStr)] := #0;
                          If InsOn Then
                               Insert (Ch,InStr,(CurX-X)+1)
                          Else
                               InStr[(CurX-X)+1] := Ch;
                          Inc (CurX);
                     End;
                End;
           End;
           While Pos (#0,InStr) > 0 Do
                 Delete (InStr,Pos (#0,InStr),1);
           WriteS (InStr,X,Y,Colr);
     Until (Ch = #13) Or (Ch = #27);
     For I := Length (InStr) To MaxLen-1 Do
         WriteS (#32,I+X,Y,7);
     If Ch = #27 Then
        NewIn := ''
     Else
         NewIn := InStr;
     SetCursor (OldCursor);
End;

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