Описание |
Ключевое слово Record один из самых полезных, и отличительных особенностей Delphi (и языка Паскаля). Оно обеспечивает средство сбора в одну структуру набора различных типов данных.
На каждое поле в записи ссылаются следующим способом record.field.
Когда объявлено, опция Packed, Delphi минимизирует память, отведенную под запись. Эти сокращения в памяти повлиять на выполнение, где данные не выстроены, соответственно, по 2, 4 или 8 байт. По умолчанию должно выровняться, где необходимо, с заполнителями.
Есть два основных типа полей записи, как показано в двух синтаксических типах:
1. Простое объявление поля
Это стандартные объявления переменных Delphi, типа:
size : Integer;
за исключением того, что их размер должен быть определен. Например:
description : string[20];
потому, что Delphi должен знать точный объём памяти необходимый этому полю в записи.
2. Выбираемые (Различные) разделы поля
Они должны всегда следовать за любыми основными объявлениями полей (ключевое слово Case не имеет закончившего слова End;).
Они позволяют различным, альтернативным типам данных заменять друг друга. Например, запись пациента может иметь различный раздел объявлений для женщин по сравнению с мужчинами. Использование той же самой записи с Variant частью является разумнее.
По умолчанию, поля в записи выравниваются по Byte и Word границам. Для обоих типов записи, опция packed позволяет ей быть изменённой, чтобы уменьшить требуемый объём памяти.
|
|
Примечания |
C использованием ключевого слова With, к полям записи можно обращаться без указания префикса каждый раз с названием поля.
В отличие от Объектно-ориентированных языков подобно Java, Тип Record в Delphi обеспечивает лучший механизм выполнения для передачи подобных групп данных чем классы данных.
|
|
Похожие команды |
Case Механизм для действия в зависимости от различных значений Порядковых
Packed Уплотняет сложные типы данных в минимальный объём памяти
With Средство упрощения ссылок к структурированным переменным
| |
|
Пример кода : Стандартное определение записи |
type // Объявление записи клиента
TCustomer = Record
firstName : string[20];
lastName : string[20];
address1 : string[100];
address2 : string[100];
address3 : string[100];
city : string[20];
postCode : string[8];
end;
var
John, Sarah : TCustomer;
begin // Присвоение подробностей
клиенту Джону
with John do
begin
firstName := 'John';
lastName := 'Smith';
address1 := '7 Park Drive';
address2 := 'Branston';
address3 := 'Grimworth';
city := 'Banmore';
postCode := 'BNM 1AB';
end;
// Присвоение подробностей о сестре
Джона - просто копирование целой записи
Sarah := John;
// И затем изменение имени
Sarah.firstName := 'Sarah';
// Теперь показ подробностей обоих
клиентов
with John do ShowCustomer([firstName, lastName,
address1, address2, address3,city,
postCode]);
ShowMessage('');
with Sarah do ShowCustomer([firstName, lastName,
address1, address2, address3,city,
postCode]);
end;
// Процедура, которая отображает переменное число
строк
procedure TForm1.ShowCustomer(const fields: array of string);
var
i : Integer;
begin // Отображение всех переданных
полей - примечание: массивы начинаются с 0
for i := 0 to Length(fields)-1 do
ShowMessage(fields[i]);
end;
|
John
Smith
7 Park Drive
Branston
Grimworth
Banmore
BNM 1AB
Sarah
Smith
7 Park Drive
Branston
Grimworth
Banmore
BNM 1AB
|
|
| Пример кода : Определение записи с секцией Case (Variant) |
type // Объявление записи плода
используя case, чтобы выбрать //
диаметр окружности плода, или иначе длины и высоты.
TFruit = Record
name : string[20]; Case isRound : Boolean of //
Выберите, как отобразить следующий раздел
True : (diameter : Single); //
Отображение той же самой памяти как длина
False : (length : Single; //
Отображение той же самой памяти как диаметр
width : Single);
end;
var
apple, banana, fruit : TFruit;
begin // Установка яблока как
окружности, с соответствующими измерениями
apple.name := 'Apple';
apple.isRound := True;
apple.diameter := 3.2;
// Установка банан как длинный, с
соответствующими измерениями
banana.name := 'Banana';
banana.isRound := False;
banana.length := 7.65;
banana.width := 1.3;
// Показ атрибутов яблока
fruit := apple;
if fruit.isRound
then ShowMessage('Диаметр '+fruit.name +' = '+
FloatToStrF(fruit.diameter, ffFixed, 2, 1)+'"')
else ShowMessage('Длина '+fruit.name +' = '+
FloatToStrF(fruit.length, ffFixed, 2, 1)+' ширина = '+
FloatToStrF(fruit.width, ffFixed, 2, 1)+'"');
// Показ атрибутов банана
fruit := banana;
if fruit.isRound
then ShowMessage(fruit.name +' диаметр = '+
FloatToStrF(fruit.diameter, ffFixed, 2, 1)+'"')
else ShowMessage(fruit.name +' length = '+
FloatToStrF(fruit.length, ffFixed,
2, 1)+'" ширина = '+
FloatToStrF(fruit.width, ffFixed, 2, 1)+'"');
end;
|
Диаметр Apple = 3.2"
Длина Banana = 7.7" Ширина = 1.3"
|
|