7

私は現在、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の回答を選択しました。

4

2 に答える 2

8

フラグの値をテストするには、次のようなものを使用します。

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

「AND」を実行した後でも、結果の値がフラグ値(または実際には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)
于 2011-01-07T16:14:29.030 に答える
0

ローカル変数を使用してみてください

    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
于 2011-01-08T09:37:39.603 に答える