Насчёт памяти:
Внутри записи допустимо указывать несколько форм её представления, и описываются все эти формы "в стиле" оператора
case (это только правило описания, способ нужного представления, понятный компилятору и разработчику, а не реальный машинный код).
Например программисту требуется использовать два типа данных: одну запись с полями:
Код:
Name : string[50];
Num: integer;
X:integer;
а другую - с полями:
Код:
a: integer;
b: char;
X:integer;
При этом программист точно знает, что он не будет применять эти группы полей одновременно друг с другом. Тогда вместо описания двух новых типов программист может описать один, только разделив внутреннюю структуру записи на две:
Код:
type TMyType = record
X:integer;
case boolean of
true: (Name: string[50]; Num: integer);
false: (a: integer; b: char);
end;
Подобная оригинальная запись расшифровывается следующим образом: Слово
case говорит, что далее следует несколько форм представления типа (записи) TMyType. Сколько? Это определяется следующим за ключевым словом
case типом
Boolean ( в данном случае, т.к Boolean имеет всего два значения, мы можем указать всего две формы представления, написав другой тип, напр byte можно больше: 5, 10, хоть все 256

)
Далее в круглых скобках приводятся варианты внутренней структуры.
Закрывает описание case не собственное ключевое слово end, а слово end, завершающее описание всей записи
Обращатся к полям записи в тексте программы можно как обычно.
Данное описание используется ещё с первых версий программы для экономии памяти, т.к для всех представлений выделяется одна общая область памати (равная облатси памяти, требуемой для самого большого представления)
Конечно, одновременно обращатся к полям из разных описаний не следует: ведь создаются подобные раздельные описания как раз исходя из того, что совместно использоваться они не будут.
Но есть ещё один способ применения условного описания. Т.к в памати для представлений отводиться одна общяя область, то можно например орагизовать доступ к отдельным байтам переменной, напр. Integer имеет длину 4 байта, тогда:
Код:
type TMyType = record
case byte of
1: (I:integer);
2: (bs: array [1..SizeOf(integer)] of byte);
end;
var A:TMyType;
begin
A.I := '1568237'; // число типа integer
A.bs[1] // значения первого байта
A.bs[4] // значение последнего байта и т.п
...