Delphi 如何知道集合中特定值的索引

Delphi 如何知道集合中特定值的索引,delphi,Delphi,我有以下代码: TAPPUGroup = (APP_UG_USERS, APP_UG_SUPER_USERS, APP_UG_ADMINS); TAPPUGroups = set of TAPPUGroup; TAppUser = record UID: integer; UName: string; UGroup: TAPPUGROUPS; end; ... LoggedUser: TAppUser; 我使

我有以下代码:

    TAPPUGroup = (APP_UG_USERS, APP_UG_SUPER_USERS, APP_UG_ADMINS);
    TAPPUGroups = set of TAPPUGroup;

    TAppUser = record
        UID: integer;
        UName: string;
        UGroup: TAPPUGROUPS;

    end;

...
LoggedUser: TAppUser;
我使用了
include
将组添加到LoggedUser.UGroup,现在我如何知道TAPPUGroup中特定值的索引,例如如果LoggedUser.UGroup中包含APP_UG_SUPER_用户,我如何在TAPPUGroup中获取其索引


示例:如果LoggedUser.UGroup=APP\u UG\u SUPER\u用户,那么我想返回1,如果LoggedUser.UGroup=APP\u UG\u管理员,我想返回2,依此类推。

如果你真的想要枚举中给定枚举项的索引,那么你只需要使用Ord()

另一方面,可以使用枚举名称,因为它是一个函数:

AGroup := TAPPUGroup(1);
无论如何,Ord()是在连续枚举声明中查找给定枚举值(如APP_UG_用户)的索引的方式。为了找出一个特定的集合实例是否包含一个给定的集合元素,你可以使用Remy显示的“if xxx in…”结构,例如

if APP_UG_USERS in MySet then  ...
你也可以这样做

var 
  AValue : TAPPUGroup;
  MySet : TAPPUGroups ;

for AValue:= Low(TAPPUGroup) to High(TAPPUGroup) do
  if AValue in MySet then ...

你不需要索引。要知道集合中是否存在值,请使用
in
运算符:

if APP_UG_SUPER_USERS in LoggedUser.UGroup then

你是在问Ord()?@MartynA是的等等。。。当我使用I:=ord(LoggedUser.UGroup)时,我得到了不兼容的类型;其中i是整数。我该怎么办?我不明白这个问题。也许您可以通过一些示例来定义索引的含义。您的示例无效,因为
UGroup
是一个集合。我认为你不完全理解集合是什么。如果你只存储一个值,就不要使用集合。使用枚举类型。我需要索引与数据库中的值进行比较。例如,如果table1.fieldbyname('ugroup').asinteger=1,则……索引没有意义。它是枚举值如何存储在集合位中的实现细节。在这种情况下,这不是你真正想要的。如果
ugroup
DB字段一次只能保存一个值,则直接将其与枚举值进行比较:
If Table1.FieldByName('ugroup')。AsInteger=APP\u UG\u SUPER\u user然后
。但如果该字段可以容纳多个值,则需要为值定义位掩码,而不是枚举:
const-APP\u-UG\u-USERS=1;APP_UG_SUPER_用户=2;APP_UG_ADMINS=4。。。如果(表1.FieldByName(@ugroup').AsInteger和APP_UG_SUPER_用户)为0,则
。如果您绝对希望在集合中使用枚举,则使用类似以下内容:
PByte(@LoggedUser.ugroup)^:=表1.FieldByName('ugroup').AsInteger;如果在LoggedUser.UGroup中有APP_UG_SUPER_用户,则
。集合是压缩的,其中声明用于保存集合声明中枚举值数量的集合指示集合使用的位数,四舍五入为8的偶数倍。因此14个值是16位,即一个
Word
,所以在强制转换时使用
PWord
Query1.ParamByName('ugroup')。AsInteger:=PWord(@LoggedUser.ugroup)^我不建议依赖集合的内部位表示。显式查询集合以获得所需的值,并根据需要构建合适的整数:
var-Groups:integer;组:=0;如果在LoggedUser.UGroup中有APP_UG_SUPER_用户,则组:=组+。。。Query1.ParamByName('ugroup')。AsInteger:=组让我们来看看。如果我使用
ord(LoggedUser.UGroup)
我会得到不兼容的类型错误,我想这是因为UGroup是一个集合。Ord()处理(除其他外)枚举的单个元素,但不处理它们的集合-Ord()在该上下文中毫无意义。如果我将单个值存储在LoggedUser.UGroup中,有没有方法将Ord()与LoggedUser.UGroup一起使用?没有,因为包含单个值的集合仍然是编译器的集合,而Ord()因为它与集合一起工作。等一下,给我两分钟,我会在我的答案上加一点,这可能会有所帮助。谢谢Martyna,看来循环是获得我想要的东西的唯一途径。