Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 01.04.2011, 22:41   #1 (permalink)
So What
Новичок
 
Регистрация: 01.04.2011
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Наследование и полиморфизм в Delphi. Необходима помощь.

Помогите, пожалуйста выполнить вот эту задачу:

Реализовать следующие иерархии объектов и заданные методы для них. На примере этих объектов продемонстрировать позднее связывание и полиморфизм:
Точка, окружность, эллипс:
Методы – рисование, стирание, движение, растяжение, сжатие, вращение.

То есть нужно создать программу, которая будет работать с такими объектами, как точка, окружность и эллипс, связанных в иерархию наследованием(выбирается объект, отображается, и его передвигают, растягивают и т п). При этом работа с объектом осуществляется единообразно – с использованием указателя на базовый класс.
So What вне форума   Ответить с цитированием

Старый 01.04.2011, 22:41
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

В данных топиках может находиться важная информация

DELPHI
Необходима помощь с комплектацией
Помощь с Delphi
SQL Delphi
Delphi
Срочно нужна помощь по Delphi не позднее 25.04

Старый 01.04.2011, 22:50   #2 (permalink)
So What
Новичок
 
Регистрация: 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}
So What вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 12:55.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.