Материал: Основы разработки программных средств в среде Delphi. Романов А.В

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

3. Объектно-ориентированное программирование в рамках языка object pascal

Прежде чем приступить к изложению основ языка программирования высокого уровня Object Pascal, необходимо отметить следующее.

Во-первых, объем всего материала по данному вопросу явно превышает размеры настоящего учебного пособия. По этой причине авторы настоятельно рекомендуют активно работать с научно-технической литературой. Основы Object Pascal и технология программирования подробно изложены, например, в [2, 4, 8]. Особенно стоит выделить справочные материалы [1], поскольку ими очень часто приходится пользоваться. Не стоит забывать о клавише F1, которая в среде Delphi активизирует справочную информацию.

Во-вторых, отдельные разделы по содержанию очень тесно взаимосвязаны друг с другом, что создает определенные трудности при изучении, ибо для понимания текущего материала необходимы знания, изложение которых предполагается далее. Идеальным вариантом изучения, по мнению авторов, является неоднократное прочтение предлагаемого материала.

Завершая вводную часть данного раздела, приведем краткую аннотацию некоторых книг, в которых можно найти специализированную информацию по программированию на языке высокого уровня, в том числе и в среде Delphi. Вопросы методологии и технологии проектирования баз данных (как реляционных, так и объектно-ориентированных) рассмотрены в [6, 8]. Разработка мультимедийных приложений и работа с графическими компонентами подробно разбираются, например, в [9]. Очень интересные, нестандартные и профессиональные приемы программирования изложены в [5]. Методология и вопросы разработки справочной системы для проектируемых программных средств приведены в [2, 3, 8].

3.1. Элементарная грамматика языка Object Pascal

Программный код в языке Object Pascal записывается с помощью символов латинского алфавита, цифр и некоторых других символов. Строчные и ПРОПИСНЫЕ буквы различаются только в строковых выражениях, но не в символических именах классов, переменных, функций и т.д. Для символических имен в дальнейшем будет использоваться понятие допустимый идентификатор – произвольное символьное имя, состоящее из букв латинского алфавита, цифр, символа подчеркивания «_», причем первым символом не может быть цифра. Примеры:

A, D3, _23, Andr_Romanov; //допустимые имена

2W, 34, @EE, КОЛЯ; //недопустимые имена

Комментарии отделяются от текста программы тремя способами:

  1. символами "//", как в приведенном примере (таким образом обычно определяется короткий комментарий, находящийся на одной строке с программным кодом);

  2. заключаются в фигурные скобки – { комментарий }; заметим, что при изложении теории программирования в фигурные скобки могут заключаться необязательные фрагменты программного кода;

  3. большой текстовой фрагмент комментария принято помещать между сочетаниями символов "(*" и "*)".

Также при изложении теоретических положений программирования принято использовать символы "<" и ">". В них заключаются фрагменты программного кода, как правило, произвольно определяемые пользователем.

Текст, являющийся комментарием, игнорируется компилятором. Но существует единственное исключение: если сразу после фигурной скобки стоит символ "$", то в этом случае мы имеем дело с директивой компилятора. Например, {$I+} – директива компилятора, а {$ I+} – просто комментарий. Директивы компилятора – это указания компилятору на выполнение тех или иных операций. Записываются в формате {$<директива>}. По области действия различаются глобальные, действующие на весь компилируемый файл, и локальные, действующие от места их объявления до места появления другой директивы, отменяющей предыдущую.

В главе 1 (пп. 1.1.3) было сказано, что основными элементами любого языка программирования высокого уровня являются список служебных (зарезервированных) слов и определенные правила записи операторов и операндов.

Зарезервированные слова являются недопустимыми идентификаторами, т.е. не могут быть использованы в качестве имен переменных, процедур, функций. Полный список их можно найти в специальной литературе, например, в [4]. При случайном использовании их в качестве идентификатора компилятор программы укажет на ошибку. Со многими основными служебными словами Object Pascal будем знакомиться по мере изучения материала. Отметим, что визуальный редактор Delphi выделяет многие зарезервированные слова. Например, если не менять установки редактора, определяемые по умолчанию, то служебные слова будут выделяться черным жирным шрифтом (как и в излагаемом далее учебном материале).

Каждая логически завершенная строка (т.е. она не обязательно должна располагаться физически на одной строке, возможен и перенос строк) программного кода завершается символом ";".

Если требуется логически выделить несколько операторов в единую структуру, то используются специальные операторные скобкиbegin <группа операторов> end.

3.2. Основные структурные единицы

3.2.1. Структуры главного файла программы и модулей

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

Program <имя>; // заголовок программы

Uses ... // объявления подключаемых модулей

{объявления локальных для головного файла типов, классов, констант, переменных, описания локальных функций и переменных}

begin

... {операторы тела программы}

end.

Программный код обычно помещают в файлы модулей, каждый из которых в общем случае имеет структуру:

unit <имя модуля>;

interface // Открытый интерфейс модуля

(* Сюда могут помещаться списки подключаемых модулей, объявления типов, констант, переменных, функций и процедур, к которым будет доступ из других модулей. *)

implementation // Реализация модуля

(* Сюда могут помещаться списки подключаемых модулей, объявления типов, констант, переменных, недоступных для других модулей. Здесь же должна быть реализация всех объявленных в разделе interface функций и процедур, а также может быть код любых дополнительных, не объявленных ранее процедур и функций. *)

initialization {реализация может отсутствовать}

(* Операторы, выполняемые один раз при первом обращении к модулю *)

finalization { реализация может отсутствовать }

(* Операторы, выполняемые один раз при завершении работы модуля *)

end.

3.2.2. Общая характеристика объявляемых элементов

Раздел interface представляет собой внешний интерфейс модуля. Подключаемые модули, объявленные типы, классы, константы, переменные, функции и процедуры доступны внешним модулям, обращающимся к данному модулю.

Раздел implementation представляет собой программную реализацию модуля. Все объявленные в нем элементы доступны только в пределах данного модуля. Основное тело модуля составляет программный код, реализующий объявленные в разделе interface функции и процедуры.

Раздел initialization включает в себя операторы, которые выполняются только один раз при первом обращении программы к данному модулю. Этот раздел не является обязательным. В нем могут помещаться какие-либо операторы, производящие начальную настройку модуля.

Раздел finalization включает в себя операторы, выполняемые только один раз при любом завершении работы программы: нормальном или аварийном. Это необязательный раздел. В нем могут помещаться операторы, производящие зачистку "мусора" – удаление временных файлов, освобождение ресурсов памяти и т.п. Введение раздела finalization не разрешается, если в модуле нет раздела initialization.

И в главном файле программы, и в разделах interface и implementation возможно объявление различных элементов программирования – модулей, классов, меток, констант, пользовательских типов, переменных, процедур и функций.

Используемые модули идентифицируются ключевым словом uses, после которого следует список имен модулей, разделяемый запятыми. Например:

uses Windows, SysUtils, Classes, Unit2, MyUnit;

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

uses Unit1 in 'Unit1.pas',

Unit2 in 'c:\exampes\Unit2.pas';

Служебное слово in используется в случаях, если Delphi неясно, где надо искать соответствующие файлы. В объявлениях uses, включаемых в модули, использование in не допускается.

При взаимных ссылках модулей друг на друга не разрешаются циклические ссылки с помощью uses, размещенных в разделах interface. Такие циклы надо разрывать, перенося в одном из модулей, требующем взаимной ссылки, uses из разделов interface в разделы implementation.

Главный файл ПО может содержать только один раздел uses, файлы модулей могут одновременно содержать uses в разделах interface и implementation. Разделов объявления меток, типов, констант и переменных может быть несколько, и они могут следовать в любом порядке.

Начало раздела объявления меток указывается с помощью директивы label, после которого через запятую следует список меток. Каждая метка обозначается допустимым идентификатором, но может состоять и из цифр. Например:

label Lbegin, 1, second, 9999;

Отметим, что использование меток при программировании на современных объектно-ориентированных языках высокого уровня не считается хорошим стилем программирования.

На начало раздела объявления типов указывает служебное слово type. Вообще в Object Pascal существует большое число стандартных (встроенных) типов. Раздел type необходим для создания собственных, нестандартных, определяемых пользователем типов данных. После ключевого слова type должен следовать ряд объявлений типов в форме:

<идентификатор типа> = <описание типа>;

Например, объявим перечисляемый тип TMode и тип, определяющий расширение файла как трехсимвольную строку.

type TMode : (mRead, mEdit, mWrite);

TFileExp : String[3];

Раздел констант начинается со служебного слова const. При компиляции программы вместо символьного имени константы фактически подставляется ее численное значение. Кроме обычных констант, в Object Pascal можно использовать и константы-переменные, которые, по сути, являются обычными переменными с начальной инициализацией. Примеры:

Const

Const_1 = 120; //константа целого типа

Const_2 = 100.0; //константа вещественного типа

Const_3 = ’100.0’; //строковая константа

_A3 = Const_3/sqr(Const_1)+12.3; {константа,

определяемая выражением}

v_1 : real = 3.14158; {вещественная

константа-переменная}

v1 : integer = 156; //целая константа-переменная

Начало раздела переменных определяется служебным словом var. В этих разделах в модулях должны быть описаны все используемые переменные. Компилятор Object Pascal не допускает использования переменных, не объявленных в разделе var. Допускается объявление неиспользуемых переменных. Формат объявления переменных в общем виде:

<идентификатор переменной> : <тип> {= <значение>};

Однотипные переменные можно перечислять через запятую и обозначать любым допустимым идентификатором. Для переменных нестандартного типа имя типа должно быть описано в разделе type. Например:

type TFileExp : String[3];

var var33, Myvar, Alfa : real;

var40 : integer = 55;

txtExp : TFileExp; // переменная, тип которой

3.3. Типы данных и операции над ними

Типы данных в Object Pascal можно разделить на предопределенные в языке (встроенные) типы и типы, определяемые пользователем. На рис. 3.1 приведена классификация предопределенных типов Object Pascal, учитывающая некоторые общие свойства различных типов.

Четыре математических оператора (+, -, /, *) и операторы сравнения (=, >, >= и т.д.) работают с любыми числовыми типами. Если хотя бы один из операндов в математических вычислениях является действительным типом (т.е. числом с плавающей точкой), то результат также будет действительным числом. Для целочисленного деления используются операторы DIV (возвращает целочисленное частное) и MOD (возвращает остаток от деления).

3.3.1. Порядковые типы

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

  • Ord(<Выражение порядкового типа>) – возвращает порядковый номер значения аргумента;

  • Pred(<Выражение порядкового типа>) – возвращает предшествующее значение аргумента;

  • Succ(<Выражение порядкового типа>) – возвращает следующую величину значения аргумента;

  • High(<Идентификатор или переменная порядкового типа>) – максимально возможное значение аргумента;

  • Low(<Идентификатор или переменная порядкового типа>) – минимально возможное значение аргумента.

Для порядковых типов определены также процедуры инкремента Inc(i) и декремента Dec(i), которые соответственно увеличивают или уменьшают на единицу порядковый номер своего аргумента i.

Целые типы данных относятся к целым порядковым типам и используются для представления целых чисел. В табл. 3.1 приведены диапазоны их изменений. Родовыми типами (т.е. обеспечивающими максимальную производительность вычислений) среди перечисленных являются Integer и Cardinal. Приведенные затраты памяти могут изменяться от версии к версии, поэтому для достоверной оценки рекомендуется пользоваться функцией SizeOf(X), которая возвращает число байт, занимаемых любой переменной или типом Х.

Таблица 3.1.

Тип

Диапазон значений

память в байтах

Знаковый тип

Byte

0 .. 255

1

нет

Word

0 .. 65535

2

нет

ShortInt

-128 .. 127

1

да

SmallInt

-32768 .. 32767

2

да

Cardinal или Longword

0 .. 4294967295

4

нет

Integer или LongInt

-2147483648 .. 2147483647

4

да

Источник: https://studfile.net/preview/16568022/