首页 > 解决方案 > 按顺序遍历Set

问题描述

对 Delphi 来说相当新,如果这是一个微不足道的问题,请原谅我。

我有以下内容:

TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,
    mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);
TMsgDlgButtons = set of TMsgDlgBtn;

这个循环:

//Buttons is of type TMsgDlgButtons and value is [mbRetry, mbCancel]
for B := Low(TMsgDlgBtn) to High(TMsgDlgBtn) do
   if B in Buttons then
     //Do something with the button B

似乎无论哪个顺序Buttons,它总是mbCancel先处理,然后再处理mbRetry。我看到这是因为顺序,TMsgDlgBtn所以我尝试了这个:

for B in Buttons do
  //Do something with the button B

但它似乎以相同的方式迭代 - 先取消,然后重试。

这是因为Buttons是一套吗?有什么方法可以迭代以Buttons使顺序得到尊重?

标签: delphiset

解决方案


有什么方法可以遍历 Buttons 以便尊重顺序?

不,因为集合不包含集合成员分配到集合的顺序的信息。

解释:

首先,您声明一个枚举类型TMsgDlgBtn. 由于您没有定义任何特定值,因此它们被赋予值 0, 1, 2, 3 ...

然后声明集合类型,TMsgDlgButtons. 对于集合的成员,为每个值保留一位。因此,12 位代表集合中按钮的成员资格。

当您分配Buttons := [mbRetry, mbCancel]这些按钮的相应位时,这些按钮被设置在Buttons集合中。第一个for循环的实现是从最低位到最高位检查成员资格,所以自然会在mbCancelbefore上进行测试mbRetry。第二个for循环的实现可能以相同的顺序完成,从低位到高位。


推荐阅读