|
Главная | Правила | Регистрация | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
![]() |
|
Опции темы | Опции просмотра |
![]() |
#1 (permalink) |
Новичок
Регистрация: 01.04.2011
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
![]() Реализовать следующие иерархии объектов и заданные методы для них. На примере этих объектов продемонстрировать позднее связывание и полиморфизм: Точка, окружность, эллипс: Методы – рисование, стирание, движение, растяжение, сжатие, вращение. То есть нужно создать программу, которая будет работать с такими объектами, как точка, окружность и эллипс, связанных в иерархию наследованием(выбирается объект, отображается, и его передвигают, растягивают и т п). При этом работа с объектом осуществляется единообразно – с использованием указателя на базовый класс. |
![]() |
![]() |
![]() |
|
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
В данных топиках может находиться важная информация DELPHI Необходима помощь с комплектацией Помощь с Delphi SQL Delphi Delphi Срочно нужна помощь по Delphi не позднее 25.04 |
![]() |
#2 (permalink) |
Новичок
Регистрация: 01.04.2011
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
![]()
Вот например программа для точки окружности и многоугольника.
unit Unit3; // Пользовательская иерархия графических объектов interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus,ExtCtrls; type // Наша декларация точки // Основное - использование массива TForm.Canvas.Pixels[x,y] // TMyPoint = class {Объект} public X,Y: Integer; Visible: Boolean; {свойство - Видимость !!!} Color: TColor; public function GetX: Integer; {Получить координату Х} function GetY: Integer; {Получить координату Х} constructor Create(InitX, InitY: Integer;IColor:TColor); destructor Free;virtual; procedure Show;virtual; {Показать объект на экране} procedure Hide;virtual; {Убрать объект с экрана } function IsVisible: Boolean; {Проверить видимость объекта } procedure MoveTo(NewX, NewY: Integer); { Переместить объект} end;{class} // Наша декларация круга // Основное - использование виртуальных правил в модуле 1 // TCircle = class (TMyPoint) {Объект круг - наследник точки} R: Integer; { Его новое качество - радиус } public constructor Create(InitX, InitY: Integer; InitRadius: Integer;IColor:TColor); destructor Free;override; procedure Show; override; procedure Hide; override; { Новое правило перекроет правило точки !!! } procedure Expand(ExpandBy: Integer); {Правило Расшириться } procedure Contract(ContractBy: Integer); {Правило Сжаться } end; ;{class} // Наша декларация правильного многоугольника // Основное – использование массива TStrings для хранения точек и // корректной перерисовки фигуры при смещении окна TPoligon = class (TCircle) {Объект правильный многоугольник - наследник точки} Points: array of TPoint; NumOfVertex: integer; //число вершин Phi: double; // начальный угол для одной из вершин (1) public constructor Create(InitX, InitY, IR,INum: Integer;IColor:TColor); destructor Free;override; procedure Recalculate; procedure Show;override; { Новое правило перекроет правило точки !!! } procedure Hide;override; { Новое правило перекроет правило точки !!! } procedure Rotate(phi1: double); { Вращать} end;{class} implementation uses unit1; // Реализация класса Point constructor TMyPoint.Create(InitX, InitY: Integer; IColor:TColor); begin X:=InitX; Y:=InitY; Visible := False;{ Первоначально точка невидима } Color:=Icolor; end; {proc} destructor TMyPoint.Free; begin end; {proc} function TMyPoint.GetX: Integer; begin GetX := X; end; {proc} function TMyPoint.GetY: Integer; begin GetY := Y; end; {proc} procedure TMyPoint.Show; begin Visible := True; { Делаем атрибут точки - видимая } with Form1.Canvas do begin { Прорисовываем ее цветом } // Когда "толстая" точка приведет к ошибке? Pixels[X,Y]:=Color; Pixels[X+1,Y]:=Color; Pixels[X-1,Y]:=Color; Pixels[X,Y+1]:=Color; Pixels[X,Y-1]:=Color; end; end; {proc} procedure TMyPoint.Hide; begin Visible := False; { Атрибут точки - невидимая } with Form1.Canvas do begin { Прорисовываем ее цветом фона окна } Pixels[X,Y]:=clBtnFace; Pixels[X+1,Y]:=clBtnFace; Pixels[X-1,Y]:=clBtnFace; Pixels[X,Y+1]:=clBtnFace; Pixels[X,Y-1]:=clBtnFace; end; end; {proc} function TMyPoint.IsVisible: Boolean; begin IsVisible := Visible; end; {proc} procedure TMyPoint.MoveTo(NewX, NewY: Integer); begin Hide; { Спрятать объект. Заметьте, что это верно и для потомков!} X := NewX; Y := NewY; Show; { Показать объект. Заметьте, что это верно и для потомков!} end; {proc} //Реализация методов объекта Circle: constructor TCircle.Create(InitX, InitY: Integer; InitRadius: Integer;IColor:TColor); begin inherited Create(InitX, InitY,IColor); { Вызвать конструктор родителя } R := InitRadius; { Установить начальный радиус } end; {proc} destructor TCircle.Free; begin inherited Free; end; {proc} procedure TCircle.Show; var tmpcolor:TColor; begin tmpColor:=Form1.Canvas.Pen.Color; Form1.Canvas.Pen.Color:=Color; Form1.Canvas.Ellipse(X-(R div 2),Y-(R div 2),X+(R div 2),Y+(R div 2)); Form1.Canvas.Pen.Color:=tmpColor; Visible := True; { Атрибут объекта - видимый } end; {proc} procedure TCircle.Hide; var TmpColor: TColor; begin tmpColor:=Form1.Canvas.Pen.Color; Form1.Canvas.Pen.Color:=clBtnFace; Form1.Canvas.Ellipse(X-(R div 2),Y-(R div 2),X+(R div 2),Y+(R div 2)); Form1.Canvas.Pen.Color:=tmpColor; Visible := False; { Атрибут объекта - невидимый } end; {proc} procedure TCircle.Expand(ExpandBy: Integer); begin Hide; { Спрятать объект } R := R + ExpandBy; { Увеличить радиус } if R < 0 then R := 0; Show; { Прорисовать с новым радиусом} end; {proc} procedure TCircle.Contract(ContractBy: Integer); begin Expand(-ContractBy); { Использовать расширение со знаком минус } end; {proc} //Реализация методов объекта Poligon constructor TPoligon.Create(InitX, InitY, IR,INum: Integer;IColor:TColor); var i:integer; begin { Вызвать конструктор родителя, черный круг} inherited Create(InitX, InitY,IR, clBlack); NumofVertex:=INum; // число вершин Phi:=0; // начальный угол SetLength(Points, NumofVertex); //установить размер массива Recalculate; end; {proc} destructor TPoligon.Free; begin inherited Free; Points:=nil; end; {proc} procedure TPoligon.Recalculate; // Пересчет координат вершин var i:integer; begin for i:=0 to NumofVertex do begin Points[i].X:=trunc(X+R*Cos(phi+i*2*Pi/NumofVertex)); Points[i].Y:=trunc(Y+R*Sin(phi+i*2*Pi/NumofVertex)); end; end; {proc} procedure TPoligon.Show; var tmpcolor:TColor; i:integer; begin Recalculate; tmpColor:=Form1.Canvas.Pen.Color; Form1.Canvas.Pen.Color:=Color; Form1.Canvas.MoveTo(Points[0].x,Points[0].Y); for i:=Low(Points)+1 to High(Points) do begin Form1.Canvas.LineTo(Points[i].x,Points[i].Y); end; Form1.Canvas.LineTo(Points[0].x,Points[0].Y); Form1.Canvas.Pen.Color:=tmpColor; Visible := True; { Атрибут объекта - видимый } end; {proc} procedure TPoligon.Hide; var TmpColor: TColor; i:integer; begin Recalculate; tmpColor:=Form1.Canvas.Pen.Color; Form1.Canvas.Pen.Color:=clBtnFace; Form1.Canvas.MoveTo(Points[0].x,Points[0].Y); for i:=Low(Points)+1 to High(Points) do begin Form1.Canvas.LineTo(Points[i].x,Points[i].Y); end; Form1.Canvas.LineTo(Points[0].x,Points[0].Y); Form1.Canvas.Pen.Color:=tmpColor; Visible := False; {Атрибут объекта - невидимый} end; {proc} procedure TPoligon.Rotate(phi1:double); begin Hide; {Спрятать объект} phi:=phi+phi1; Show; {Прорисовать с новым радиусом} end; {proc} end. {Unit3} |
![]() |
![]() |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
![]() |
Опции темы | |
Опции просмотра | |
|
|