Verständnissfrage Select Case .. Or ..

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Verständnissfrage Select Case .. Or ..

    Hallo zusammen, ich habe eine Frage zu einem Select Case, welches mir grade den letzten Nerv geraubt hat :P

    Ich habe folgenden Code:

    VB.NET-Quellcode

    1. Select Case GetStatus.BatteryFlag
    2. Case BatteryFlag.NoSystemBattery Or BatteryFlag.Unknown
    3. Me.Text = "no battery " & GetStatus.BatteryFlag
    4. Case Else
    5. Me.Text = "battery " & GetStatus.BatteryFlag
    6. End Select


    Welcher mir an einem Desktoprechner ohne Batterie ein "battery" rausschmeist, obwohl der Flag richtig erkanngt wurde (128)

    VB.NET-Quellcode

    1. Public Enum BatteryFlag As Byte
    2. High = 1
    3. Low = 2
    4. Critical = 4
    5. Charging = 8
    6. NoSystemBattery = 128
    7. Unknown = 255
    8. End Enum


    Jetzt kommts, änder ich das Select Case von OR zu AND, springt das Programm in den richtigen Case Block und gibt auch die richtige Meldung aus.
    An dieser Stelle bin ich ein wenig verwirrt :S

    Verwende ich das Select Case irgendwie falsch? Änder ich das ganze in ein If ... or ... then ... else... dann funktioniert es ..

    VB.NET-Quellcode

    1. If GetStatus.BatteryFlag = BatteryFlag.NoSystemBattery Or GetStatus.BatteryFlag = BatteryFlag.Unknown Then
    2. Me.Text = "no battery " & GetStatus.BatteryFlag
    3. End If


    gruß

    Edit: And zu Or in If Clause

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „YEE“ ()

    Das ist ein Flag, die Überprüfung muss per Verundung stattfinden:

    VB.NET-Quellcode

    1. If (GetStatus.BatteryFlag And BatteryFlag.NoSystemBattery) <> 0 Then
    2. ...

    wobei unknown in jedem Fall True ist.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Es würde auch reichen nicht Or sondern einfach ein Komma zu verwenden:

    VB.NET-Quellcode

    1. ​Select Case GetStatus.BatteryFlag
    2. Case BatteryFlag.NoSystemBattery, BatteryFlag.Unknown
    3. Me.Text = "no battery " & GetStatus.BatteryFlag
    4. Case Else
    5. Me.Text = "battery " & GetStatus.BatteryFlag
    6. End Select


    falls du es abfragen willst wie @jvbsl gezeigt hat, musst du dein Enum mit dem <Flags> Attribut versehen.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    YEE schrieb:

    VB.NET-Quellcode

    1. Case BatteryFlag.NoSystemBattery Or BatteryFlag.Unknown
    ist gleichbedeutend mit

    VB.NET-Quellcode

    1. Case BatteryFlag.Unknown
    , da bei BatteryFlag.Unknown alle genutzten Bits gesetzt sind.
    Gib Unknown ggf. den Wert 256.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    es ist also kein Select-Problem, sondern ein Problem des Verständnisses bei bitweiser Verknüpfung von Enums.
    Wenn dir das garnix sagt, google "Net Enum bitweise Verknüpfung" - vlt. findeste Tuts dazu - hoffentlich ein gutes. Vermeide dabei utube-Tuts, denn die sind meistens schlecht.

    Oder du downloadest das Löffelmann-Buch, Version 2005 - da ist ein ausgezeichnetes Kapitel über Enums drin.
    Buchsammlung: Entwickler-Ressourcen und Tools, Bücher und WebCasts