Difference between revisions of "Set/ru"
(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 | + | С помощью [[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 |