Set/ru
Deutsch · English · Français · Suomi · Русский
Введение
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 в переменной FlagsFrom 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.
Talk about this page
Nobody has opened a bench for this page yet. Sign in to open one.
