我有以下内容:
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);
不确定上述内容是否正确,但我的另一个问题是如何将其中一个路线更改为True
或False
?
我现在达到了一个困惑状态:(
这是我尝试设置值的最后一件事,但我得到了非法表达(在Lazarus中)。
Directions(TDirection(DirNorth)) := True;
答案 0 :(得分:13)
Directions
是TDirection
类型的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
功能: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];
在我的回答中隐含的是,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;