我有以下几点:

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

在一个单独的类中,我将它声明为一个属性:
property Directions: TDirections read FDirections write FDirections;

我想要的是能够将它们视为 bool 值,例如,如果 dirNorth 为 True 那么它将是 1 ,如果 False 它将是 0

我想把它想象成 (1,0,0,0)
我想检查一个方向是否为真,我可以使用:
var
  IsTrue: Boolean;
begin
  IsTrue := (DirNorth in Directions);

不确定以上是否正确,但是我的另一个问题是如何将方向之一更改为 TrueFalse

我现在已经达到了我的困惑状态之一:(

这是我尝试设置该值的最后一件事,但我收到了非法表达式(在 Lazarus 中)。
Directions(TDirection(DirNorth)) := True;

最佳答案

DirectionsTDirection 类型元素的 set

要查看它是否为 contains dirNorth ,请执行 dirNorth in Directions 。使用 in 运算符的结果是一个 bool 值;如果集合 dirNorth in Directions 包含元素 Directions ,则 dirNorth 为真。

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

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

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

形式上,+ 计算两个集合的 union- 计算两组的 set difference* 计算两个操作数的 intersection

你还有很好的 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 类型是在数学 set 之后建模的。有关 Delphi set 类型的更多信息,请参阅 the official documentation

关于delphi - 如何设置枚举类型的值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18773163/

10-10 04:50