2018-08-02 22:04:49 +03:00
|
|
|
|
<html>
|
|
|
|
|
|
|
|
|
|
|
|
<head>
|
|
|
|
|
|
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
|
|
|
|
|
<param name="Keyword" value="">
|
|
|
|
|
|
</object>
|
|
|
|
|
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
|
|
|
|
|
<title></title>
|
|
|
|
|
|
<link rel="StyleSheet" href="../../default.css">
|
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
|
|
<body>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<H1>ABCObjects: контейнеры графических объектов</H1>
|
|
|
|
|
|
<p>Класс <code><a href="../../PABCUnits/ABCObjects/gabc_ContainerABC.html">ContainerABC</a></code> представляет собой контейнер графических
|
|
|
|
|
|
объектов. Он также является потомком <code>ObjectABC</code>, но при
|
|
|
|
|
|
создании не содержит ни одного объекта. Он добавляет следующий интерфейс:</p>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<blockquote>
|
|
|
|
|
|
<p><code><b>procedure</b> Add(g: ObjectABC);<br>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<b>property</b> Count: integer; // количество объектов<br>
|
|
|
|
|
|
<b>property</b> Objects[i: integer]: ObjectABC; // i-тый объект</code></p>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
</blockquote>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>При масштабировании <code>ContainerABC</code> производится масштабирование
|
|
|
|
|
|
всех входящих в него объектов. При добавлении объекта в <code>ContainerABC</code>
|
|
|
|
|
|
его свойство <code>Owner</code> становится равным этому <code>ContainerABC</code>. При
|
|
|
|
|
|
присваивании свойству <code>Owner</code> объекта его владелец меняется, при этом
|
|
|
|
|
|
объект перерисовывается как принадлежащий новому владельцу. При присваивании
|
|
|
|
|
|
свойству <code>Owner</code> объекта значения <b><code>nil</code></b> он перестает иметь владельца и
|
|
|
|
|
|
отображается непосредственно в графическом окне.</p>
|
|
|
|
|
|
<p>Рассмотрим следующую программу:</p>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<blockquote>
|
|
|
|
|
|
<p><code><b>uses</b> ABCObjects,GraphABC;</code></p>
|
|
|
|
|
|
<p><code><b>var</b><br>
|
|
|
|
|
|
c1,c2: ContainerABC;<br>
|
|
|
|
|
|
r: CircleABC;</code></p>
|
|
|
|
|
|
<p><code><b>begin</b><br>
|
|
|
|
|
|
SetWindowSize(300,300);<br>
|
|
|
|
|
|
c1 := <b>new</b> ContainerABC(50,30);<br>
|
|
|
|
|
|
c1.Add(<b>new </b>RectangleABC(0,0,200,100,clGreen));<br>
|
|
|
|
|
|
r := <b>
|
|
|
|
|
|
new </b>CircleABC(15,15,70,clYellow);<br>
|
|
|
|
|
|
<b>end</b>.</code></p>
|
|
|
|
|
|
</blockquote>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>После ее запуска графический экран имеет вид:</p>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<p><img border="0" src="images/Cont1.PNG" width="308" height="332"></p>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Контейнер <code>c1</code> содержит
|
|
|
|
|
|
зеленый прямоугольник, а объект r не имеет владельца (<code>r.Owner=nil</code>). Нетрудно убедиться, что <code>ObjectsCount=2</code> (контейнер
|
|
|
|
|
|
и круг), а <code>c1.Count=1</code>.</p>
|
|
|
|
|
|
<p>Добавим круг в контейнер, дописав в конец программы строчку</p>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<blockquote>
|
|
|
|
|
|
<p><code>c1.Add(r);</code></p>
|
|
|
|
|
|
</blockquote>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>После запуска программы графический экран примет вид:</p>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<p><img border="0" src="images/Cont2.PNG" width="308" height="332"></p>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Круг <code>r</code> теперь принадлежит
|
|
|
|
|
|
контейнеру (<code>r.Owner=с2</code>), <code>
|
|
|
|
|
|
ObjectsCount=1</code> (только контейнер), а <code>
|
|
|
|
|
|
c1.Count=2</code>. Кроме этого, координаты круга пересчитываются
|
|
|
|
|
|
относительно координат контейнера-владельца (они по-прежнему равны (15,15), но
|
|
|
|
|
|
относительно левого верхнего угла контейнера <code>c1</code>).</p>
|
|
|
|
|
|
<p>Такой же эффект можно было получить от оператора</p>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<blockquote>
|
|
|
|
|
|
<p><code>r.Owner := c1;</code></p>
|
|
|
|
|
|
</blockquote>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Создадим второй контейнер <code>c2</code>
|
|
|
|
|
|
и поменяем владельца у <code>r</code>
|
|
|
|
|
|
на <code>c2</code>. Для этого допишем в
|
|
|
|
|
|
конец строки:</p>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<blockquote>
|
|
|
|
|
|
<p><code>c2 := <b>new</b>
|
|
|
|
|
|
ContainerABC(50,160);<br>
|
|
|
|
|
|
c2.Add(<b>new</b> RectangleABC(0,0,200,100,clMoneyGreen));<br>
|
|
|
|
|
|
r.Owner := c2;</code></p>
|
|
|
|
|
|
</blockquote>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>После запуска программы графический экран примет вид:</p>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<p><img border="0" src="images/Cont3.PNG" width="308" height="332"></p>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Как мы видим, круг r поменял
|
|
|
|
|
|
владельца, и теперь имеет координаты (15,15), но относительно левого верхнего
|
|
|
|
|
|
угла нового владельца <code>c2</code>.</p>
|
|
|
|
|
|
<p>Если вместо строчки <code>r.Owner:=c2</code>;
|
|
|
|
|
|
написать <code>r.Owner:=<b>nil</b></code>; , то круг
|
|
|
|
|
|
<code>r</code> потеряет владельца и снова будет позиционироваться
|
|
|
|
|
|
относительно левого верхнего угла экрана:</p>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<p><img border="0" src="images/Cont4.PNG" width="308" height="332"></p>
|
|
|
|
|
|
</body>
|
|
|
|
|
|
|
|
|
|
|
|
</html>
|