Помощь - Поиск - Пользователи - Календарь
Полная версия: Консоль и Read
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Archvingel
Доброго времени суток! Неловко даже с такой проблемой соваться, но, видимо, придется. Необходимо сделать программу в консольном режиме. Суть программы неважна - я ее уже сделал. Но вот проблема - ввод у меня задан следующим образом:
Код

var
  S: array of Char;
  I: Integer;

begin
  WriteLn('Input the string: ');
  I := -1;
  repeat
    I := I + 1;
    if I mod 4 = 0 then
      SetLength(S, I + 4);
    Read(S[I]);
  until S[I] = '.';

При этом не удается ввести последовательность больше 254 символов за раз - на 254-ом отображение их прекращается и курсор замирает. Препод требует, чтобы строка не прерывалась при вводе. Естественно, ввести требуется больше 254 символов. Можно ли с этим что-либо сделать? Есть такие мысли, что можно делать ввод построчно, пимпать enter в конце каждой строки. Но при вводе последнего символа в строке курсор автоматически переностится на новую, а если это делать не на последних символах, то не будет непрерывности. Может быть есть какие-нибудь спецсимволы для переноса курсора на строку вверх? В общем, буду очень благодарен за помощь.
volvo
Вот так сделай:
program Project1;

{$APPTYPE CONSOLE}

uses crt32;
var
S: array of Char;
I: Integer;

begin
clrscr;
WriteLn('Input the string: ');
I := -1;
repeat
I := I + 1;
if I mod 4 = 0 then
SetLength(S, I + 4);

s[i] := Readkey; write(s[i]);
until S[I] = '.';

writeln('i = ', i);
readln;
end.


Файл CRT32 - в аттаче, взят из DRKB... На D6 Все прекрасно работает...
Гость
Увы, мне не подойдет. Никаких модулей, никакого асма и т.п. Вроде как все самому надо сделать. Но за модулек спасибо smile.gif
xds
Можно так:
program Project1;

{$APPTYPE CONSOLE}

uses
Windows;

var
StdIn: THANDLE;
DefMode, n: Cardinal;

S: array of Char;
I: Integer;

begin
StdIn := GetStdHandle(STD_INPUT_HANDLE);
GetConsoleMode(StdIn, DefMode);
SetConsoleMode(
StdIn,
DefMode and not (ENABLE_ECHO_INPUT or ENABLE_LINE_INPUT)
);

WriteLn('Input the string: ');
I := -1;
repeat
I := I + 1;
if I mod 4 = 0 then
SetLength(S, I + 4);
ReadConsole(StdIn, @s[i], 1, n, nil); write(s[i]);
until S[I] = '.';

writeln('i = ', i);

SetConsoleMode(StdIn, DefMode);
readln;
end.
Гость
Спасибо большущее. Может, и пройдет таким образом. Хотя сильно подозреваю, что меня пошлют, мотивируя это тем, что я таких вещей еще не знаю. Но попробовать стоит. Спасиб yes2.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.