Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Delphi.Начало.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.56 Mб
Скачать

Тип данных запись (структура)

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

Пример объявления типа записи Planet, который описывает данные о планете:

type

Planet = record

Name:string; {название планеты}

x, y:integer; {экранные координаты планеты}

clr:TСolor; {цвет планеты}

rad:integer; {радиус планеты }

end;

Где ключевое слово type задает описание нового типа.

Planet – имя типа;

Name, x,y, clr, rad - это поля типа, каждое из которых описывается со своим типом.

Следующее объявление задает две переменных типа Planet – Earth(Земля) и Mars(Марс).

var

Earth, Mars: Planet;

Доступ к элементам (полям) записи осуществляется с помощью конструкции, называемой "селектор записи", и имеющей следующий общий вид:

R.F

где R – переменная комбинированного типа (запись), F - имя поля.

Пример:

Earth.Name:='Земля';

Mars.Name:='Марс';

Задание для самостоятельной работы

  1. Опишите с помощью типа запись данные о книге: название, автор, год издания, цена. Создайте переменную этого типа и присвойте ей значения.

  2. Опишите с помощью типа запись данные об учащемся: фамилия, имя, отчество, дата рождения, класс, информация о родителях. Создайте переменную этого типа и присвойте ей значение.

Классы и объекты в Delphi

Грубо говоря, классы можно рассматривать как расширение понятия структура. Поля объекта аналогичны полям записи. Отличие между полями записей и классов состоит в том, что поля записи общедоступны, а поля класса могут иметь разные уровни доступа. Наряду с дан­ными, класс содержит методы. Методы это процедуры или функции. Класс позволяет описать объекты. Объект в Delphi состоит из полей, свойств и методов. Свойства объекта это поля, защищенные своими методами, т.е. доступ к свойству осуществляется не напрямую, а только через методы объекта. Свойство в Delphi описывается как поле, плюс два метода. Один метод позволяет писать в поле, а другой метод – позволяет читать из поля. Таким образом, в Delphi реализован принцип инкапсуляции.

Покажем использование классов, объектов и основных принципов объектно-ориен­тированного программи­рования на следующем примере. Например, мы хотим изобра­зить на экране движение планет вокруг Солнца. Внешний вид окна может быть таким:

Перед тем как писать классы их необходимо спроектировать, а затем оформить в виде операторов языка. В данном примере легко просматриваются следующие классы:

  1. Класс «Звезда»;

  2. Класс «Планета».

Причем класс «Планета» является наследником класса «Звезда».

У класса «Звезда» могут быть следующие поля и методы:

Поля

Описание

X,Y

Экранные координаты

CLR

Цвет звезды

RP

Радиус звезды

Метод

Описание

DRAW

Нарисовать звезду

CLEAN

Стереть звезду

MOVE

Переместить звезду

Для рисования звезды на экране необходим метод Draw, который, используя экранные координаты звезды, рисует ее в нужном месте. Если звезда, находясь в центре экрана, будет неподвижна, тогда зачем же нам методы Clean и Move, которые используются для создания иллюзии движения объекта? Дело в том, что мы будем проектировать класс «Звезда» так, чтобы можно было от него создать наследника, класс «Планета», который унаследует все поля, свойства и методы предка, добавит новые поля и свойства, а некоторые методы предка будут переопределены в потомке. Т.е. методы Clean и Move только объявляются в классе «Звезда», а реализацию они получат в потомке, т.е. будут переопределены, в классе «Планета».

У класса «Звезда» будет только один экземпляр – это «Солнце».

Перейдем к проектированию класса «Планета». Так как класс «Планета» является наследником класса «Звезда», он наследует все поля и свойства у предка и добавляет свои поля и свойства. В таблице показаны поля класса «Планета», которые будут добавлены:

Поля

Описание

RORB

Радиус орбиты планеты при движении вокруг звезды

D_UG

Угол поворота планеты при движении по орбите, фактически скорость движения планеты по орбите

UGOL

Задает начальный угол

K

Коэффициент растяжения орбиты по оси X

Заголовки методов у класса «Планета» те же, что и у класса «Звезда». Но метод Draw будет переопределен в классе «Планета», а методы Clean и Move должны получить реализацию.

У класса «Планета» может быть несколько экземпляров: «Земля», «Марс», «Юпитер» и др.

После проектирования можно описать классы с помощью операторов языка. Классы можно описать либо в секции interface, либо на верхнем уровне секции реализации (implementation). Например, класс «Звезда» может иметь следующее описание:

type

TStar = class(TObject)

private

x,y:integer;

col:TColor; // цвет

rp:integer; // радиус планеты

public

constructor Create(x1,y1:integer; col1:TColor; rp1:integer);

procedure draw; virtual;

procedure move; virtual; abstract;

procedure clean; virtual; abstract;

end;

Где ключевое слово type – задает описание класса. TStar – это имя класса. В Delphi имя класса принято начинать с буквы T, что означает type. Ключевое слово class – говорит о том, что описываемый тип – это класс. В скобках задается имя класса, от которого наследуется данный класс. В Delphi все классы являются наследниками класса TObject. Поэтому записи TStar = class(TObject) и TStar = class – равнозначны.

Ключевое слово private – задает скрытые части класса. Доступ к скрытым частям возможен только в рамках данной программной единицы, т.е. того модуля, где содержится описанный класс.

Все методы класса описаны как public(общедоступные), т.е. видимые другими классами.

Ключевое слово virtual, которое используется при описании методов, говорит о том, что данный метод является виртуальным, т.е. этот метод получит другую реализацию у потомков.

Ключевое слово abstract, которое задается при описании методов Clean и Move, говорит о том, что данный метод является абстрактным, т.е. он только объявлен, но не имеет реализации, реализация появится у потомков.

Метод класса Constructor позволяет создать экземпляр класса, т.е. объект, и заполнить значениями его поля. На вход методу поступают значения, которые должны быть присвоены его полям.

Класс «Планета» может иметь следующее описание:

TPlanet=class(TStar)

private

rorb:integer; // радиус орбиты

d_ug:real; // угол поворота

ugol:real; // начальный угол

k:real; // коэффициент растяжения по X

public

constructor CreatePlanet(x1,y1:integer; col1:TColor; rp1:integer;

rorb1:integer; d_ug1,ugol1,k1:real);

procedure clean; override;

procedure draw;override;

procedure move;override;

end;

В части private описываются скрытые части класса – поля, которые добавляются у потомка. В части public описываются общедоступные части класса. Метод CreatePlanet – это конструктор, который позволяет создать экземпляр класса и присвоить начальные значения его полям. Остальные методы описываются с ключевым словом override, которое говорит о том, что данные методы переопределяются в потомке, т.е. получают другую реализацию.

Обратите внимание, при описании классов описываются только заголовки методов. Необходимо еще для каждого метода написать реализацию. Реализация методов задается в части implementation модуля.

Для класса TStar реализация методов имеет следующий вид:

// Конструктор

constructor TStar.Create(x1,y1:integer; col1:TColor; rp1:integer);

begin

x:=x1;

y:=y1;

col:=col1;

rp:=rp1;

end;

// Метод Draw

procedure TStar.Draw;

begin

with form1.canvas do

begin

pen.color:=clBlack;

brush.Color:=col;

ellipse(x-rp,y-rp,x+rp,y+rp);

end;

end;

Для класса TPlanet реализация методов может иметь следующий вид:

// Конструктор

constructor TPlanet.CreatePlanet(x1,y1:integer; col1:TColor; rp1:integer;

rorb1:integer; d_ug1,ugol1,k1:real);

begin

x:=x1; y:=y1; col:=col1; rp:=rp1; rorb:=rorb1; d_ug:=d_ug1; ugol:=ugol1;

k:=k1;

end;

// Метод Draw

procedure TPlanet.draw;

begin

with form1.canvas do

begin

pen.color:=clBlack;

brush.Color:=col;

ellipse(x-rp,y-rp,x+rp,y+rp);

end;

end;

// Метод Clean

procedure TPlanet.clean;

begin

with form1.Canvas do

begin

pen.color:=fon;

brush.Color:=fon;

ellipse(x-rp,y-rp,x+rp,y+rp);

end;

end;

// Метод Move

procedure TPlanet.move;

var x0,y0:integer;

begin

ugol:=ugol+d_ug;

x0:=Form1.width div 2;

y0:=Form1.height div 2;

x:=x0+round(k*rorb*cos(ugol));

y:=y0-round(rorb*sin(ugol));

end;

После описания классов необходимо объявить переменные классов TStar и TPlanet. Это можно сделать либо в секции interface, либо на верхнем уровне секции реализации:

var

Sun:TStar; // переменная-указатель на объект класса TStar

Earth, Mars : TPlanet; // переменные-указатели на объекты класса TPlanet.

Переменная-указатель будет содержать адрес объекта, она только указывает на объект, но объекта еще нет, его нужно создать. Для создания объектов можно использовать событие формы OnCreate. Объекты создаются с помощью конструкторов и для свойств объектов назначаются начальные значения. Обработчик события OnCreate формы может иметь следующий вид:

procedure TForm1.FormCreate(Sender: TObject);

var x1,y1:integer;

begin

randomize;

x1:=Form1.Width div 2;

y1:=Form1.Height div 2;

// Создание объекта класса TStar

Sun:=TStar.Create(x1,y1,clYellow,10);

// Создание объекта Earth

x1:=Form1.Width div 2+round(1.3*20);

y1:=Form1.Height div 2;

Earth:=TPlanet.CreatePlanet(x1,y1,clBlue,5,20, 2*pi/100, 0,1.3);

// Создание объекта Mars

x1:=Form1.Width div 2+round(1.3*60);

y1:=Form1.Height div 2+round(60);

Mars:=TPlanet.CreatePlanet(x1,y1,clRed,3,60,2*pi/70,2,1.3);

end;

Для организации движения поместим в область формы компонент Timer1:TTimer. На событие OnTimer этого компонента напишем обработчик:

procedure TForm1.Timer1Timer(Sender: TObject);

begin

// рисуем планеты в движении

with Earth do begin

clean;

move;

draw;

end;

with Mars do begin

clean;

move;

draw;

end;

end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]