pascalabcnet/PABCNetHelp/Tutorials/ABCObjects/ABCContainersOverview.html

86 lines
5.1 KiB
HTML
Raw Normal View History

<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>
<H1>ABCObjects: контейнеры графических объектов</H1>
<p>Класс <code><a href="../../PABCUnits/ABCObjects/gabc_ContainerABC.html">ContainerABC</a></code> представляет собой контейнер графических
объектов. Он также является потомком <code>ObjectABC</code>, но при
создании не содержит ни одного объекта. Он добавляет следующий интерфейс:</p>
<blockquote>
<p><code><b>procedure</b> Add(g: ObjectABC);<br>
<b>property</b> Count: integer; // количество объектов<br>
<b>property</b> Objects[i: integer]: ObjectABC; // i-тый объект</code></p>
</blockquote>
<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>
<blockquote>
<p><code><b>uses</b> ABCObjects,GraphABC;</code></p>
<p><code><b>var</b><br>
&nbsp; c1,c2: ContainerABC;<br>
&nbsp; r: CircleABC;</code></p>
<p><code><b>begin</b><br>
&nbsp; SetWindowSize(300,300);<br>
&nbsp; c1 := <b>new</b> ContainerABC(50,30);<br>
&nbsp; c1.Add(<b>new </b>RectangleABC(0,0,200,100,clGreen));<br>
&nbsp; r := <b>
new </b>CircleABC(15,15,70,clYellow);<br>
<b>end</b>.</code></p>
</blockquote>
<p>После ее запуска графический экран имеет вид:</p>
<p><img border="0" src="images/Cont1.PNG" width="308" height="332"></p>
<p>Контейнер <code>c1</code> содержит
зеленый прямоугольник, а объект r не имеет владельца (<code>r.Owner=nil</code>). Нетрудно убедиться, что <code>ObjectsCount=2</code> (контейнер
и круг), а <code>c1.Count=1</code>.</p>
<p>Добавим круг в контейнер, дописав в конец программы строчку</p>
<blockquote>
<p><code>c1.Add(r);</code></p>
</blockquote>
<p>После запуска программы графический экран примет вид:</p>
<p><img border="0" src="images/Cont2.PNG" width="308" height="332"></p>
<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>
<blockquote>
<p><code>r.Owner := c1;</code></p>
</blockquote>
<p>Создадим второй контейнер <code>c2</code>
и поменяем владельца&nbsp; у <code>r</code>
на <code>c2</code>. Для этого допишем в
конец строки:</p>
<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>
<p>После запуска программы графический экран примет вид:</p>
<p><img border="0" src="images/Cont3.PNG" width="308" height="332"></p>
<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>
<p><img border="0" src="images/Cont4.PNG" width="308" height="332"></p>
</body>
</html>