Реализация классов.
constructor TPset.Create;
begin
{ инициализируем поля экземпляра класса }
X := aX;
Y := aY;
Angle := 0;
Size := 1;
Color := aColor;
end;
destructor TPset.Destroy;
begin
{ сотрем с экрана класс }
Hide;
end;
procedure TPset.Show;
begin
{ нарисуем класс с установленным цветом }
Paint(aColor);
end;
procedure TPset.Hide;
begin
{ нарисуем класс с 0-м цветом (стираем)}
Paint(0);
end;
procedure TPset.Shift;
begin
Hide; {сотрем со старыми координатами}
X:= X + dX;
Y:= Y + dY;
Show; {нарисуем с новыми координатами}
end;
procedure TPset.Paint;
begin
{ рисуем класс}
PutPixel(X,Y,aColor);
end;
procedure TPset.ChangeSize;
begin
Hide; {сотрем со старым размером}
{изменим размер}
if ToLarge
then Size:= Size*2;
else
if Size<>1 then Size:= Size div 2;
Show; {нарисуем с новым размером}
end;
procedure TPset.Rotate;
begin
Hide; {сотрем со старым углом}
Angle:= (Angle+aAngle) mod 360;
Show; {нарисуем с новым углои}
end;
{TCircle}
constructor TCircle.Create;
begin
{инициализируем унаследованные поля}
inherited Create(aX,aY,aColor);
{инициализируем поле по своему усмотрению}
Size:= aSize;
end;
procedure TCircle.Paint;
begin
SetColor(aColor);
Circle(X,Y,Size);
end;
{TRightFigure}
constructor TRightFigure.Create;
begin
{инициализируем унаследованные поля}
inherited Create(aX,aY,aColor);
{инициализируем собсвенные поля}
SumSides:= aSumSides;
end;
procedure TRightFigure.Paint;
var
Xp,Yp: Integer;
Step: Single;
Side: Integer;
const
k = pi/180;
begin
Step:= 360/SumSides;
{ рисуем класс с учетом угла поворота}
SetColor(aColor);
Xp:= round(cos(((SumSides-1)*Step+Angle)*k)*Size+X);
Yp:= round(sin(((SumSides-1)*Step+Angle)*k)*Size+Y);
MoveTo(Xp,Yp);
for Side := 0 to SumSides-1 do begin
Xp := round(cos((Side*Step+Angle)*k)*Size+X);
Yp := round(sin((Side*Step+Angle)*k)*Size+Y);
LineTo(Xp,Yp);
end;
end;
{TSquare}
constructor TSquare.Create;
begin
{инициализируем унаследованные поля}
{aSize - в данном случае размер стороны квадрата}
inherited Create(aX,aY,aColor,Round(aSize*cos(pi/4)),4);
end;
{TTriangle}
constructor TTriangle.Create;
begin
{инициализируем унаследованные поля}
{aSize - в данном случае размер стороны треугольника}
inherited Create (aX, aY, aColor, Round((2/3)*aSize*cos(pi/6)),3);
end;
Далее:
1 - Нужно, чтобы класс понимал, что он выделен и при рисовании неким образом выделял себя, то есть у класса должен быть флаг состояния – выделен/невыделен (Focused).
2 – Метод, рисующий (стирающий) выделение(DrawConers)
3 - Метод установки (снятия) выделения(SetFocus).
4 - Метод, возвращающий координаты для рисования выделения. В данном случае решение простое : все фигуры правильные и есть точка центра, относительно которой рисуются фигуры. Поэтому достаточно написать функцию, возвращающую радиус описанной окружности (GetObjectArea).Для точки радиус положим равным 5. Естественно, как и процедура рисования, так и функция GetObjectArea у каждого класса своя, следовательно, она должна быть виртуальная. Метод будет переопределен лишь в классе Круг, так как все дочерние классы наследуют данный метод.
5 - Поле Next, которое позволит нашим классам соединится в список.
Это все, естественно, нужно реализовать в классе TPset, так как он является базовым.
TPset = object
private { приватные поля методы }