我有以下几点:
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);
不确定以上是否正确,但是我的另一个问题是如何将方向之一更改为
True
或 False
?我现在已经达到了我的困惑状态之一:(
这是我尝试设置该值的最后一件事,但我收到了非法表达式(在 Lazarus 中)。
Directions(TDirection(DirNorth)) := True;
最佳答案
Directions
是 TDirection
类型元素的 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。
你还有很好的 Include
和 Exclude
函数: 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/