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
从而遵守顺序吗?
答案 0 :(得分:3)
是否有任何方法可以遍历Button,从而遵守顺序?
否,因为集合不包含集合成员的信息,集合成员以什么顺序分配给集合。
说明:
首先,您声明一个枚举类型TMsgDlgBtn
。由于您没有定义任何特定值,因此给它们指定了值0、1、2、3 ...
然后声明集合类型TMsgDlgButtons
。对于集合的成员,每个值保留一位。因此,12位代表集合中按钮的成员身份。
当您分配Buttons := [mbRetry, mbCancel]
时,这些按钮的相应位将在Buttons
集中进行设置。第一个for
循环的实现从最低位到最高位检查成员资格,因此自然在mbCancel
之前对mbRetry
进行测试。第二个for
循环的实现可能以相同的顺序完成,从低位到高位。