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
使顺序得到尊重?
解决方案
有什么方法可以遍历 Buttons 以便尊重顺序?
不,因为集合不包含集合成员分配到集合的顺序的信息。
解释:
首先,您声明一个枚举类型TMsgDlgBtn
. 由于您没有定义任何特定值,因此它们被赋予值 0, 1, 2, 3 ...
然后声明集合类型,TMsgDlgButtons
. 对于集合的成员,为每个值保留一位。因此,12 位代表集合中按钮的成员资格。
当您分配Buttons := [mbRetry, mbCancel]
这些按钮的相应位时,这些按钮被设置在Buttons
集合中。第一个for
循环的实现是从最低位到最高位检查成员资格,所以自然会在mbCancel
before上进行测试mbRetry
。第二个for
循环的实现可能以相同的顺序完成,从低位到高位。
推荐阅读
- python - Flask 扩展、上下文和 Neo4j
- java - 传输文件
- yii2 - 在 Yii2 中上传文件(word、pdf、excel)?
- mongodb - 在猫鼬承诺之间传递数据?
- javascript - 参考错误:未定义响应AngularJs
- python - 如何从 QLineEdit 继承 returnPressed() 到 QPlainTextEdit
- ruby - 为什么我的 Ruby 脚本中的 shell 变量不可见?
- c++ - 符号 y 无法解析
- javascript - 将cookie设置为菜单jquery
- azure-devops - 使用 VSTS 的 Fastlane 发布到 TestFlight