diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs
index 18ae4a650..48e379a9f 100644
--- a/Configuration/GlobalAssemblyInfo.cs
+++ b/Configuration/GlobalAssemblyInfo.cs
@@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "9";
public const string Build = "0";
- public const string Revision = "3436";
+ public const string Revision = "3438";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
diff --git a/Configuration/Version.defs b/Configuration/Version.defs
index b3cf2b7c0..7ecffb331 100644
--- a/Configuration/Version.defs
+++ b/Configuration/Version.defs
@@ -1,4 +1,4 @@
%COREVERSION%=0
-%REVISION%=3436
+%REVISION%=3438
%MINOR%=9
%MAJOR%=3
diff --git a/PABCNetHelp/ForEducation/Executors/robotstart.html b/PABCNetHelp/ForEducation/Executors/robotstart.html
index 49eb5ac10..3f663bc30 100644
--- a/PABCNetHelp/ForEducation/Executors/robotstart.html
+++ b/PABCNetHelp/ForEducation/Executors/robotstart.html
@@ -100,12 +100,13 @@
if ;
w ;
if + ;
- count -;
+ count -;
+ mix ;
cc ;
p ;
pp .
-
9 x 11
+
7 x 9
StandardField ,
N x M Field(N,M).
.
diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt
index 3896ab264..35c65ef8f 100644
--- a/Release/pabcversion.txt
+++ b/Release/pabcversion.txt
@@ -1 +1 @@
-3.9.0.3436
+3.9.0.3438
diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh
index 35f8917d1..3c0fb953e 100644
--- a/ReleaseGenerators/PascalABCNET_version.nsh
+++ b/ReleaseGenerators/PascalABCNET_version.nsh
@@ -1 +1 @@
-!define VERSION '3.9.0.3436'
+!define VERSION '3.9.0.3438'
diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas
index aed35e7bb..32eec5a18 100644
--- a/TestSuite/CompilationSamples/PABCSystem.pas
+++ b/TestSuite/CompilationSamples/PABCSystem.pas
@@ -343,8 +343,12 @@ type
/// Стандартная подсистема ввода-вывода
IOStandardSystem = class(IOSystem)
- state := 0; // 0 - нет символа в буфере char, 1 - есть символ в буфере char
- sym: integer; // буфер в 1 символ для моделирования Peek в консоли
+ //state := 0; // 0 - нет символа в буфере char, 1 - есть символ в буфере char
+ //sym: integer; // буфер в 1 символ для моделирования Peek в консоли
+ // SSM 28/02/24 - новая концепция для считывания из консоли без редиректа: буфер на одну строку
+ read_buf := new char[0];
+ rblen := 0;
+ rbpos := 0;
buf: array of char := new char[buflen];
pos := 0;
realbuflen := -1; // только вначале
@@ -352,6 +356,7 @@ type
public
constructor Create;
procedure ReadNextBuf;
+ procedure ReadNextConsoleBuf;
function peek: integer; virtual;// использует state и sym (стар) или буфер buf (нов)
function read_symbol: char; virtual;// использует state и sym (стар) или буфер buf (нов)
procedure read(var x: integer); virtual;
@@ -5452,6 +5457,14 @@ begin
pos := 0;
end;
+procedure IOStandardSystem.ReadNextConsoleBuf;
+begin
+ var sbuf := Console.ReadLine + NewLine;
+ read_buf := sbuf.ToCharArray;
+ rbpos := 0;
+ rblen := read_buf.Length;
+end;
+
var
_IsPipedRedirectedQuery := False;
@@ -5492,14 +5505,18 @@ begin
if not console_alloc then
AllocConsole;
// SSM 29.11.14
- if state = 1 then // в sym - символ, считанный предыдущим Peek
+ {if state = 1 then // в sym - символ, считанный предыдущим Peek
Result := sym
else // в sym ничего нет
begin
state := 1;
sym := Console.Read(); // считываение в буфер из одного символа
Result := sym;
- end;
+ end; }
+ // SSM 28.02.23
+ if rbpos >= rblen then // буфер строки пуст
+ ReadNextConsoleBuf;
+ Result := integer(read_buf[rbpos]);
end;
end;
@@ -5518,7 +5535,7 @@ begin
if not console_alloc then
AllocConsole;
// SSM 29.11.14
- if state = 1 then // в sym - символ, считанный предыдущим Peek
+ {if state = 1 then // в sym - символ, считанный предыдущим Peek
begin
state := 0;
Result := char(sym);
@@ -5526,7 +5543,12 @@ begin
end
else // в sym ничего нет
Result := char(Console.Read());
- exit;
+ exit;}
+ // SSM 28.02.23
+ if rbpos >= rblen then // буфер строки пуст
+ ReadNextConsoleBuf;
+ Result := read_buf[rbpos];
+ rbpos += 1;
end;
end;
@@ -5608,14 +5630,25 @@ begin
begin
if not console_alloc then
AllocConsole;
- if state = 1 then
+ {if state = 1 then
begin
state := 0;
Result := char(sym) + Console.ReadLine;
sym := -1;
end
else
- Result := Console.ReadLine;
+ Result := Console.ReadLine;}
+
+ // SSM 28.02.23
+ if rbpos >= rblen then // буфер строки пуст
+ ReadNextConsoleBuf;
+
+ // Проблема - там может уже оставаться 1 или 2 символа. Если так, то строка будет пустой!
+ var remlen := rblen - rbpos - NewLine.Length;
+ if remlen <= 0 then
+ Result := ''
+ else Result := string.Create(read_buf,rbpos,remlen);
+ rbpos := rblen;
end;
end;
@@ -7206,36 +7239,42 @@ procedure Print(params args: array of object);
begin
if args.Length = 0 then
exit;
- if PrintDelimDefault<>'' then
- for var i := 0 to args.length - 1 do
+ for var i := 0 to args.length - 1 do
+ if PrintDelimDefault<>'' then
Write(args[i], PrintDelimDefault)
- else
- for var i := 0 to args.length - 1 do
- Write(args[i])
+ else Write(args[i]);
end;
procedure Println(params args: array of object);
begin
- Print(args);
- Writeln;
+ if args.Length = 0 then
+ exit;
+ for var i := 0 to args.length - 2 do
+ if PrintDelimDefault<>'' then
+ Write(args[i], PrintDelimDefault)
+ else Write(args[i]);
+ Writeln(args[args.Length-1]);
end;
procedure Print(f: Text; params args: array of object);
begin
if args.Length = 0 then
exit;
- if PrintDelimDefault<>'' then
- for var i := 0 to args.length - 1 do
+ for var i := 0 to args.length - 1 do
+ if PrintDelimDefault<>'' then
Write(f, args[i], PrintDelimDefault)
- else
- for var i := 0 to args.length - 1 do
- Write(f, args[i])
+ else Write(f, args[i])
end;
procedure Println(f: Text; params args: array of object);
begin
- Print(f, args);
- Writeln(f);
+ if args.Length = 0 then
+ exit;
+ for var i := 0 to args.length - 2 do
+ if PrintDelimDefault<>'' then
+ Write(f, args[i], PrintDelimDefault)
+ else Write(f, args[i]);
+ Writeln(f, args[args.Length-1]);
end;
procedure Serialize(fileName: string; obj: object);
diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas
index aed35e7bb..32eec5a18 100644
--- a/bin/Lib/PABCSystem.pas
+++ b/bin/Lib/PABCSystem.pas
@@ -343,8 +343,12 @@ type
/// Стандартная подсистема ввода-вывода
IOStandardSystem = class(IOSystem)
- state := 0; // 0 - нет символа в буфере char, 1 - есть символ в буфере char
- sym: integer; // буфер в 1 символ для моделирования Peek в консоли
+ //state := 0; // 0 - нет символа в буфере char, 1 - есть символ в буфере char
+ //sym: integer; // буфер в 1 символ для моделирования Peek в консоли
+ // SSM 28/02/24 - новая концепция для считывания из консоли без редиректа: буфер на одну строку
+ read_buf := new char[0];
+ rblen := 0;
+ rbpos := 0;
buf: array of char := new char[buflen];
pos := 0;
realbuflen := -1; // только вначале
@@ -352,6 +356,7 @@ type
public
constructor Create;
procedure ReadNextBuf;
+ procedure ReadNextConsoleBuf;
function peek: integer; virtual;// использует state и sym (стар) или буфер buf (нов)
function read_symbol: char; virtual;// использует state и sym (стар) или буфер buf (нов)
procedure read(var x: integer); virtual;
@@ -5452,6 +5457,14 @@ begin
pos := 0;
end;
+procedure IOStandardSystem.ReadNextConsoleBuf;
+begin
+ var sbuf := Console.ReadLine + NewLine;
+ read_buf := sbuf.ToCharArray;
+ rbpos := 0;
+ rblen := read_buf.Length;
+end;
+
var
_IsPipedRedirectedQuery := False;
@@ -5492,14 +5505,18 @@ begin
if not console_alloc then
AllocConsole;
// SSM 29.11.14
- if state = 1 then // в sym - символ, считанный предыдущим Peek
+ {if state = 1 then // в sym - символ, считанный предыдущим Peek
Result := sym
else // в sym ничего нет
begin
state := 1;
sym := Console.Read(); // считываение в буфер из одного символа
Result := sym;
- end;
+ end; }
+ // SSM 28.02.23
+ if rbpos >= rblen then // буфер строки пуст
+ ReadNextConsoleBuf;
+ Result := integer(read_buf[rbpos]);
end;
end;
@@ -5518,7 +5535,7 @@ begin
if not console_alloc then
AllocConsole;
// SSM 29.11.14
- if state = 1 then // в sym - символ, считанный предыдущим Peek
+ {if state = 1 then // в sym - символ, считанный предыдущим Peek
begin
state := 0;
Result := char(sym);
@@ -5526,7 +5543,12 @@ begin
end
else // в sym ничего нет
Result := char(Console.Read());
- exit;
+ exit;}
+ // SSM 28.02.23
+ if rbpos >= rblen then // буфер строки пуст
+ ReadNextConsoleBuf;
+ Result := read_buf[rbpos];
+ rbpos += 1;
end;
end;
@@ -5608,14 +5630,25 @@ begin
begin
if not console_alloc then
AllocConsole;
- if state = 1 then
+ {if state = 1 then
begin
state := 0;
Result := char(sym) + Console.ReadLine;
sym := -1;
end
else
- Result := Console.ReadLine;
+ Result := Console.ReadLine;}
+
+ // SSM 28.02.23
+ if rbpos >= rblen then // буфер строки пуст
+ ReadNextConsoleBuf;
+
+ // Проблема - там может уже оставаться 1 или 2 символа. Если так, то строка будет пустой!
+ var remlen := rblen - rbpos - NewLine.Length;
+ if remlen <= 0 then
+ Result := ''
+ else Result := string.Create(read_buf,rbpos,remlen);
+ rbpos := rblen;
end;
end;
@@ -7206,36 +7239,42 @@ procedure Print(params args: array of object);
begin
if args.Length = 0 then
exit;
- if PrintDelimDefault<>'' then
- for var i := 0 to args.length - 1 do
+ for var i := 0 to args.length - 1 do
+ if PrintDelimDefault<>'' then
Write(args[i], PrintDelimDefault)
- else
- for var i := 0 to args.length - 1 do
- Write(args[i])
+ else Write(args[i]);
end;
procedure Println(params args: array of object);
begin
- Print(args);
- Writeln;
+ if args.Length = 0 then
+ exit;
+ for var i := 0 to args.length - 2 do
+ if PrintDelimDefault<>'' then
+ Write(args[i], PrintDelimDefault)
+ else Write(args[i]);
+ Writeln(args[args.Length-1]);
end;
procedure Print(f: Text; params args: array of object);
begin
if args.Length = 0 then
exit;
- if PrintDelimDefault<>'' then
- for var i := 0 to args.length - 1 do
+ for var i := 0 to args.length - 1 do
+ if PrintDelimDefault<>'' then
Write(f, args[i], PrintDelimDefault)
- else
- for var i := 0 to args.length - 1 do
- Write(f, args[i])
+ else Write(f, args[i])
end;
procedure Println(f: Text; params args: array of object);
begin
- Print(f, args);
- Writeln(f);
+ if args.Length = 0 then
+ exit;
+ for var i := 0 to args.length - 2 do
+ if PrintDelimDefault<>'' then
+ Write(f, args[i], PrintDelimDefault)
+ else Write(f, args[i]);
+ Writeln(f, args[args.Length-1]);
end;
procedure Serialize(fileName: string; obj: object);
diff --git a/bin/PascalABCNET.chm b/bin/PascalABCNET.chm
index c626716ab..a8ef42d2d 100644
Binary files a/bin/PascalABCNET.chm and b/bin/PascalABCNET.chm differ
diff --git a/bin/template.pct b/bin/template.pct
index 69027c32d..26ed083a5 100644
--- a/bin/template.pct
+++ b/bin/template.pct
@@ -173,6 +173,14 @@ begin
|
end.
+[grabc]
+uses GraphABC;
+
+begin
+ |
+end.
+
+
[wf]
{$reference System.Windows.Forms.dll}
{$reference System.Drawing.dll}