如何设置枚举类型的值?

5

我有以下内容:

TDirection = (dirNorth, dirEast, dirSouth, dirWest);
TDirections = set of TDirection;

在另一个类中,我将其声明为属性:

property Directions: TDirections read FDirections write FDirections;

我希望能够将它们视为布尔值,例如如果dirNorth为True,则应为1,如果为False,则应为0

我试图将其想象为(1,0,0,0)

我认为要检查方向是否为True,可以使用:

var
  IsTrue: Boolean;
begin
  IsTrue := (DirNorth in Directions);

不确定上述内容是否正确,但我的另一个问题是如何将其中一个方向更改为TrueFalse

我现在陷入了困惑状态 :(

这是我尝试设置值的最后一件事,但我得到了非法表达式(在Lazarus中)。

Directions(TDirection(DirNorth)) := True;

2
包含(Directions, dirNorth); - Sertac Akyuz
2
反过来,使用Exclude(Directions, dirNorth);可以将其再次移除。 - Ken White
1
阅读集合的文档。 - David Heffernan
正如Gerry Coll在下面的评论中写道,include/exclude期望一个集合作为变量参数,因此您无法传递一个属性。 - pf1957
3个回答

14

Directions是一个类型为TDirection的元素的集合

要查看它是否包含dirNorth,请执行dirNorth in Directions。使用in运算符的结果是布尔值;当集合Directions包含元素dirNorth时,dirNorth in Directions为true。

要确保dirNorth包含在Directions中,请执行Directions := Directions + [dirNorth]

要确保dirNorth 不包含Directions中,请执行Directions := Directions - [dirNorth]

要将Directions设置为特定值,只需赋值:Directions := [dirNorth, dirSouth]

形式上,+计算两个集合的并集-计算两个集合的差集* 计算两个操作数的交集

您还拥有不错的IncludeExclude函数:Include(Directions, dirNorth)Directions := Directions + [dirNorth]相同;Exclude(Directions, dirNorth)Directions := Directions - [dirNorth]相同。

例如,如果

type
  TAnimal = (aDog, aCat, aRat, aRabbit);
  TAnimalSet = set of TAnimal;
const
  MyAnimals = [aDog, aRat, aRabbit];
  YourAnimals = [aDog, aCat];

然后

aDog in MyAnimals = true;
aCat in MyAnimals = false;
aRat in YourAnimals = false;
aCat in YourAnimals = true;

MyAnimals + YourAnimals = [aDog, aRat, aRabbit, aCat];
MyAnimals - YourAnimals = [aRat, aRabbit];
MyAnimals * YourAnimals = [aDog];

回答中隐含的事实是 Delphi set 类型是基于数学集合模型的。 如需了解有关 Delphi set 类型的更多信息,请参阅官方文档


4
请注意,您不能在属性上使用IncludeExclude - 否则会出现[DCC Error] XXXX.pas(200): E2064 Left side cannot be assigned to错误,您必须使用PropName + [element(s) - Gerry Coll
这些都非常有帮助,但第一句话应该是“没有if/else的情况下不能直接设置集合元素的状态” - 因为这就是问题所在。我认为这真的是一个缺失的功能。据我所知,唯一的改进是编写一个辅助函数,但它无法与属性一起使用,就像Include/Exclude一样。 - maf-soft

1

您可以通过以下方式向集合中添加一个项目:

Include(Directions, dirNorth);

从集合中删除它:
Exclude(Diretions, dirNorth);

帮助文档指出,使用该代码的结果与使用加号运算符相同,但代码更高效。

正如Gerry Coll在上面的评论中所写,include/exclude期望一个作为变量参数的集合,因此您无法传递属性。 - pf1957

0

基于这个帮助程序,它不能用于属性,我创建了这个(需要XE6) - 它可以用于变量属性:

TGridOptionsHelper = record helper for TGridOptions
public
  ///  <summary>Sets a set element based on a Boolean value</summary>
  ///  <example>
  ///    with MyGrid do Options:= Options.SetOption(goEditing, False);
  ///    MyVariable.SetOption(goEditing, True);
  ///  </example>
  function SetOption(GridOption: TGridOption; const Value: Boolean): TGridOptions;
end;

function TGridOptionsHelper.SetOption(
  GridOption: TGridOption; const Value: Boolean): TGridOptions;
begin
  if Value then Include(Self, GridOption) else Exclude(Self, GridOption);
  Result:= Self;
end;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接