На этом шаге мы рассмотрим записи с вариантами.
Рассмотренный на предыдущем шаге тип TStudentCard включает только четыре оценки за один семестр. Но в следующих семестрах будут выноситься на экзамен другие дисциплины. Возникает проблема: в записи TStudentCard нас интересуют (для нашего примера) оценки только за последний семестр, но в каждом семестре сдаются другие предметы. Если использовать обычные фиксированные записи, то придется в тип TStudentCard включать поля для всех изучаемых за время обучения дисциплин. Это приведет к избыточности информации в типе TStudentCard и снижению читабельности программы. Кроме того, будет неэкономно использоваться память, поскольку для каждого студента память будет выделяться под поля всех его оценок, а фактически (в нашем рассматриваемом случае) будут использоваться только несколько полей, описывающих оценки за последний семестр.
В таких случаях целесообразно использовать вариантные записи, в которых также, как и в фиксированных, описываются поля для всех возможных случаев, однако альтернативные группы полей разграничиваются более наглядно и память выделяется только под конкретный, необходимый в данный момент вариант.
Если тип TStudentCard расширить оценками за второй семестр, то в форме вариантной записи он примет такой вид:
type TMarksSem1 = record MathAnall : Byte; { Мат. анализ } LinAl : Byte; { Лин. алгебра } Prog1 : Byte;{ Программирование } Phys : Byte; { Физика } end; TMarksSem2 = record MathAnal2 : Byte; { Мат. анализ } Electron : Byte; { Электроника } Prog2 : Byte; { Программирование } DigAutom : Byte; { Теория циф. автоматов } end; TStudentCard = record { Фиксированная часть записи } SurName : String20; { Фамилия } Name : String20; { Имя } FatherName : String20; { Отчество } Year : Integer; { Год рождения } HomeAddress: String; { Домашний адрес } GroupCode : String7; { Шифр группы } { Вариантная часть записи } case Semestr : Byte of 1: ( MarksSem1 : TMarksSem1 ) { Оценки за первый семестр } 2: ( MarksSem2: TMarksSem2 ) { Оценки за второй семестр } end;
В типе TVarStudentCard поле Semestr является полем признака, поля MarksSem1 и MarksSem2 - альтернативными вариантами данной записи.
Если объявить, как показано выше переменные Group_KB51 и Group_KB52, то заполнение информацией за первый семестр экземпляра карточки одного студента, имеющей порядковый номер 3, может иметь, например, такой вид:
with Group_KB51[3] do begin { Заполнение фиксированной части записи } SurName := 'Иванов'; Name := 'Иван'; FatherName := 'Иванович'; Year := 1978; HomeAddress := 'г. Курган, ул. Иванова, д.12, кв.63' GroupCode := 'КВ-511'; { Заполнение вариантной части записи } Semestr := 1; { Установка признака первого семестра } with MarksSem1 do { Оценки за первый семестр } begin MathAnal1 := 5; LinAl := 4; Prog1 := 5; Phys := 3; end; end;
В заключение отметим одно неудобство применения вариантных записей. В вариантных компонентах таких записей не допускается использование одинаковых идентификаторов.
Например, в рассмотренном примере оба альтернативных варианта записи для предмета "Мат.анализ" не могут содержать одинаковый идентификатор MathAnal, а для предмета "Программирование" - одинаковый идентификатор Prog.
На следующем шаге мы рассмотрим тип "файл".