Флаги в VB6 не возвращают правильное значение - PullRequest
7 голосов
/ 07 января 2011

В настоящее время я пытаюсь использовать перечисление битового флага в проекте 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

Все еще получая True, когда basket.AvailableFruits = 0: - (

Решение

После тестирования различных решений я смог сузить проблему до компонента COM. В исходном кодере этого компонента указатель был установлен на 0 вместовозвращая 0 в качестве значения, которое вызвало проблему при попытке прочитать значение.

Я выбрал ответ FlipScript из-за вспомогательной функции, которая кажется хорошим советом для улучшения читабельности кода.

Ответы [ 2 ]

8 голосов
/ 07 января 2011

Чтобы проверить значение флага, используйте что-то вроде этого:

lblAppleAvailable.Visible = (basket.AvailableFruits And Fruits.Apple) = Fruits.Apple

После того, как вы выполнили «И», вам все еще нужно посмотреть, равно ли полученное значение значению флага (или что-либо, кроме 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)
0 голосов
/ 08 января 2011

Попробуйте использовать локальную переменную

    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
...