Sign in Join
Wiki copytemporary

Revision 2 of 2, by Zoltanleo on 2-16-2021. The page as it is now.

Set/ru

Введение

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

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

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

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

pascal
TPossibleSpeeds = set of TSpeed

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

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

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

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

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

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

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

pascal
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 можно также проверить, принадлежит ли значение множеству. Обычно оно используется следующим образом:

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

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

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

pascal
(*
      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


From the Free Pascal wiki, page "Set/ru", as the Internet Archive kept it on 2024-11-25, last changed on 2021-02-17. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.