Sign in Join
Wiki copytemporary

Set/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Set/ru

OldNewLine
1+## Введение
2+
3+**Set** представляет собой множество элементов из перечисленного набора значений и является порядковым типом.
4+
5+В качестве примера рассмотрим следующее перечисление:
6+
7+``` pascal
8+ TSpeed = (spVerySlow,spSlow,spAVerage,spFast,spVeryFast);
9+```
10+
11+И такое множество:
12+
13+``` pascal
14+ TPossibleSpeeds = set of TSpeed
15+```
16+
17+Значения множества TPossibleSpeeds могут быть определены с помощью скобок для перечисления элементов:
18+
19+``` pascal
20+ const
21+ RatherSlow = [spVerySlow,spSlow];
22+ RatherFast = [spFast,spVeryFast];
23+```
24+
25+*RatherSlow* и *RatherFast* представляют некоторое множество из *TSpeed*.
26+
27+## Операции над множествами
28+
29+В [[System unit/ru|модуле System]] библиотеки [[RTL/ru|RTL]] определены две функции, использующиеся для операций над множествами: [[Include/ru|Include]](ASet,AValue) и [[Exclude/ru|Exclude]](ASet,AValue).
30+
31+``` pascal
32+ var
33+ SomeSpeeds: TPossibleSpeeds;
34+ begin
35+ SomeSpeeds := [];
36+ Include(SomeSpeeds,spVerySlow);
37+ Include(SomeSpeeds,spVeryFast);
38+ end;
39+```
40+
41+Множествами нельзя управлять напрямую, если они находятся в разделе *published*. Обычно в этом случае вам необходимо создать локальную копию, изменить её значение и затем вызвать *setter*.
42+
43+``` pascal
44+ procedure TSomething.DoSomething(Sender: TFarObject);
45+ var
46+ LocalCopy: TPossibleSpeeds;
47+ begin
48+ LocalCopy := Sender.PossibleSpeeds; // getter to local
49+ Include(LocalCopy,spVerySlow);
50+ Sender.PossibleSpeeds := LocalCopy; // local to setter.
51+ end;
52+```
53+
54+С помощью [[Keyword/ru|ключевого слова]] **[[In|in]]** можно также проверить, принадлежит ли значение множеству. Обычно оно используется следующим образом:
55+
56+``` pascal
57+ var
58+ CanBeSlow: Boolean;
59+ const
60+ SomeSpeeds = [Low(TSpeed)..High(TSpeed)];
61+ begin
62+ CanBeSlow := (spVerySlow in SomeSpeeds) or (spSlow in SomeSpeeds);
63+ end;
64+```
65+
66+## Битовые маски
67+
68+Множества могут использоваться для создания битовых масок, как показано в следующем примере.
69+
70+``` pascal
71+(*
72+ FLAG_A = 1; // 1 shl 0
73+ FLAG_B = 2; // 1 shl 1
74+ FLAG_C = 4; // 1 shl 2
75+*)
76+
77+type
78+ TFlag = (FLAG_A, FLAG_B, FLAG_C);
79+ TFlags = set of TFlag;
80+
81+var
82+ Flags: TFlags;
83+
84+[..]
85+ Flags:= [FLAG_A, FLAG_C];
86+ if FLAG_A in Flags then .. // проверяет, установлен ли FLAG_A в переменной Flags
87+```
88+
89+---
90+*From the Free Pascal wiki, page "Set/ru", as it stood on 2021-02-16 after a change by Zoltanleo, out of the wiki's dump of 2024-05-26. 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](/wiki-contact).*

Back to history