4

我有以下内容:

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)

我想检查一个方向是否为真,我可以使用:

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

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

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

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

Directions(TDirection(DirNorth)) := True;
4

3 回答 3

13

Directions是一类型的元素TDirection

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

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

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

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

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

你也有 niceIncludeExcludefunctions:和;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];

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

于 2013-09-12T19:54:33.760 回答
0

您可以通过执行以下操作将项目添加到集合中:

Include(Directions, dirNorth);

要将其从集合中移除:

Exclude(Diretions, dirNorth);

帮助说明结果与使用加号运算符相同,但代码效率更高。

于 2013-09-12T20:01:57.333 回答
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;
于 2018-05-09T12:17:39.640 回答