Angelehnt an den Tipp 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.888 mal aufgerufen.
Anzeige
![]() ![]() ![]() 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. |
vb@rchiv CD Vol.6 ![]() ![]() Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! Online-Update-Funktion Entwickler-Vollversionen u.v.m. Tipp des Monats ![]() Manfred Bohn IndexOf für mehrdimensionale Arrays Die generische Funktion "IndexOf" ermittelt das erste Auftreten eines bestimmten Wertes in einem n-dimensionalen Array 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 |
||||||||||||||||
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. |