Actualmente estoy tratando de usar un bit flag enum en un proyecto VB6/COM. Sin embargo, cuando trato de leer valores de la enumeración, obtengo resultados inconsistentes.Las banderas en VB6 no devuelven un valor correcto
Aquí es la definición de enumeración:
Enum Fruits
None = 0
Apple = 1
Strawberry = 2
Lemon = 4
End Enum
He se utiliza un objeto que expone una propiedad de tipo Frutas
Public Get AvailableFruits as Fruits
El código que debe ser capaz de leer el valor de mostrar/ocultar una etiqueta en función de los valores de cada bit de la enumeración:
lblAppleAvailable.Visible = basket.AvailableFruits And Fruits.Apple
Cuando este código se ejecuta y tengo basket.AvailableFruits = 0
, me pongo verdadero como resultado.
¿Alguna idea de qué podría causar este comportamiento?
Editar:
He tratado con los diferentes valores de la enumeración:
basket.AvailableFruits = 0
basket.AvailableFruits And Apple // Returns True
basket.AvailableFruits And Strawberry // Returns True
basket.AvailableFruits And Lemon // Returns False
Como un nodo lado, al depurar el código, Si pongo la expresión en una expresión de inspección, recibo el valor correcto; pero cuando la expresión se evalúa en mi código, aún devuelve True.
He intentado utilizar una sintaxis diferente cheque:
(basket.AvailableFruits And Fruits.Apple) = Fruits.Apple
Aún así conseguir True cuando basket.AvailableFruits = 0
:-(
Solución
Después de haber probado diferentes soluciones, que han sido capaces de reducir el problema para el componente COM. El codificador original de este componente tenía un puntero establecido en 0 en lugar de devolver 0 como un valor, lo que causaba p problema al tratar de leer el valor.
He seleccionado la respuesta FlipScript debido a la función auxiliar que parece ser un buen consejo para mejorar la legibilidad del código.
¿Cuál es su código para 'basket.AvailableFruits'? – LittleBobbyTables
@LBT: no tengo acceso al código real de la propiedad, es parte de un objeto COM codificado en C++. –
Entonces, cuando AvailableFruits = 0, entonces en el caso de Apple (0 AND 1) = ¿Verdadero? Sin embargo, en el caso de limón (0 y 4) = ¿Falso? Hmmm ... Puede que haya algo más que una verificación de bitfield aquí ... – Flipster