[vb.net] msgBoxStyle Wert korrekt auslesen

Gorasul

Grünschnabel
Halöle :)

Ich habe eine kleine MessageBox geschrieben die etwas umfangreicher ist als das Original. Nun will ich den Code noch etwas optimieren.

Der Aufruf erfolgt fast wie das Original:

Code:
Sub New(ByVal Titel As String, ByVal Nachricht As String,
 Optional ByVal Stylee As MsgBoxStyle = 0,
 Optional ByVal CustomIcon As Image = Nothing)

Zur Zeit ist es so das ich die "Style" Variable als Int auslese. Das ist recht unpraktisch da ich durch die vielen Kombinationen auf einen elend langen Select Case komme. Die Variable Style ist vom Typ MsgBoxStyle. Also wenn ich es recht verstanden habe Enum.

Der MsgBoxStyle ist in Blöcken aufgeteilt(ich glaube 5) mit je 4 Bit also:

Block 1___Block 2___Block 3
0100_____1000_____0100

entspricht Beispielsweise: AbortRetryIgnore_Button / Critical_Icon / DefaultButton_2

Ich habe es mit folgender Schleife versucht:
Code:
Dim g As Integer
        Dim i As SByte
        For Each i In [Enum].GetValues(GetType(MsgBoxStyle))
            STRstyle(g) = i
            g += 1

        Next

Da ist aber das Problem das er mir einfach alle Werte von MsgBoxStyle, also alle Auswahlmöglichkeiten, zurückgibt und nicht nur die die der User beim Aufruf meiner MessageBox angegeben hat.

Jetzt ist meine Frage wie Lese ich nun den Wert bzw die Werte korrekt aus meiner Variablen "Style" aus?

Danke im Voraus

Gruß
Gorasul
 
Hi

Also in C# würde ein einfacher Cast genügen
C#:
MsgBoxStyle mbs = (MsgBoxStyle)intVariableWithValue;
Da mir die VB-Syntax nicht so geläufig ist das Beispiel in C#
 
Ich glaube die Frage ist, wie du herausfinden kannst ob z.B. das 4te Bit in einer Variable gesetzt ist, richtig? Die Idee bei der MsgBoxStyle-Enumeration ist, dass die verschiedenen "Auswahlmöglichkeiten" Potenzen von 2 sind, also 2^0, 2^1, 2^2, 2^3, usw. Denn diese Zahlen entsprechen in Binärdarstellung 0001, 0010, 0100, 1000, usw. Wenn du zwei Auswahlmöglichkeiten addierst (oder mit Or-Operator kombinierst), sagen wir 2^0 und 2^1, dann erhälst du 0011. Wenn du jetzt die einzelnen Bits wieder auslesen kannst, dann weißt du was der Benutzer ausgewählt hat.

Ließ dir dazu mal diese Links durch:
http://visualbasic.about.com/od/usingvbnet/a/bitops01.htm
http://www.codeproject.com/KB/cs/masksandflags.aspx
http://bytes.com/topic/net/answers/740112-c-how-check-if-bit-set
 
Zuletzt bearbeitet:
so in etwa ja :)

also durch viel herumprobieren habe ich jetzt eine funktionierende Lösung gefunden:

Man wandle die Variable Style in eine Bitfolge um, also binär mit bestimmter länge. Die länge kann man festlegen da es je nach Größe des Integer Wertes der Style Variable man die Anzahl der Codeblöcke bestimmen kann. Das heißt man fügt vorn am Binärstring 0 hinzu bis die Länge passt (4,8,12,16,20). Danach trennt man die Blöcke. Ich habs über ein Array gelöst.

Diese Blöcke wandle ich nach dem hinzufügen der entsprechenden anzahl an 0-Blöcken wieder in einen Integer wert und so sehe ich welche Optionen der User gewählt hat.

:) ich werde zum besseren Verständnis dann noch am Montag den Code Posten.
Ich sollte mir auch angewöhnen erstmal 3 Stunden zu suchen und dann erst nen Thread zu öffnen :D auf jedenfall danke für die Hinweise.

Gruß
Gorasul
 
Man wandle die Variable Style in eine Bitfolge um, also binär mit bestimmter länge. Die länge kann man festlegen da es je nach Größe des Integer Wertes der Style Variable man die Anzahl der Codeblöcke bestimmen kann. Das heißt man fügt vorn am Binärstring 0 hinzu bis die Länge passt (4,8,12,16,20). Danach trennt man die Blöcke. Ich habs über ein Array gelöst.
Es geht vieeeeeel eleganter. Du brauchst nur den And- und den Or-Operator. Erstelle ein neues Consolen-Programm und füge folgenden Code ein:
Code:
Module Module1
    <Flags()>
    Public Enum Auswahl As Integer
        Hund = 2 ^ 0
        Katze = 2 ^ 1
        Elefant = 2 ^ 2
    End Enum


    Sub Main()
        Dim BenutherHatAusgewählt As Auswahl = Auswahl.Hund Or Auswahl.Katze
        For Each i As Auswahl In [Enum].GetValues(GetType(Auswahl))
            Console.WriteLine("Ist " + i.ToString() + " ausgewählt?")
            If ((i And BenutherHatAusgewählt) = i) Then
                Console.WriteLine("Ja!")
            Else
                Console.WriteLine("Nein.")
            End If
        Next
        Console.WriteLine("Beliebige Taste zum Beenden drücken.")
        Console.ReadKey()
    End Sub

End Module
Beachte, dass ich der Enumeration das Flags-Attribut gegeben habe. Das Programm wird aber auch ohne das Attribut korrekt funktionieren.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück