Delphi справочник - Форум программистов - Навигация  
 A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z      По первой букве  
System     SysUtils     StrUtils     DateUtils     FileCtrl     ConvUtils     StdConvs     Math     Classes     Dialogs     Types     Variants    ПО Unit   Compiler directives     Directives     Keywords     Types     Variables     Constants     Functions     Procedures    По категории  


Основы Delphi
Record
Ключевое слово
Структурный тип данных содержащий поля данных unit
  
1 type Name = {packed} Record
  Declarations ...
end;

2 type Name = {packed} record
type Name = {packed} record
    Declarations ...
      case {Tag :} Ordinal type of
        Ordinal value {,Ordinal value...} : (Declarations);
        {...}
end;
Описание
Ключевое слово 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"
 



© Форум Delphi   |  Блог программистов   |  Создание и продвижение сайтов - "Веб сателлит"  |  Ссылки   |  Английская версия