Расшифровка часть 1
1)Модули
Модули предназначены для разбиения текста программы на несколько файлов. В модулях описываются переменные, константы, типы, классы, процедуры и функции. Для того чтобы эти объекты можно было использовать в вызывающем модуле (которым может быть и основная программа), следует указать имя файла модуля (без расширения .pas) в разделе usesвызывающего модуля. Файл модуля должен находиться либо в том же каталоге, что и основная программа, либо в подкаталоге Units системного каталога программы Pascal ABC.
Модуль в Pascal ABC представляет собой файл со следующим содержанием:
unit имя модуля;
раздел подключения модулей
раздел описаний
раздел инициализации
раздел финализации
end.
Первая строка обязательна и называетсязаголовком модуля.
Раздел подключения модулей начинается со служебного слова uses, за которым следует список имен модулей, перечисляемых через запятую.
Раздел описаний может включать разделы описания переменных, констант, типов, процедур и функций, которые следуют друг за другом в произвольном порядке.
Раздел инициализации состоит из служебного слова initialization, после которого следуют операторы, разделяемые символом "точка с запятой". Операторы из раздела инициализации модуля выполняются до начала основной программы.
Раздел финализации состоит из служебного слова finalization, после которого следуют операторы, разделяемые символом "точка с запятой". Операторы из раздела финализации модуля выполняются после окончания основной программы.
Раздел финализации может отсутствовать, либо оба раздела инициализации и финализации могут отсутствовать. Раздел инициализации может также начинаться со служебного слова begin, в этом случае раздел финализации отсутствует.
Например:
unit Lib;
uses GraphABC;
const Dim=5;
var Colors: array[1..Dim] of integer;
function RandomColor: integer;
begin
Result:=RGB(Random(255),Random(255),Random(255));
end;
procedureFillByRandomColor;
var i: integer;
begin
for i:=1 to Dim do
Colors[i]:=RandomColor;
end;
initialization
FillByRandomColor;
end.
Поскольку система Pascal ABC не создает кода на диске, модули являются по-существу аналогом включаемых файлов. В частности, они компилируются всякий раз при компиляции основной программы. Однако, если при компиляции программы один и тот же модуль подключается в нескольких модулях, то этот модуль компилируется лишь раз.
Циклические ссылки в модулях запрещены. Например, ситуация, когда в в модуле a.pas присутствует строка usesb, а в модуле b.pas - строка uses a, считается ошибочной.
∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆
2)Обзор классов и объектов
Класс представляет собой составной тип, состоящий из полей (переменных),методов (процедур и функций) и свойств.
Описание класса имеет вид:
type
имя класса=class
описания полей
объявления или описания методов и описания свойств
end;
После слова class в скобках может быть указано имя класса-предка (см. п.Наследование).
Поля описываются по тем же правилам, что и поля в записях (см. п. Записи). Поля и методы образуют интерфейс класса.
В отличие от Borland Delphi, тела процедур и функций, являющихся методами, могут описываться как внутри, так и вне класса. Описание методов идентично описанию обычных процедур и функций. Объявление метода является заголовком процедуры или функции, которая должна быть описана позднее либо внутри, либо вне тела класса. При описании вне класса имя метода должно предваряться именем класса с последующей точкой.
Например:
type
Student=class
name: string;
course, group: integer;
constructorCreate(nm: string; c,gr: integer);
procedure Print;
begin
writeln('Имя:',name,' курс:',course,' группа:');
end;
procedureNextCourse;
begin
Inc(course);
end;
end;
constructorStudent.Create(nm:string; c,gr: integer);
begin
name:=nm;
course:=c;
group:=g;
end;
Здесь конструктор Create объявлен в классе, а определен вне класса, а методыPrint и NextCourse определены внутри класса. При определении метода вне класса его имя предваряется именем класса с последующей точкой.
Обычно только небольшие методы определяются внутри класса. Это делается для того чтобы интерфейс класса был обозримым.
Объявление метода не может следовать за определением этого же метода.
Экземпляры классов называютсяобъектами. Каждый объект содержит копии всех полей, определенных в его классе, и может пользоваться всеми его методами. Переменная типа класс хранит в действительности указатель на объект. Однако, при обращении к полям, методам или свойствам объекта разыменование такого указателя не требуется; указывается имя объекта и затем, после разделителя-точки, указывается имя поля, метода или свойства:
var s: Student;
...
s.name:='Иванов'; s.course:=1; s.group:=3;
s.Print;
s.GotoNextCourse;
s.Print;
Как и другие указатели, переменная типа класс может хранить значение nil:
s:=nil;
...
if s=nil then ...
Несколько переменных типа класс могут ссылаться на один объект:
var s1,s2: Student;
...
s1.name:=' Петров';
s2:=s1;
writeln(s2.name); // s2.name='Петров'
Локальные определения классов (т.е. определения в процедурах и функциях) запрещены.
В методах, описанных внутри класса запрещены вложенные описания подпрограмм.
∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆
3) Модуль GraphABC
Модуль GraphABC содержит константы, типы, процедуры, функции и классы для рисования в графическом окне. Они подразделяются на следующие группы:
Графические примитивы
Действия с цветом
Действия с пером
Действия с кистью
Действия со шрифтом
Действия с рисунками: описатели
Действия с рисунками: класс Picture
Действия с графическим окном
Задание режимов вывода
Процедуры и функции рисования и установки параметров рисования аналогичны методам и свойствам классаTCanvas в Delphi. Например, вместо свойства Canvas.Brush.Colorиспользуется пара: процедураSetBrushColor(color) и функцияBrushColor.
∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆
4)Модуль Events
Модуль Events предназначен для создания программ, управляемых событиями. Он работает только в паре с модулем GraphABC. При одновременном подключении модулей GraphABC иEvents программа после запуска и выполнения своего основного блокаbegin/end не завершается, а продолжает выполняться, отслеживая возникающие события. Все события связаны с графическим окном: это события, приходящие от мыши, клавиатуры, события изменения размеров графического окна и событие его закрытия. После закрытия графического окна программа завершается.
Каждому событию соответствует свояпроцедурная переменная:
СобытиеПеременнаянажатие мышиOnMouseDownотпускание мышиOnMouseUpперемещение мышиOnMouseMoveнажатие клавишиOnKeyDownотпускание клавишиOnKeyUpнажатие символьной клавишиOnKeyPressизменение размеров графического окнаOnResizeзакрытие графического окнаOnClose
До начала работы программы эти переменные имеют нулевые значения. Чтобы при возникновении некоторого события выполнить определенное действие, необходимо в программе присвоить процедурной переменной конкретную процедуру, выступающую в роли обработчика события. При возникновении одного из перечисленных выше событий проверяется, содержит ли соответствующая процедурная переменная ссылку на процедуру-обработчик, и если да, то данная процедура-обработчик вызывается.
Переменные, соответствующие событиям, описаны в модуле Eventsследующим образом:
var
OnMouseDown, OnMouseUp, OnMouseMove:procedure(x,y,mousebutton: integer);
OnKeyDown, OnKeyUp:procedure (key: integer);
OnKeyPress: procedure(ch: char);
OnResize, OnClose:procedure;
Параметры x и y в обработчикахOnMouseDown, OnMouseUp иOnMouseMove определяют координаты курсора мыши в момент наступления события, параметр mousebutton равен 0, если кнопка мыши не нажата, 1, если нажата левая кнопка мыши, и 2, если нажата правая кнопка мыши. Параметрkey в обработчиках OnKeyDownиOnKeyUp определяет виртуальный код нажатой клавиши. Параметр ch в обработчике OnKeyPress определяет нажатый символ. Если переменная-событие OnKeyPress имеет обработчик, то графическое окно не закрывается по нажатию клавиши Esc.
Например, если определена следующая процедура-обработчик:
procedureMouseDown(x,y,mb: integer);
begin
write(1);
end;
и в основной программе она привязана к соответствующей переменной-событию:
OnMouseDown:=MouseDown;
то всякий раз при щелчке мышью в графическом окне в окно вывода будет выводиться 1.
∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆
5) Модуль Timers
Таймеры позволяют выполнять указанное действие периодически через равные промежутки времени. Процедуры и функции для управления таймерами содержатся в модуле Timers.
Функция CreateTimer(ms,TimerProc) создает таймер, выполняющий каждые ms миллисекунд действие, содержащееся в процедуре без параметров TimerProc, и возвращает его целочисленный описатель. Созданный таймер сразу же запускается.
Функция CreateTimerExt(ms,TimerProcExt) создает таймер, выполняющий каждые ms миллисекунд действие, содержащееся в процедуре с одним целочисленнным параметром TimerProcExt, и возвращает его целочисленный описатель. Созданный таймер сразу же запускается. Целочисленный параметр, передаваемый процедуре TimerProcExt, хранит описатель таймера, вызвавшего эту процедуру.
Процедура StartTimer(n) запускает таймер с описателем n.
Процедура StopTimer(n)останавливает таймер с описателем n.
Процедура SetTimerInterval(n,ms) устанавливает у таймера с описателем n интервал в ms миллисекунд.
Функция TimerInterval(n)возвращает интервал у таймера с описателем n.
Функция TimerEnabled(n)возвращает True, если таймер запущен, и False в противном случае.
Процедура DestroyTimer(n) разрушает таймер с описателем n.
Модуль Timers содержит также класс Timer, имеющий следующий интефейс:
type
Timer=class
constructor Create(ms: integer; TimerProc: procedure);
destructor Destroy;
procedure Start;
procedure Stop;
property Enabled: boolean;
property Interval: integer;
function Handle: integer;
end;
Конструкторы и деструкторы
constructor Create(ms: integer; TimerProc: procedure);
Создает таймер, выполняющий каждые ms миллисекунд действие, содержащееся в процедуре без параметров TimerProc. Созданный таймер сразу же запускается.
constructor Create(ms: integer; TimerProc: procedure);
Создает таймер, выполняющий каждые ms миллисекунд действие, содержащееся в процедуре с одним целочисленнным параметром TimerProc. Созданный таймер сразу же запускается. Целочисленный параметр, передаваемый процедуре TimerProcExt, хранит описатель таймера, вызвавшего эту процедуру.
destructor Destroy;
Разрушает объект и содержащийся в нем таймер.
Свойства
property Enabled: boolean;
Запущен ли таймер. Присваивание Enabled=False эквивалентно вызову Stop, а присваивание Enabled=True - вызову Start.
Методы
procedure Start;
Запускает таймер.
procedure Stop;
Останавливаетает таймер.
function Handle: integer;
Возвращает описатель таймера.
Таймеры удобнее рассматривать как объекты класса Timer, в котором собраны все основные действия с таймерами. Такой подход является более удобным и современным, чем подход с описателями таймеров. Единственный его недостаток - необходимость вводить основные понятия, связанные с классами. Подход с описателями позволяет работать с таймерами сразу после рассмотрения темы "Процедуры и функции".
Пример 1
Вариант с описателем таймера
uses Timers,Events;
procedure TimerProc;
begin
write(1);
end;
var t: integer;
begin
t:=CreateTimer(200,TimerProc);
end.
Вариант с классом Timer
uses Timers,Events;
procedure TimerProc;
begin
write(1);
end;
var t: Timer;
begin
t:=Timer.Create(200,TimerProc);
end.
Для периодического вызова процедуры таймера необходимо после его создания продолжить выполнение приложения. Это можно сделать либо поместив в конце основной программы бесконечный цикл, либо сделав приложение событийным, подключив модуль Events.
Пример 2
Вариант с описателем таймера
uses Timers, Events;
var t1,t2: integer;
procedure TimerProcExt(n: integer);
begin
if n=t1 then
write(1,' ')
else write(2,' ');
end;
begin
t1:=CreateTimerExt(200,TimerProcExt);
t2:=CreateTimerExt(300,TimerProcExt);
end.
Вариант с классом Timer
uses Timers, Events;
var t1,t2: Timer;
procedure TimerProcExt(n: integer);
begin
if n=t1.Handle then
write(1,' ')
else write(2,' ');
end;
begin
t1:=Timer.Create(200,TimerProcExt);
t2:=Timer.Create(300,TimerProcExt);
end.
∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆
Продолжение в следующей главе ∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆
