Difference between revisions of "Set/ru"

From Lazarus wiki
Jump to navigationJump to search
(Created page with "{{Set}} == Введение == '''Set''' представляет собой множество элементов из перечисленного набора значе...")
 
 
(One intermediate revision by one other user not shown)
Line 7: Line 7:
 
В качестве примера рассмотрим следующее перечисление:
 
В качестве примера рассмотрим следующее перечисление:
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
   TSpeed = (spVerySlow,spSlow,spAVerage,spFast,spVeryFast);  
 
   TSpeed = (spVerySlow,spSlow,spAVerage,spFast,spVeryFast);  
 
</syntaxhighlight>
 
</syntaxhighlight>
Line 13: Line 13:
 
И такое множество:
 
И такое множество:
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
   TPossibleSpeeds = set of TSpeed
 
   TPossibleSpeeds = set of TSpeed
 
</syntaxhighlight>
 
</syntaxhighlight>
Line 19: Line 19:
 
Значения множества TPossibleSpeeds могут быть определены с помощью скобок для перечисления элементов:
 
Значения множества TPossibleSpeeds могут быть определены с помощью скобок для перечисления элементов:
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
   const
 
   const
 
     RatherSlow = [spVerySlow,spSlow];
 
     RatherSlow = [spVerySlow,spSlow];
Line 31: Line 31:
 
В [[System unit/ru|модуле System]] библиотеки [[RTL/ru|RTL]] определены две функции, использующиеся для операций над множествами: [[Include/ru|Include]](ASet,AValue) и  [[Exclude/ru|Exclude]](ASet,AValue).
 
В [[System unit/ru|модуле System]] библиотеки [[RTL/ru|RTL]] определены две функции, использующиеся для операций над множествами: [[Include/ru|Include]](ASet,AValue) и  [[Exclude/ru|Exclude]](ASet,AValue).
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
   var
 
   var
 
     SomeSpeeds: TPossibleSpeeds;
 
     SomeSpeeds: TPossibleSpeeds;
Line 43: Line 43:
 
Множествами нельзя управлять напрямую, если они находятся в разделе ''published''. Обычно в этом случае вам необходимо создать локальную копию, изменить её значение и затем вызвать ''setter''.
 
Множествами нельзя управлять напрямую, если они находятся в разделе ''published''. Обычно в этом случае вам необходимо создать локальную копию, изменить её значение и затем вызвать ''setter''.
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
   procedure TSomething.DoSomething(Sender: TFarObject);
 
   procedure TSomething.DoSomething(Sender: TFarObject);
 
   var
 
   var
Line 54: Line 54:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
С помощью [[Keyword/ru|ключевого слова]] '''[[In/ru|In]]''' можно также проверить, принадлежит ли значение множеству. Обычно оно используется следующим образом:
+
С помощью [[Keyword/ru|ключевого слова]] '''[[In|in]]''' можно также проверить, принадлежит ли значение множеству. Обычно оно используется следующим образом:
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
   var
 
   var
 
     CanBeSlow: Boolean;
 
     CanBeSlow: Boolean;
Line 70: Line 70:
 
Множества могут использоваться для создания битовых масок, как показано в следующем примере.
 
Множества могут использоваться для создания битовых масок, как показано в следующем примере.
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
(*
 
(*
 
   FLAG_A = 1;  // 1 shl 0
 
   FLAG_A = 1;  // 1 shl 0

Latest revision as of 01:04, 17 February 2021

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