Das StatusStrip ist ein beliebtes Control um benutzerdefinierte Informationen anzeigen zu lassen. Vielfältige Gestaltungsmöglichkeiten verleihen dem StatusStrip ein perfektes Aussehen. Leider haben die Entwickler dieses Controls vergessen, automatische Panels für Datum und Uhrzeit einzubauen. Auch fehlen Panels für die Anzeige der CapsLock-, NumLock- und ScrollLock Informationen. Sicherlich werden Sie sich jetzt sagen - ist ja kein Thema. Nehme ich doch einfach ein Timer und schreibe das Datum, bzw. die aktuelle Uhrzeit in ein Panel auf das StatusStrip. Weitaus eleganter und flexibler geht es jedoch mit der nachfolgenden Klasse. Das Klassenmodul "extStrip" stellt Ihnen hierzu die mehrfach überladene Methode "AddPanel" zur Verfügung, mit der Sie die Panels erzeugen können. Dabei kann zusätzlich ein gültiger Format-String für die Darstellung des Datums, bzw. der Uhrzeit festgelegt werden. Über den Konstruktor der Klasse wird das StatusStrip aus der Form übergeben. Die Klasse wird dadurch flexibel einsetzbar und kann für jedes StatusStrip aus Ihren Formen verwendet werden. Die Klasse wurde mit VB2005 erstellt und unterstützt zusätzlich noch die Property-Beschreibungen für die IntelliSense Anzeige. Option Explicit On Option Strict On Imports System.Windows.Forms ''' <summary> ''' Diese Klasse stellt Methoden für StatusStrip-Panels zur Verfügung ''' </summary> ''' <remarks> ''' VB.Net 2005 Klassenmodul ''' Diese Klasse stellt Date-, Time-, CapsLock-, NumLock- und ScrollLock ''' Panels für ein StatusStrip zur Verfügung. Durch Überladungen der ''' AddPanel Methode, kann ein Panel über den Index oder den Key ''' referenziert werden. Die Ausgabeformatierung kann über DisplayFormat ''' für die Panels eingestellt werden. ''' ''' Mai 2006 - VB-Power.net ''' http://www.vb-power.net ''' </remarks> Public Class extStrip ''' <summary> ''' Aufzählung der verschiedenen PanelTypen ''' </summary> Enum PanelType TimePanel DatePanel CapsPanel NumPanel ScrollPanel End Enum Private m_StatusStrip As StatusStrip Private m_PanelItems As New List(Of PanelItem) Public Event BeforePanelUpdate(ByVal PanelKey As String, _ ByRef PanelText As String, ByVal ePanel As PanelType, _ ByVal LastState As Boolean, ByRef Cancel As Boolean) ' ============================= ' Anfang Private Sub-Klasse ' ============================= Private Class PanelItem Public m_Key As String Public m_PanelType As PanelType Public m_Format As String Public m_LastState As Boolean Private WithEvents m_Timer As New Timer Public Event PanelEvent(ByVal sender As PanelItem) ''' <summary> ''' Initialisierung der Sub-Klasse ''' </summary> Public Sub New(ByVal Key As String, ByVal ePanel As PanelType, ByVal sFormat As String) m_Key = Key m_PanelType = ePanel m_Format = sFormat m_Timer.Interval = 200 Select Case ePanel Case PanelType.DatePanel, PanelType.TimePanel m_Timer.Interval = 1000 Case PanelType.CapsPanel m_LastState = My.Computer.Keyboard.CapsLock Case PanelType.NumPanel m_LastState = My.Computer.Keyboard.NumLock Case PanelType.ScrollPanel m_LastState = My.Computer.Keyboard.ScrollLock End Select m_Timer.Enabled = True m_Timer.Start() End Sub Protected Overrides Sub Finalize() m_Timer.Stop() m_Timer.Dispose() MyBase.Finalize() End Sub ''' <summary> ''' Private Methode Timerereignis ''' Die Sub-Klassen Objekte (Panels) werden verarbeitet. ''' Bei Bedarf wird das Ereignis PanelEvent in die ''' Hauptklasse gefeuert. ''' </summary> Private Sub m_Timer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles m_Timer.Tick Dim aState As Boolean = False Select Case m_PanelType Case PanelType.DatePanel, PanelType.TimePanel aState = True Case PanelType.CapsPanel If Not m_LastState = My.Computer.Keyboard.CapsLock Then m_LastState = My.Computer.Keyboard.CapsLock aState = True End If Case PanelType.NumPanel If Not m_LastState = My.Computer.Keyboard.NumLock Then m_LastState = My.Computer.Keyboard.NumLock aState = True End If Case PanelType.ScrollPanel If Not m_LastState = My.Computer.Keyboard.ScrollLock Then m_LastState = My.Computer.Keyboard.ScrollLock aState = True End If End Select ' Ereignis bei Bedarf auslösen If aState Then RaiseEvent PanelEvent(Me) End Sub End Class ' ============================= ' Anfang Hauptklasse ' ============================= ''' <summary> ''' Initialisierung der Klasse</summary> ''' <param name="StripToControl"> ''' Übergeben wird das StatusStrip aus der Form</param> Public Sub New(ByVal StripToControl As StatusStrip) m_StatusStrip = StripToControl End Sub ''' <summary> ''' Fügt ein Panel aus dem StatusStrip für die Ausgabe hinzu</summary> ''' <param name="Index"> ''' Der Index des zu übergebenen Panels</param> ''' <param name="ePanel"> ''' Bestimmt den PanelType für die Anzeige</param> Public Function AddPanel(ByVal Index As Integer, ByVal ePanel As PanelType) As Boolean Try If CheckForLabel(CType(m_StatusStrip.Items(Index), ToolStripStatusLabel)) Then Dim tKey As String = m_StatusStrip.Items(Index).Name Dim tFormat As String Select Case ePanel Case PanelType.DatePanel : tFormat = "dd.MM.yyyy" Case PanelType.TimePanel : tFormat = "HH:mm" Case Else : tFormat = String.Empty End Select Dim tPanel As New PanelItem(tKey, ePanel, tFormat) AddHandler tPanel.PanelEvent, AddressOf DoPanelUpdate m_PanelItems.Add(tPanel) DoPanelUpdate(tPanel) Return True Else Return False End If Catch ex As Exception Return False End Try End Function ''' <param name="PanelName"> ''' Der Name des zu übergebenen Panels</param> ''' <param name="ePanel"> ''' Bestimmt den PanelType für die Anzeige</param> ''' <remarks> ''' Überladene Funktion</remarks> Public Function AddPanel(ByVal PanelName As String, ByVal ePanel As PanelType) As Boolean If m_StatusStrip.Items.ContainsKey(PanelName) Then Dim tIndex As Integer = m_StatusStrip.Items.IndexOfKey(PanelName) Return Me.AddPanel(tIndex, ePanel) Else Return False End If End Function ''' <param name="Index"> ''' Der Index des zu übergebenen Panels</param> ''' <param name="ePanel"> ''' Bestimmt den PanelType für die Anzeige</param> ''' <param name="DisplayFormat"> ''' Ein gültiger Format-String für ein Date- oder TimePanel</param> ''' <remarks> ''' Überladene Funktion</remarks> Public Function AddPanel(ByVal Index As Integer, ByVal ePanel As PanelType, ByVal DisplayFormat As String) As Boolean If Me.AddPanel(Index, ePanel) Then Dim tPanel As PanelItem = m_PanelItems.Item(m_PanelItems.Count - 1) tPanel.m_Format = DisplayFormat DoPanelUpdate(tPanel) Return True Else Return False End If End Function ''' <param name="PanelName"> ''' Der Name des zu übergebenen Panels</param> ''' <param name="ePanel"> ''' Bestimmt den PanelType für die Anzeige</param> ''' <param name="DisplayFormat"> ''' Ein gültiger Format-String für ein Date- oder TimePanel</param> ''' <remarks> ''' Überladene Funktion</remarks> Public Function AddPanel(ByVal PanelName As String, ByVal ePanel As PanelType, ByVal DisplayFormat As String) As Boolean If m_StatusStrip.Items.ContainsKey(PanelName) Then Dim tIndex As Integer = m_StatusStrip.Items.IndexOfKey(PanelName) If Me.AddPanel(tIndex, ePanel) Then Dim tPanel As PanelItem = m_PanelItems.Item(m_PanelItems.Count - 1) tPanel.m_Format = DisplayFormat DoPanelUpdate(tPanel) Return True Else Return False End If Else Return False End If End Function ''' <summary> ''' Private AddHandler Methode ''' Wird bei einem Timerereignis aus der Sub-Klasse angesprungen. ''' Die Methode feuert das Ereignis BeforePanelUpdate in die ''' aufrufende Form. ''' </summary> Private Sub DoPanelUpdate(ByVal cPanelItem As PanelItem) Dim pText As String = Nothing Dim bCancel As Boolean = False With cPanelItem Select Case .m_PanelType Case PanelType.DatePanel ' Panel Datum pText = Date.Today.ToString(.m_Format) Case PanelType.TimePanel ' Panel Uhrzeit pText = Date.Now.ToString(.m_Format) Case PanelType.CapsPanel ' Panel CapsLock pText = CStr(IIf(.m_LastState, "Caps On", "Caps Off")) Case PanelType.NumPanel ' Panel NumLock pText = CStr(IIf(.m_LastState, "Num On", "Num Off")) Case PanelType.ScrollPanel ' Panel ScrollLock pText = CStr(IIf(.m_LastState, "Scroll On", "Scroll Off")) End Select ' Ereignis auslösen... RaiseEvent BeforePanelUpdate(.m_Key, pText, .m_PanelType, .m_LastState, bCancel) If Not bCancel Then m_StatusStrip.Items(.m_Key).Text = pText End If End With End Sub ''' <summary>Ermittelt, ob das übergebene Panel überhaupt ein Label ist</summary> Private Function CheckForLabel(ByVal value As ToolStripStatusLabel) As Boolean Try If value.GetType Is GetType(ToolStripStatusLabel) Then Return True Else Return False End If Catch ex As Exception Return False End Try End Function End Class Welche Möglichkeiten Ihnen die Klasse bietet, zeigt eindrucksvoll unser Demoprojekt. Viel Spaß... |