ABCObjects: контейнеры графических объектов
Класс ContainerABC
представляет собой контейнер графических
объектов. Он также является потомком ObjectABC
, но при
создании не содержит ни одного объекта. Он добавляет следующий интерфейс:
procedure Add(g: ObjectABC);
property Count: integer; // количество объектов
property Objects[i: integer]: ObjectABC; // i-тый объект
При масштабировании ContainerABC
производится масштабирование
всех входящих в него объектов. При добавлении объекта в ContainerABC
его свойство Owner
становится равным этому ContainerABC
. При
присваивании свойству Owner
объекта его владелец меняется, при этом
объект перерисовывается как принадлежащий новому владельцу. При присваивании
свойству Owner
объекта значения nil
он перестает иметь владельца и
отображается непосредственно в графическом окне.
Рассмотрим следующую программу:
uses ABCObjects,GraphABC;
var
c1,c2: ContainerABC;
r: CircleABC;
begin
SetWindowSize(300,300);
c1 := new ContainerABC(50,30);
c1.Add(new RectangleABC(0,0,200,100,clGreen));
r := new CircleABC(15,15,70,clYellow);
end.
После ее запуска графический экран имеет вид:
Контейнер c1
содержит
зеленый прямоугольник, а объект r не имеет владельца (r.Owner=nil
). Нетрудно убедиться, что ObjectsCount=2
(контейнер
и круг), а c1.Count=1
.
Добавим круг в контейнер, дописав в конец программы строчку
c1.Add(r);
После запуска программы графический экран примет вид:
Круг r
теперь принадлежит
контейнеру (r.Owner=с2
),
ObjectsCount=1
(только контейнер), а
c1.Count=2
. Кроме этого, координаты круга пересчитываются
относительно координат контейнера-владельца (они по-прежнему равны (15,15), но
относительно левого верхнего угла контейнера c1
).
Такой же эффект можно было получить от оператора
r.Owner := c1;
Создадим второй контейнер c2
и поменяем владельца у r
на c2
. Для этого допишем в
конец строки:
c2 := new ContainerABC(50,160);
c2.Add(new RectangleABC(0,0,200,100,clMoneyGreen));
r.Owner := c2;
После запуска программы графический экран примет вид:
Как мы видим, круг r поменял
владельца, и теперь имеет координаты (15,15), но относительно левого верхнего
угла нового владельца c2
.
Если вместо строчки r.Owner:=c2
;
написать r.Owner:=nil
; , то круг
r
потеряет владельца и снова будет позиционироваться
относительно левого верхнего угла экрана: