ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 26.04.2001

Diese Seite wurde zuletzt aktualisiert am 26.04.2001
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicAddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zur AVB-Web-Site, Kontakt und Impressum

Zurück...

Schiebe-Regelung

Zurück...

(-hg) mailto:hg_komsliderrange@aboutvb.de

Wird die Eigenschaft SelRange des Slider-Steuerelements aus den Microsoft Common Controls auf True gesetzt, wird ein Bereichsbalken angezeigt. Dessen Start und Länge wird über die Eigenschaften SelStart und SelLength des Sliders festgelegt.

Den Bereichsbalken eines Slider-Steuerelements können Sie bequem in einer Klasse kontrollieren

Den Bereichsbalken eines Slider-Steuerelements können Sie bequem in einer Klasse kontrollieren

Den Umgang mit diesem Bereichsbalken vereinfacht die Klasse clsSliderRange. Sie lässt sich in drei verschiedenen Modi nutzen, die über die Eigenschaft Mode festgelegt werden. Im Modus srModeSimple beginnt der Bereichsbalken automatisch mein Minimum-Wert (Eigenschaft Min des Sliders) und reicht immer bis zum eingestellten Wert (Position des Schiebers). Der Modus srModeExtended ermöglicht eine beliebige Startposition (SelStart-Eigenschaft der Klasse) des Bereichsbalkens, wobei die Endposition (SelEnd-Eigenschaft der Klasse) weiterhin vom aktuellen Wert festgelegt wird bzw. umgekehrt den aktuellen festlegt. Dabei kann die Endposition auch vor der Startposition liegen. Im Modus srModeLimited hingegen wird der Bereichsbalken mit SelStart und SelEnd festgelegt und begrenzt den Einstellbereich des Schiebers.

Sie legen für jedes Slider-Steuerelement eine Instanz der Klasse clsSliderRange an und übergeben ihr bei einem erstmaligen (und nur einmal notwendigen) Aufruf der Init-Methode den betreffenden Slider. In den weiteren optionalen Parametern der Init-Methode können Sie zugleich den Modus, die Start- und die Endposition und den aktuellen Wert des Sliders voreinstellen.

Diese Einstellungen und Werte können Sie auch jederzeit nachträglich über die Eigenschaften Mode, SelEnd, SelStart und Value der Klasse auslesen und setzen. Die aktuelle Länge des Bereichsbalkens können Sie über SelLength auslesen, jedoch nicht ändern. Auf die Eigenschaften SelLength, SelStart und Value sollten Sie daher auch nur über die Klasse zugreifen, und nicht über den Slider direkt. Die übrigen Eigenschaften des Sliders bleiben von der Klasse unberührt - auf diese können Sie wie gewohnt beliebig zugreifen.

Mit der Methode SwapSelStartEnd vertauschen Sie schließlich noch in den beiden Modi srModeExtended und srModeLimited die Start- und die Endposition. Im Modus srModeExtended wird dabei der Schieber (Value) auf die Endposition umgesetzt.

Ein paar Besonderheiten bietet die von der Klasse kontrollierte Tastatur- und Maus-Steuerung. Im Modus srModeSimple wird der Schieber wie gewohnt mit den Cursor-Tasten oder mit der Maus bewegt - die Umschalt-Taste und die Strg-Taste haben keinerlei Auswirkungen.

Im Modus srModeExtended wird die Startposition beim Niederdrücken der linken Maustaste und gleichzeitig gedrückter Umschalt-Taste neu gesetzt. Ist dagegen die Strg-Taste gedrückt, verschiebt sich der Bereichsbalken mit dem Schieber unter Beibehaltung seiner Länge. Bei der Tastatursteuerung über die Cursortasten bewirkt die Umschalt-Taste die Verschiebung der Startposition anstelle des Schiebers, während die Strg-Taste ebenfalls wie bei der Maussteuerung den Bereichsbalken zusammen mit dem Schieber verschiebt.

Sowohl bei Maus- als auch bei Tastatursteuerung über die Cursortasten bleibt die Umschalttaste im Modus srModeLimited ohne Wirkung. Die Strg-Taste bewirkt dagegen, dass die jeweils erreichte Grenze des Bereichsbalkens überschritten und mit verschoben wird.

Die Tastatur-Ereignisse KeyDown und KeyUp werden vor der Auswertung als Ereignisse der Klasse ausgelöst und können somit vorab kontrolliert und modifiziert werden. Die Maus-Ereignisse MouseDown, MouseMove und MouseUp werden hingegen nach der Verarbeitung als Ereignisse der Klasse weitergegeben - eine Modifikation der Parameter bei Mausereignissen hat ja in VB keine Auswirkungen. Bei jeder Positionsänderung des Schiebers als auch bei Änderungen der Start- und Endpositionen wird das Scroll-Ereignis der Klasse ausgelöst. Sie sollten diese sechs Ereignisse anstelle der Original-Ereignisse des Slider-Steuerelements verwenden.

Private WithEvents eSlider As Slider

Private mMoveRange As Boolean
Private mMoveLimit As Boolean

Public Event Scroll()
Public Event MouseDown(ByVal Button As Integer, _
 ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Public Event MouseMove(ByVal Button As Integer, _
 ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Public Event MouseUp(ByVal Button As Integer, _
 ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Public Event KeyDown(KeyCode As Integer, Shift As Integer)
Public Event KeyUp(KeyCode As Integer, Shift As Integer)

Public Enum srModeConstants
  srModeSimple
  srModeExtended
  srModeLimited
End Enum

Private pMode As srModeConstants
Private pSelEnd As Long
Private pSelStart As Long

Public Property Get Mode() As srModeConstants
  Mode = pMode
End Property

Public Property Let Mode(New_Mode As srModeConstants)
  Select Case New_Mode
    Case pMode
    Case srModeSimple
      pMode = New_Mode
      pSelStart = 0
      zSetRange
    Case srModeExtended, srModeLimited
      pMode = New_Mode
      zSetRange
    Case Else
      Err.Raise 380
  End Select
End Property

Public Property Get SelEnd() As Long
  SelEnd = pSelEnd
End Property

Public Property Let SelEnd(New_SelEnd As Long)
  With eSlider
    Select Case New_SelEnd
      Case .Min To .Max
        If pSelEnd <> New_SelEnd Then
          pSelEnd = New_SelEnd
          Select Case pMode
            Case srModeLimited
            Case Else
              .Value = pSelEnd
          End Select
          zSetRange
        End If
      Case Else
        Err.Raise 380
    End Select
  End With
End Property

Public Property Get SelLength() As Long
  SelLength = eSlider.SelLength
End Property

Public Property Get SelStart() As Long
  SelStart = pSelStart
End Property

Public Property Let SelStart(New_SelStart As Long)
  With eSlider
    Select Case New_SelStart
      Case .Min To .Max
        If pSelStart <> New_SelStart Then
          pSelStart = New_SelStart
          zSetRange
        End If
      Case Else
        Err.Raise 380
    End Select
  End With
End Property

Public Property Get Value() As Long
  Value = eSlider.Value
End Property

Public Property Let Value(New_Value As Long)
  With eSlider
    Select Case New_Value
      Case .Value
      Case Is < .Min
        .Value = .Min
      Case Is > .Max
        .Value = .Max
      Case Else
        .Value = New_Value
    End Select
    Select Case pMode
      Case srModeLimited
      Case Else
        pSelEnd = eSlider.Value
    End Select
  End With
  zSetRange
End Property

Public Sub Init(Slider As Slider, _
 Optional ByVal Mode As srModeConstants = srModeSimple, _
 Optional ByVal SelStart As Long, _
 Optional ByVal SelEnd As Long, _
 Optional ByVal Value As Long)

  Set eSlider = Slider
  pMode = Mode
  pSelEnd = SelEnd
  With eSlider
    Select Case pMode
      Case srModeSimple
        pSelStart = .Min
        .Value = pSelEnd
      Case srModeExtended
        Me.SelStart = SelStart
        .Value = pSelEnd
      Case srModeLimited
        .Value = Value
    End Select
  End With
  zSetRange
End Sub

Public Sub SwapSelStartEnd()
  Dim n As Long
  
  If pMode Then
    n = pSelStart
    pSelStart = pSelEnd
    pSelEnd = n
    Select Case pMode
      Case srModeLimited
      Case Else
        eSlider.Value = pSelEnd
    End Select
    zSetRange
  End If
End Sub

Private Sub eSlider_KeyDown(KeyCode As Integer, Shift As Integer)
  Dim nShift As Integer
  
  RaiseEvent KeyDown(KeyCode, Shift)
  Select Case pMode
    Case srModeSimple
      With eSlider
        Select Case KeyCode
          Case vbKeyHome
            .Value = .Min
            KeyCode = 0
          Case vbKeyEnd
            .Value = .Max
            KeyCode = 0
        End Select
      End With
      zSetRange
    Case srModeLimited
      With eSlider
        Select Case KeyCode
          Case vbKeyHome
            .Value = .Min
            If Shift = vbCtrlMask Then
              mMoveLimit = True
              Select Case pSelEnd
                Case Is >= pSelStart
                  pSelStart = .Min
                  .SelStart = pSelStart
                  .SelLength = pSelEnd - pSelStart
                Case Is < pSelStart
                  pSelEnd = .Min
                  .SelStart = pSelEnd
                  .SelLength = pSelStart - pSelEnd
              End Select
              RaiseEvent Scroll
            Else
              zSetRange
            End If
            KeyCode = 0
          Case vbKeyEnd
            .Value = .Max
            If Shift = vbCtrlMask Then
              mMoveLimit = True
              Select Case pSelEnd
                Case Is >= pSelStart
                  pSelEnd = .Max
                  .SelLength = pSelEnd - pSelStart
                Case Is < pSelStart
                  pSelStart = .Max
                  .SelLength = pSelStart - pSelEnd
              End Select
              RaiseEvent Scroll
            Else
              zSetRange
            End If
            KeyCode = 0
          Case vbKeyRight, vbKeyLeft, vbKeyUp, vbKeyDown, _
           vbKeyPageDown, vbKeyPageUp
            If Shift = vbCtrlMask Then
              mMoveLimit = True
              Exit Sub
            End If
        End Select
      End With
    Case srModeExtended
      nShift = Shift
      Select Case KeyCode
        Case vbKeyHome
          With eSlider
            Select Case nShift
              Case 0
                pSelEnd = .Min
                .Value = pSelEnd
                zSetRange
              Case vbShiftMask
                pSelStart = .Min
                zSetRange
              Case vbCtrlMask
                Select Case pSelEnd
                  Case Is > pSelStart
                    pSelStart = .Min
                    pSelEnd = .SelLength
                    .SelStart = pSelStart
                    .Value = pSelEnd
                  Case pSelStart
                    pSelStart = .Min
                    pSelEnd = pSelStart
                    .SelStart = pSelStart
                    .Value = pSelEnd
                  Case Is < pSelStart
                    pSelEnd = .Min
                    pSelStart = .SelLength
                    .SelStart = pSelEnd
                    .Value = pSelEnd
                End Select
                RaiseEvent Scroll
            End Select
          End With
          KeyCode = 0
        Case vbKeyEnd
          With eSlider
            Select Case nShift
              Case 0
                pSelEnd = .Max
                .Value = pSelEnd
                zSetRange
              Case vbShiftMask
                pSelStart = .Max
                zSetRange
              Case vbCtrlMask
                Select Case pSelEnd
                  Case Is > pSelStart
                    pSelEnd = .Max
                    pSelStart = pSelEnd - .SelLength
                    .SelStart = pSelStart
                    .Value = pSelEnd
                  Case pSelStart
                    pSelEnd = .Max
                    pSelStart = pSelEnd
                    .SelStart = pSelStart
                    .Value = pSelEnd
                  Case Is < pSelStart
                    pSelEnd = .Max - .SelLength
                    pSelStart = .Max
                    .SelStart = pSelEnd
                    .Value = pSelEnd
                End Select
                RaiseEvent Scroll
            End Select
          End With
          KeyCode = 0
        Case Else
          Select Case Shift
            Case 0
              mMoveRange = False
            Case vbShiftMask
              mMoveRange = False
              With eSlider
                Select Case KeyCode
                  Case vbKeyLeft, vbKeyUp
                    pSelStart = pSelStart - .SmallChange
                    If pSelStart < .Min Then
                      pSelStart = .Min
                    End If
                    zSetRange
                    KeyCode = 0
                  Case vbKeyRight, vbKeyDown
                    pSelStart = pSelStart + .SmallChange
                    If pSelStart > .Max Then
                      pSelStart = .Max
                    End If
                    zSetRange
                    KeyCode = 0
                  Case vbKeyPageUp
                    pSelStart = pSelStart - .LargeChange
                    If pSelStart < .Min Then
                      pSelStart = .Min
                    End If
                    zSetRange
                    KeyCode = 0
                  Case vbKeyPageDown
                    pSelStart = pSelStart + .LargeChange
                    If pSelStart > .Max Then
                      pSelStart = .Max
                    End If
                    zSetRange
                    KeyCode = 0
                End Select
              End With
            Case vbCtrlMask
              mMoveRange = True
          End Select
      End Select
  End Select
End Sub

Private Sub eSlider_KeyUp(KeyCode As Integer, Shift As Integer)
  Select Case KeyCode
    Case vbKeyControl
      mMoveRange = False
      mMoveLimit = False
  End Select
  RaiseEvent KeyUp(KeyCode, Shift)
End Sub

Private Sub eSlider_MouseDown(Button As Integer, _
 Shift As Integer, X As Single, Y As Single)

  If pMode = srModeExtended Then
    Select Case Shift
      Case vbShiftMask
        mMoveRange = False
        pSelStart = eSlider.Value
        zSetRange
      Case vbCtrlMask
        mMoveRange = True
        zSetRange
      Case 0
        mMoveRange = False
    End Select
  End If
  RaiseEvent MouseDown(Button, Shift, X, Y)
End Sub

Private Sub eSlider_MouseMove(Button As Integer, _
 Shift As Integer, X As Single, Y As Single)

  If Button = vbLeftButton Then
    Select Case pMode
      Case srModeExtended
        Select Case Shift
          Case vbShiftMask
            mMoveRange = False
            zSetRange
          Case vbCtrlMask
            mMoveRange = True
            zSetRange
          Case 0
            mMoveRange = False
        End Select
      Case srModeLimited
        Select Case Shift
          Case vbCtrlMask
            mMoveLimit = True
          Case Else
            mMoveLimit = False
        End Select
    End Select
  End If
  RaiseEvent MouseMove(Button, Shift, X, Y)
End Sub

Private Sub eSlider_MouseUp(Button As Integer, _
 Shift As Integer, X As Single, Y As Single)

  mMoveRange = False
  mMoveLimit = False
  RaiseEvent MouseUp(Button, Shift, X, Y)
End Sub

Private Sub eSlider_Scroll()
  Select Case pMode
    Case srModeLimited
    Case Else
      pSelEnd = eSlider.Value
  End Select
  zSetRange
End Sub

Private Sub zSetRange()
  Static sInProc As Boolean
    
  If sInProc Then
    Exit Sub
  Else
    sInProc = True
  End If
  With eSlider
    Select Case pMode
      Case srModeSimple
        .SelLength = .Value
        pSelStart = .Min
        .SelStart = pSelStart
      Case srModeExtended
        If mMoveRange Then
          Select Case pSelEnd
            Case Is > pSelStart
              pSelStart = pSelEnd - .SelLength
              If pSelStart < .Min Then
                pSelStart = .Min
                pSelEnd = .SelLength
                .Value = pSelEnd
              End If
              .SelStart = pSelStart
            Case pSelStart
              If pSelEnd = .Min Then
                pSelEnd = .SelLength
                .Value = pSelEnd
                pSelStart = .Min
              ElseIf pSelEnd = .Max Then
                pSelEnd = .Max - .SelLength
                pSelStart = .Max
                .SelStart = pSelEnd
                .Value = pSelEnd
              End If
            Case Is < pSelStart
              If pSelEnd < .Max - .SelLength Then
                .SelStart = pSelEnd
                pSelStart = pSelEnd + .SelLength
              ElseIf pSelEnd >= .Max - .SelLength Then
                pSelEnd = .Max - .SelLength
                pSelStart = .Max
                .SelStart = pSelEnd
                .Value = pSelEnd
              End If
          End Select
        Else
          Select Case pSelEnd
            Case Is > pSelStart
              .SelStart = pSelStart
              .SelLength = pSelEnd - pSelStart
            Case pSelStart
              .SelStart = pSelEnd
              .SelLength = 0
            Case Is < pSelStart
              .SelStart = pSelEnd
              .SelLength = pSelStart - pSelEnd
          End Select
        End If
      Case srModeLimited
        If mMoveLimit Then
          Select Case pSelEnd
            Case Is >= pSelStart
              Select Case .Value
                Case Is > pSelEnd
                  pSelEnd = .Value
                  .SelLength = pSelEnd - pSelStart
                Case Is < pSelStart
                  pSelStart = .Value
                  .SelStart = pSelStart
                  .SelLength = pSelEnd - pSelStart
              End Select
            Case Is < pSelStart
              Select Case .Value
                Case Is > pSelStart
                  pSelStart = .Value
                  .SelLength = pSelStart - pSelEnd
                Case Is < pSelEnd
                  pSelEnd = .Value
                  .SelStart = pSelEnd
                  .SelLength = pSelStart - pSelEnd
              End Select
          End Select
        Else
          Select Case pSelEnd
            Case Is >= pSelStart
              Select Case .Value
                Case Is < pSelStart
                  .Value = pSelStart
                Case Is > pSelEnd
                  .Value = pSelEnd
              End Select
              .SelStart = pSelStart
              .SelLength = pSelEnd - pSelStart
            Case Is < pSelStart
              Select Case .Value
                Case Is > pSelStart
                  .Value = pSelStart
                Case Is < pSelEnd
                  .Value = pSelEnd
              End Select
              .SelStart = pSelEnd
              .SelLength = pSelStart - pSelEnd
          End Select
        End If
    End Select
  End With
  RaiseEvent Scroll
  sInProc = False
End Sub

Beispiel-Projekte und Klasse clsSliderRange (sliderrange.zip - ca. 10,6 KB)



Komponenten-Übersicht

Schnellsuche




Zum Seitenanfang

Copyright © 1999 - 2023 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...