Angelehnt an den Tipp Elemente einer Enumeration ermitteln und zur Auswahl anzeigen möchte ich in diesem Tipp zeigen, wie man Enumerationen als Bitfelder nutzen kann. Dazu stellen wir uns folgendes Beispiel eines Weckers vor: Kommen wir zunächst zur Enumeration-Auflistung selbst: <Flags()> Public Enum Wochentag Sonntag = 1 Montag = 2 Dienstag = 4 Mittwoch = 8 Donnerstag = 16 Freitag = 32 Samstag = 64 End Enum Wichtig sind hier natürlich die Werte der jeweiligen Enumerationskonstanten in Potenzen von zwei, das heißt, 1, 2, 4, 8 usw. Dies bedeutet, dass sich die einzelnen Flags in kombinierten Enumerationskonstanten nicht überschneiden. Das Flags Attribut ist nicht unbedingt notwendig, bietet jedoch unter anderem beim Umwandeln in einen String Vorteile. Befüllt wird ein solches Bitfeld mit einer bitweisen OR-Kombination. Im beschrieben Beispiel könnte man die CheckBoxen wie folgt abfragen: Private Function GetWochentag() As Wochentag Dim eWochentag As Wochentag If Me.chkSonntag.Checked Then eWochentag = eWochentag Or Wochentag.Sonntag End If If Me.chkMontag.Checked Then eWochentag = eWochentag Or Wochentag.Montag End If If Me.chkDienstag.Checked Then eWochentag = eWochentag Or Wochentag.Dienstag End If If Me.chkMittwoch.Checked Then eWochentag = eWochentag Or Wochentag.Mittwoch End If If Me.chkDonnerstag.Checked Then eWochentag = eWochentag Or Wochentag.Donnerstag End If If Me.chkFreitag.Checked Then eWochentag = eWochentag Or Wochentag.Freitag End If If Me.chkSamstag.Checked Then eWochentag = eWochentag Or Wochentag.Samstag End If Return eWochentag End Function Die Enumerationsvariable Wochentag wird bei einer ausgewählten CheckBox immer mit dem Endsprechenden Wochentag durch den Or erweitert. Die Wochentage, welche in der Enumerationsvariable enthalten sind, können Sie mit einem AND Abfrage ermitteln. Hier der umgekehrte Vorgang um die CheckBoxen nach dem Inhalt der Enumerationsvariable zu aktivieren: Private Sub SetWochentag(ByVal eWochentag As Wochentag) If (eWochentag And Wochentag.Sonntag) <> 0 Then Me.chkSonntag.Checked = True Else Me.chkSonntag.Checked = False End If If (eWochentag And Wochentag.Montag) <> 0 Then Me.chkMontag.Checked = True Else Me.chkMontag.Checked = False End If If (eWochentag And Wochentag.Dienstag) <> 0 Then Me.chkDienstag.Checked = True Else Me.chkDienstag.Checked = False End If If (eWochentag And Wochentag.Mittwoch) <> 0 Then Me.chkMittwoch.Checked = True Else Me.chkMittwoch.Checked = False End If If (eWochentag And Wochentag.Donnerstag) <> 0 Then Me.chkDonnerstag.Checked = True Else Me.chkDonnerstag.Checked = False End If If (eWochentag And Wochentag.Freitag) <> 0 Then Me.chkFreitag.Checked = True Else Me.chkFreitag.Checked = False End If If (eWochentag And Wochentag.Samstag) <> 0 Then Me.chkSamstag.Checked = True Else Me.chkSamstag.Checked = False End If End Sub Durch das Flags Attribut kann man den Inhalt auch sehr einfach in das Direktfenster schreiben: Dim eWochentag As Wochentag eWochentag = Me.GetWochentag() Debug.Print(eWochentag.ToString) Wenn das Flags Attribut nicht gesetzt ist, wird nur der Bitwert in das Direktfenster geschrieben. Das Beispiel mit dem Wecker und den CheckBoxen für die Wochentage lässt sich natürlich noch optimieren. Wenn Sie zum Beispiel in der Tag-Eigenschaft der CheckBoxen die entsprechende Enumerationskonstante hinterlegen ist eine Schleife möglich. Um dies kurz zu zeigen wird im Load-Ereignis des Formular die Tag-Eigenschaft der ComboBoxen befüllt: Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load Me.chkSonntag.Tag = Wochentag.Sonntag Me.chkMontag.Tag = Wochentag.Montag Me.chkDienstag.Tag = Wochentag.Dienstag Me.chkMittwoch.Tag = Wochentag.Mittwoch Me.chkDonnerstag.Tag = Wochentag.Donnerstag Me.chkFreitag.Tag = Wochentag.Freitag Me.chkSamstag.Tag = Wochentag.Samstag End Sub Zum Schluss nun noch eine optimierte Möglichkeit der Methoden Get- und SetWochentag: Private Function GetWochentag2() As Wochentag Dim eWochentag As Wochentag Dim oCheckBox As Windows.Forms.CheckBox For Each oControl As Windows.Forms.Control In Me.Controls If TypeOf oControl Is Windows.Forms.CheckBox Then oCheckBox = CType(oControl, CheckBox) If oCheckBox.Checked Then eWochentag = eWochentag Or CType(oCheckBox.Tag, Wochentag) End If End If Next Return eWochentag End Function Private Sub SetWochentag2(ByVal eWochentag As Wochentag) Dim oCheckBox As Windows.Forms.CheckBox For Each oControl As Windows.Forms.Control In Me.Controls If TypeOf oControl Is Windows.Forms.CheckBox Then oCheckBox = CType(oControl, CheckBox) If (eWochentag And CType(oCheckBox.Tag, Wochentag)) <> 0 Then oCheckBox.Checked = True Else oCheckBox.Checked = False End If End If Next End Sub Dieser Tipp wurde bereits 10.677 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
Neu! sevCoolbar 3.0 Professionelle Toolbars im modernen Design! Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access Tipp des Monats September 2024 Dieter Otter Übergabeparameter: String oder Array? Mit der IsArray-Funktion lässt sich prüfen, ob es sich bei einem Übergabeparameter an eine Prozedur um ein Array oder einer "einfachen" Variable handelt. Access-Tools Vol.1 Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |