pascalabcnet/PABCNetHelp/Tutorials/ABCObjects/ABCContainersOverview.html

86 lines
3.8 KiB
HTML

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