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"
 



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