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

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答案因为辅助函数,这似乎是提高代码可读性的好方法.

Fli*_*ter 8

要测试标志的值,请使用以下内容:

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)