
Перечислимые типы
Перечислимые типы определяют упорядоченное множество идентификаторов, представляющих собой возможные значения переменных этого типа. Вводятся эти типы для того, чтобы сделать код более понятным. В частности, многие типы Delphi являются перечислимыми, что упрощает работу с ними, поскольку дает возможность работать не с абстрактными числами, а с осмысленными значениями.
Пусть, например, в программе должна быть переменная Mode, в которой зафиксирован один из возможных режимов работы приложения: чтение данных, их редактирование, запись данных. Можно, конечно, дать переменной Mode тип Word и присваивать этой переменной в нужные моменты времени одно из трех условных чисел: 0 - режим чтения, 1 - режим редактирования, 2 - режим записи. Тогда программа будет содержать операторы вида
if (Mode = 1) then ...
Через некоторое время уже забудется, что означает значение Mode, равное 1, и разбираться в таком коде будет очень сложно. А можно поступить иначе: определить переменную Mode как переменную перечислимого типа и обозначить ее возможные значения как mRead, mEdit, mWrite. Тогда приведенный выше оператор изменится следующим образом:
if (Mode = mEdit) then ...
Конечно, такой оператор понятнее, чем предыдущий.
Переменная перечислимого типа может определяться предложением вида:
var <имя переменной> : (<значение 1>, ..., < значение n>);
Например
var Mode : (mRead, mEdit, mWrite);
Если переменная определена так, то ей можно присваивать указанные значения, можно проверять ее величину, сравнивая с возможными значениями. Кроме того, надо учитывать, что перечислимые типы относятся к целым порядковым типам и к ним применимы любые операции сравнения (>, < и т.п.), а также процедуры и функции, определенные для порядковых типов.
Однако, если возможные значения типа определены, как указано выше, в переменной при ее объявлении, то нельзя будет ввести другую переменную с теми же значениями. Если такая потребность имеется, то перечислимый тип надо определять именно как тип:
type <имя типа> = (<значение 1>, ..., < значение n>);
Тогда можно ввести в программе несколько переменных этого типа. Например:
type TMode : (mRead, mEdit, mWrite);
var Mode1, Mode2 : TMode;
Ограниченные типы
Для порядковых типов можно задать поддиапазон их возможных значений для вводимого вами типа или переменной - это и будет ограниченный тип. Задается диапазон значений ограниченного типа выражением вида
<минимальное значение>..<максимальное значение>
Например:
var Letter : 'a'..'z';
Num : 1..12;
type Caps = 'A'..'Z';
В этих примерах переменная Letter может принимать только символы латинских букв в нижнем регистре, переменная Num - только целые числа в диапазоне 1 12 (это могут быть, например, номера месяцев), переменные, чей тип будет объявлен как Caps будут принимать только символы латинских букв в верхнем регистре.
Ограниченные типы используются, например, при объявлениях размеров массивов. Но они могут использоваться и самостоятельно. В компиляторе Object Pascal имеется опция, позволяющая включить проверку диапазона при присваивании значения переменной ограниченного типа. Это опция {$R+}. Вы можете ее включить в том месте вашей программы, где вы хотите начать проверку диапазона, и выключить проверку, где захотите, опцией {$R-}. Можно также включить опцию проверки в окне Project Options на странице Compiler. Это надежнее, так как опция {$R+} срабатывает только при ошибках диапазона, очевидных для компилятора, а установка опции проверки диапазона в окне Project Options действует в процессе выполнения (в режиме отладки) и при попытке присвоить переменной ограниченного типа значение, выходящее за пределы заданного поддиапазона, генерирует сообщение "Range check error".
Таким образом, введение ограниченных типов является неплохим средством отладки.
При использовании в объявлении ограниченного типа константных выражений возможны некоторые ошибки компилятора. Например, объявления
const
Х=100;
Y=200;
type
Scale = (X + Y) div 2..Y;
вызовут сообщение компилятора об ошибке, поскольку, если после знака равенства в объявлении типа следует скобка, то компилятор считает, что описывается перечислимый тип. Чтобы избежать такой ошибки, приведенные выше объявления можно заменить следующими:
const
Х=100;
Y=200;
type
Scale = 1 * (X + Y) div 2 . . Y ;