7

我目前正在尝试在 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 作为结果。

知道什么可能导致这种行为吗?

编辑 :

我尝试过使用 enum 的不同值:

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 答案,是因为辅助函数似乎是提高代码可读性的一个好技巧。

4

2 回答 2

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)
于 2011-01-07T16:14:29.030 回答
0

尝试使用本地变量

    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
于 2011-01-08T09:37:39.603 回答