home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / turbo5 / mcinput.pas < prev    next >
Pascal/Delphi Source File  |  1988-10-09  |  6KB  |  240 lines

  1.  
  2. { Copyright (c) 1985, 88 by Borland International, Inc. }
  3.  
  4. unit MCINPUT;
  5.  
  6. interface
  7.  
  8. uses Crt, Dos, MCVars, MCUtil, MCDisply, MCParser, MCLib;
  9.  
  10. function GetKey : Char;
  11. { Reads the next keyboard character }
  12.  
  13. function EditString(var S : IString; Legal : IString;
  14.                     MaxLength : Word) : Boolean;
  15. { Allows the user to edit a string with only certain characters allowed -
  16.    Returns TRUE if ESC was not pressed, FALSE is ESC was pressed.
  17. }
  18.  
  19. procedure GetInput(C : Char);
  20. { Reads and acts on an input string from the keyboard that started with C }
  21.  
  22. function GetWord(var Number : Word; Low, High : Word) : Boolean;
  23. { Reads in a positive word from low to high }
  24.  
  25. function GetCell(var Col, Row : Word) : Boolean;
  26. { Reads in a cell name that was typed in - Returns False if ESC was pressed }
  27.  
  28. function GetYesNo(var YesNo : Char; Prompt : String) : Boolean;
  29. { Prints a prompt and gets a yes or no answer - returns TRUE if ESC was
  30.    pressed, FALSE if not.
  31. }
  32.  
  33. function GetCommand(MsgStr, ComStr : String) : Word;
  34. { Reads in a command and acts on it }
  35.  
  36. implementation
  37.  
  38. function GetKey;
  39. var
  40.   C : Char;
  41. begin
  42.   C := ReadKey;
  43.   repeat
  44.     if C = NULL then
  45.     begin
  46.       C := ReadKey;
  47.       if Ord(C) > 127 then
  48.         C := NULL
  49.       else
  50.         GetKey := Chr(Ord(C) + 128);
  51.     end
  52.     else
  53.       GetKey := C;
  54.   until C <> NULL;
  55. end; { GetKey }
  56.  
  57. function EditString;
  58. var
  59.   CPos : Word;
  60.   Ins : Boolean;
  61.   Ch : Char;
  62. begin
  63.   Ins := True;
  64.   ChangeCursor(Ins);
  65.   CPos := Succ(Length(S));
  66.   SetColor(White);
  67.   repeat
  68.     GotoXY(1, ScreenRows + 5);
  69.     Write(S, '':(79 - Length(S)));
  70.     GotoXY(CPos, ScreenRows + 5);
  71.     Ch := GetKey;
  72.     case Ch of
  73.       HOMEKEY : CPos := 1;
  74.       ENDKEY : CPos := Succ(Length(S));
  75.       INSKEY : begin
  76.         Ins := not Ins;
  77.         ChangeCursor(Ins);
  78.       end;
  79.       LEFTKEY : if CPos > 1 then
  80.         Dec(CPos);
  81.       RIGHTKEY : if CPos <= Length(S) then
  82.         Inc(CPos);
  83.       BS : if CPos > 1 then
  84.       begin
  85.         Delete(S, Pred(CPos), 1);
  86.         Dec(CPos);
  87.       end;
  88.       DELKEY : if CPos <= Length(S) then
  89.         Delete(S, CPos, 1);
  90.       CR : ;
  91.       UPKEY, DOWNKEY : Ch := CR;
  92.       ESC : S := '';
  93.       else begin
  94.         if ((Legal = '') or (Pos(Ch, Legal) <> 0)) and
  95.             ((Ch >= ' ') and (Ch <= '~')) and
  96.              (Length(S) < MaxLength) then
  97.         begin
  98.           if Ins then
  99.             Insert(Ch, S, CPos)
  100.           else if CPos > Length(S) then
  101.             S := S + Ch
  102.           else
  103.             S[CPos] := Ch;
  104.           Inc(CPos);
  105.         end;
  106.       end;
  107.     end; { case }
  108.   until (Ch = CR) or (Ch = ESC);
  109.   ClearInput;
  110.   ChangeCursor(False);
  111.   EditString := Ch <> ESC;
  112.   SetCursor(NoCursor);
  113. end; { EditString }
  114.  
  115. procedure GetInput;
  116. var
  117.   S : IString;
  118. begin
  119.   S := C;
  120.   if (not EditString(S, '', MAXINPUT)) or (S = '') then
  121.     Exit;
  122.   Act(S);
  123.   Changed := True;
  124. end; { GetInput }
  125.  
  126. function GetWord;
  127. var
  128.   I, Error : Word;
  129.   Good : Boolean;
  130.   Num1, Num2 : String[5];
  131.   Message : String[80];
  132.   S : IString;
  133. begin
  134.   GetWord := False;
  135.   S := '';
  136.   Str(Low, Num1);
  137.   Str(High, Num2);
  138.   Message := MSGBADNUMBER + ' ' + Num1 + ' to ' + Num2 + '.';
  139.   repeat
  140.     if not EditString(S, '1234567890', 4) then
  141.       Exit;
  142.     Val(S, I, Error);
  143.     Good := (Error = 0) and (I >= Low) and (I <= High);
  144.     if not Good then
  145.       ErrorMsg(Message);
  146.   until Good;
  147.   Number := I;
  148.   GetWord := True;
  149. end; { GetWord }
  150.  
  151. function GetCell;
  152. var
  153.   Len, NumLen, OldCol, OldRow, Posit, Error : Word;
  154.   Data : IString;
  155.   NumString : IString;
  156.   First, Good : Boolean;
  157. begin
  158.   NumLen := RowWidth(MAXROWS);
  159.   OldCol := Col;
  160.   OldRow := Row;
  161.   First := True;
  162.   Good := False;
  163.   Data := '';
  164.   repeat
  165.     if not First then
  166.       ErrorMsg(MSGBADCELL);
  167.     First := False;
  168.     Posit := 1;
  169.     if not EditString(Data, '', NumLen + 2) then
  170.     begin
  171.       Col := OldCol;
  172.       Row := OldRow;
  173.       GetCell := False;
  174.       Exit;
  175.     end;
  176.     if (Data <> '') and (Data[1] in Letters) then
  177.     begin
  178.       Col := Succ(Ord(UpCase(Data[1])) - Ord('A'));
  179.       Inc(Posit);
  180.       if (Posit <= Length(Data)) and (Data[Posit] in LETTERS) then
  181.       begin
  182.         Col := Col * 26;
  183.         Inc(Col, Succ(Ord(UpCase(Data[Posit])) - Ord('A')));
  184.         Inc(Posit);
  185.       end;
  186.       if Col <= MAXCOLS then
  187.       begin
  188.         NumString := Copy(Data, Posit, Succ(Length(Data) - Posit));
  189.         Val(NumString, Row, Error);
  190.         if (Row <= MAXROWS) and (Error = 0) then
  191.           Good := True;
  192.       end;
  193.     end;
  194.   until Good;
  195.   GetCell := True;
  196. end; { GetCell }
  197.  
  198. function GetYesNo;
  199. begin
  200.   SetCursor(ULCursor);
  201.   GetYesNo := False;
  202.   WritePrompt(Prompt + ' ');
  203.   repeat
  204.     YesNo := UpCase(GetKey);
  205.     if YesNo = ESC then
  206.       Exit;
  207.   until YesNo in ['Y', 'N'];
  208.   SetCursor(NoCursor);
  209.   GetYesNo := True;
  210. end; { GetYesNo }
  211.  
  212. function GetCommand;
  213. var
  214.   Counter, Len : Word;
  215.   Ch : Char;
  216. begin
  217.   Len := Length(MsgStr);
  218.   GotoXY(1, ScreenRows + 4);
  219.   ClrEol;
  220.   for Counter := 1 to Len do
  221.   begin
  222.     if MsgStr[Counter] in ['A'..'Z'] then
  223.       SetColor(COMMANDCOLOR)
  224.     else
  225.       SetColor(LOWCOMMANDCOLOR);
  226.     Write(MsgStr[Counter]);
  227.   end;
  228.   GotoXY(1, ScreenRows + 5);
  229.   repeat
  230.     Ch := UpCase(GetKey);
  231.   until (Pos(Ch, ComStr) <> 0) or (Ch = ESC);
  232.   ClearInput;
  233.   if Ch = ESC then
  234.     GetCommand := 0
  235.   else
  236.     GetCommand := Pos(Ch, ComStr);
  237. end; { GetCommand }
  238.  
  239. end.
  240.