[Back to ENTRY SWAG index] [Back to Main SWAG index] [Original]

    {
     SJ>     What is the best way to enter extended characters using readln?  I
     SJ> would really like to assign Ctrl-E to ASCII 130.  I tried using ansi
     SJ> and I could get it to work in dos but Pascal seems to override it.
     SJ> Basically what I am tying to do is make it easy for the user to enter
     SJ> foreign letters into a string.  Any suggestions would be appreciated.
     SJ>                                             Stuart Johnston

    To achieve this, you have to prog your own ReadLine-procedure, using
    the READKEY and KEYPRESSED functions of TP.
    You can't get READLN() to do the job for you. You have to do it your
    own. :-)

    Here is an example of what an Input-Line routine could look like:
    It's only a small one. I also have a much more comfortable one, but it
    isn't finished yet. :-)))

    ----------------------------------------------------------------------- }

    uses CRT;

    function InputLine(column, line, width, color : byte) : string;
    {
     Function to read one line of input from the keyboard.
    }

    var

     i     : byte;
     key   : char;
     coln  : byte;    { column of cursor position }
     entry : byte;    { pointer into inputstring }
     str   : string;  { input string }

    begin
     textattr := color;    { set color of whole line }
     gotoxy(column, line);
     for i := column to (column + width - 1) do
      write(#32);
     coln := column;
     entry := 1;
     str[0] := #0;  { empty string }
     while (TRUE) do
     begin
      gotoxy(coln, line);
      key := readkey;
      case key of
       #0 : begin  { Trace Function-keys }
             key := readkey;
            end;
       #8 : begin  { BACKSPACE-key }
             if (entry > 1) then
             begin
              coln := coln - 1;
              gotoxy(coln, line);
              write(#32);
              entry := entry - 1;
             end;
            end;
       #12 : begin        { Ctrl-L : delete entire line }
              gotoxy(column, line);
              for i := column to (column + width - 1) do
               write(#32);
              coln := column;
              entry := 1;
              str[0] := #0;  { empty string }
             end;
       #13 : begin  { RETURN-key }
              if (entry > 1) then  { no RETURN with an empty line! }
              begin
               str[0] := char(entry - 1);  { set string length }
               InputLine := str;
               exit;
              end;
             end;
       #27 : begin        { ESC-key : to abort the entry }
              str := #255;            { set a marker for "ESC-key has been pressed" }
              InputLine := str;
              exit;
             end;
       #32..#254 : begin
                    if (entry <= width) then { input field full? }
                    begin
                     write(key);
                     str[entry] := key;
                     entry := entry + 1;
                     coln := coln + 1;
                    end;
                   end;
      end;
     end;
    end;

[Back to ENTRY SWAG index] [Back to Main SWAG index] [Original]