如何设置枚举类型的值?

时间:2013-09-12 19:50:28

标签: delphi delphi-xe freepascal lazarus

我有以下内容:

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

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

property Directions: TDirections read FDirections write FDirections;

我想要的是能够像对待布尔人一样对待它们,例如,如果dirNorth为真,则为1,如果为假,则为0

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

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

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

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

我现在达到了一个困惑状态:(

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

Directions(TDirection(DirNorth)) := True;

3 个答案:

答案 0 :(得分:13)

DirectionsTDirection类型的set元素。

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

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

为确保dirNorth中包含<{1}} ,请执行Directions

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

正式地,Directions := [dirNorth, dirSouth]计算两组union; +计算两组set difference-计算两个操作数的intersection

您还拥有不错的*Include功能:ExcludeInclude(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];

在我的回答中隐含的是,Delphi 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]; 类型是在数学set之后建模的。有关Delphi set类型的更多信息,请参阅the official documentation

答案 1 :(得分:1)

您可以通过以下方式将项目添加到集合中:

Include(Directions, dirNorth);

要从集合中删除它:

Exclude(Diretions, dirNorth);

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

答案 2 :(得分:0)

基于this helper,它不适用于属性,我创建了这个(需要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;