Unit Globals; Interface Uses Crt{, Dos?}; { Special keyboard Characters: } { I've squeezed them into a couple of lines so that they'd fit in a message.. might be an idea to expand them back to ~20 lines or so..} NULL = #0; BS = #8; ForMFEED = #12; CR = #13; ESC = #27; HOMEKEY = #199; {Values apply if only used With the 'Getkey' Function} endKEY = #207; UPKEY = #200; doWNKEY = #208; PGUPKEY = #201; PGDNKEY = #209; LEFTKEY = #203; inSKEY = #210; RIGHTKEY = #205; DELKEY = #211; CTRLLEFTKEY = #243; CTRLRIGHTKEY = #244; F1 = #187; F2 = #188; F3 = #189; F4 = #190; F5 = #191; F6 = #192; F7 = #193; F8 = #194; F9 = #195; F10 = #196; Type CurType = ( off, Big, Small ); Var Ins : Boolean; { Global Var containing status of Insert key} {-----------------------------------------------------------------------------} Function GetKey : Char; Procedure EdReadln(Var S : String); Procedure Cursor( Size : CurType ); { Either off, Big or Small } Procedure ChangeCursor( Ins : Boolean ); {-----------------------------------------------------------------------------} Implementation Function GetKey; { : Char; } Var C : Char; begin C := ReadKey; Repeat if C = NULL then begin C := ReadKey; if ord(C) > 127 then C := NULL else GetKey := Chr(ord(C) + 128); end else GetKey := C; Until C <> NULL; end; { GetKey } {-----------------------------------------------------------------------------} Procedure EdReadln; { (Var S : String); } { Legal : IString; MaxLength : Word; Var ESCPressed : Boolean); } Var CPos : Word; Ch : Char; OldY : Byte; Legal : String[1]; MaxLength : Byte; EscPressed : Boolean; begin OldY := WhereY - 1; ChangeCursor(Ins); CPos := 1; {Place cursor at START of line} { CPos := Succ(Length(S));} {Whereas this places cursor at end of line} Legal := ''; {Legal and Maxlength originally passed as params} MaxLength := Lo( WindMax ) - Lo( WindMin ); Repeat Cursor( off ); GotoXY(1, WhereY); Write(S, '':(MaxLength - Length(S))); GotoXY(CPos, WhereY); ChangeCursor(Ins); Ch := GetKey; Case Ch of HOMEKEY : CPos := 1; endKEY : CPos := Succ(Length(S)); inSKEY : begin Ins := not Ins; ChangeCursor(Ins); end; LEFTKEY : if CPos > 1 then Dec(CPos); RIGHTKEY : if CPos <= Length(S) then Inc(CPos); BS : if CPos > 1 then begin Delete(S, Pred(CPos), 1); Dec(CPos); end; DELKEY : if CPos <= Length(S) then Delete(S, CPos, 1); CR : ; ESC : begin S := ''; CPos := 1; end; else begin if ((Legal = '') or (Pos(Ch, Legal) <> 0)) and ((Ch >= ' ') and (Ch <= '~')) and (Length(S) < MaxLength) then begin if Ins then Insert(Ch, S, CPos) else if CPos > Length(S) then S := S + Ch else S[CPos] := Ch; Inc(CPos); end; end; end; { Case } Until (Ch = CR); Cursor( Small ); ESCPressed := Ch <> ESC; Writeln; end; { EditString } {-----------------------------------------------------------------------------} Procedure Cursor; { ( Size : CurType ); { Either off, Big or Small } Var Regs : Registers; begin With Regs Do begin Ax := $100; Case Size of off : Cx := $3030; Big : Cx := $0F; Small : Cx := $607; end; Intr ( $10, Regs ); end; end; {-----------------------------------------------------------------------------} Procedure ChangeCursor; { ( Ins : Boolean ); } {Changes cursor size depending on status of insert key} begin if Ins then Cursor( Small ) else Cursor( Big ); end; begin end.