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}