В Delphi 2.0 определено несколько новых типов данных, использующих возможности, доступные в Windows 95. В Delphi 2.0 также были изменены несколько типов данных для того, чтобы воспользоваться преимуществами 32-битной среды.
Новые типы данных включают в себя:
Character type (символьный тип) String type (строковый тип) Variant type (вариантный тип) Currency type (денежный тип) Измененные типы данных: Integer Cardinal Дополнительный синтаксис:
секция модуля finalization
Новые типы данных
Character type (символьный тип)
Delphi 2.0 вводит новый, "широкий" тип символов для поддержки Unicode. Delphi 1.0 рассматривал символы в виде 8-битных величин типа Char.
Вот стандартные типы, представляющие символы в Delphi 2.0:
ANSIChar - Стандартный 8-битный ANSI-символ, эквивалент типа Char в предшествующих версиях Delphi.
WideChar - 16-битный символ, представляющий символ Unicode. Если старший байт является нулем, младший байт содержит символ ANSI.
Char - тип по умолчанию, Char является эквивалентом ANSIChar. Char работает также, как и зависящий от реализации целочисленный тир Integer, который эквивалентен SmallInt в 16-битной версии Delphi и LongInt в 32-битной версии Delphi. В Delphi 2.0 Char по умолчанию является 8-битной величиной. Символьные типы-указатели: Тип-указатель Символьный тип ------------- -------------- PANSIChar ANSIChar PWideChar WideChar PChar Char Семантика всех символьных типов-указателей идентична. Единственная изменяющаяся вещь - размер символа, на который ссылается указатель.
String Type (строковый тип)
Delphi 2.0 поддерживает строки практически неограниченной длины, в отличие от строк длиной в 255 символов, поддерживаемой ранее. Новая директива компилятора, $H, позволяет задать для ключевого слова "string" новую, или старую длину строки. Состояние по умолчанию $H, т.е. $H+, используется строка неограниченной длины. Все компоненты Delphi 2.0 используют новый тип строки с неограниченной длиной.
Вот новые строковые типы:
ShortString - Нумерованная строка с максимальной длиной 255 символов. Эквивалент типа String в Delphi 1.0. Каждый элемент имееет тип ANSIChar.
AnsiString - Строка нового стиля с переменной длиной, также называемая "длинной строкой." Каждый элемент имееет тип ANSIChar.
string - Или короткая строка, или строка ANSI, в зависимости от значения директивы компилятора $H.
WideString - Длинная строка, каждый элемент имеет тип WideChar. Вот вопросы совместимости.
Хотя кодирование с длинными и короткими строками ничем между собой не различается, некоторые действия с короткой строкой совсем не будут работать с длинными строками, кроме того, для достижения максимальной эффективности рекомендуется для различных типов строк применять различные функции. Следующая таблица суммирует эти изменения.
Операции с Эквивалент для короткой строкой длинной строки Пояснение ---------------- -------------- --------- PString type string Все длинные строки распределяются динамически, поэтому PString излишен и требует более трудного программирования. S[0] := L SetLength(S,L) Поскольку длинные строки распределяются динамически, SetString(S,P,L) то для распределения необходимого количества памяти вы должны вызывать процедуру SetLength. StrPCopy StrPCopy(Buffer, (Buffer, S) PChar(S)) Вы можете осуществить приведение типа длинной строки к строке с терминирующим нулем. Адрес длинной строки совпадает с адресом ее первого символа, а ее длина рассчитывается до терминирующего нуля. S := StrPas(P) S := P Длинные строки могут автоматически копироваться из строк с терминирующим нулем. Длинные строки не могут передаваться в качестве параметров типа "открытых строк" или переменных параметров короткой строки (var-параметры).
Вариантный тип
Delphi 2.0 вводит понятие вариантного типа (variant type), дающее вам мощный и гибкий инструмент для динамического изменения типа переменной. Это может оказаться полезным при работе с OLE-автоматизацией или определенных типах операциях с базой данных, где тип параметра, передаваемого сервером приложению Delphi, заранее неизвестен.
Вариантный тип является 16-битной структурой, хранящей информацию о типе вместе с самой величиной, которая, в свою очередь, может представлять из себя строку, целое или значение с плавающей точкой. Компилятор признает стандартный идентификатор типа Variant как объявление variant.
В случае, если вариантный тип несовместим с типом, с которым необходимо завершить действие, вариантный тип, если возможно, автоматически преобразует свою величину к совместимому значению. К примеру, если вариантный тип содержит целое и вы присваиваете это строке, вариантный тип преобразует свое значение в строку, содержащую номер целочисленного значения, которая, впоследствие, присваивается строке.
Вы также можете присвоить вариантное выражение переменной стандартного типа или передавать значение вариантного типа в качества параметра программе, ожидающей в качестве параметра стандартный тип. Delphi, при возможности, преобразует значение вариантного типа к необходимому типу, а если это невозможно, то она возбудит исключение.
Денежный (Currency) тип
Delphi 2.0 вводит понятие нового, денежного (Currency) типа, являющегося типом с плавающей точкой и разработанного специально для работы с большими значениями, имеющими большую точностью. Данный тип для присвоения совместим со всеми типами, поддерживающими плавающую точку (и вариантным типом), но в действительности он хранится в виде 64-битного целого значения, очень похожего на тип Comp.
Значения денежного типа имеют точность до четырех десятичных знаков после запятой. Другими словами, значение с плавающей точкой хранится в целочисленном формате, где в четырех младших разрядах хранится значение денежного типа после запятой.
Измененные типы данных
Зависимые от реализации типы Integer и Cardinal в Delphi 2.0 представлены 32-битными величинами, в Delphi 1.0 они были 16-битными. Если вам необходимо объявить данные 16-битного целого типа, используйте типы SmallInt и Word.
Дополнительный синтаксис
Вы можете включить в модуль дополнительную секцию finalization. Finalization - аналог initialization (инициализация), и срабатывает при завершении приложения. Вы можете думать о секции finalization как об "коде выхода" из модуля ("код покидания модуля"). Секция finalization перекрывает соответствующие вызовы ExitProc и AddExitProc в Delphi 1.0.
Секция finalization начинается с зарезервированного ключевого слова finalization. Секция finalization должна располагаться после секции initialization, но до конечного end.
После выполнения кода секции initialization, соответствующая секция initialization гарантированно будет выполнена при завершении приложения. Секция Finalization должна корректно обрабатывать частично инициализированные данные, по аналогии с деструктором класса.
Секции Finalization выполняются в порядке, обратном секциям initialized. Например, если ваше приложение инициализирует модули в порядке A, B, и C, то при завершении приложения порядок выполнения секций finalization таков: модуль C, B, и A.
Схема модуля может быть похожей на эту:
unit UnitName; interface { список uses; опция } ... implementation { список uses; опция } ... initialization { опция } ... finalization { опция } ... end.