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

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

// объявлен пользователем

Как было сказано выше, все объявленные переменные в Delphi действительны только в пределах своей области действия. Переменные, объявленные в интерфейсной части модуля, являются глобальными, т.е. видимыми во всех других модулях, использующих данный модуль. Глобальные переменные занимают пространство в памяти и не освобождают его, пока программа работает. Переменные, объявленные в разделе implementation или внутри процедуры или функции, являются локальными. С точки зрения программных ресурсов, их использование предпочтительнее, поскольку в этом случае экономится память и несколько облегчается процесс отладки.

Символьные типы данных предназначены для хранения одного символа. Родовым является однобайтный тип Char, эквивалентный в настоящее время типу ANSIChar, поддерживающий множество символов ANSI (American Standard Code for Information). Именно тип Char имеет смысл использовать во всех случаях, кроме обращений к функциям, требующим другой тип символьных данных – WideChar, поддерживающий универсальную двухбайтовую кодировку Unicode. Первые 256 символов в этих множествах одинаковы и соответствуют символам ASCII (American Standard Code for Information Interchange) от 0 до 255. Для символьного типа предопределена функция Chr, возвращающая символ любого целого значения в пределах AnsiChar или WideChar. Например, Chr(65) возвращает символ "A".

П

Таблица 3.2.

Тип

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

Boolean

1

ByteBool

1

WordBool

2

LongBool

4

еременные логических (булевых) типов представляют два значения – true (истина) и false (ложь). Для совместимости Delphi с другими системами определены несколько логических типов (табл. 3.2). Предпочтительнее всегда использовать тип Boolean, кроме обращений к процедурам, явным образом требующим другой тип.

Д ля булевых типов определены булевы операции: AND (И), OR (ИЛИ), NOT (НЕ, отрицание) и XOR (исключающее ИЛИ). На рис. 3.2 представлены таблицы истинности для операторов AND, OR и XOR. Ячейки в каждой таблице содержат результат объединения логических значений заголовков по строке и столбцу при использовании заданного логического оператора. Использование этих операций расширяет возможности по формированию сложных условий в ряде операторов.

Предопределенные константы true и false обладают в разных булевых типах несколько разными свойствами, которые приведены в табл. 3.3.

Таблица 3.3.

тип Boolean

типы ByteBool, WordBool, LongBool

false < true

false <> true

Ord(false) = 0

Ord(false) = 0

Ord(true) = 1

Ord(true) <> 0

Succ(false) = true

Succ(false) = true

Pred(true) = false

Pred(false) = true

Перечислимые типы определяют упорядоченное множество идентификаторов, представляющих собой возможные значения переменных этого типа. Вводятся эти типы для улучшения логичности восприятия программного кода. Многие типы Delphi являются перечислимыми. Это упрощает работу с ними, поскольку дает возможность работать не с абстрактными числами, а с осмысленными значениями.

Пусть, например, в программе должна быть переменная Mode, в которой зафиксирован один из возможных режимов работы приложения: чтение данных, их редактирование, запись данных. Можно, конечно, этой переменной присваивать в нужные моменты времени одно из трех условных чисел: 0 – режим чтения, 1 – режим редактирования, 2 – режим записи. Тогда программа будет содержать операторы вида

if (Mode = 1) then ...

Можно поступить иначе: определить перечисляемый тип TMode, как это сделано в одном из примеров предыдущего раздела, а переменную Mode объявить как переменную этого типа:

type TMode : (mRead, mEdit, mWrite);

var Mode : TMode;

Приведенный оператор изменится следующим образом.

if (Mode = mEdit) then ...

Конечно, такой оператор понятнее, чем предыдущий.

Переменная перечислимого типа определяется предложениями вида:

type <имя> = (<значение 1>, .., < значение n>);

var <имя> : (<значение 1>, .., < значение n>);

Второй вариант делает невозможным объявление и использование другой переменной с теми же значениями.

Переменной перечисляемого типа можно присваивать указанные значения, проверять ее величину, сравнивая с возможными значениями. Кроме того, применимы любые операции сравнения (>, < и т.п.), а также процедуры и функции, определенные для порядковых типов.

Ограниченный тип или тип-диапазон для порядковых типов задает поддиапазон возможных значений для вводимого типа или переменной. Задается выражением вида <минимальное значение>..<максимальное значение>.

Приведем пример: пусть переменная Letter может принимать только символы латинских букв в нижнем регистре, переменная Num – только целые числа в диапазоне 1..12 (например, номера месяцев) и объявим тип Caps как совокупность символов латинских букв в верхнем регистре.

var Letter : 'a'..'z';

Num : 1..12;

type Caps = 'A'..'Z';

Введение ограниченных типов является неплохим средством отладки. Они часто используются при объявлениях размеров массивов, но могут использоваться и самостоятельно. В компиляторе Object Pascal имеется опция (директива компилятора {$R+}), позволяющая включить проверку диапазона при присваивании значения переменной ограниченного типа. При попытке присвоить переменной ограниченного типа значение, выходящее за пределы заданного поддиапазона, генерирует сообщение "Range check error".

3.3.2. Действительные типы

Действительные типы данных предназначены для хранения чисел, имеющих дробную часть (табл. 3.4).

Таблица 3.4

Тип

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

Число значащих разрядов

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

Real48

2.9·10–39 .. 1.7·1038

11–12

6

Real или Double

5.0·10-324 .. 1.7·10308

15–16

8

Single

1.5·10-45 .. 3.4·1038

7–8

4

Extended

3.6·10-4951 .. 1.1·104932

19–20

10

Currency

–922337203685477.5808 .. 922337203685477.5807

19–20

8

Родовым является тип Real, который в настоящий момент эквивалентен типу Double. Наименьшую производительность обеспечивает тип Real48, сохраняемый только для обратной совместимости с более ранними версиями языка. Тип Extended обладает максимальной точностью, но могут возникать проблемы с его переносимостью на другие платформы. Для тип Currency минимизирована ошибка округления и поэтому он используется для представления денежных величин.

3.3.3. Строки

Строки представляют собой последовательность символов и определяются совокупностью четырех типов – ShortString, AnsiString, String, WideString. Различные типы строк можно классифицировать по двум признакам:

  • длинные или короткие строки;

  • строки, использующие или не использующие нулевой символ #0 в конце строки.

Родовым является тип String, который имеет разный смысл в зависимости от директивы компилятора $H. Если включена директива {$H+} (включена по умолчанию), то String интерпретируется компилятором как тип AnsiString – длинная строка (до 2 Гбайт) с нулевым символом ("#0") в конце. Подобное представление строкового типа данных имеет дополнительное имя – ASCIIZ, используются также термины ограниченная нулем строка и строка с завершающим нулем. При директиве {$H-} String интерпретируется как тип ShortString – короткая строка (максимум 255 символов) без завершающего нулевого символа. Тип WideString является длинной строкой с завершающим нулем, используется в серверах COM и интерфейсах, может содержать до 1 Гбайта символов Unicode.

Если в объявлении типа после ключевого слова String следует число символов в квадратных скобках (например, String[4]), то, независимо от директив компилятора, тип трактуется как строка без нулевого символа в конце с указанным числом символов.

Стандартная функция Length возвращает число символов в строке, переданной ей в качестве параметра. Процедура SetLength устанавливает длину строки. Вообще, для строк определено достаточно большое количество стандартных операторов, процедур и функций.

К строкам применимы операции сравнения. Если сравниваются строки разной длины, то большей считается более длинная строка. При сравнении строк одинаковой длины принимаются в расчет символы в одинаковых позициях – сравниваются коды этих символов.

Сцепление (конкатенация) строк осуществляется операцией "+". Например, выражение S1+S2 даст в результате строку, в которой после символов строки S1 будут расположены символы строки S2. Строки разных типов могут присваиваться друг другу и смешиваться в одном выражении. Компилятор при этом осуществляет автоматическое приведение типов. Но строки, передаваемые как параметры в функции и процедуры, должны иметь указанный в объявлениях тип. В противном случае необходимо использовать операции явного приведения типов или другие приемы программирования.

Со строками можно оперировать как с индексированными массивами символов. Например, S[i] – это символ, расположенный в строке в позиции i (индексы отсчитываются от 1, т.е. индекс 1 соответствует первому символу). Для строк типа ShortString или AnsiString выражение S[i] имеет тип AnsiChar, для строк типа WideString – WideChar.

При работе со строками с завершающим нулем часто используют специальные типы указателей: PChar и PWideChar, которые являются указателями соответственно на массивы с элементами типов Char и WideChar с нулевым символом в конце. Переменные этих типов часто требуется передавать в различные функции и процедуры в качестве параметров. К тому же типы PChar и PWideChar существенно упрощают коды по причине совместимости со строковыми константами. Указатели этих типов могут индексироваться точно так же, как строки и массивы символов. Например, если Р определен как PChar, то P[0] – это первый символ строки.

В выражениях, операторах присваивания и при передаче параметров в функции и процедуры можно смешивать длинные строки (AnsiString) и строки с нулевым символом в конце типа PChar. Но иногда требуется явное приведение типа PChar к типу длинной строки. Например, операция конкатенации строк требует, чтобы хотя бы один ее операнд имел строковый тип. Если же требуется склеить два объекта типа PChar, то это надо сделать с помощью приведения типа:

S := string(P1) + string(P2);

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