VB6中的标志不返回正确的值

时间:2011-01-07 16:08:06

标签: vb6 enums bitflags

我目前正在尝试在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答案,这似乎是提高代码可读性的好方法。

2 个答案:

答案 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