vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
SEPA-Dateien erstellen inkl. IBAN-, BLZ-/Kontonummernprüfung  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Controls   |   VB-Versionen: VB.NET24.12.07
Scrollbar: Scrollbereich unabhängig v. LargeChange

Scrollbar-Variante bei der die LargeChange-Einstellung keinen Einfluss auf den Scrollbereich hat

Autor:   Manfred BohnBewertung:     [ Jetzt bewerten ]Views:  20.299 
ohne HomepageSystem:  WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Das Standard-Verhalten der beiden Windows.Forms-Steuerelemente 'HScrollbar' und 'VScrollbar' ist für viele Zwecke nur wenig geeignet (und für VB6-Umsteiger unerwartet).

Stellt man nämlich die LargeChange-Eigenschaft auf einen Wert größer 1, kann man im Formular nicht mehr zwischen den Eigenschaften 'Minimum' und 'Maximum' scrollen, sondern erreicht nur noch die Obergrenze: Maximum - LargeChange + 1. (Besonders verwirrend: Diese eingeschränkte Obergrenze wird im Formular graphisch als Maximalwert dargestellt.)

Spätestens dann, wenn man ein Scroller-Steuerelement benutzen will, um den Anwender die Elemente einer Collection auswählen zu lassen, - wobei die aktuelle Anzahl der Collection-Elemente mit der Maximum-Eigenschaft des Scroller-Steuerelements koordiniert ist -, erweist sich dessen Standardverhalten als ungeeignet.

Man kann zwar statt dessen das 'Trackbar'-Steuerelement heranziehen, aber nicht jeder möchte diesen 'rustikalen Hebel' auf seinem Formular haben. Bei einer geringen Zahl von Collection-Elementen ist es möglich, die LargeChange-Eigenschaft des Scroller auf 1 zu setzen. Doch bei größeren Anzahlen ist diese Einstellung nicht mehr praktisch und man wird höhere Schrittweiten wählen.

Folgt man der VB-Dokumentation, dann setzt man in diesem Fall die Maximum-Eigenschaft auf den Wert Maximum + LargeChange (- 1). Die Maximum-Eigenschaft des Scrollers korrespondiert nicht mit der Anzahl der Collection-Elemente. (Heikel: eine Fehlerquelle, insbesondere bei der Umstellung von VB6-Code!)

Auszug aus dem Beispiel in der VB-Doku:

Me.hScrollBar1.LargeChange = Me.hScrollBar1.Maximum / 10 
' Adjust the Maximum value to make the raw Maximum value attainable by user interaction. 
Me.hScrollBar1.Maximum += Me.hScrollBar1.LargeChangeLargeChange

Als Alternative bietet es sich an, das Standardverhalten des ScrollBar-Steuerelements zu ändern, indem die entsprechenden Eigenschaften in einer Klasse geeignet überschrieben werden.

Die Klasse 'clsHScrollbar' verlagert die erforderliche Anpassung zwischen der LargeChange-Einstellung und der Maximum-Eigenschaft in den Code dieser Klasse. Mit dem daraus resultierenden Steuerelement kann man - unabhängig von der LargeChange-Einstellung - zwischen den Ausprägungen 'Minimum' und 'Maximum' scrollen. Die beiden überschriebenen Eigenschaften können im Code wie gewohnt eingesetzt und die Werte beliebig verändert werden. (Nur zur Demonstration ist die maximale Ausprägung der LargeChange-Eigenschaft auf die halbe Breite der Scroll-Skala begrenzt worden.)

Zur Verwendung des 'clsHScrollbar'-Steuerelements ist dem Projekt eine neue Klasse hinzuzufügen, in die der Code kopiert wird.

In einer Windows-Form ist im Deklarationsteil folgendes zu ergänzen:

Dim WithEvents myScroller As New clsHScrollBar

Im Load-Ereignis des Formulars ist die Instanz von 'clsHScrollbar' der Steuerelement-Auflistung (namentlich) hinzuzufügen:

Me.Controls.Add(myScroller)

Die weitere Verwendung im Code entspricht dem HScrollbar-Steuerelement.
Die Klasse wird übrigens auch - ohne weiteres Zutun - in der VB-Toolbox angezeigt und Instanzen können - wie gewohnt - auf die Form gezogen ('ClsHScollbar1') und die Vor-Einstellungen im Eigenschaftenfenster vorgenommen werden.

''' <summary>
''' Variante der HScrollbar, die zwischen den
''' Eigenschaften 'Minimum' und 'Maximum' scrollt,
''' unabhängig von der LargeChange-Einstellung
''' </summary>
''' <remarks></remarks>
Public Class clsHScrollBar
  Inherits Windows.Forms.HScrollBar
 
  ' bei diesem Steuerelement geht es natürlich auch:
  ' Inherits Windows.Forms.VScrollBar
 
  ' sichtbares Skalen-Maximum
  Private gMaximum As Integer
  ''' <summary>
  ''' Standardkonstruktor (Standardeinstellungen)
  ''' </summary>
  Public Sub New()
    ' Standardeinstellungen der Scrollbar
    gMaximum = MyBase.Maximum
    Dim lc As Integer = MyBase.LargeChange
 
    MyBase.LargeChange = _
    Maximal_Halbe_Skala(lc)
 
    Setze_Base_Maximum()
  End Sub
  ''' <summary>
  ''' Überschriebene Eigenschaft Maximum
  ''' koordiniert den Maximalwert mit LargeChange
  ''' </summary>
  ''' <value>Scroller-Maximum</value>
  ''' <returns>Scroller-Maximum</returns>
  Public Overloads Property Maximum() As Integer
    Get
      Return _
        (MyBase.Maximum - MyBase.LargeChange + 1)
    End Get
    Set(ByVal value As Integer)
      gMaximum = value
      MyBase.LargeChange = _
        Maximal_Halbe_Skala(MyBase.LargeChange)
     Setze_Base_Maximum()
    End Set
  End Property
  ''' <summary>
  ''' Überschriebene Eigenschaft LargeChange
  ''' koordiniert mit dem Maximalwert des Scollers
  ''' </summary>
  ''' <value>große Schrittweite</value>
  ''' <returns>große Schrittweite</returns>
  Public Overloads Property LargeChange() As Integer
    Get
      LargeChange = MyBase.LargeChange
    End Get
    Set(ByVal value As Integer)
      MyBase.LargeChange = _
        Maximal_Halbe_Skala(value)
      Setze_Base_Maximum()
    End Set
  End Property
  ''' <summary>
  ''' Hilfsfunktion: LargeChange-Ausprägung wird 
  ''' auf die halbe aktuelle Skalenbreite begrenzt
  ''' </summary>
  ''' <returns>LargeChange-Wert</returns>
  Private Function Maximal_Halbe_Skala( _
    ByVal Wert As Integer) As Integer
 
    Dim skala As Integer = gMaximum - MyBase.Minimum + 1
    If Wert > skala \ 2 Then
      Wert = skala \ 2
    End If
    If Wert < 1 Then Wert = 1
    Return Wert
  End Function
  ''' <summary>
  ''' Hilfsfunktion:
  ''' Maximum-Eigenschaft der Base anpassen
  ''' </summary>
  Private Sub Setze_Base_Maximum()
    MyBase.Maximum = _
    gMaximum + MyBase.LargeChange - 1
  End Sub
End Class

Dieser Tipp wurde bereits 20.299 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

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.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel