pascalabcnet/PABCNetHelp/Tutorials/ABCObjects/ABCContainersOverview.html

86 lines
5.1 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>