В настоящее время я пытаюсь использовать перечисление битового флага в проекте 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 из-за вспомогательной функции, которая кажется хорошим советом для улучшения читаемости кода.
basket.AvailableFruits
? - person LittleBobbyTables - Au Revoir   schedule 07.01.2011basket.AvailableFruits = 0
, поскольку 0 не является значением для перечисленияFruits
? - person Brian Hooper   schedule 10.01.2011