Thi*_*ise 7 vb6 enums bitflags
我目前正在尝试在VB6/COM项目中使用一个标志枚举.但是,当尝试从枚举中读取值时,我得到的结果不一致.
这是枚举定义:
Enum Fruits
None = 0
Apple = 1
Strawberry = 2
Lemon = 4
End Enum
Run Code Online (Sandbox Code Playgroud)
我有一个暴露属于Fruits类型属性的对象
Public Get AvailableFruits as Fruits
Run Code Online (Sandbox Code Playgroud)
应该能够读取该值的代码用于显示/隐藏标签,具体取决于枚举的每个位的值:
lblAppleAvailable.Visible = basket.AvailableFruits And Fruits.Apple
Run Code Online (Sandbox Code Playgroud)
当我执行此代码时basket.AvailableFruits = 0,我得到True作为结果.
有什么可能导致这种行为的想法吗?
编辑:
我尝试过枚举的不同值:
basket.AvailableFruits = 0
basket.AvailableFruits And Apple // Returns True
basket.AvailableFruits And Strawberry // Returns True
basket.AvailableFruits And Lemon // Returns False
Run Code Online (Sandbox Code Playgroud)
作为副节点,在调试代码时,如果我将表达式放在监视表达式中,我会得到正确的值; 但是当我的代码中计算表达式时,它仍然返回True.
我尝试使用不同的检查语法:
(basket.AvailableFruits And Fruits.Apple) = Fruits.Apple
Run Code Online (Sandbox Code Playgroud)
仍然是真的时候basket.AvailableFruits = 0:-(
解
在测试了不同的解决方案之后,我已经能够将问题缩小到COM组件.此组件的原始编码器将指针设置为0而不是将0作为值返回,这在尝试读取值时导致问题.
我选择了FlipScript答案因为辅助函数,这似乎是提高代码可读性的好方法.
要测试标志的值,请使用以下内容:
lblAppleAvailable.Visible = (basket.AvailableFruits And Fruits.Apple) = Fruits.Apple
Run Code Online (Sandbox Code Playgroud)
执行"AND"后,您仍然需要查看结果值是否等于标志值(或者除了0以外的任何值).
您还可以创建一个小辅助函数:
Private Function HasFruitFlag(Check As Fruits, Flag As Fruits) As Boolean
HasFruitFlag (Check And Flag) = Flag
End Function
Run Code Online (Sandbox Code Playgroud)
你可以像这样称呼它:
lblAppleAvailable.Visible = HasFruitFlag(basket.AvailableFruits, Fruits.Apple)
Run Code Online (Sandbox Code Playgroud)