Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Консоль и Read

Автор: Archvingel 9.11.2006 0:28

Доброго времени суток! Неловко даже с такой проблемой соваться, но, видимо, придется. Необходимо сделать программу в консольном режиме. Суть программы неважна - я ее уже сделал. Но вот проблема - ввод у меня задан следующим образом:

Код

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 9.11.2006 1:01

Вот так сделай:

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 Все прекрасно работает...


Прикрепленные файлы
Прикрепленный файл  crt32.pas ( 26.96 килобайт ) Кол-во скачиваний: 164

Автор: Гость 9.11.2006 1:17

Увы, мне не подойдет. Никаких модулей, никакого асма и т.п. Вроде как все самому надо сделать. Но за модулек спасибо smile.gif

Автор: xds 9.11.2006 20:08

Можно так:

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.

Автор: Гость 9.11.2006 21:07

Спасибо большущее. Может, и пройдет таким образом. Хотя сильно подозреваю, что меня пошлют, мотивируя это тем, что я таких вещей еще не знаю. Но попробовать стоит. Спасиб yes2.gif