[Back to ENTRY SWAG index] [Back to Main SWAG index] [Original]
{===========================================================================
Date: 10-02-93 (06:28)
From: RANDALL WOODMAN
Subj: Input
{->>>>GetString<<<<--------------------------------------------}
{ }
{ Filename : GETSTRIN.SRC -- Last Modified 7/14/88 }
{ }
{ This is a generalized string-input procedure. It shows a }
{ field between vertical bar characters at X,Y, with any }
{ string value passed initially in XString left-justified in }
{ the field. The current state of XString when the user }
{ presses Return is returned in XString. The user can press }
{ ESC and leave the passed value of XString undisturbed, even }
{ if XString was altered prior to his pressing ESC. }
{ }
{ From: COMPLETE TURBO PASCAL 5.0 by Jeff Duntemann }
{ Scott, Foresman & Co., Inc. 1988 ISBN 0-673-38355-5 }
{--------------------------------------------------------------}
PROCEDURE GetString( X,Y : Integer;
VAR XString : String80;
MaxLen : Integer;
Capslock : Boolean;
Numeric : Boolean;
GetReal : Boolean;
VAR RValue : Real;
VAR IValue : Integer;
VAR Error : Integer;
VAR Escape : Boolean);
VAR I,J : Integer;
Ch : Char;
Cursor : Char;
Dot : Char;
BLength : Byte;
ClearIt : String80;
Worker : String80;
Printables : SET OF Char;
Lowercase : SET OF Char;
Numerics : SET OF Char;
CR : Boolean;
BEGIN
Printables := [' '..'}']; { Init sets }
Lowercase := ['a'..'z'];
IF GetReal THEN Numerics := ['-','.','0'..'9','E','e']
ELSE Numerics := ['-','0'..'9'];
Cursor := '_'; Dot := '.';
CR := False; Escape := False;
FillChar(ClearIt,SizeOf(ClearIt),'.'); { Fill the clear string }
ClearIt[0] := Chr(MaxLen); { Set clear string to MaxLen }
{ Convert numbers to string if required: }
IF Numeric THEN { Convert zero values to null string: }
IF (GetReal AND (RValue = 0.0)) OR
(NOT GetReal AND (IValue = 0)) THEN XString := ''
ELSE { Convert nonzero values to string equiv: }
IF GetReal THEN Str(RValue:MaxLen,XString)
ELSE Str(IValue:MaxLen,XString);
{ Truncate string value to MaxLen }
IF Length(XString) > MaxLen THEN XString[0] := Chr(MaxLen);
GotoXY(X,Y); Write('|',ClearIt,'|'); { Draw the field }
GotoXY(X+1,Y); Write(XString);
IF Length(XString)<MaxLen THEN
BEGIN
GotoXY(X + Length(XString) + 1,Y);
Write(Cursor) { Draw the Cursor }
END;
Worker := XString; { Fill work string with input string }
REPEAT { Until ESC or (CR) entered }
{ Wait here for keypress: }
WHILE NOT KeyPressed DO BEGIN {NULL} END;
Ch := ReadKey;
IF Ch IN Printables THEN { If Ch is printable... }
IF Length(Worker) >= MaxLen THEN UhUh ELSE
IF Numeric AND (NOT (Ch IN Numerics)) THEN UhUh ELSE
BEGIN
IF Ch IN Lowercase THEN IF Capslock THEN Ch := Chr(Ord(Ch)-32);
Worker := CONCAT(Worker,Ch);
GotoXY(X+1,Y); Write(Worker);
IF Length(Worker) < MaxLen THEN Write(Cursor)
END
ELSE { If Ch is NOT printable... }
CASE Ord(Ch) OF
8,127 : IF Length(Worker) <= 0 THEN UhUh ELSE
BEGIN
Delete(Worker,Length(Worker),1);
GotoXY(X+1,Y); Write(Worker,Cursor);
IF Length(Worker) < MaxLen-1 THEN Write(Dot);
END;
13 : CR := True; { Carriage return }
24 : BEGIN { CTRL-X : Blank the field }
GotoXY(X+1,Y); Write(ClearIt);
Worker := ''; { Blank out work string }
END;
27 : Escape := True; { ESC }
ELSE UhUh { CASE ELSE }
END; { CASE }
UNTIL CR OR Escape; { Get keypresses until (CR) or }
{ ESC pressed }
GotoXY(X + 1,Y); Write(ClearIt);
GotoXY(X + 1,Y); Write(Worker);
IF CR THEN { Don't update XString if ESC hit }
BEGIN
XString := Worker;
IF Numeric THEN { Convert string to Numeric values }
CASE GetReal OF
True : Val(Worker,RValue,Error);
False : Val(Worker,IValue,Error)
END { CASE }
ELSE
BEGIN
RValue := 0.0;
IValue := 0
END
END
END; { GETString }
[Back to ENTRY SWAG index] [Back to Main SWAG index] [Original]