如何设置枚举类型的值?

4 delphi freepascal lazarus delphi-xe

我有以下内容:

TDirection = (dirNorth, dirEast, dirSouth, dirWest);
TDirections = set of TDirection;
Run Code Online (Sandbox Code Playgroud)

在一个单独的类中,我将它声明为属性:

property Directions: TDirections read FDirections write FDirections;
Run Code Online (Sandbox Code Playgroud)

我想要的是能够像对待布尔人一样对待它们,所以例如如果dirNorth是真的那么它将是1,如果是假的话0.

我想把它想象成 (1,0,0,0)

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

var
  IsTrue: Boolean;
begin
  IsTrue := (DirNorth in Directions);
Run Code Online (Sandbox Code Playgroud)

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

我现在达到了我的一个混乱状态:(

这是我尝试设置值的最后一件事,但我得到的是Illegal Expression(在Lazarus中).

Directions(TDirection(DirNorth)) := True;
Run Code Online (Sandbox Code Playgroud)

And*_*and 13

Directions是一类型的元素TDirection.

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

为确保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];
Run Code Online (Sandbox Code Playgroud)

然后

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];
Run Code Online (Sandbox Code Playgroud)

在我的回答中隐含的事实是Delphi set类型是在数学之后建模的.有关Delphi set类型的更多信息,请参阅官方文档.

  • 请注意,您不能在属性上使用`Include`和`Exclude` - 它会给出一个`[DCC Error] XXXX.pas(200):E2064左侧无法分配给`错误,你必须使用`PropName + [元件(一个或多个)` (4认同)