Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП у Фридлянда. МО - 2 курс. Методичка по лабе №1.RTF
Скачиваний:
19
Добавлен:
25.05.2014
Размер:
59.7 Кб
Скачать

Реализация классов.

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 { приватные поля методы }