我目前正在尝试在VB6 / COM项目中使用一个标志枚举。 但是,当尝试从枚举中读取值时,我得到的结果不一致。
以下是枚举定义:
Enum Fruits
None = 0
Apple = 1
Strawberry = 2
Lemon = 4
End Enum
我有一个对象,它暴露了Fruits
类型的属性Public Get AvailableFruits as Fruits
应该能够读取该值的代码用于显示/隐藏标签,具体取决于枚举的每个位的值:
lblAppleAvailable.Visible = basket.AvailableFruits And Fruits.Apple
当执行此代码并且我有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
作为副节点,在调试代码时,如果我将表达式放在监视表达式中,我会得到正确的值;但是当我的代码中计算表达式时,它仍然返回True。
我尝试使用不同的检查语法:
(basket.AvailableFruits And Fruits.Apple) = Fruits.Apple
basket.AvailableFruits = 0
时仍然变为真: - (
解决方案
在测试了不同的解决方案之后,我已经能够将问题缩小到COM组件。 此组件的原始编码器将指针设置为0而不是将0作为值返回,这在尝试读取值时导致问题。
由于辅助函数,我选择了FlipScript答案,这似乎是提高代码可读性的好方法。
答案 0 :(得分:8)
要测试标志的值,请使用以下内容:
lblAppleAvailable.Visible = (basket.AvailableFruits And Fruits.Apple) = Fruits.Apple
执行“AND”后,您仍然需要查看结果值是否等于标志值(或者实际上是0以外的任何值)。
您还可以创建一个小辅助函数:
Private Function HasFruitFlag(Check As Fruits, Flag As Fruits) As Boolean
HasFruitFlag (Check And Flag) = Flag
End Function
你可以这样称呼它:
lblAppleAvailable.Visible = HasFruitFlag(basket.AvailableFruits, Fruits.Apple)
答案 1 :(得分:0)
尝试使用本地var
Dim LocalFruits As Fruits
LocalFruits = basket.AvailableFruits
Debug.Print (LocalFruits And Apple) <> 0
Debug.Print (LocalFruits And Strawberry) <> 0
Debug.Print (LocalFruits And Lemon) <> 0
此外,您可能希望使用枚举较少的错误声明,如此
Enum Fruits
Apple = 2 ^ 0
Strawberry = 2 ^ 1
Lemon = 2 ^ 2
End Enum