Set/ru

From Free Pascal wiki

Deutsch (de) English (en) suomi (fi) français (fr) русский (ru)

Введение

Set представляет собой множество элементов из перечисленного набора значений и является порядковым типом.

В качестве примера рассмотрим следующее перечисление:

  TSpeed = (spVerySlow,spSlow,spAVerage,spFast,spVeryFast);

И такое множество:

  TPossibleSpeeds = set of TSpeed

Значения множества TPossibleSpeeds могут быть определены с помощью скобок для перечисления элементов:

  const
    RatherSlow = [spVerySlow,spSlow];
    RatherFast = [spFast,spVeryFast];

RatherSlow и RatherFast представляют некоторое множество из TSpeed.

Операции над множествами

В модуле System библиотеки RTL определены две функции, использующиеся для операций над множествами: Include(ASet,AValue) и Exclude(ASet,AValue).

  var
    SomeSpeeds: TPossibleSpeeds;
  begin
    SomeSpeeds := [];
    Include(SomeSpeeds,spVerySlow);
    Include(SomeSpeeds,spVeryFast);
  end;

Множествами нельзя управлять напрямую, если они находятся в разделе published. Обычно в этом случае вам необходимо создать локальную копию, изменить её значение и затем вызвать setter.

  procedure TSomething.DoSomething(Sender: TFarObject);
  var
    LocalCopy: TPossibleSpeeds;
  begin
    LocalCopy := Sender.PossibleSpeeds; // getter to local
    Include(LocalCopy,spVerySlow);
    Sender.PossibleSpeeds := LocalCopy; // local to setter.
  end;

С помощью ключевого слова In можно также проверить, принадлежит ли значение множеству. Обычно оно используется следующим образом:

  var
    CanBeSlow: Boolean;
  const
    SomeSpeeds = [Low(TSpeed)..High(TSpeed)];
  begin
    CanBeSlow := (spVerySlow in SomeSpeeds) or (spSlow in SomeSpeeds);
  end;

Битовые маски

Множества могут использоваться для создания битовых масок, как показано в следующем примере.

(*
  FLAG_A = 1;  // 1 shl 0
  FLAG_B = 2;  // 1 shl 1
  FLAG_C = 4;  // 1 shl 2 
*)

type
  TFlag = (FLAG_A, FLAG_B, FLAG_C);
  TFlags = set of TFlag;

var
  Flags: TFlags;

[..]
  Flags:= [FLAG_A, FLAG_C];
  if FLAG_A in Flags then ..  // проверяет, установлен ли FLAG_A в переменной Flags
Типы данных
Простые типы Boolean | Byte | Cardinal | Char | Currency | Extended | Int64 | Integer | Longint | Pointer | Real | Shortint | Smallint | Word
Сложные типы Array | Class | Record | Set | String | Shortstring