2011-01-07 44 views
6

Tôi hiện đang cố gắng sử dụng một chút cờ enum trong một dự án VB6/COM. Tuy nhiên, khi cố gắng đọc các giá trị từ enum, tôi nhận được kết quả không phù hợp.Cờ trong VB6 không trả lại giá trị chính xác

Dưới đây là định nghĩa enum:

Enum Fruits 
    None = 0 
    Apple = 1 
    Strawberry = 2 
    Lemon = 4 
End Enum 

Tôi đã một đối tượng mà cho thấy một loại tài sản của Trái cây

Public Get AvailableFruits as Fruits 

Mã này rằng sẽ có thể đọc các giá trị được sử dụng để hiển thị/ẩn nhãn tùy thuộc vào giá trị của từng bit của enum:

lblAppleAvailable.Visible = basket.AvailableFruits And Fruits.Apple 

Khi mã này được thực hiện và tôi có basket.AvailableFruits = 0, tôi nhận được True là kết quả.

Bất kỳ ý tưởng nào về điều gì có thể gây ra hành vi này?

Edit:

Tôi đã thử với các giá trị khác nhau của enum:

basket.AvailableFruits = 0 
basket.AvailableFruits And Apple  // Returns True 
basket.AvailableFruits And Strawberry // Returns True 
basket.AvailableFruits And Lemon  // Returns False 

Là một nút phụ, khi gỡ lỗi mã, Nếu tôi đặt sự biểu hiện trong một biểu thức đồng hồ, tôi nhận được giá trị chính xác; nhưng khi biểu thức được đánh giá trong mã của tôi, nó vẫn trả về True.

tôi đã cố gắng sử dụng một cú pháp kiểm tra khác nhau:

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

Tuy nhận Đúng khi basket.AvailableFruits = 0 :-(

Giải pháp

Sau khi thử nghiệm các giải pháp khác nhau, tôi đã có thể thu hẹp vấn đề cho thành phần COM Bộ mã hóa ban đầu của thành phần này có một con trỏ được đặt thành 0 thay vì trả về 0 làm giá trị, gây ra p khi cố gắng đọc giá trị.

Tôi đã chọn câu trả lời FlipScript vì chức năng trợ giúp có vẻ là mẹo hay để cải thiện khả năng đọc của mã.

+0

Mã của bạn cho 'basket.AvailableFruits' là gì? – LittleBobbyTables

+0

@LBT: Tôi không có quyền truy cập vào mã thực của thuộc tính, nó là một phần của đối tượng COM được mã hóa bằng C++. –

+0

Vì vậy, khi AvailableFruits = 0, sau đó trong trường hợp Apple (0 AND 1) = True? Tuy nhiên, trong trường hợp Lemon (0 AND 4) = False? Hmmm .... Có thể có điều gì đó hơn kiểm tra bitfield đang diễn ra ở đây ... – Flipster

Trả lời

7

Để kiểm tra giá trị của lá cờ, sử dụng một cái gì đó như thế này:

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

Sau khi bạn làm "AND", bạn vẫn cần phải xem nếu giá trị kết quả tương đương với giá trị cờ (hoặc bất cứ điều gì khác hơn 0, thực sự).

Bạn cũng có thể tạo một hàm helper nhỏ:

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

Và bạn có thể gọi nó như thế này:

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

+1 điều này là chính xác, bạn chỉ cần đánh tôi để đăng cùng một thứ. –

+0

Tôi đã cố gắng so sánh giá trị kết quả với 0 (((basket.AvailableFruits And Fruits.Apple) <> 0), nhưng không thành công. Sẽ thử phương pháp của bạn mặc dù. –

+0

Tôi nghĩ điều này là sai. Trong mã ban đầu, VB6 sẽ ngầm nén kết quả số nguyên của bitwise Và thao tác với một Boolean. Số không sẽ được chuyển thành False và mọi giá trị khác 0 sẽ được chuyển thành True. Sự thay đổi mã này sẽ không làm thay đổi kết quả của biểu thức. – MarkJ

0

Hãy thử sử dụng một var địa phương

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 

Ngoài ra, bạn có thể muốn sử dụng tuyên bố ít bị lỗi hơn của enum như thế này

Enum Fruits 
    Apple = 2^0 
    Strawberry = 2^1 
    Lemon = 2^2 
End Enum 
Các vấn đề liên quan