2011-01-07 7 views
6

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.

+0

¿Cuál es su código para 'basket.AvailableFruits'? – LittleBobbyTables

+0

@LBT: no tengo acceso al código real de la propiedad, es parte de un objeto COM codificado en C++. –

+0

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

Respuesta

7

para probar el valor de la bandera, usar algo como esto:

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

Después de hacer la "Y", que todavía tienen que ver si el valor resultante es igual al valor de la bandera (o que no sea nada 0, realmente).

También puede crear un poco de función auxiliar:

Private Function HasFruitFlag(Check As Fruits, Flag As Fruits) As Boolean 
    HasFruitFlag (Check And Flag) = Flag 
End Function 

Y se le puede llamar así:

lblAppleAvailable.Visible = HasFruitFlag(basket.AvailableFruits, Fruits.Apple) 
+0

+1 esto es correcto. Me acabas de ganar para publicar lo mismo. –

+0

Intenté compare el valor resultante con 0 (((cesta.Frutas y frutas disponibles.Apple) <> 0), pero sin éxito. Sin embargo, probaré tu método. –

+0

Creo que esto está mal. En el código original, VB6 forzará implícitamente el resultado entero de la operación Y a nivel de bit a un Booleano. Cero se convertirá en False, y cualquier valor que no sea cero se convertirá en True. Este cambio de código no alterará el resultado de la expresión. – MarkJ

0

intentar usar un 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 

Además, podría querer usar una declaración menos propensa a errores de la enumeración como esta

Enum Fruits 
    Apple = 2^0 
    Strawberry = 2^1 
    Lemon = 2^2 
End Enum 
Cuestiones relacionadas