WPFObjects модуль почти готов

Примеры WPFObjects
Дополнения в справку - методы файлов
Методы типизированных файлов переназваны f.FileSize на f.Size
f.FilePos на f.Position
Сделаны f.Reset и f.Rewrite
Random для вещественных
This commit is contained in:
miks1965 2018-08-21 17:28:27 +03:00
parent f685999bf7
commit 85b5ac28d7
24 changed files with 486 additions and 138 deletions

View file

@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "4";
public const string Build = "0";
public const string Revision = "1754";
public const string Revision = "1758";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%MINOR%=4
%REVISION%=1754
%REVISION%=1758
%COREVERSION%=0
%MAJOR%=3

View file

@ -0,0 +1,25 @@
uses WPFObjects;
var Destroyer: CircleWPF;
procedure CheckPulyaIntersects;
begin
Destroyer.IntersectionList.ForEach(procedure(o)->o.Destroy);
end;
begin
Window.SetSize(640,480);
Window.Title := 'Разрушитель: метод Intersect пересечения объектов';
for var i:=1 to 500 do
new RectangleWPF(Random(Window.Width.Round-200)+100,Random(Window.Height.Round-100),Random(200),Random(200),clRandom);
Destroyer := new CircleWPF(10,Window.Height.Round div 2,100,Colors.Black);
Destroyer.FontColor := Colors.Yellow;
Destroyer.Text := 'Destroyer';
for var i:=1 to 900 do
begin
Destroyer.MoveOn(1,0);
CheckPulyaIntersects;
Sleep(1);
end;
end.

View file

@ -0,0 +1,45 @@
uses WPFObjects;
const
/// Количество графических объектов
Count = 300;
/// Возвращает случайный графический объект
function NewRandomABC: ObjectWPF;
begin
case Random(3) of
0: Result := new CircleWPF(Random(Window.Width.Round-30)+10,Random(Window.Height.Round-30)+10,Random(10)+5,RandomColor);
1: Result := new RectangleWPF(Random(Window.Width.Round-30)+10,Random(Window.Height.Round-30)+10,Random(20)+10,Random(20)+10,RandomColor);
2: Result := new StarWPF(Random(Window.Width.Round-30)+10,Random(Window.Height.Round-30)+10,Random(20)+10,Random(10)+5,Random(4)+4,RandomColor);
end;
end;
/// Передвигает графический объект с отражением его от стенок
procedure Move(o: ObjectWPF);
begin
o.Move;
if (o.Left<0) or (o.Left+o.Width>Window.Width) then
o.dx := -o.dx;
if (o.Top<0) or (o.Top+o.Height>Window.Height) then
o.dy := -o.dy;
end;
begin
Window.Title := 'Движущиеся объекты';
for var i:=1 to Count do
begin
var m: ObjectWPF := NewRandomABC;
repeat
m.dx := Random(-3,3);
m.dy := Random(-3,3);
until (m.dx<>0) and (m.dy<>0);
end;
var k := 1;
while True do
begin
for var i:=0 to Objects.Count-1 do
Move(Objects[i]);
k += 1;
Window.Title := Format('{0,5:f2}',k/Milliseconds*1000)+' кадров в секунду';
end;
end.

View file

@ -3,6 +3,8 @@
<param name="Keyword" value="Read2">
<param name="Keyword" value="Read3">
<param name="Keyword" value="ReadElements">
<param name="Keyword" value="Reset">
<param name="Keyword" value="Rewrite">
<param name="Keyword" value="Seek">
<param name="Keyword" value="Write"></object>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><link rel="StyleSheet" href="../../../default.css">
@ -17,6 +19,10 @@
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò ïîñëåäîâàòåëüíîñòü ýëåìåíòîâ îòêðûòîãî òèïèçèðîâàííîãî ôàéëà îò òåêóùåãî ýëåìåíòà äî êîíå÷íîãî</td></tr>
<tr><td><code><b>function</b> ReadElements&lt;T&gt;(fname: string): <b>sequence </b> <b>of</b> T;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Îòêðûâàåò òèïèçèðîâàííûé ôàéë, âîçâðàùàåò ïîñëåäîâàòåëüíîñòü åãî ýëåìåíòîâ è çàêðûâàåò åãî</td></tr>
<tr><td><code><b>procedure</b> Reset&lt;T&gt;(Self: <b>file</b> <b>of</b> T); </code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Îòêðûâàåò ñóùåñòâóþùèé òèïèçèðîâàííûé ôàéë</td></tr>
<tr><td><code><b>procedure</b> Rewrite&lt;T&gt;(Self: <b>file</b> <b>of</b> T); </code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ñîçäàåò íîâûé èëè îáíóëÿåò ñóùåñòâóþùèé òèïèçèðîâàííûé ôàéë</td></tr>
<tr><td><code><b>function</b> Seek&lt;T&gt;(Self: <b>file</b> <b>of</b> T; n: int64): <b>file</b> <b>of</b> T; </code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Óñòàíàâëèâàåò òåêóùóþ ïîçèöèþ ôàéëîâîãî óêàçàòåëÿ â òèïèçèðîâàííîì ôàéëå íà ýëåìåíò ñ íîìåðîì n</td></tr>
<tr><td><code><b>procedure</b> Write&lt;T&gt;(Self: <b>file</b> <b>of</b> T; <b>params</b> vals: <b>array</b> <b>of</b> T); </code>

View file

@ -88,20 +88,32 @@
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ïåðåâîäèò ðàäèàíû â ãðàäóñû</td></tr>
<tr><td><code><b>function</b> Random(maxValue: integer): integer;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò ñëó÷àéíîå öåëîå â äèàïàçîíå îò 0 äî maxValue-1</td></tr>
<tr><td><code><b>function</b> Random(maxValue: real): real;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò ñëó÷àéíîå âåùåñòâåííîå â äèàïàçîíå [0,maxValue)</td></tr>
<tr><td><code><b>function</b> Random(a, b: integer): integer;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò ñëó÷àéíîå öåëîå â äèàïàçîíå îò a äî b</td></tr>
<tr><td><code><b>function</b> Random(a, b: real): real;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò ñëó÷àéíîå âåùåñòâåííîå â äèàïàçîíå [a,b)</td></tr>
<tr><td><code><b>function</b> Random: real;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò ñëó÷àéíîå âåùåñòâåííîå â äèàïàçîíå [0..1)</td></tr>
<tr><td><code><b>function</b> Random2(maxValue: integer): (integer, integer);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò 0 äî maxValue-1</td></tr>
<tr><td><code><b>function</b> Random2(maxValue: real): (real, real);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0,maxValue)</td></tr>
<tr><td><code><b>function</b> Random2(a, b: integer): (integer, integer);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò a äî b</td></tr>
<tr><td><code><b>function</b> Random2(a, b: real): (real, real);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [a,b)</td></tr>
<tr><td><code><b>function</b> Random2: (real, real);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0..1)</td></tr>
<tr><td><code><b>function</b> Random3(maxValue: integer): (integer, integer, integer);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò 0 äî maxValue-1</td></tr>
<tr><td><code><b>function</b> Random3(maxValue: real): (real, real, real);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0,maxValue)</td></tr>
<tr><td><code><b>function</b> Random3(a, b: integer): (integer, integer, integer);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò a äî b</td></tr>
<tr><td><code><b>function</b> Random3(a, b: real): (real, real, real);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [a,b)</td></tr>
<tr><td><code><b>function</b> Random3: (real, real, real);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0..1)</td></tr>
<tr><td><code><b>procedure</b> Randomize(seed: integer);</code>

View file

@ -67,7 +67,10 @@
<ul>
<li><a href="stand_common_files_methods.html">Îáùèå ìåòîäû ôàéëîâûõ òèïîâ</a></li>
<li><a href="stand_text_files_methods.html">Ìåòîäû òåêñòîâûõ ôàéëîâ</a></li>
<li><a href="stand_typed_files_methods.html">Ìåòîäû òèïèçèðîâàííûõ ôàéëîâ</a></li>
<li><a href="stand_binary_files_methods.html">Ìåòîäû äâîè÷íûõ ôàéëîâ</a></li>
<li><a href="Files/Extension%20methods%20for%20typed%20files.html">Ìåòîäû
ðàñøèðåíèÿ òèïèçèðîâàííûõ ôàéëîâ</a></li>
</ul>
</body>

View file

@ -11,26 +11,26 @@
</head>
<body>
<H1>Методы двоичных файлов</H1>
<p>Äëÿ
äâîè÷íûõ ôàéëîâ (òèïû <code><strong>file</strong></code>, <code><strong>file of</strong> T</code>)
<p>Äëÿ äâîè÷íûõ ôàéëîâ <code><strong>file</strong></code>
определены следующие методы:</p>
&nbsp;<table border=0 CELLPADDING=5>
<tr>
<td>
<code><strong>function</strong> FilePos: int64; </code><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò òåêóùóþ ïîçèöèþ ôàéëîâîãî óêàçàòåëÿ â äâîè÷íîì ôàéëå
<code><strong>function</strong> Position: int64; </code><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò èëè
óñòàíàâëèâàåò òåêóùóþ ïîçèöèþ ôàéëîâîãî óêàçàòåëÿ â äâîè÷íîì ôàéëå
</td>
</tr>
<tr>
<td>
<code><strong>function</strong> FileSize: int64; </code><br>
<code><strong>function</strong> Size: int64; </code><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Возвращает количество элементов в двоичном файле</td>
</tr>
<tr>
<td>
<code><strong>procedure</strong> Seek(n: int64); </code><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Устанавливает текущую позицию файлового указателя в двоичном
ôàéëå íà ýëåìåíò ñ íîìåðîì n</td>
ôàéëå íà áàéò ñ íîìåðîì n</td>
</tr>
<tr>
<td>

View file

@ -0,0 +1,44 @@
<html><head>
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
<param name="Keyword" value="Position">
<param name="Keyword" value="Size">
<param name="Keyword" value="Seek">
<param name="Keyword" value="Truncate">
</object>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title></title>
<link rel="StyleSheet" href="../../default.css">
</head>
<body>
<H1>Ìåòîäû òèïèçèðîâàííûõ ôàéëîâ</H1>
<p>Äëÿ
òèïèçèðîâàííûõ ôàéëîâ <code><strong>file of</strong> T</code>
îïðåäåëåíû ñëåäóþùèå ìåòîäû:</p>
&nbsp;<table border=0 CELLPADDING=5>
<tr>
<td>
<code><strong>function</strong> Position: int64; </code><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò òåêóùóþ ïîçèöèþ ôàéëîâîãî óêàçàòåëÿ â
òèïèçèðîâàííîì ôàéëå
</td>
</tr>
<tr>
<td>
<code><strong>function</strong> Size: int64; </code><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò êîëè÷åñòâî ýëåìåíòîâ â
òèïèçèðîâàííîì ôàéëå</td>
</tr>
<tr>
<td>
<code><strong>procedure</strong> Seek(n: int64); </code><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Óñòàíàâëèâàåò òåêóùóþ ïîçèöèþ ôàéëîâîãî óêàçàòåëÿ â
òèïèçèðîâàííîì
ôàéëå íà ýëåìåíò ñ íîìåðîì n</td>
</tr>
<tr>
<td>
<code><strong>procedure</strong> Truncate; </code><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Óñåêàåò òèïèçèðîâàííûé ôàéë, îòáðàñûâàÿ âñå ýëåìåíòû ñ ïîçèöèè
ôàéëîâîãî óêàçàòåëÿ</tr>
</table>
</body></html>

View file

@ -46,9 +46,21 @@
<li>
<a href="../PABCSystemUnit/Files/Subroutines%20for%20binary%20files.html">Ïîäïðîãðàììû äëÿ ðàáîòû ñ äâîè÷íûìè ôàéëàìè</a></li>
<li><a href="../PABCSystemUnit/Files/Functions%20for%20file%20names.html">Ïîäïðîãðàììû äëÿ ðàáîòû ñ èìåíàìè ôàéëîâ</a></li>
<li><a href="../PABCSystemUnit/stand_common_files_methods.html">Îáùèå ìåòîäû
ôàéëîâ</a></li>
<li><a href="../PABCSystemUnit/stand_text_files_methods.html">Ìåòîäû
òåêñòîâûõ ôàéëîâ</a></li>
<li><a href="../PABCSystemUnit/stand_typed_files_methods.html">Ìåòîäû
òèïèçèðîâàííûõ ôàéëîâ</a></li>
<li><a href="../PABCSystemUnit/stand_binary_files_methods.html">Ìåòîäû
äâîè÷íûõ ôàéëîâ</a></li>
<li>
<a href="../PABCSystemUnit/Files/Extension%20methods%20for%20typed%20files.html">
Ìåòîäû ðàñøèðåíèÿ òèïèçèðîâàííûõ ôàéëîâ</a></li>
</ul>
<p>Êðîìå òîãî, â .NET èìååòñÿ ðÿä
классов, связанных с работой с файлами.</p>
êëàññîâ, ñâÿçàííûõ ñ ðàáîòîé ñ ôàéëàìè. Îíè íàõîäÿòñÿ â ïðîñòðàíñòâàõ èìåí
System.Text è System.IO.</p>
</body>
</html>

View file

@ -938,20 +938,32 @@ procedure Randomize;
procedure Randomize(seed: integer);
/// Âîçâðàùàåò ñëó÷àéíîå öåëîå â äèàïàçîíå îò 0 äî maxValue-1
function Random(maxValue: integer): integer;
/// Âîçâðàùàåò ñëó÷àéíîå âåùåñòâåííîå â äèàïàçîíå [0,maxValue)
function Random(maxValue: real): real;
/// Âîçâðàùàåò ñëó÷àéíîå öåëîå â äèàïàçîíå îò a äî b
function Random(a, b: integer): integer;
/// Âîçâðàùàåò ñëó÷àéíîå âåùåñòâåííîå â äèàïàçîíå [a,b)
function Random(a, b: real): real;
/// Âîçâðàùàåò ñëó÷àéíîå âåùåñòâåííîå â äèàïàçîíå [0..1)
function Random: real;
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò 0 äî maxValue-1
function Random2(maxValue: integer): (integer, integer);
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0,maxValue)
function Random2(maxValue: real): (real, real);
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò a äî b
function Random2(a, b: integer): (integer, integer);
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [a,b)
function Random2(a, b: real): (real, real);
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0..1)
function Random2: (real, real);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò 0 äî maxValue-1
function Random3(maxValue: integer): (integer, integer, integer);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0,maxValue)
function Random3(maxValue: real): (real, real, real);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò a äî b
function Random3(a, b: integer): (integer, integer, integer);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [a,b)
function Random3(a, b: real): (real, real, real);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0..1)
function Random3: (real, real, real);
@ -2143,7 +2155,7 @@ end;
// Äîïîëíåíèÿ èþëü 2016: Incremental
///--
{function IncrementalSeq(Self: sequence of integer): sequence of integer;
function IncrementalSeq(Self: sequence of integer): sequence of integer;
begin
var iter := Self.GetEnumerator();
if iter.MoveNext() then
@ -2220,7 +2232,7 @@ end;
function Incremental(Self: LinkedList<real>): sequence of real; extensionmethod;
begin
Result := IncrementalSeq(Self);
end;}
end;
/// Âîçâðàùàåò ïîñëåäîâàòåëüíîñòü ðàçíîñòåé ñîñåäíèõ ýëåìåíòîâ èñõîäíîé ïîñëåäîâàòåëüíîñòè.  êà÷åñòâå ôóíêöèè ðàçíîñòè èñïîëüçóåòñÿ func
function Incremental<T, T1>(Self: sequence of T; func: (T,T)->T1): sequence of T1; extensionmethod;
@ -3939,3 +3951,15 @@ begin
PABCSystem.Write(Self, x);
end;
/// Îòêðûâàåò ñóùåñòâóþùèé òèïèçèðîâàííûé ôàéë
procedure Reset<T>(Self: file of T); extensionmethod;
begin
PABCSystem.Reset(Self);
end;
/// Ñîçäàåò íîâûé èëè îáíóëÿåò ñóùåñòâóþùèé òèïèçèðîâàííûé ôàéë
procedure Rewrite<T>(Self: file of T); extensionmethod;
begin
PABCSystem.Rewrite(Self);
end;

View file

@ -621,20 +621,32 @@ procedure Randomize;
procedure Randomize(seed: integer);
/// Âîçâðàùàåò ñëó÷àéíîå öåëîå â äèàïàçîíå îò 0 äî maxValue-1
function Random(maxValue: integer): integer;
/// Âîçâðàùàåò ñëó÷àéíîå âåùåñòâåííîå â äèàïàçîíå [0,maxValue)
function Random(maxValue: real): real;
/// Âîçâðàùàåò ñëó÷àéíîå öåëîå â äèàïàçîíå îò a äî b
function Random(a, b: integer): integer;
/// Âîçâðàùàåò ñëó÷àéíîå âåùåñòâåííîå â äèàïàçîíå [a,b)
function Random(a, b: real): real;
/// Âîçâðàùàåò ñëó÷àéíîå âåùåñòâåííîå â äèàïàçîíå [0..1)
function Random: real;
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò 0 äî maxValue-1
function Random2(maxValue: integer): (integer, integer);
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0,maxValue)
function Random2(maxValue: real): (real, real);
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò a äî b
function Random2(a, b: integer): (integer, integer);
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [a,b)
function Random2(a, b: real): (real, real);
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0..1)
function Random2: (real, real);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò 0 äî maxValue-1
function Random3(maxValue: integer): (integer, integer, integer);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0,maxValue)
function Random3(maxValue: real): (real, real, real);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò a äî b
function Random3(a, b: integer): (integer, integer, integer);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [a,b)
function Random3(a, b: real): (real, real, real);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0..1)
function Random3: (real, real, real);
///-function Max(a: ÷èñëî, b: ÷èñëî): ÷èñëî;
@ -1565,3 +1577,7 @@ function ReadElements<T>(Self: file of T): sequence of T; extensionmethod;
function ReadElements<T>(fname: string): sequence of T;
/// Çàïèñûâàåò äàííûå â òèïèçèðîâàííûé ôàéë
procedure Write<T>(Self: file of T; params vals: array of T); extensionmethod;
/// Îòêðûâàåò ñóùåñòâóþùèé òèïèçèðîâàííûé ôàéë
procedure Reset<T>(Self: file of T); extensionmethod;
/// Ñîçäàåò íîâûé èëè îáíóëÿåò ñóùåñòâóþùèé òèïèçèðîâàííûé ôàéë
procedure Rewrite<T>(Self: file of T); extensionmethod;

View file

@ -600,20 +600,32 @@ procedure Randomize;
procedure Randomize(seed: integer);
/// Âîçâðàùàåò ñëó÷àéíîå öåëîå â äèàïàçîíå îò 0 äî maxValue-1
function Random(maxValue: integer): integer;
/// Âîçâðàùàåò ñëó÷àéíîå âåùåñòâåííîå â äèàïàçîíå [0,maxValue)
function Random(maxValue: real): real;
/// Âîçâðàùàåò ñëó÷àéíîå öåëîå â äèàïàçîíå îò a äî b
function Random(a, b: integer): integer;
/// Âîçâðàùàåò ñëó÷àéíîå âåùåñòâåííîå â äèàïàçîíå [a,b)
function Random(a, b: real): real;
/// Âîçâðàùàåò ñëó÷àéíîå âåùåñòâåííîå â äèàïàçîíå [0..1)
function Random: real;
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò 0 äî maxValue-1
function Random2(maxValue: integer): (integer, integer);
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0,maxValue)
function Random2(maxValue: real): (real, real);
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò a äî b
function Random2(a, b: integer): (integer, integer);
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [a,b)
function Random2(a, b: real): (real, real);
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0..1)
function Random2: (real, real);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò 0 äî maxValue-1
function Random3(maxValue: integer): (integer, integer, integer);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0,maxValue)
function Random3(maxValue: real): (real, real, real);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò a äî b
function Random3(a, b: integer): (integer, integer, integer);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [a,b)
function Random3(a, b: real): (real, real, real);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0..1)
function Random3: (real, real, real);
///-function Max(a: ÷èñëî, b: ÷èñëî): ÷èñëî;
@ -1528,3 +1540,7 @@ function ReadElements<T>(Self: file of T): sequence of T; extensionmethod;
function ReadElements<T>(fname: string): sequence of T;
/// Çàïèñûâàåò äàííûå â òèïèçèðîâàííûé ôàéë
procedure Write<T>(Self: file of T; params vals: array of T); extensionmethod;
/// Îòêðûâàåò ñóùåñòâóþùèé òèïèçèðîâàííûé ôàéë
procedure Reset<T>(Self: file of T); extensionmethod;
/// Ñîçäàåò íîâûé èëè îáíóëÿåò ñóùåñòâóþùèé òèïèçèðîâàííûé ôàéë
procedure Rewrite<T>(Self: file of T); extensionmethod;

View file

@ -568,20 +568,32 @@ procedure Randomize;
procedure Randomize(seed: integer);
/// Âîçâðàùàåò ñëó÷àéíîå öåëîå â äèàïàçîíå îò 0 äî maxValue-1
function Random(maxValue: integer): integer;
/// Âîçâðàùàåò ñëó÷àéíîå âåùåñòâåííîå â äèàïàçîíå [0,maxValue)
function Random(maxValue: real): real;
/// Âîçâðàùàåò ñëó÷àéíîå öåëîå â äèàïàçîíå îò a äî b
function Random(a, b: integer): integer;
/// Âîçâðàùàåò ñëó÷àéíîå âåùåñòâåííîå â äèàïàçîíå [a,b)
function Random(a, b: real): real;
/// Âîçâðàùàåò ñëó÷àéíîå âåùåñòâåííîå â äèàïàçîíå [0..1)
function Random: real;
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò 0 äî maxValue-1
function Random2(maxValue: integer): (integer, integer);
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0,maxValue)
function Random2(maxValue: real): (real, real);
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò a äî b
function Random2(a, b: integer): (integer, integer);
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [a,b)
function Random2(a, b: real): (real, real);
/// Âîçâðàùàåò êîðòåæ èç äâóõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0..1)
function Random2: (real, real);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò 0 äî maxValue-1
function Random3(maxValue: integer): (integer, integer, integer);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0,maxValue)
function Random3(maxValue: real): (real, real, real);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ öåëûõ â äèàïàçîíå îò a äî b
function Random3(a, b: integer): (integer, integer, integer);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [a,b)
function Random3(a, b: real): (real, real, real);
/// Âîçâðàùàåò êîðòåæ èç òðåõ ñëó÷àéíûõ âåùåñòâåííûõ â äèàïàçîíå [0..1)
function Random3: (real, real, real);
/// Âîçâðàùàåò ìàêñèìàëüíîå èç ÷èñåë a,b
@ -1470,3 +1482,7 @@ function ReadElements<T>(Self: file of T): sequence of T; extensionmethod;
function ReadElements<T>(fname: string): sequence of T;
/// Çàïèñûâàåò äàííûå â òèïèçèðîâàííûé ôàéë
procedure Write<T>(Self: file of T; params vals: array of T); extensionmethod;
/// Îòêðûâàåò ñóùåñòâóþùèé òèïèçèðîâàííûé ôàéë
procedure Reset<T>(Self: file of T); extensionmethod;
/// Ñîçäàåò íîâûé èëè îáíóëÿåò ñóùåñòâóþùèé òèïèçèðîâàííûé ôàéë
procedure Rewrite<T>(Self: file of T); extensionmethod;

View file

@ -862,6 +862,10 @@
<param name="Name" value="&Igrave;&aring;&ograve;&icirc;&auml;&ucirc; &auml;&acirc;&icirc;&egrave;&divide;&iacute;&ucirc;&otilde; &ocirc;&agrave;&eacute;&euml;&icirc;&acirc;">
<param name="Local" value="LangGuide\PABCSystemUnit\stand_binary_files_methods.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="&Igrave;&aring;&ograve;&icirc;&auml;&ucirc; &ograve;&egrave;&iuml;&egrave;&ccedil;&egrave;&eth;&icirc;&acirc;&agrave;&iacute;&iacute;&ucirc;&otilde; &ocirc;&agrave;&eacute;&euml;&icirc;&acirc;">
<param name="Local" value="LangGuide\PABCSystemUnit\stand_typed_files_methods.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="&Igrave;&aring;&ograve;&icirc;&auml;&ucirc; &eth;&agrave;&ntilde;&oslash;&egrave;&eth;&aring;&iacute;&egrave;&yuml; &ograve;&egrave;&iuml;&egrave;&ccedil;&egrave;&eth;&icirc;&acirc;&agrave;&iacute;&iacute;&ucirc;&otilde; &ocirc;&agrave;&eacute;&euml;&icirc;&acirc;">
<param name="Local" value="LangGuide\PABCSystemUnit\Files\Extension methods for typed files.html">

View file

@ -1 +1 @@
!define VERSION '3.4.0.1754'
!define VERSION '3.4.0.1758'

View file

@ -500,28 +500,33 @@ type
ElementSize: int64;
offset: integer;
offsets: array of integer;
function GetFilePos: int64;
public
ElementType: System.Type;
constructor Create(ElementType: System.Type);
constructor Create(ElementType: System.Type; offs: integer; params offsets: array of integer);
function ToString: string; override;
/// Возвращает текущую позицию файлового указателя в типизированном файле
function FilePos: int64;
/// Возвращает количество элементов в типизированном файле
function FileSize: int64;
function Size: int64;
/// Устанавливает текущую позицию файлового указателя в типизированном файле на элемент с номером n
procedure Seek(n: int64);
/// Возвращает или устанавливает текущую позицию файлового указателя в типизированном файле
property Position: int64 read GetFilePos write Seek;
end;
// Class for binary files
///--
BinaryFile = sealed class(AbstractBinaryFile)
private
function GetFilePos: int64;
public
function ToString: string; override;
/// Возвращает текущую позицию файлового указателя в бестиповом файле
function FilePos: int64;
/// Возвращает количество байт в бестиповом файле
function FileSize: int64;
/// Устанавливает текущую позицию файлового указателя в бестиповом файле на байт с номером n
function Size: int64;
/// Устанавливает текущую позицию файлового указателя в бестиповом файле на элемент с номером n
procedure Seek(n: int64);
/// Возвращает или устанавливает текущую позицию файлового указателя в бестиповом файле
property Position: int64 read GetFilePos write Seek;
end;
//{{{doc: Начало секции интерфейса для документации }}}
@ -1253,20 +1258,32 @@ procedure Randomize;
procedure Randomize(seed: integer);
/// Возвращает случайное целое в диапазоне от 0 до maxValue-1
function Random(maxValue: integer): integer;
/// Возвращает случайное вещественное в диапазоне [0,maxValue)
function Random(maxValue: real): real;
/// Возвращает случайное целое в диапазоне от a до b
function Random(a, b: integer): integer;
/// Возвращает случайное вещественное в диапазоне [a,b)
function Random(a, b: real): real;
/// Возвращает случайное вещественное в диапазоне [0..1)
function Random: real;
/// Возвращает кортеж из двух случайных целых в диапазоне от 0 до maxValue-1
function Random2(maxValue: integer): (integer, integer);
/// Возвращает кортеж из двух случайных вещественных в диапазоне [0,maxValue)
function Random2(maxValue: real): (real, real);
/// Возвращает кортеж из двух случайных целых в диапазоне от a до b
function Random2(a, b: integer): (integer, integer);
/// Возвращает кортеж из двух случайных вещественных в диапазоне [a,b)
function Random2(a, b: real): (real, real);
/// Возвращает кортеж из двух случайных вещественных в диапазоне [0..1)
function Random2: (real, real);
/// Возвращает кортеж из трех случайных целых в диапазоне от 0 до maxValue-1
function Random3(maxValue: integer): (integer, integer, integer);
/// Возвращает кортеж из трех случайных вещественных в диапазоне [0,maxValue)
function Random3(maxValue: real): (real, real, real);
/// Возвращает кортеж из трех случайных целых в диапазоне от a до b
function Random3(a, b: integer): (integer, integer, integer);
/// Возвращает кортеж из трех случайных вещественных в диапазоне [a,b)
function Random3(a, b: real): (real, real, real);
/// Возвращает кортеж из трех случайных вещественных в диапазоне [0..1)
function Random3: (real, real, real);
@ -5541,30 +5558,17 @@ end;
// -----------------------------------------------------
// TypedFile & BinaryFile methods
// -----------------------------------------------------
function TypedFile.FilePos: int64;
begin
Result := PABCSystem.FilePos(Self);
end;
function TypedFile.Size: int64 := PABCSystem.FileSize(Self);
function TypedFile.FileSize: int64;
begin
Result := PABCSystem.FileSize(Self);
end;
function TypedFile.GetFilePos: int64 := PABCSystem.FilePos(Self);
function BinaryFile.FilePos: int64;
begin
Result := PABCSystem.FilePos(Self);
end;
procedure TypedFile.Seek(n: int64) := PABCSystem.Seek(Self, n);
function BinaryFile.FileSize: int64;
begin
Result := PABCSystem.FileSize(Self);
end;
function BinaryFile.GetFilePos: int64 := PABCSystem.FilePos(Self);
procedure BinaryFile.Seek(n: int64);
begin
PABCSystem.Seek(Self, n);
end;
function BinaryFile.Size: int64 := PABCSystem.FileSize(Self);
procedure BinaryFile.Seek(n: int64) := PABCSystem.Seek(Self, n);
// -----------------------------------------------------
// Eoln - Eof
@ -7117,18 +7121,34 @@ begin
Result := rnd.Next(a, b + 1);
end;
function Random(a, b: real): real;
begin
if a > b then Swap(a, b);
Result := a + Random()*(b-a);
end;
function Random := rnd.NextDouble;
function Random(MaxValue: real) := Random()*Abs(MaxValue);
function Random2(maxValue: integer) := (Random(maxValue), Random(maxValue));
function Random2(maxValue: real) := (Random(maxValue), Random(maxValue));
function Random2(a, b: integer) := (Random(a, b), Random(a, b));
function Random2(a, b: real) := (Random(a, b), Random(a, b));
function Random2 := (Random, Random);
function Random3(maxValue: integer) := (Random(maxValue), Random(maxValue), Random(maxValue));
function Random3(maxValue: Real) := (Random(maxValue), Random(maxValue), Random(maxValue));
function Random3(a, b: integer) := (Random(a, b), Random(a, b), Random(a, b));
function Random3(a, b: real) := (Random(a, b), Random(a, b), Random(a, b));
function Random3 := (Random, Random, Random);
@ -10724,6 +10744,32 @@ begin
Result := (Self[0], Self[1], Self[2], Self[3], Self[4], Self[5], v);
end;
// Выводит кортеж
procedure Print<T1, T2>(Self: (T1, T2)); extensionmethod := Print(Self);
// Выводит кортеж
procedure Print<T1, T2, T3>(Self: (T1, T2, T3)); extensionmethod := Print(Self);
// Выводит кортеж
procedure Print<T1, T2, T3, T4>(Self: (T1, T2, T3, T4)); extensionmethod := Print(Self);
// Выводит кортеж
procedure Print<T1, T2, T3, T4, T5>(Self: (T1, T2, T3, T4, T5)); extensionmethod := Print(Self);
// Выводит кортеж
procedure Print<T1, T2, T3, T4, T5, T6>(Self: (T1, T2, T3, T4, T5, T6)); extensionmethod := Print(Self);
// Выводит кортеж
procedure Print<T1, T2, T3, T4, T5, T6, T7>(Self: (T1, T2, T3, T4, T5, T6, T7)); extensionmethod := Print(Self);
// Выводит кортеж и переходит на новую строку
procedure Println<T1, T2>(Self: (T1, T2)); extensionmethod := Println(Self);
// Выводит кортеж и переходит на новую строку
procedure Println<T1, T2, T3>(Self: (T1, T2, T3)); extensionmethod := Println(Self);
// Выводит кортеж и переходит на новую строку
procedure Println<T1, T2, T3, T4>(Self: (T1, T2, T3, T4)); extensionmethod := Println(Self);
// Выводит кортеж и переходит на новую строку
procedure Println<T1, T2, T3, T4, T5>(Self: (T1, T2, T3, T4, T5)); extensionmethod := Println(Self);
// Выводит кортеж и переходит на новую строку
procedure Println<T1, T2, T3, T4, T5, T6>(Self: (T1, T2, T3, T4, T5, T6)); extensionmethod := Println(Self);
// Выводит кортеж и переходит на новую строку
procedure Println<T1, T2, T3, T4, T5, T6, T7>(Self: (T1, T2, T3, T4, T5, T6, T7)); extensionmethod := Println(Self);
{// Определяет, есть ли указанный элемент в массиве
function Contains<T>(self: array of T; x: T): boolean; extensionmethod;
begin

View file

@ -5196,7 +5196,7 @@ namespace PascalABCCompiler.TreeConverter
expressions_list ex_list = new expressions_list();
ex_list.AddRange(exprs);
ex_list.remove_at(0);
ffn = convertion_data_and_alghoritms.select_function(ex_list, sil, subloc, syntax_nodes_parameters);
ffn = convertion_data_and_alghoritms.select_function(ex_list, sil, subloc, syntax_nodes_parameters,true);
if (ffn == null)
{
ThrowCompilationError = true;
@ -5422,7 +5422,7 @@ namespace PascalABCCompiler.TreeConverter
skip_first_parameter = false;
sil = tmp_sil;
exprs.remove_at(0);
fn = convertion_data_and_alghoritms.select_function(exprs, sil, subloc, syntax_nodes_parameters);
fn = convertion_data_and_alghoritms.select_function(exprs, sil, subloc, syntax_nodes_parameters,true);
if (fn == null)
{
ThrowCompilationError = true;
@ -5451,7 +5451,7 @@ namespace PascalABCCompiler.TreeConverter
{
sil = tmp_sil;
exprs.remove_at(0);
fn = convertion_data_and_alghoritms.select_function(exprs, sil, subloc, syntax_nodes_parameters);
fn = convertion_data_and_alghoritms.select_function(exprs, sil, subloc, syntax_nodes_parameters,true);
}
else
throw ex;

View file

@ -144,6 +144,7 @@
<KeyWords name = "NonReserved1" bold="false" italic="false" color="Blue">
<Key word = "self" />
<Key word = "result" />
<Key word = "value" />
</KeyWords>
<KeyWords name = "OperatorKeywords" bold="true" italic="false" color="Black">

View file

@ -21,7 +21,8 @@ uses System.Threading;
uses System.Windows.Shapes;
uses System.Windows.Threading;
var CountVisuals := 0;
var
CountVisuals := 0;
{procedure Invoke(d: System.Delegate; params args: array of object);
procedure Invoke(d: ()->());

View file

@ -133,6 +133,18 @@ begin
PABCSystem.Write(Self, x);
end;
/// Открывает существующий типизированный файл
procedure Reset<T>(Self: file of T); extensionmethod;
begin
PABCSystem.Reset(Self);
end;
/// Создает новый или обнуляет существующий типизированный файл
procedure Rewrite<T>(Self: file of T); extensionmethod;
begin
PABCSystem.Rewrite(Self);
end;
//{{{--doc: Конец секции подпрограмм для типизированных файлов для документации }}}

View file

@ -500,28 +500,33 @@ type
ElementSize: int64;
offset: integer;
offsets: array of integer;
function GetFilePos: int64;
public
ElementType: System.Type;
constructor Create(ElementType: System.Type);
constructor Create(ElementType: System.Type; offs: integer; params offsets: array of integer);
function ToString: string; override;
/// Возвращает текущую позицию файлового указателя в типизированном файле
function FilePos: int64;
/// Возвращает количество элементов в типизированном файле
function FileSize: int64;
function Size: int64;
/// Устанавливает текущую позицию файлового указателя в типизированном файле на элемент с номером n
procedure Seek(n: int64);
/// Возвращает или устанавливает текущую позицию файлового указателя в типизированном файле
property Position: int64 read GetFilePos write Seek;
end;
// Class for binary files
///--
BinaryFile = sealed class(AbstractBinaryFile)
private
function GetFilePos: int64;
public
function ToString: string; override;
/// Возвращает текущую позицию файлового указателя в бестиповом файле
function FilePos: int64;
/// Возвращает количество байт в бестиповом файле
function FileSize: int64;
/// Устанавливает текущую позицию файлового указателя в бестиповом файле на байт с номером n
function Size: int64;
/// Устанавливает текущую позицию файлового указателя в бестиповом файле на элемент с номером n
procedure Seek(n: int64);
/// Возвращает или устанавливает текущую позицию файлового указателя в бестиповом файле
property Position: int64 read GetFilePos write Seek;
end;
//{{{doc: Начало секции интерфейса для документации }}}
@ -1253,20 +1258,32 @@ procedure Randomize;
procedure Randomize(seed: integer);
/// Возвращает случайное целое в диапазоне от 0 до maxValue-1
function Random(maxValue: integer): integer;
/// Возвращает случайное вещественное в диапазоне [0,maxValue)
function Random(maxValue: real): real;
/// Возвращает случайное целое в диапазоне от a до b
function Random(a, b: integer): integer;
/// Возвращает случайное вещественное в диапазоне [a,b)
function Random(a, b: real): real;
/// Возвращает случайное вещественное в диапазоне [0..1)
function Random: real;
/// Возвращает кортеж из двух случайных целых в диапазоне от 0 до maxValue-1
function Random2(maxValue: integer): (integer, integer);
/// Возвращает кортеж из двух случайных вещественных в диапазоне [0,maxValue)
function Random2(maxValue: real): (real, real);
/// Возвращает кортеж из двух случайных целых в диапазоне от a до b
function Random2(a, b: integer): (integer, integer);
/// Возвращает кортеж из двух случайных вещественных в диапазоне [a,b)
function Random2(a, b: real): (real, real);
/// Возвращает кортеж из двух случайных вещественных в диапазоне [0..1)
function Random2: (real, real);
/// Возвращает кортеж из трех случайных целых в диапазоне от 0 до maxValue-1
function Random3(maxValue: integer): (integer, integer, integer);
/// Возвращает кортеж из трех случайных вещественных в диапазоне [0,maxValue)
function Random3(maxValue: real): (real, real, real);
/// Возвращает кортеж из трех случайных целых в диапазоне от a до b
function Random3(a, b: integer): (integer, integer, integer);
/// Возвращает кортеж из трех случайных вещественных в диапазоне [a,b)
function Random3(a, b: real): (real, real, real);
/// Возвращает кортеж из трех случайных вещественных в диапазоне [0..1)
function Random3: (real, real, real);
@ -5541,30 +5558,17 @@ end;
// -----------------------------------------------------
// TypedFile & BinaryFile methods
// -----------------------------------------------------
function TypedFile.FilePos: int64;
begin
Result := PABCSystem.FilePos(Self);
end;
function TypedFile.Size: int64 := PABCSystem.FileSize(Self);
function TypedFile.FileSize: int64;
begin
Result := PABCSystem.FileSize(Self);
end;
function TypedFile.GetFilePos: int64 := PABCSystem.FilePos(Self);
function BinaryFile.FilePos: int64;
begin
Result := PABCSystem.FilePos(Self);
end;
procedure TypedFile.Seek(n: int64) := PABCSystem.Seek(Self, n);
function BinaryFile.FileSize: int64;
begin
Result := PABCSystem.FileSize(Self);
end;
function BinaryFile.GetFilePos: int64 := PABCSystem.FilePos(Self);
procedure BinaryFile.Seek(n: int64);
begin
PABCSystem.Seek(Self, n);
end;
function BinaryFile.Size: int64 := PABCSystem.FileSize(Self);
procedure BinaryFile.Seek(n: int64) := PABCSystem.Seek(Self, n);
// -----------------------------------------------------
// Eoln - Eof
@ -7117,18 +7121,34 @@ begin
Result := rnd.Next(a, b + 1);
end;
function Random(a, b: real): real;
begin
if a > b then Swap(a, b);
Result := a + Random()*(b-a);
end;
function Random := rnd.NextDouble;
function Random(MaxValue: real) := Random()*Abs(MaxValue);
function Random2(maxValue: integer) := (Random(maxValue), Random(maxValue));
function Random2(maxValue: real) := (Random(maxValue), Random(maxValue));
function Random2(a, b: integer) := (Random(a, b), Random(a, b));
function Random2(a, b: real) := (Random(a, b), Random(a, b));
function Random2 := (Random, Random);
function Random3(maxValue: integer) := (Random(maxValue), Random(maxValue), Random(maxValue));
function Random3(maxValue: Real) := (Random(maxValue), Random(maxValue), Random(maxValue));
function Random3(a, b: integer) := (Random(a, b), Random(a, b), Random(a, b));
function Random3(a, b: real) := (Random(a, b), Random(a, b), Random(a, b));
function Random3 := (Random, Random, Random);
@ -10724,6 +10744,32 @@ begin
Result := (Self[0], Self[1], Self[2], Self[3], Self[4], Self[5], v);
end;
// Выводит кортеж
procedure Print<T1, T2>(Self: (T1, T2)); extensionmethod := Print(Self);
// Выводит кортеж
procedure Print<T1, T2, T3>(Self: (T1, T2, T3)); extensionmethod := Print(Self);
// Выводит кортеж
procedure Print<T1, T2, T3, T4>(Self: (T1, T2, T3, T4)); extensionmethod := Print(Self);
// Выводит кортеж
procedure Print<T1, T2, T3, T4, T5>(Self: (T1, T2, T3, T4, T5)); extensionmethod := Print(Self);
// Выводит кортеж
procedure Print<T1, T2, T3, T4, T5, T6>(Self: (T1, T2, T3, T4, T5, T6)); extensionmethod := Print(Self);
// Выводит кортеж
procedure Print<T1, T2, T3, T4, T5, T6, T7>(Self: (T1, T2, T3, T4, T5, T6, T7)); extensionmethod := Print(Self);
// Выводит кортеж и переходит на новую строку
procedure Println<T1, T2>(Self: (T1, T2)); extensionmethod := Println(Self);
// Выводит кортеж и переходит на новую строку
procedure Println<T1, T2, T3>(Self: (T1, T2, T3)); extensionmethod := Println(Self);
// Выводит кортеж и переходит на новую строку
procedure Println<T1, T2, T3, T4>(Self: (T1, T2, T3, T4)); extensionmethod := Println(Self);
// Выводит кортеж и переходит на новую строку
procedure Println<T1, T2, T3, T4, T5>(Self: (T1, T2, T3, T4, T5)); extensionmethod := Println(Self);
// Выводит кортеж и переходит на новую строку
procedure Println<T1, T2, T3, T4, T5, T6>(Self: (T1, T2, T3, T4, T5, T6)); extensionmethod := Println(Self);
// Выводит кортеж и переходит на новую строку
procedure Println<T1, T2, T3, T4, T5, T6, T7>(Self: (T1, T2, T3, T4, T5, T6, T7)); extensionmethod := Println(Self);
{// Определяет, есть ли указанный элемент в массиве
function Contains<T>(self: array of T; x: T): boolean; extensionmethod;
begin

View file

@ -86,6 +86,7 @@ type
ObjectsType = class
private
l := new List<ObjectWPF>;
d := new Dictionary<FrameworkElement,ObjectWPF>;
procedure AddP(ob: ObjectWPF);
procedure DeleteP(ob: ObjectWPF);
procedure ToBackP(ob: ObjectWPF);
@ -112,8 +113,9 @@ type
ChildrenWPF := new List<ObjectWPF>;
procedure InitOb(x,y,w,h: real; o: FrameworkElement; SetWH: boolean := True);
public
property X: real read InvokeReal(()->Canvas.GetLeft(can)) write Invoke(procedure->Canvas.SetLeft(can,value));
property Y: real read InvokeReal(()->Canvas.GetTop(can)) write Invoke(procedure->Canvas.SetTop(can,value));
dx,dy: real;
property Left: real read InvokeReal(()->Canvas.GetLeft(can)) write Invoke(procedure->Canvas.SetLeft(can,value));
property Top: real read InvokeReal(()->Canvas.GetTop(can)) write Invoke(procedure->Canvas.SetTop(can,value));
property Width: real read InvokeReal(()->gr.Width) write Invoke(procedure->begin gr.Width := value; ob.Width := value end); virtual;
property Height: real read InvokeReal(()->gr.Height) write Invoke(procedure->begin gr.Height := value; ob.Height := value end); virtual;
property Text: string read InvokeString(()->t.Text) write Invoke(procedure->t.Text := value);
@ -135,6 +137,14 @@ type
procedure AddChildP(ch: ObjectWPF);
procedure DeleteChildP(ch: ObjectWPF);
function GetInternalGeometry: Geometry; virtual := nil;
function GetGeometry: Geometry; virtual;
begin
Result := GetInternalGeometry;
var g := new TransformGroup();
g.Children.Add(r);
g.Children.Add(new TranslateTransform(Left,Top));
Result.Transform := g; // версия
end;
public
property TextAlignment: Alignment write Invoke(WTA,Value);
property FontSize: real read InvokeReal(()->t.FontSize) write Invoke(procedure->t.FontSize := value);
@ -143,12 +153,12 @@ type
read Invoke&<GColor>(()->(t.Foreground as SolidColorBrush).Color)
write Invoke(procedure->t.Foreground := new SolidColorBrush(value));
property Center: Point
read Pnt(X + Width/2,Y + Height/2)
read Pnt(Left + Width/2, Top + Height/2)
write MoveTo(Value.X - Width/2, Value.Y - Height/2);
property LeftTop: Point read Pnt(X,Y);
property LeftBottom: Point read Pnt(X,Y + Height);
property RightTop: Point read Pnt(X + Height,Y);
property RightBottom: Point read Pnt(X + Height,Y + Height);
property LeftTop: Point read Pnt(Left,Top);
property LeftBottom: Point read Pnt(Left,Top + Height);
property RightTop: Point read Pnt(Left + Height,Top);
property RightBottom: Point read Pnt(Left + Height,Top + Height);
property RotateAngle: real read InvokeReal(()->r.Angle) write Invoke(procedure->r.Angle := value);
property RotateCenter: Point
@ -158,28 +168,21 @@ type
read RGB(0,0,0)
write begin end; virtual;
procedure MoveTo(x,y: real) := (Self.X,Self.Y) := (x,y);
procedure MoveTo(x,y: real) := (Self.Left,Self.Top) := (x,y);
procedure MoveForward(r: real);
begin
X := X + r*Cos(Pi/180*(90-RotateAngle));
Y := Y - r*Sin(Pi/180*(90-RotateAngle));
Left := Left + r*Cos(Pi/180*(90-RotateAngle));
Top := Top - r*Sin(Pi/180*(90-RotateAngle));
end;
procedure MoveOn(dx,dy: real) := MoveTo(x+dx,y+dy);
procedure RotateOn(da: real) := RotateAngle += da;
procedure MoveOn(dx,dy: real) := MoveTo(Left+dx,Top+dy);
procedure Move := MoveOn(dx,dy);
procedure Rotate(da: real) := RotateAngle += da;
procedure AddChild(ch: ObjectWPF) := Invoke(AddChildP,ch);
procedure DeleteChild(ch: ObjectWPF) := Invoke(DeleteChildP,ch);
procedure Destroy;
procedure ToFront;
procedure ToBack;
function GetGeometry: Geometry; virtual;
begin
Result := GetInternalGeometry;
var g := new TransformGroup();
g.Children.Add(r);
g.Children.Add(new TranslateTransform(X,Y));
Result.Transform := g; // версия
end;
end;
BoundedObjectWPF = class(ObjectWPF)
@ -212,9 +215,9 @@ type
EllipseWPF = class(BoundedObjectWPF)
private
procedure InitOb2(x,y,w,h: real; c: GColor) := InitOb1(x,y,w,h,c,new Ellipse());
function GetInternalGeometry: Geometry; override := (ob as Shape).RenderedGeometry;
public
constructor (x,y,w,h: real; c: GColor) := Invoke(InitOb2,x,y,w,h,c);
function GetInternalGeometry: Geometry; override := (ob as Shape).RenderedGeometry;
end;
CircleWPF = class(BoundedObjectWPF)
@ -225,10 +228,11 @@ type
procedure Rad(value: real);
begin
//(ob as Ellipse).RenderedGeometry
X -= value - ob.Width/2;
Y -= value - ob.Width/2;
Left -= value - ob.Width/2;
Top -= value - ob.Width/2;
(ob.Width,ob.Height) := (value*2,value*2);
end;
function GetInternalGeometry: Geometry; override := (ob as Shape).RenderedGeometry;
public
constructor (x,y,r: real; c: GColor) := Invoke(InitOb2,x,y,r,c);
constructor (p: Point; r: real; c: GColor) := Invoke(InitOb2,p.x,p.y,r,c);
@ -241,7 +245,6 @@ type
property Radius: real
read InvokeReal(()->ob.Height/2)
write Invoke(Rad,Value);
function GetInternalGeometry: Geometry; override := (ob as Shape).RenderedGeometry;
end;
RectangleWPF = class(BoundedObjectWPF)
@ -251,17 +254,17 @@ type
var rr := new Rectangle();
InitOb1(x,y,w,h,c,rr);
end;
function GetInternalGeometry: Geometry; override := (ob as Shape).RenderedGeometry;
public
constructor (x,y,w,h: real; c: GColor) := Invoke(InitOb2,x,y,w,h,c);
function GetInternalGeometry: Geometry; override := (ob as Shape).RenderedGeometry;
end;
SquareWPF = class(CircleWPF)
private
procedure InitOb2(x,y,w: real; c: GColor) := InitOb1(x,y,w,w,c,new Rectangle());
function GetInternalGeometry: Geometry; override := (ob as Shape).RenderedGeometry;
public
constructor (x,y,w: real; c: GColor) := Invoke(InitOb2,x,y,w,c);
function GetInternalGeometry: Geometry; override := (ob as Shape).RenderedGeometry;
end;
RoundRectWPF = class(BoundedObjectWPF)
@ -272,9 +275,9 @@ type
rr.RadiusY := r;
InitOb1(x,y,w,h,c,rr);
end;
function GetInternalGeometry: Geometry; override := (ob as Shape).RenderedGeometry;
public
constructor (x,y,w,h,r: real; c: GColor) := Invoke(InitOb2,x,y,w,h,r,c);
function GetInternalGeometry: Geometry; override := (ob as Shape).RenderedGeometry;
end;
RoundSquareWPF = class(CircleWPF)
@ -285,9 +288,9 @@ type
rr.RadiusY := r;
InitOb1(x,y,w,w,c,rr);
end;
function GetInternalGeometry: Geometry; override := (ob as Shape).RenderedGeometry;
public
constructor (x,y,w,r: real; c: GColor) := Invoke(InitOb2,x,y,w,r,c);
function GetInternalGeometry: Geometry; override := (ob as Shape).RenderedGeometry;
end;
LineWPF = class(ObjectWPF)
@ -297,14 +300,14 @@ type
begin
var ll := new Line();
InitOb(min(x1,x2),min(y1,y2),abs(x1-x2),abs(y1-y2),ll,False);
ll.X1 := x1-X;
ll.Y1 := y1-Y;
ll.X2 := x2-X;
ll.y2 := y2-Y;
ll.X1 := x1-Left;
ll.Y1 := y1-Top;
ll.X2 := x2-Left;
ll.y2 := y2-Top;
Color := c;
end;
procedure RecalcXW(x1,x2: real) := (x,Width) := (min(x1,x2),abs(x1-x2));
procedure RecalcYH(y1,y2: real) := (y,Height) := (min(y1,y2),abs(y1-y2));
procedure RecalcXW(x1,x2: real) := (Left,Width) := (min(x1,x2),abs(x1-x2));
procedure RecalcYH(y1,y2: real) := (Top,Height) := (min(y1,y2),abs(y1-y2));
procedure ES(value: GColor) := Element.Stroke := new SolidColorBrush(Value);
procedure EST(value: real) := Element.StrokeThickness := Value;
procedure WX1(value: real) := begin
@ -321,8 +324,9 @@ type
(Element.X1,Element.X2) := (0,Width)
else (Element.X1,Element.X2) := (Width,0);
end;
procedure WY1(value: real) := begin Element.Y1 := value - Y; {RecalcWHXY;} end;
procedure WY2(value: real) := begin Element.Y2 := value - Y; {RecalcWHXY;} end;
procedure WY1(value: real) := begin Element.Y1 := value - Top; {RecalcWHXY;} end;
procedure WY2(value: real) := begin Element.Y2 := value - Top; {RecalcWHXY;} end;
function GetInternalGeometry: Geometry; override := (ob as Shape).RenderedGeometry;
public
constructor (x1,y1,x2,y2: real; c: GColor) := Invoke(InitOb2,x1,y1,x2,y2,c);
property Color: GColor
@ -331,12 +335,11 @@ type
property LineWidth: real
read InvokeReal(()->Element.StrokeThickness)
write Invoke(EST,value);
property X1: real read InvokeReal(()->Element.X1 + X) write Invoke(WX1,value);
property X2: real read InvokeReal(()->Element.X2 + X) write Invoke(WX2,value);
property Y1: real read InvokeReal(()->Element.Y1 + Y) write Invoke(WY1,value);
property Y2: real read InvokeReal(()->Element.Y2 + Y) write Invoke(WY2,value);
property X1: real read InvokeReal(()->Element.X1 + Left) write Invoke(WX1,value);
property X2: real read InvokeReal(()->Element.X2 + Left) write Invoke(WX2,value);
property Y1: real read InvokeReal(()->Element.Y1 + Top) write Invoke(WY1,value);
property Y2: real read InvokeReal(()->Element.Y2 + Top) write Invoke(WY2,value);
property P1: Point read Pnt(X1,Y1) write begin X1 := Value.X; Y1 := Value.Y end;
function GetInternalGeometry: Geometry; override := (ob as Shape).RenderedGeometry;
end;
RegularPolygonWPF = class(BoundedObjectWPF)
@ -346,7 +349,7 @@ type
procedure InitOb2(x,y,r: real; n: integer; c: GColor);
begin
InitOb1(x-r,y-r,2*r,2*r,c,CreatePolygon(r,n),false);
(Self.x,Self.y,Self.n) := (x-r,y-r,n);
(Self.Left,Self.Top,Self.n) := (x-r,y-r,n);
end;
function ChangePointCollection(r: real; n: integer): PointCollection;
begin
@ -362,8 +365,8 @@ type
procedure Rad(value: real);
begin
var delta := value - gr.Width/2;
X -= delta;
Y -= delta;
Left -= delta;
Top -= delta;
(gr.Width,gr.Height) := (value*2,value*2);
Element.Points := ChangePointCollection(value,n);
end;
@ -372,6 +375,7 @@ type
n := value;
Element.Points := ChangePointCollection(Radius,value);
end;
function GetInternalGeometry: Geometry; override := new EllipseGeometry(Center,Width/2,Height/2);
public
constructor (x,y,r: real; n: integer; c: GColor) := Invoke(InitOb2,x,y,r,n,c);
constructor (p: Point; r: real; n: integer; c: GColor) := Create(p.X,p.Y,r,n,c);
@ -387,7 +391,6 @@ type
property Count: integer
read InvokeInteger(()->n)
write Invoke(Cnt,Value);
function GetInternalGeometry: Geometry; override := new EllipseGeometry(Center,Width/2,Height/2);
end;
StarWPF = class(RegularPolygonWPF)
@ -396,7 +399,7 @@ type
procedure InitOb2(x,y,r,rint: real; n: integer; c: GColor);
begin
InitOb1(x-r,y-r,2*r,2*r,c,CreatePolygon(r,rint,n),false);
(Self.x,Self.y,Self.rint,Self.n) := (x-r,y-r,rint,n);
(Self.Left,Self.Top,Self.rint,Self.n) := (x-r,y-r,rint,n);
end;
function ChangePointCollection(r,rint: real; n: integer): PointCollection;
begin
@ -413,8 +416,8 @@ type
procedure Rad(value: real);
begin
var delta := value - gr.Width/2;
X -= delta;
Y -= delta;
Left -= delta;
Top -= delta;
(gr.Width,gr.Height) := (value*2,value*2);
Element.Points := ChangePointCollection(value,rint,n);
end;
@ -454,9 +457,7 @@ type
var y1 := pp.Min(p->p.y);
var y2 := pp.Max(p->p.y);
var a := pp.Select(p->Pnt(p.x-x1,p.y-y1)).ToArray;
a.Println;
Println(x1,x2,y1,y2);
InitOb1(x1,x2,x2-x1,y2-y1,c,CreatePolygon(a));
InitOb1(x1,y1,x2-x1,y2-y1,c,CreatePolygon(a));
end;
function CreatePolygon(pp: array of Point): Polygon;
begin
@ -491,10 +492,10 @@ type
var b := CreateBitmapImage(fname);
Rest(x,y,b.Width,b.Height,b);
end;
function GetInternalGeometry: Geometry; override := new RectangleGeometry(Rect(Left,Top,Width,Height));
public
constructor (x,y: real; fname: string) := Invoke(InitOb2,x,y,fname);
constructor (x,y,w,h: real; fname: string) := Invoke(InitOb3,x,y,w,h,fname);
function GetInternalGeometry: Geometry; override := new RectangleGeometry(Rect(X,Y,Width,Height));
end;
/// Главное окно
@ -564,12 +565,14 @@ procedure ObjectsType.AddP(ob: ObjectWPF);
begin
l.Add(ob);
host.Children.Add(ob.can);
d.Add(ob.ob,ob);
end;
procedure ObjectsType.DeleteP(ob: ObjectWPF);
begin
l.Remove(ob);
host.Children.Remove(ob.can);
d.Remove(ob.ob);
end;
procedure ObjectsType.ToBackP(ob: ObjectWPF);
@ -687,27 +690,16 @@ function MyHitTestResult2(res: HitTestResult): HitTestResultBehavior;
begin
var id := (res as GeometryHitTestResult).IntersectionDetail;
Result := HitTestResultBehavior.Stop;
case id of
{IntersectionDetail.FullyContains:
begin
//hitResultsList.Add(res.VisualHit);
Result := HitTestResultBehavior.Continue;
exit;
end; }
IntersectionDetail.Intersects:
IntersectionDetail.FullyContains,
IntersectionDetail.Intersects,
IntersectionDetail.FullyInside:
begin
hitResultsList.Add(res.VisualHit);
Result := HitTestResultBehavior.Continue;
exit;
end;
{IntersectionDetail.FullyInside:
begin
//hitResultsList.Add(res.VisualHit);
Result := HitTestResultBehavior.Continue;
exit;
end;}
end;
end;
Result := HitTestResultBehavior.Stop;
end;
@ -728,13 +720,40 @@ begin
end;
end;
function ObjectsIntersectPL(o: ObjectWPF): List<ObjectWPF>;
begin
hitResultsList.Clear();
VisualTreeHelper.HitTest(host, nil,
MyHitTestResult2,
new GeometryHitTestParameters(o.GetGeometry));
Result := new List<ObjectWPF>;
foreach var a in hitResultsList do
begin
var aa := a as FrameworkElement;
if (aa<>o.ob) and Objects.d.ContainsKey(aa) then
Result.Add(Objects.d[aa])
end;
end;
type ObHelper = auto class
o1,o2: ObjectWPF;
function f: boolean := ObjectsIntersectP(o1,o2);
end;
type OLHelper = auto class
o: ObjectWPF;
function f: List<ObjectWPF> := ObjectsIntersectPL(o);
end;
function ObjectsIntersect(o1,o2: ObjectWPF)
:= Invoke&<boolean>(ObHelper.Create(o1,o2).f);
function IntersectionList(Self: ObjectWPF): List<ObjectWPF>; extensionmethod
:= Invoke&<List<ObjectWPF>>(OLHelper.Create(Self).f);
//---------------------------------------------------------------------------
function GraphWindowTypeGetLeftP: real;

Binary file not shown.