logo search
Программирование в среде Delphy / Программирование в среде Delphi

10. Работа с записями

Запись – это набор данных, который может содержать поля разных типов и определяется ключевым словом – Record. Имeна полей отделяются от имени записи точкой. Например, запись текущей даты можно определить следующим образом:

Type TDate=Record

D:1..31;

M:1..12;

Y:1900..2200;

End;

Здесь D, M и Y определяются диапазонами значений и соответствуют дню, месяцу и году. Теперь определим, например, запись типа анкеты сотрудника:

Type TAnketa=Record

Number:integer; // Порядковый номер

FIO:String[80]; // Фамилия, имя и отчество

DR:TDate; // День рождения

MR:String[50]; // Место рождения

Dolg:String[40]; // Должность

Oklad:Longint; // Оклад

End;

Чтобы не писать каждый раз имя записи и отделять его от поля точкой, можно использовать ключевое слово With с указанием имени записи. Затем в блоке Begin можно работать прямо с полями этой записи. Рассмотрим пример ввода полей записи для массива анкет сотрудников. Будем считать, что приведенные выше типы записей уже определены как глобальные типы. Определим глобальный массив таких записей и текущее число записей. На форме поля записей будут вводиться через элементы TEdit, здесь же будут присутствовать две кнопки – для ввода новой записи и для упорядочения записей по фамилиям сотрудников. Введенные записи будут отображаться в компоненте Memo1, а результат упорядочения – в Memo2:

// Определение глобальных констант и переменных

Const nmax=20; // Максимальное число записей

Var n:integer; // Текущее число записей

Ar:array[1..nmax] of TAnketa; // Массив записей

// Определение обработчиков событий

// Обработчик создания формы

Procedure TForm1.FormCreate(Sender: TObject);

begin

n:=0; // Зануляем число записей

Memo1.Clear; // Очищаем текстовые редакторы

Memo2.Clear;

end;

// Обработчик нажатия кнопки «Добавить запись»

procedure TForm1.Button1Click(Sender: TObject);

begin

Inc(n); // Наращиваем число записей

With Ar[n] do Begin

Number:=StrtoInt(Edit1.Text);

Fio:=Edit2.Text; // Определение текущей записи анкеты

Dr.D:=StrtoInt(Edit3.Text);

Dr.M:=StrtoInt(Edit4.Text);

Dr.Y:=StrtoInt(Edit5.Text);

Mr:=Edit6.Text;

Dolg:=Edit7.Text;

Oklad:=StrtoInt(Edit8.Text);

End;

Memo1.Clear; // Очищаем поле Memo1

For i:=1 to n do With Ar[i] do Begin // Заново выводим все записи в Memo1.

Memo1.Add(’n=’+InttoStr(Number)+’ Fio=’+FIO+’ D=’+InttoStr(Dr.D)+

’ M=’+InttoStr(Dr.M)+’ Y=’+InttoStr(Dr.Y)+’ Mr=’+Mr+’ Dolg=’+Dolg+

’ Oklad=’+InttoStr(Oklad));

end;

end;

// Обработчик нажатия кнопки «Сортировать»

procedure TForm1.Button2Click(Sender: TObject);

Var i,j,imin:Integer; // Внутренние переменные

Rt,Rmin:Tanketa; // Внутренние записи

Begin

// Сортировка записей по фамилии методом последовательного

// поиска минимального значения

For i:=1 to n-1 do do Begin

Rmin:=Ar[i];

Imin:=i;

For j:=i+1 to n do Begin

If Ar[j].FIO

Rmin:=Ar[j];

Imin:=j;

End;

If imin<>I then Begin

Rt:=Ar[i]; // Перестановка imin и i–й записей

Ar[i]:=Rmin;

Ar[imin]:=Rt;

End;

End;

End;

Memo2.Clear; // Вывод массива упорядоченных записей в Memo2

For i:=1 to n do With Ar[i] do Begin

Memo1.Add(’n=’+InttoStr(Number)+’ Fio=’+FIO+’ D=’+InttoStr(Dr.D)+

’ M=’+InttoStr(Dr.M)+’ Y=’+InttoStr(Dr.Y)+’ Mr=’+Mr+’ Dolg=’+Dolg+

’ Oklad=’+InttoStr(Oklad));

end;

end;

end.

Записи могут иметь вариантную часть, которая похожа на оператор Case.

В общем виде такая запись определяется так:

Type тип записи = record

Поле–1: Тип–1;

...

Поле–n: Тип–n;

case переменная условия выбора: перечисляемый тип of

Значение–1: (вариант полей 1);

...

Значение–K: (вариант полей K);

end;

Например, одна и та же память, выделяемая целой переменной длиной 4 байта, может быть разбита на отдельные 4 переменные, каждая из которых занимает в памяти 1 байт:

Type Tvar=(FourByte, OneByte);

Tr=Record

Case Tvar of

FB:Integer;

B1,B2,B3,B4:Byte;

End;

End;

Var R:Tr;

Теперь в программе можно использовать поле R.FB как переменную длиной 4 байта, а можно, например, использовать только младший байт из этой записи – R.B1.