- •Глава 1
- •Структура модуля
- •Интерфейс
- •Реализация
- •Инициализация и завершение
- •Ключевые слова
- •Ключевое слово const
- •Ключевое слово type
- •Комментарии
- •Переменные
- •Типы данных и переменные
- •Преобразование типов
- •Знаки операций
- •Константы
- •Массивы
- •Одномерные массивы
- •Многомерные массивы
- •Функции Low и High
- •Динамические массивы
- •Короткая строка
- •Длинная строка
- •Операции со строками
- •Разбиение литерала по строкам программы
- •Строковые функции
- •Множества
- •Совместимость типов данных
- •Примечание.
- •Указатели
- •Статические и динамические переменные
- •Размещение динамических переменных
- •Разыменование указателя
- •Глава 2.
- •Вложенные условия. Операторы if могут быть вложены друг в друга произвольное число раз:
- •Элементы структуры цикла
- •Цикл for…
- •Цикл for с увеличением счетчика синтаксически определен как
- •Цикл for с уменьшением счетчика в общем случае имеет следующий вид
- •Функции Pred и Succ
- •Цикл while
- •Синтаксис цикла while имеет вид
- •Цикл repeat
- •Управление циклами
- •Оператор goto
- •Оператор case
- •Область видимости идентификаторов
- •Пример записи
- •Оператор with
- •Массивы записей
- •Подпрограммы
- •Процедуры и функции
- •Объявление и определение подпрограммы
- •Параметры подпрограмм
- •Локальные процедуры и функции
- •Перегрузка подпрограмм
- •Параметры по умолчанию
- •Глава 3
- •Анатомия класса
- •Наследование
- •Ключевые слова is и as
- •Что такое класс?
- •Анатомия класса
- •Указатель Self
- •Пример класса
- •Анализ объявления и реализации
- •Наследование
- •Перекрытие методов
- •Ключевые слова is и as
Совместимость типов данных
Новый термин. Совместимость типов означает, что данные одного типа можно трактовать как данные другого типа. Тем самым, переменные (объекты) родственных типов, можно трактовать как переменные одного и того же общего типа. Принцип совместимости позволяет выполнять преобразование типа переменной. На английском языке это называется typecasting.
Ниже дан пример, показывающий как узнать цифровой код, соответствующий букве «А» латинского алфавита:
procedure TForm1.Button1Click(Sender: TObject);
var
AChar : Char;
AnInteger : Integer;
begin
AChar := 'A';
AnInteger := Integer(AChar);
Label1.Caption := IntToStr(AnInteger);
end;
В этом примере выражение Integer(AChar) есть указание компилятору преобразовать значение переменной AChar типа Char в значение типа Integer. Такое преобразование необходимо постольку поскольку мы не можем присвоить значение типа Char переменной целого типа. Если бы мы сделали такое присваивание, минуя операцию приведения типа, компилятор выдал бы сообщение «Incompatible types: 'Integer' and 'Char'».
Приведение типов, однако, возможно не всегда. Рассмотрим следующий код:
procedure TForm1.Button1Click(Sender: TObject);
var
Pi : Double;
AnInteger : Integer;
begin
Pi := 3.14;
AnInteger := Integer(Pi);
Label1.Caption := IntToStr(AnInteger);
end;
Здесь мы пытаемся трактовать данные типа Double как данные типа Integer. Это недопустимо. Компилятор выдаст сообщение «Invalid typecast». Для преобразования вещественного значения в целочисленное необходимо использовать функции Trunc, Floor, или Ceil.
Примечание.
Функция Trunc возвращает целую часть вещественного числа
Функция Floor округляет вещественное до ближайшего целого снизу
Функция Ceil округляет вещественное до ближайшего целого сверху
Для преобразования типа указателя используется оператор as. (Указатели рассматриваются в следующем разделе, а использование оператора as объясняется ниже в разделе "Ключевые слова классов is и as."
Указатели
Указатель суть адрес переменной в памяти компьютера. Говорят, что он указывает на переменную. Таким образом, указатель косвенно связан с реальными данными.
Новый термин: Указатель есть переменная, которая содержит адрес памяти, по которому записано значение другой переменной.
Рассмотрим пример. Допустим, что в некоторую подпрограмму надо передать адрес записи. Определить адрес экземпляра записи можно с помощью оператора @ следующим образом:
var
MLRecord : TMailingListRecord;
APtr : Pointer;
begin
{ Заполним запись данными. }
APtr := @MLRecord;
SomeFunction(APtr);
end;
Переменная APtr (ее тип есть Pointer) используется для запоминания адреса записи MLRecord. В данном случае мы имеем дело с так называемым нетипизированным указателем или указателем без типа. Нетипизированный указатель просто есть адрес переменной. Существуют и типизированные указатели. Допустим что нам необходимо определить специальный тип указателей на записи TMailingListRecord. Объявление типизированного указателя имеет вид:
type
PMailingListRecord = ^TMailingListRecord;
TMailingListRecord = record
FirstName : string;
LastName : string;
Address : string;
City : string;
State : string;
Zip : Integer;
end;
Здесь тип PMailingListRecord определяется как указатель записи типа TMailingListRecord. Необходимость применения в программах типизированных указателй возникает довольно часто. В следующем разделе мы рассмотрим примеры их использования.
ПРИМЕЧАНИЕ: В приведенном выше фрагменте кода поля записи объявлены как длинные строки. Если переменные типа TMailingListRecord надо будет хранить в файле, такое объявление полей не подходит. Это связано с тем, что все записи файла должны иметь одинаковый размер (число байт). Длинные строки имеют переменную длину, поэтому нет гарантии того, что все записи будут одинаковы по длине. Если записи будут храниться в файле, для объявления строковых полей следует использовать короткие строки с явной спецификацией длины.
