
- •Занятие 1. Введение Почему именно Delphi?
- •Что мы видим на экране
- •Контрольные вопросы:
- •Занятие 2. Мое первое приложение в Delphi Вывести текст в окне
- •Задания для самостоятельной работы
- •Кнопки. Какие они бывают и зачем они?
- •Задания для самостоятельной работы
- •Поле редактирования
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Занятие 3. Введение в язык программирования Pascal
- •Понятие алгоритма
- •Структура процедуры
- •Правила задания имен языка Pascal
- •Задания для самостоятельной работы
- •Тип данных
- •Числовой тип данных. Целые числа
- •Числовой тип данных. Вещественные числа
- •Описание данных
- •Задания для самостоятельной работы
- •Операции
- •Присвоение значения переменной. Оператор присваивания
- •Задания для самостоятельной работы
- •Задача «Простой калькулятор»
- •Встроенные функции
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Занятие 4. Разветвляющийся алгоритм
- •Логический тип данных
- •Описание данных логического типа
- •Логические выражения
- •Разветвляющийся алгоритм
- •Оператор if
- •Оператор выбора case
- •Задания для самостоятельной работы
- •Списки. Компоненты ListBox и ComboBox
- •Зависимые переключатели. Компоненты RadioButton, RadioGroup
- •Задание для самостоятельной работы
- •Добавление формы к проекту
- •Структура модуля Pascal
- •Как открыть форму
- •Задание для самостоятельной работы
- •Способность форм ссылаться друг на друга
- •Задание для самостоятельной работы
- •Просмотр форм и ассоциированных с ними модулей
- •Основные свойства, методы и события формы
- •Менеджер проектов
- •Опции пpоекта
- •Упpавление пpоектами
- •Компиляция и сборка проекта
- •Выполнение и отладка проекта
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Занятие 6. Начинаем рисовать
- •Рисование линий
- •Задание цвета
- •Рисование фигур
- •Свойства класса tBrush
- •Вывод текста
- •События формы OnPaint и OnResize
- •Задания для самостоятельной работы
- •Занятие 7. Циклы
- •Цикл со счетчиком: for
- •Цикл с предусловием: while
- •Цикл с постусловием: repeat..Until
- •Использование операторов Continue и Break в циклах
- •Задание случайных чисел. Функция Random. Процедура Randomize
- •Вложенные циклы
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Занятие 8. Массивы
- •Одномерные массивы
- •Двумерные массивы
- •Компонент tStringGrid
- •Задание для самостоятельной работы
- •Контрольные вопросы
- •Занятие 9. Строки и символы
- •Символьный тип данных
- •Строковый тип данных
- •Сравнение текстовой информации
- •Функции для работы с текстовой информацией
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Занятие 10. Работа с изображениями
- •Редактор Image Editor
- •Как отобразить рисунок в форме
- •Компонент Timer
- •Как заставить картинку двигаться
- •Случайное движение
- •Задание для самостоятельной работы.
- •Движение по закону
- •Задание для самостоятельной работы
- •Управляемое движение
- •Задание для самостоятельной работы
- •Как совместить разные виды движения
- •Задание для самостоятельной работы
- •Использование мыши
- •Занятие 11. Процедуры и функции
- •Описание и вызов процедуры
- •Описание и вызов функции
- •Где описывать процедуры(функции)
- •Передача параметров по ссылке и по значению
- •Контрольные вопросы
- •Задание для самостоятельной работы
- •Занятие12. Еще про компоненты Еще раз про списки
- •Функция MessageDlg
- •Задание для самостоятельной работы
- •Главное меню приложения. Компонент MainManu
- •Задание для самостоятельной работы
- •Кнопочная панель. Компонент ToolBar
- •Область редактирования. Компонент Memo
- •Контекстное меню. Компонент PopupMenu
- •Диалоговые окна Windows
- •Задание для самостоятельной работы
- •Занятие 13. Объектно-ориентированный подход (ооп) в программировании Основные понятия ооп
- •Основные принципы ооп
- •Тип данных запись (структура)
- •Задание для самостоятельной работы
- •Классы и объекты в Delphi
- •Задание для самостоятельной работы
- •Контрольные вопросы
- •Занятие 14. Работа с файлами
- •Общая технология работы с файлами в Delphi
- •Стандартный подход к работе с файлами
- •Описание файловой переменной
- •Открытие файлов
- •Запись в файл
- •Считывание из файла
- •Закрытие файла
- •Установка новой позиции в файле
- •Текстовые файлы
- •Конец файла
- •Стандартные подпрограммы для работы с файлами и каталогами
- •Пример работы с нетипизированными файлами
- •Пример работы с типизированными файлами
- •Пример работы с текстовыми файлами
- •Объектный подход к работе с файлами
- •Задания для самостоятельной работы
- •Контрольные вопросы
Тип данных запись (структура)
При описании конкретного человека требуется иметь информацию о его фамилии, имени, годе рождения, поле. Для описания, например, книги, необходима информация о названии книги, авторе, годе издания. Для описания таких данных используется специальный тип данных – запись, который также называют комбинированный тип. Тип данных запись позволяет задавать набор разнородных, но логически связанных данных. Данные, входящие в состав записи, называют полями записи.
Пример объявления типа записи 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:='Марс';
Задание для самостоятельной работы
Опишите с помощью типа запись данные о книге: название, автор, год издания, цена. Создайте переменную этого типа и присвойте ей значения.
Опишите с помощью типа запись данные об учащемся: фамилия, имя, отчество, дата рождения, класс, информация о родителях. Создайте переменную этого типа и присвойте ей значение.
Классы и объекты в Delphi
Грубо говоря, классы можно рассматривать как расширение понятия структура. Поля объекта аналогичны полям записи. Отличие между полями записей и классов состоит в том, что поля записи общедоступны, а поля класса могут иметь разные уровни доступа. Наряду с данными, класс содержит методы. Методы это процедуры или функции. Класс позволяет описать объекты. Объект в Delphi состоит из полей, свойств и методов. Свойства объекта это поля, защищенные своими методами, т.е. доступ к свойству осуществляется не напрямую, а только через методы объекта. Свойство в Delphi описывается как поле, плюс два метода. Один метод позволяет писать в поле, а другой метод – позволяет читать из поля. Таким образом, в Delphi реализован принцип инкапсуляции.
Покажем использование классов, объектов и основных принципов объектно-ориентированного программирования на следующем примере. Например, мы хотим изобразить на экране движение планет вокруг Солнца. Внешний вид окна может быть таким:
Перед тем как писать классы их необходимо спроектировать, а затем оформить в виде операторов языка. В данном примере легко просматриваются следующие классы:
Класс «Звезда»;
Класс «Планета».
Причем класс «Планета» является наследником класса «Звезда».
У класса «Звезда» могут быть следующие поля и методы:
-
Поля
Описание
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;