依次遍历Set

时间:2019-11-14 18:15:19

标签: delphi 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从而遵守顺序吗?

1 个答案:

答案 0 :(得分:3)

  

是否有任何方法可以遍历Button,从而遵守顺序?

否,因为集合不包含集合成员的信息,集合成员以什么顺序分配给集合。

说明:

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

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

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