依次遍历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从而遵守顺序吗?

fwangeling 回答:依次遍历Set

  

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

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

说明:

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

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

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

本文链接:https://www.f2er.com/3100182.html

大家都在问