{ General STRING input routine with Color prompt and input } USES DOS,Crt; TYPE CharSet = Set OF Char; VAR Name : STRING; procedure QWrite( Column, Line , Color : byte; S : STRING ); var VMode : BYTE ABSOLUTE $0040 : $0049; { Video mode: Mono=7, Color=0-3 } NumCol : WORD ABSOLUTE $0040 : $004A; { Number of CRT columns (1-based) } VSeg : WORD; OfsPos : integer; { offset position of the character in video RAM } vPos : integer; sLen : Byte ABSOLUTE S; Begin If VMode in [0,2,7] THEN VSeg := $B000 ELSE VSeg := $B800; OfsPos := (((pred(Line) * NumCol) + pred(Column)) * 2); FOR vPos := 0 to pred(sLen) do MemW[VSeg : (OfsPos + (vPos * 2))] := (Color shl 8) + byte(S[succ(vPos)]) End; Function GetString(cx,cy,cc,pc : Byte; Default,Prompt : String; MaxLen : Integer;OKSet : charset):string; { cx = Input Column } { cy = Input Row } { cc = Input Color } { pc = Prompt Color } const BS = ^H; CR = ^M; iPutChar = #249; ConSet : CharSet = [BS,CR]; var TStr : string; TLen,X,i : Integer; Ch : Char; begin {$I-} { turn off I/O checking } TStr := ''; TLen := 0; Qwrite(cx,cy,pc,Prompt); X := cx + Length(Prompt); For i := x to (x + Maxlen - 1) do Qwrite(i,cy,cc,iputChar); Qwrite(x,cy,cc,Default); OKSet := OKSet + ConSet; repeat Gotoxy(x,cy); repeat ch := readkey until Ch in OKSet; if Ch = BS then begin if TLen > 0 then begin TLen := TLen - 1; X := X - 1; QWrite(x,cy,cc,iPutChar); end end else if (Ch <> CR) and (TLen < MaxLen) then begin QWrite(x,cy,cc,Ch); TLen := TLen + 1; TStr[TLen] := Ch; X := X + 1; end until Ch = CR; If Tlen > 0 Then Begin TStr[0] := chr(Tlen); Getstring := TStr End Else Getstring := Default; {$I+} end; BEGIN ClrScr; Name := Getstring(16,5,79,31,'GOOD OLE BOY','Enter Name : ',25,['a'..'z','A'..'Z',' ']); GOTOXY(16,7); WriteLn('Name : ',Name); Readkey; END.