vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik:    |   VB-Versionen: VB.NET01.06.06
Extended Panels für das StatusStrip (VB.Net 2005)

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...

Autor:  Roland WutzkeBewertung:     [ Jetzt bewerten ]Views:  1.550 
http://www.vb-power.netSystem:  WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt 

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ß...
Roland Wutzke