Лекция 2.3. Особенности программирования в Delphi (Object Pascal)
В данной теме вы познакомитесь с теми элементами языка Object Pascal, с которыми обязательно приходится сталкиваться при работе в среде Delphi.
Модули
Во многих языках и средствах разработки приложений используются модули, фактически они представляют собой библиотеки подпрограмм, которые можно подключать к различным создаваемым программам.
Все что реализовано в модуле, можно использовать в программе так, словно все это описано в самой программе. Использование модулей позволяет решить некоторые проблемы, возникающие в процессе разработки программ:1. Объединение логически связанных типов данных, переменных, процедур и функций.
2. Повторное использование кода.
3. Сокрытие деталей реализации кода.
4. Преодоление барьера сложности при разработке больших программ.
Для использования модуля в программе достаточно объявить его в разделе uses программы. Модули Object Pascal имеют следующую структуру:
unit Имя_модуля; // заголовок
interface // раздел интерфейса
uses Unit1, Unit2;
const Const1 = Value1; Const2 = Value2;
type Type1=Type_Def1;
var Id1: Type1; Id2: Type_Def2;
procedure Proc1;
function Func1: Type1;
implementation // блок реализации
uses Unit3, Unit4;
const Const3 = Value3;
type Type2=Type_Def2;
var Id3: Type4; Id2: Type_Def1;
procedure Proc1;
begin
…
end;
function Func1: Type1;
begin
…
end;
procedure Proc2;
begin
…
end;
initialization // блок инициализации
statement1;
statement2;
finalization // блок завершения
statements;
statement4;
end.
Таким образом, модуль состоит из 5 основных разделов:
1. unit – заголовок модуля. Определяет имя модуля, которое должно совпадать с именем файла (обязательный раздел).
2. interface – раздел интерфейса. Содержит объявления доступные всем программам или модулям, использующим данный модуль.
Функции и процедуры данного раздела представлены только своими заголовками.3. implementation – раздел реализации. Объявления данного раздела принадлежат только модулю и недоступны использующим его программам и модулям, кроме того, для функций и процедур обязательно приводится их реализация (код).
4. initialization – раздел инициализации. Содержит код, который будет выполнен только один раз, при запуске программы использующей модуль (необязательный раздел).
5. finalization – раздел завершения. Содержит код, который будет выполнен только один раз, перед завершением программы использующей модуль (необязательный раздел, который может присутствовать, только если имеется раздел initialization).
Указатели
Указатель представляет собой четырехбайтную переменную, указывающую на область памяти в которой расположены какие-либо структуры. Значения указателей определяются только в процессе выполнения программы.
Указатели позволяют решать следующие задачи:
· Динамическое выделение ресурсов памяти, например, дает возможность использовать столько ресурсов памяти, сколько необходимо приложению в данный момент времени.
· Экономия вычислительных ресурсов, например, передача не самих данных, а их адреса, что позволяет избежать дублирования данных и исключает необходимость их копирования.
Указатели могут ссылаться на любые данные. Различают указатели:
· типизированные – ссылка на данные определенного типа (значок ^ перед типом), размер выделяемой области памяти определяется типом данных;
· нетипизированные – ссылка на данные любого типа (сама ссылка будет иметь тип Pointer), размер выделяемой области памяти определяется программистом.
Как и все переменные, указатели располагаются в области данных программы, но могут ссылаться на любую область памяти, что позволяет программе использовать всю доступную память системы.
Пример описания указателей:
var P1: Pointer; // нетипизированный указатель
P2: ^Integer; // типизированный указатель на переменную
// типа Integer
P3: Integer; // обычная переменная тип Integer
Рисунок 2.3.1 - Принципиальная схема использования указателей
На рисунке 2.3.1, синим - обозначены переменные типа Integer, красным – «нетипизированная» область памяти.
Для выполнения операций над данными, на которые ссылаются указатели, необходимо, после имени переменной-указателя поставить значок разыменовывания ^, например, присвоить значение динамической переменной типа Integer можно так: P2^:= 10.
Указателю можно присваивать пустое значение – nil, это означает, что он ни на что не ссылается, например, P1:= nil (обратите внимание, что значение присваивается самому указателю, а не данным и знак разыменовывания не используется).
Область памяти под динамические переменные не выделяется автоматически, ее надо выделить, после использования область памяти необходимо освободить. Для выделения области памяти под «нетипизированные» данные используют оператор GetMem, а для высвобождения FreeMem.
Для выделения области памяти под типизированные переменные используют оператор New, а для высвобождения Dispose.
Пример выделения и высвобождения областей памяти под динамические переменные:
begin
GetMem(P1, 7); // выделяем 7 бай памяти
// здесь можно использовать память через указатель Р1
FreeMem(P1);
// здесь использовать область памяти через P1 нельзя
…
New(P2);
// можно использовать переменную Integer через указатель Р2
Р2^:= P2^ + 100; // добавление к переменной указателя
…
Dispose(P2);
// здесь использовать область памяти через P2 нельзя
P2:= nil; // «официально» заявляем что указатель пуст
P3:= P3 + 100; // добавление к переменной без использования
// указателя
end;
Обработка исключительных ситуаций
Исключительная ситуация – это событие, прерывающее нормальное выполнение программы (ошибка). В языке Object Pascal существуют специальные средства для обработки исключительных ситуаций. Исключительные ситуации, возникающие во время выполнения программы, описываются с помощью специального объектного типа Exception. На базе этого типа определен ряд дочерних классов, для наиболее распространенных исключительных ситуаций. Имена классов-потомков Exception принято начинать с буквы «Е».
В Object Pascal имеется два способа обработки исключительных ситуаций:
· блок try ... except;
· блок try ...finally.
Блок try ... except используется для реакции на конкретную исключительную ситуацию и реализуется следующим образом:
try
Оператор 1;
Оператор 2;
except
on Exception1 do Оператор 3;
on Exception2 do Оператор 4;
else Оператор 5;
end;
При возникновении ошибки в разделе try происходит обращение к разделу except, в котором выполняется анализ исключительной ситуации. По результатам анализа (Exception) выполняются или не выполняются те или иные операторы, следующие за служебным словом do. Если в разделе try ошибки не возникают, то к разделу except обращение вообще не происходит.
Блок try ...finally используется в тех случаях, когда необходимо выполнить некоторые действия даже в случае возникновения исключительной ситуации (например, освободить занятую память). Блок try ... finally имеет следующий вид:
try
Оператор 1;
Оператор 2;
finally
Оператор 3;
Оператор 4;
end;
В данной конструкции раздел finally выполняется в любом случае, даже если в разделе try не возникает ошибка. Эта конструкция не обрабатывает исключительную ситуацию, а лишь служит для защиты выделенных ресурсов, позволяя освободить их даже в случае возникновения исключительной ситуации.
Исключительную ситуацию можно вызвать принудительно с помощью специального оператора raise, например:
raise Exception.Create('Сообщение выводимое на экран');
Оператор raise прервет нормальное выполнение программы, так как если бы ошибка была вызвана по другим причинам.
Вопросы для самоконтроля
1. Назовите основное назначение модулей?
2. В чем основное назначение раздела интерфейса?
3. Какие разделы модулей являются обязательными?
4. В чем разница между описанием в разделе интерфейса и описанием в разделе реализации?
5. Назовите основное назначение указателей?
6. Какие еще преимущества может дать использование указателей?
7. Что произойдет при использовании P1:= P2;?
8. В чем разница между записями P2:= 100; и P2^:= 100;?
9. Для чего необходима обработка исключительных ситуаций?
10. Какие способы обработки исключительных ситуаций существуют в Object Pascal?
11. В чем назначение блока try…except?
12. В чем назначение блока try…finally?
13. Как принудительно можно сгенерировать исключительную ситуацию?
Еще по теме Лекция 2.3. Особенности программирования в Delphi (Object Pascal):
- 2 Цели мерчандайзинга поставщика
- 5. Оценка эфективности наружной рекламы
- 3. 3. Возникновение государственного судопроизводства в Риме.
- Детерминизм и индетерминизм. Креационная и эволюционная модели мира.
- Общая характеристика философии экзистенциализма. Манифест Ж. -П. Сартра «Экзистенциализм - это гуманизм».
- Монархическая форма правления.
- Конфедерация и иные формы межгосударственных объединений (союзы, сообщества, содружества, ассоциации)
- Понятие и признаки государственного органа. Классификация государственных органов.
- Образ Петербурга Достоевского в творчестве Бунина