Ответ 1
AFAIK, вы не можете заставить Readln()
RTL Readln()
принимать больше символов (хотя и внутренне, она закодирована для запуска цикла, который должен иметь возможность обрабатывать более 254 символов). По умолчанию, когда вы вставляете тестовую строку 300-char в консольное окно, она перестает принимать символы на 254 даже до нажатия Enter.
Но вы можете использовать другой подход - вызовите GetStdHandle(STD_INPUT_HANDLE)
а затем вызовите ReadFile()
в этой HANDLE
чтобы прочитать, сколько вы хотите. Если вы используете буфер размером не менее 300 байт, он с радостью примет тестовую строку с 300 символами:
program Project3;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, Winapi.Windows;
var
buf : array[0..299] of AnsiChar;
MyTest: AnsiString;//string;
hStdIn: THandle;
dwNumRead: DWORD;
begin
try
//Readln(MyTest);
hStdIn := GetStdHandle(STD_INPUT_HANDLE);
ReadFile(hStdIn, buf, sizeof(buf), dwNumRead, nil);
SetString(MyTest, buf, dwNumRead);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Затем вы можете позволить RTL обрабатывать эту буферизацию для вас, обернув HANDLE
в THandleStream
и TStreamReader
(последний позволяет указать размер буфера - по умолчанию - 1024 байта), например:
program Project3;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, Winapi.Windows, System.Classes;
var
MyTest : String;
strm: THandleStream;
reader: TStreamReader;
begin
try
//Readln(MyTest);
strm := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE));
try
reader := TStreamReader.Create(strm);
try
MyTest := reader.ReadLine;
finally
reader.Free;
end;
finally
strm.Free;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.