240 lines
5.4 KiB
Plaintext
240 lines
5.4 KiB
Plaintext
|
||
{ Copyright (c) 1985, 88 by Borland International, Inc. }
|
||
|
||
unit MCINPUT;
|
||
|
||
interface
|
||
|
||
uses Crt, Dos, MCVars, MCUtil, MCDisply, MCParser, MCLib;
|
||
|
||
function GetKey : Char;
|
||
{ Reads the next keyboard character }
|
||
|
||
function EditString(var S : IString; Legal : IString;
|
||
MaxLength : Word) : Boolean;
|
||
{ Allows the user to edit a string with only certain characters allowed -
|
||
Returns TRUE if ESC was not pressed, FALSE is ESC was pressed.
|
||
}
|
||
|
||
procedure GetInput(C : Char);
|
||
{ Reads and acts on an input string from the keyboard that started with C }
|
||
|
||
function GetWord(var Number : Word; Low, High : Word) : Boolean;
|
||
{ Reads in a positive word from low to high }
|
||
|
||
function GetCell(var Col, Row : Word) : Boolean;
|
||
{ Reads in a cell name that was typed in - Returns False if ESC was pressed }
|
||
|
||
function GetYesNo(var YesNo : Char; Prompt : String) : Boolean;
|
||
{ Prints a prompt and gets a yes or no answer - returns TRUE if ESC was
|
||
pressed, FALSE if not.
|
||
}
|
||
|
||
function GetCommand(MsgStr, ComStr : String) : Word;
|
||
{ Reads in a command and acts on it }
|
||
|
||
implementation
|
||
|
||
function GetKey;
|
||
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 }
|
||
|
||
function EditString;
|
||
var
|
||
CPos : Word;
|
||
Ins : Boolean;
|
||
Ch : Char;
|
||
begin
|
||
Ins := True;
|
||
ChangeCursor(Ins);
|
||
CPos := Succ(Length(S));
|
||
SetColor(White);
|
||
repeat
|
||
GotoXY(1, ScreenRows + 5);
|
||
Write(S, '':(79 - Length(S)));
|
||
GotoXY(CPos, ScreenRows + 5);
|
||
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 : ;
|
||
UPKEY, DOWNKEY : Ch := CR;
|
||
ESC : S := '';
|
||
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) or (Ch = ESC);
|
||
ClearInput;
|
||
ChangeCursor(False);
|
||
EditString := Ch <> ESC;
|
||
SetCursor(NoCursor);
|
||
end; { EditString }
|
||
|
||
procedure GetInput;
|
||
var
|
||
S : IString;
|
||
begin
|
||
S := C;
|
||
if (not EditString(S, '', MAXINPUT)) or (S = '') then
|
||
Exit;
|
||
Act(S);
|
||
Changed := True;
|
||
end; { GetInput }
|
||
|
||
function GetWord;
|
||
var
|
||
I, Error : Word;
|
||
Good : Boolean;
|
||
Num1, Num2 : String[5];
|
||
Message : String[80];
|
||
S : IString;
|
||
begin
|
||
GetWord := False;
|
||
S := '';
|
||
Str(Low, Num1);
|
||
Str(High, Num2);
|
||
Message := MSGBADNUMBER + ' ' + Num1 + ' to ' + Num2 + '.';
|
||
repeat
|
||
if not EditString(S, '1234567890', 4) then
|
||
Exit;
|
||
Val(S, I, Error);
|
||
Good := (Error = 0) and (I >= Low) and (I <= High);
|
||
if not Good then
|
||
ErrorMsg(Message);
|
||
until Good;
|
||
Number := I;
|
||
GetWord := True;
|
||
end; { GetWord }
|
||
|
||
function GetCell;
|
||
var
|
||
Len, NumLen, OldCol, OldRow, Posit, Error : Word;
|
||
Data : IString;
|
||
NumString : IString;
|
||
First, Good : Boolean;
|
||
begin
|
||
NumLen := RowWidth(MAXROWS);
|
||
OldCol := Col;
|
||
OldRow := Row;
|
||
First := True;
|
||
Good := False;
|
||
Data := '';
|
||
repeat
|
||
if not First then
|
||
ErrorMsg(MSGBADCELL);
|
||
First := False;
|
||
Posit := 1;
|
||
if not EditString(Data, '', NumLen + 2) then
|
||
begin
|
||
Col := OldCol;
|
||
Row := OldRow;
|
||
GetCell := False;
|
||
Exit;
|
||
end;
|
||
if (Data <> '') and (Data[1] in Letters) then
|
||
begin
|
||
Col := Succ(Ord(UpCase(Data[1])) - Ord('A'));
|
||
Inc(Posit);
|
||
if (Posit <= Length(Data)) and (Data[Posit] in LETTERS) then
|
||
begin
|
||
Col := Col * 26;
|
||
Inc(Col, Succ(Ord(UpCase(Data[Posit])) - Ord('A')));
|
||
Inc(Posit);
|
||
end;
|
||
if Col <= MAXCOLS then
|
||
begin
|
||
NumString := Copy(Data, Posit, Succ(Length(Data) - Posit));
|
||
Val(NumString, Row, Error);
|
||
if (Row <= MAXROWS) and (Error = 0) then
|
||
Good := True;
|
||
end;
|
||
end;
|
||
until Good;
|
||
GetCell := True;
|
||
end; { GetCell }
|
||
|
||
function GetYesNo;
|
||
begin
|
||
SetCursor(ULCursor);
|
||
GetYesNo := False;
|
||
WritePrompt(Prompt + ' ');
|
||
repeat
|
||
YesNo := UpCase(GetKey);
|
||
if YesNo = ESC then
|
||
Exit;
|
||
until YesNo in ['Y', 'N'];
|
||
SetCursor(NoCursor);
|
||
GetYesNo := True;
|
||
end; { GetYesNo }
|
||
|
||
function GetCommand;
|
||
var
|
||
Counter, Len : Word;
|
||
Ch : Char;
|
||
begin
|
||
Len := Length(MsgStr);
|
||
GotoXY(1, ScreenRows + 4);
|
||
ClrEol;
|
||
for Counter := 1 to Len do
|
||
begin
|
||
if MsgStr[Counter] in ['A'..'Z'] then
|
||
SetColor(COMMANDCOLOR)
|
||
else
|
||
SetColor(LOWCOMMANDCOLOR);
|
||
Write(MsgStr[Counter]);
|
||
end;
|
||
GotoXY(1, ScreenRows + 5);
|
||
repeat
|
||
Ch := UpCase(GetKey);
|
||
until (Pos(Ch, ComStr) <> 0) or (Ch = ESC);
|
||
ClearInput;
|
||
if Ch = ESC then
|
||
GetCommand := 0
|
||
else
|
||
GetCommand := Pos(Ch, ComStr);
|
||
end; { GetCommand }
|
||
|
||
end.
|
||
|