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.
|
|||
|
|