diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index b303af95a..318844ffb 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 = "8"; public const string Build = "3"; - public const string Revision = "3093"; + public const string Revision = "3101"; 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 7a47a52f3..a7581db29 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ %MINOR%=8 -%REVISION%=3093 +%REVISION%=3101 %COREVERSION%=3 %MAJOR%=3 diff --git a/InstallerSamples/OMPSamples/Hanoi.pas b/InstallerSamples/Experimental/OMPSamples/Hanoi.pas similarity index 100% rename from InstallerSamples/OMPSamples/Hanoi.pas rename to InstallerSamples/Experimental/OMPSamples/Hanoi.pas diff --git a/InstallerSamples/OMPSamples/MultMatrix.pas b/InstallerSamples/Experimental/OMPSamples/MultMatrix.pas similarity index 100% rename from InstallerSamples/OMPSamples/MultMatrix.pas rename to InstallerSamples/Experimental/OMPSamples/MultMatrix.pas diff --git a/InstallerSamples/OMPSamples/Mutual Lock.pas b/InstallerSamples/Experimental/OMPSamples/Mutual Lock.pas similarity index 100% rename from InstallerSamples/OMPSamples/Mutual Lock.pas rename to InstallerSamples/Experimental/OMPSamples/Mutual Lock.pas diff --git a/InstallerSamples/OMPSamples/QuickSort.pas b/InstallerSamples/Experimental/OMPSamples/QuickSort.pas similarity index 100% rename from InstallerSamples/OMPSamples/QuickSort.pas rename to InstallerSamples/Experimental/OMPSamples/QuickSort.pas diff --git a/InstallerSamples/OMPSamples/SqrSinArrays.pas b/InstallerSamples/Experimental/OMPSamples/SqrSinArrays.pas similarity index 100% rename from InstallerSamples/OMPSamples/SqrSinArrays.pas rename to InstallerSamples/Experimental/OMPSamples/SqrSinArrays.pas diff --git a/InstallerSamples/OMPSamples/SumOfPrime.pas b/InstallerSamples/Experimental/OMPSamples/SumOfPrime.pas similarity index 100% rename from InstallerSamples/OMPSamples/SumOfPrime.pas rename to InstallerSamples/Experimental/OMPSamples/SumOfPrime.pas diff --git a/InstallerSamples/OMPSamples/Write Critical.pas b/InstallerSamples/Experimental/OMPSamples/Write Critical.pas similarity index 100% rename from InstallerSamples/OMPSamples/Write Critical.pas rename to InstallerSamples/Experimental/OMPSamples/Write Critical.pas diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCL/MatrMlt.cl b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenCL/MatrMlt.cl similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenCL/MatrMlt.cl rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenCL/MatrMlt.cl diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCL/MatrMlt.pas b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenCL/MatrMlt.pas similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenCL/MatrMlt.pas rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenCL/MatrMlt.pas diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCL/SimpleAddition.cl b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenCL/SimpleAddition.cl similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenCL/SimpleAddition.cl rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenCL/SimpleAddition.cl diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCL/SimpleAddition.pas b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenCL/SimpleAddition.pas similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenCL/SimpleAddition.pas rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenCL/SimpleAddition.pas diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/MatrMlt.cl b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/MatrMlt.cl similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/MatrMlt.cl rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/MatrMlt.cl diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/MatrMlt.pas b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/MatrMlt.pas similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/MatrMlt.pas rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/MatrMlt.pas diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.cl b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.cl similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.cl rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.cl diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.pas b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.pas similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.pas rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.pas diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Wait очереди/1.pas b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/Wait очереди/1.pas similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenCLABC/Wait очереди/1.pas rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/Wait очереди/1.pas diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Wait очереди/2.pas b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/Wait очереди/2.pas similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenCLABC/Wait очереди/2.pas rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/Wait очереди/2.pas diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Wait очереди/NamedQData.pas b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/Wait очереди/NamedQData.pas similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenCLABC/Wait очереди/NamedQData.pas rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/Wait очереди/NamedQData.pas diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Игра жизнь/Игра жизнь.cl b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/Игра жизнь/Игра жизнь.cl similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenCLABC/Игра жизнь/Игра жизнь.cl rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/Игра жизнь/Игра жизнь.cl diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Игра жизнь/Игра жизнь.pas b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/Игра жизнь/Игра жизнь.pas similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenCLABC/Игра жизнь/Игра жизнь.pas rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/Игра жизнь/Игра жизнь.pas diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/0.cl b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/0.cl similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/0.cl rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/0.cl diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Использовать.pas b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Использовать.pas similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Использовать.pas rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Использовать.pas diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Прекомпилировать.pas b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Прекомпилировать.pas similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Прекомпилировать.pas rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Прекомпилировать.pas diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGLABC/!Крутящийся треугольник/Крутящийся треугольник.pas b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/!Крутящийся треугольник/Крутящийся треугольник.pas similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenGLABC/!Крутящийся треугольник/Крутящийся треугольник.pas rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/!Крутящийся треугольник/Крутящийся треугольник.pas diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGLABC/!Крутящийся треугольник/Крутящийся треугольник.vert b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/!Крутящийся треугольник/Крутящийся треугольник.vert similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenGLABC/!Крутящийся треугольник/Крутящийся треугольник.vert rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/!Крутящийся треугольник/Крутящийся треугольник.vert diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Common.pas b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/Common.pas similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenGLABC/Common.pas rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/Common.pas diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Empty.vert b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/Точки на поле/Empty.vert similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Empty.vert rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/Точки на поле/Empty.vert diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Mandelbrot.frag b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/Точки на поле/Mandelbrot.frag similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Mandelbrot.frag rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/Точки на поле/Mandelbrot.frag diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/SinglePointToScreen.geom b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/Точки на поле/SinglePointToScreen.geom similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/SinglePointToScreen.geom rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/Точки на поле/SinglePointToScreen.geom diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Волны.frag b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/Точки на поле/Волны.frag similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Волны.frag rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/Точки на поле/Волны.frag diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Минимум расстояний.frag b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/Точки на поле/Минимум расстояний.frag similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Минимум расстояний.frag rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/Точки на поле/Минимум расстояний.frag diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Спирали.frag b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/Точки на поле/Спирали.frag similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Спирали.frag rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/Точки на поле/Спирали.frag diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Сумма расстояний.frag b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/Точки на поле/Сумма расстояний.frag similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Сумма расстояний.frag rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/Точки на поле/Сумма расстояний.frag diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Точки.pas b/InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/Точки на поле/Точки.pas similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Точки.pas rename to InstallerSamples/Experimental/OpenGL и OpenCL/OpenGLABC/Точки на поле/Точки.pas diff --git a/InstallerSamples/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html b/InstallerSamples/Experimental/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html rename to InstallerSamples/Experimental/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html diff --git a/InstallerSamples/OpenGL и OpenCL/Справка OpenCLABC.html b/InstallerSamples/Experimental/OpenGL и OpenCL/Справка OpenCLABC.html similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/Справка OpenCLABC.html rename to InstallerSamples/Experimental/OpenGL и OpenCL/Справка OpenCLABC.html diff --git a/InstallerSamples/OpenGL и OpenCL/Справка OpenGLABC.html b/InstallerSamples/Experimental/OpenGL и OpenCL/Справка OpenGLABC.html similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/Справка OpenGLABC.html rename to InstallerSamples/Experimental/OpenGL и OpenCL/Справка OpenGLABC.html diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt index e49b8ba70..bc17425ba 100644 --- a/Release/pabcversion.txt +++ b/Release/pabcversion.txt @@ -1 +1 @@ -3.8.3.3093 +3.8.3.3101 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index 3737560e9..ed78195d9 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.8.3.3093' +!define VERSION '3.8.3.3101' diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index f97a2908a..c7978f9b3 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -8130,7 +8130,8 @@ end; procedure Halt; begin - Halt(ExitCode); + System.Diagnostics.Process.GetCurrentProcess.Kill; + //Halt(ExitCode); end; procedure Halt(exitCode: integer); @@ -10418,13 +10419,24 @@ end; /// Разбивает последовательность на серии длины size function Batch(Self: sequence of T; size: integer): sequence of sequence of T; extensionmethod; begin - Result := SeqWhile(Self, v -> v.Skip(size), v -> v.Count > 0).Select(v -> v.Take(size)) + var buf := new List; + foreach var elm in Self do begin + buf.Add(elm); + if buf.Count=size then begin + yield buf.ToArray; + buf.Clear + end; + end; + if buf.Count>0 then + yield buf.ToArray; + //Result := SeqWhile(Self, v -> v.Skip(size), v -> v.Count > 0).Select(v -> v.Take(size)) end; /// Разбивает последовательность на серии длины size и применяет проекцию к каждой серии function Batch(Self: sequence of T; size: integer; proj: Func, Res>): sequence of Res; extensionmethod; begin - Result := SeqWhile(Self, v -> v.Skip(size), v -> v.Count > 0).Select(v -> v.Take(size)).Select(ss -> proj(ss)); + //Result := SeqWhile(Self, v -> v.Skip(size), v -> v.Count > 0).Select(v -> v.Take(size)).Select(ss -> proj(ss)); + Result := Self.Batch(size).Select(ss -> proj(ss)); end; ///-- @@ -12568,7 +12580,7 @@ function NotDivs(Self,d: integer): boolean; extensionmethod := Self mod d <> 0; function DivsAny(Self: integer; params a: array of integer): boolean; extensionmethod; begin Result := False; - for var i:=0 to a.High do + for var i:=0 to a.Length-1 do if Self mod a[i] = 0 then begin Result := True; @@ -12580,7 +12592,7 @@ end; function DivsAll(Self: integer; params a: array of integer): boolean; extensionmethod; begin Result := True; - for var i:=0 to a.High do + for var i:=0 to a.Length-1 do if Self mod a[i] <> 0 then begin Result := False; diff --git a/TestSuite/CompilationSamples/WPFObjects.pas b/TestSuite/CompilationSamples/WPFObjects.pas index 1de672ddb..eaabd248d 100644 --- a/TestSuite/CompilationSamples/WPFObjects.pas +++ b/TestSuite/CompilationSamples/WPFObjects.pas @@ -360,7 +360,7 @@ type end; procedure AnimRotateP(a,sec: real); begin - var an := new DoubleAnimation(a, System.TimeSpan.FromSeconds(sec)); + var an := new DoubleAnimation(a + rot.Angle, System.TimeSpan.FromSeconds(sec)); rot.BeginAnimation(RotateTransform.AngleProperty, an, HandoffBehavior.Compose); end; procedure AnimScaleP(a,sec: real); diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas index 2552e4fa9..c7978f9b3 100644 --- a/bin/Lib/PABCSystem.pas +++ b/bin/Lib/PABCSystem.pas @@ -8130,7 +8130,8 @@ end; procedure Halt; begin - Halt(ExitCode); + System.Diagnostics.Process.GetCurrentProcess.Kill; + //Halt(ExitCode); end; procedure Halt(exitCode: integer); @@ -10418,13 +10419,24 @@ end; /// Разбивает последовательность на серии длины size function Batch(Self: sequence of T; size: integer): sequence of sequence of T; extensionmethod; begin - Result := SeqWhile(Self, v -> v.Skip(size), v -> v.Count > 0).Select(v -> v.Take(size)) + var buf := new List; + foreach var elm in Self do begin + buf.Add(elm); + if buf.Count=size then begin + yield buf.ToArray; + buf.Clear + end; + end; + if buf.Count>0 then + yield buf.ToArray; + //Result := SeqWhile(Self, v -> v.Skip(size), v -> v.Count > 0).Select(v -> v.Take(size)) end; /// Разбивает последовательность на серии длины size и применяет проекцию к каждой серии function Batch(Self: sequence of T; size: integer; proj: Func, Res>): sequence of Res; extensionmethod; begin - Result := SeqWhile(Self, v -> v.Skip(size), v -> v.Count > 0).Select(v -> v.Take(size)).Select(ss -> proj(ss)); + //Result := SeqWhile(Self, v -> v.Skip(size), v -> v.Count > 0).Select(v -> v.Take(size)).Select(ss -> proj(ss)); + Result := Self.Batch(size).Select(ss -> proj(ss)); end; ///-- diff --git a/bin/Lib/WPFObjects.pas b/bin/Lib/WPFObjects.pas index 1de672ddb..eaabd248d 100644 --- a/bin/Lib/WPFObjects.pas +++ b/bin/Lib/WPFObjects.pas @@ -360,7 +360,7 @@ type end; procedure AnimRotateP(a,sec: real); begin - var an := new DoubleAnimation(a, System.TimeSpan.FromSeconds(sec)); + var an := new DoubleAnimation(a + rot.Angle, System.TimeSpan.FromSeconds(sec)); rot.BeginAnimation(RotateTransform.AngleProperty, an, HandoffBehavior.Compose); end; procedure AnimScaleP(a,sec: real); diff --git a/bin/Lib/XLSX.pas b/bin/Lib/XLSX.pas index beddeba91..ed0a0c403 100644 --- a/bin/Lib/XLSX.pas +++ b/bin/Lib/XLSX.pas @@ -2,8 +2,8 @@ interface -function ReadXLSX(fileName:string):Dictionary; -function ToDate(Self:string):DateTime; +function ReadXLSX(fileName: string): Dictionary; +function ToDate(Self: string): DateTime; implementation @@ -16,21 +16,21 @@ uses System.Xml,sf; var numFmt := new List; - arxiv : System.IO.Compression.ZipArchive; + arxiv: System.IO.Compression.ZipArchive; shStr := new List; - DateTypeId := |14,15,16,17,22,27,30,36,50,55,57|.ToHS; + DateTypeId := |14, 15, 16, 17, 22, 27, 30, 36, 50, 55, 57|.ToHS; -function ToDate(Self:string):DateTime; +function ToDate(Self: string): DateTime; begin Result := DateTime.Parse(Self); end; - -function ToCR(Self:string);extensionmethod - := (self[2:].ToI-1, self[1]-'A'); // 'B3' -> [1,2] -function Load(path:string):XmlElement; +function ToCR(Self: string); extensionmethod +:= (self[2:].ToI - 1, self[1] - 'A'); // 'B3' -> [1,2] + +function Load(path: string): XmlElement; begin - if arxiv.Entries.Any(e->(e as ZipArchiveEntry).FullName = path) then begin + if arxiv.Entries.Any(e -> (e as ZipArchiveEntry).FullName = path) then begin var stream := arxiv.GetEntry(path).Open; var doc := new XmlDocument(); doc.Load(stream); @@ -38,59 +38,84 @@ begin end; end; -function LoadSheet(path:string):array of array of string; +function LoadSheet(path: string): array of array of string; begin var elms := Load(path); - var (LU,RD) := elms.Item['dimension'].GetAttribute('ref').Split(':').Sel(s->s.ToCR); - var (w,h) := (RD[1]-LU[1]+1,RD[0]-LU[0]+1); - var sheet : array of array of string; - setLength(sheet,h); - for var i:=0 to h-1 do sheet[i] := new string[w]; - - foreach var node:XmlNode in elms.Item['sheetData'].ChildNodes do begin - foreach var cell:XmlNode in node.ChildNodes do begin - var (i,j) := cell.Attributes.GetNamedItem('r').Value.ToCR; + var dim := elms.Item['dimension']; + var LU, RD: (int, int); + if dim = nil then begin // собираем габариты таблицы + var (l, u) := (maxint, maxint); + var (r, d) := (-1, -1); + foreach var node: XmlNode in elms.Item['sheetData'].ChildNodes do + begin + foreach var cell: XmlNode in node.ChildNodes do + begin + var (i, j) := cell.Attributes.GetNamedItem('r').Value.ToCR; + l := min(l, i); + u := min(u, j); + r := max(r, i); + d := max(d, j); + end + end; + LU := (l, u); + RD := (r, d); + end else // готовые габариты из таблицы + (LU, RD) := dim.GetAttribute('ref').Split(':').Sel(s -> s.ToCR); + + var (w, h) := (RD[1] - LU[1] + 1, RD[0] - LU[0] + 1); + var sheet: array of array of string; + setLength(sheet, h); + for var i := 0 to h - 1 do sheet[i] := new string[w]; + + foreach var node: XmlNode in elms.Item['sheetData'].ChildNodes do + begin + foreach var cell: XmlNode in node.ChildNodes do + begin + var (i, j) := cell.Attributes.GetNamedItem('r').Value.ToCR; + i -= LU[0]; + j -= LU[1]; var typ := cell.Attributes.GetNamedItem('t'); var st := cell.Attributes.GetNamedItem('s'); var shared := false; - if (typ<>nil) and (typ.Value='s') then + if (typ <> nil) and (typ.Value = 's') then shared := true; var value := ''; - foreach var vl:XmlNode in cell.ChildNodes do - if vl.Name='v' then value := vl.InnerText; + foreach var vl: XmlNode in cell.ChildNodes do + if vl.Name = 'v' then value := vl.InnerText; if shared then - sheet[i,j] := shStr[value.ToInteger] - else if (st<>nil)and(numFmt[st.Value.ToI] in DateTypeId) then - sheet[i,j] := (new DateTime(1900,1,1)).AddDays(value.ToI-2).ToString('dd.MM.yyyy') + sheet[i, j] := shStr[value.ToInteger] + else if (st <> nil) and (numFmt[st.Value.ToI] in DateTypeId) then + sheet[i, j] := (new DateTime(1900, 1, 1)).AddDays(value.ToI - 2).ToString('dd.MM.yyyy') else - sheet[i,j] := value; + sheet[i, j] := value; end; end; Result := sheet; end; -function ReadXLSX(fileName:string):Dictionary; +function ReadXLSX(fileName: string): Dictionary; begin arxiv := ZipFile.OpenRead(fileName); - + // общие строки var elms := Load('xl/sharedStrings.xml'); - if elms<>nil then - foreach var node:XmlNode in elms.ChildNodes do + if elms <> nil then + foreach var node: XmlNode in elms.ChildNodes do shStr.Add(node.Item['t'].InnerText.Trim); // стили elms := Load('xl/styles.xml'); numFmt := new List; - foreach var node:XmlNode in elms.Item['cellXfs'].ChildNodes do + foreach var node: XmlNode in elms.Item['cellXfs'].ChildNodes do numFmt.Add(node.Attributes.GetNamedItem('numFmtId').Value.ToI); elms := Load('xl/workbook.xml'); - Result := new Dictionary; - foreach var node:XmlNode in elms.Item['sheets'].ChildNodes do begin + Result := new Dictionary; + foreach var node: XmlNode in elms.Item['sheets'].ChildNodes do + begin var name := node.Attributes.GetNamedItem('name').Value; var attrs := new List; - foreach var attr:XmlAttribute in node.Attributes do + foreach var attr: XmlAttribute in node.Attributes do attrs.Add(attr.Name); var sheetId := node.Attributes.GetNamedItem('r:id').Value[4:]; Result[name] := LoadSheet($'xl/worksheets/sheet{sheetId}.xml');