Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка DELPHI.DOC
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.73 Mб
Скачать

Записи (объединения)

С помощью зарезервированного слова record в единой структуре можно объединить данные разных типов. Общий синтаксис объявления такого объединения следующий:

Type <имя типа> = Record

<Список полей>: <тип>;

<Список полей>: <тип>;

. . . . . . . . . . ;

End;

Поля записи (или объединения) могут быть любого типа, количество их не ограничено. Например,

Type

Complex = record {Тип комплексных чисел}

Re, Im: real;

end;

Data = record {Тип – дата рождения}

Year:word;

Month: 1..12;

Day: 1..31;

end;

Person = record {Тип – сведения о сотруднике}

Name: string[40];

Age: word;

Adres: string[80];

end;

Количество памяти, выделяемой под запись, может быть различным в зависимости от директивы {$A} (выравнивание). Если установлено {$A+}, то поля выравниваются по четным адресам - уменьшается время доступа к переменной в памяти. По умолчанию установлено {$A-}. Перед ключевым словом record можно добавить слово Packed. В этом случае под запись выделяется минимальное количество байт, причем директива {$A} игнорируется.

После объявления типа можно задать переменные или типизированные константы этого типа, например,

Var Z: Data;

X: Complex;

Const

Birthday:Data=(Year:1974;Month:7;Day:12);

Petrov:Person=(Name:’Иван’;Age:22;

Adres:’Новомосковск,Мира,20,3’);

Доступ к полям записи в программе осуществляется следующим способом:

Z.Year:=1969; {Z – селектор записи; Year – поле}.

Z.Month:=7; Z.Day:=13; X.Re: 0.8;

X.Im: 2.1; Z.Month:= Z.Day div 5+2;

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

Type

Figure=(Square,Triangle,Circle);

G = Record

X,Y: integer;

Case fig: Figure of

Square: (Side: integer);

Triangle: (Side1,Side2,Angle: integer);

Circle: (Radius: integer);

end;

В данном случае задан перечисляемый тип для обозначения трёх геометрических фигур: квадрата, треугольника и окружности. Далее вводится объединение: X, Y – координаты привязки этих фигур на некоторой плоскости, Side (сторона) определяет квадрат, Side1, Side2, Angle (угол) определяют треугольник, Radius – окружность. Начиная с ключевого слова Case, записывается вариантная часть. Память выделяется одна. Трактовать её можно в данном случае так: в памяти находится или одна величина Side, или три величины Side1, Side2, Angle, или одна величина Radius. Когда и как трактовать память – выбирает программист.

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

Case Figure of

Square: (Side: integer);

Triangle: (Side1,Side2,Angle: integer);

Circle: (Radius: integer);

Как замечено выше, память под вариантную часть выделяется одна и та же. В данном случае для Triangle требуется записать три величины типа integer, больше, чем для других фигур. Поэтому под вариантную часть будет выделено 12 байт памяти (по 4 байта на каждую величину).

Далее выберем две переменные и запишем данные в эти переменные:

Var MySquare: G; MyCircle: G;

. . . . . . . . . . . . . .

MySquare.Side:= 5; MyCircle.Radius: = 10;

Как можно заметить, отличий в записи информации в вариантные поля от обычных полей на этом уровне не существует. Если попытаться в примере выше прочитать значение MySquare.Side, то оно будет равно 10, так как последняя запись в общую память была именно такая (MyCircle.Radius: = 10;).