vertikal, horizontal scrollen

Moderator: ModerationP

vertikal, horizontal scrollen

Beitragvon Gast » 15. Sep 2021, 07:11

Hallo,
ist man bei einem Textfeld ausschließlich auf die vertikale Bildlaufleiste angewiesen, um unten stehenden Text lesen zu können oder kann man auch mit der Maus scrollen?
Wäre super, wenn mit der Umsch-Taste evtl. auch das horizontale scrollen möglich wäre.
VG Betty
Gast
 

Re: vertikal, horizontal scrollen

Beitragvon Bitsqueezer » 15. Sep 2021, 09:00

Hallo,

die Textbox kann nur vertikal scrollen. Da am rechten Ende grundsätzlich ein Zeilenumbruch erzeugt wird (wenn die Textbox mehrzeilig erstellt wurde), kann die Textbox nicht horizontal scrollen. Bei einzeiligen Textboxen braucht es wiederum keine vertikale Scrollleiste. Für eine vergrößerte Darstellung hilft Shift-F2, oder man baut sich selbst etwas Schöneres mit einem Formular.

Man kann bei einer einzeiligen Textbox auch einfach mit der Maus den Text markieren, dadurch scrollt er auch nach rechts.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8475
Registriert: 21. Jun 2007, 12:17

Re: vertikal, horizontal scrollen

Beitragvon Nepumuk » 15. Sep 2021, 10:04

Hallo Betty,

im Modul des UserForms:

Code: Alles auswählen
Private Sub TextBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Call HookMouse(Me, TextBox1)
End Sub

Private Sub UserForm_Terminate()
    Call UnhookMouse
End Sub


In einem Standardmodul:

Code: Alles auswählen
Option Explicit
Option Private Module

Private Declare PtrSafe Function GetWindowLongPtrA Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function WindowFromPoint Lib "user32.dll" ( _
    ByVal point As LongLong) As LongPtr
Private Declare PtrSafe Sub RtlMoveMemory Lib "kernel32.dll" ( _
    ByRef Destination As Any, _
    ByRef Source As Any, _
    ByVal Length As LongPtr)
Private Declare PtrSafe Function SetWindowsHookExA Lib "user32.dll" ( _
    ByVal idHook As Long, _
    ByVal lpfn As LongPtr, _
    ByVal hmod As LongPtr, _
    ByVal dwThreadId As Long) As LongPtr
Private Declare PtrSafe Function CallNextHookEx Lib "user32.dll" ( _
    ByVal hHook As LongPtr, _
    ByVal ncode As Long, _
    ByVal wParam As LongPtr, _
    ByRef lParam As Any) As LongPtr
Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32.dll" ( _
    ByVal hHook As LongPtr) As Long
Private Declare PtrSafe Function GetCursorPos Lib "user32.dll" ( _
    ByRef lpPoint As POINTAPI) As Long
Private Declare PtrSafe Function GetKeyState Lib "user32.dll" ( _
    ByVal nVirtKey As Long) As Integer
Private Declare PtrSafe Function PostMessageA Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByVal wMsg As Long, _
    ByVal wParam As LongPtr, _
    ByVal lParam As LongPtr) As Long
Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As LongPtr

Private Type POINTAPI
    XY As LongLong
End Type

Private Type MOUSEHOOKSTRUCT
    pt As POINTAPI
    hwnd As LongPtr
    wHitTestCode As Long
    dwExtraInfo As LongPtr
End Type

Private Const WH_MOUSE_LL As Long = 14&
Private Const WM_MOUSEWHEEL As LongPtr = &H20A
Private Const HC_ACTION As Long = 0&
Private Const GWL_HINSTANCE As Long = -6&
Private Const WM_KEYDOWN As Long = &H100
Private Const SCROLL_DOWN As LongPtr = &H780000
Private Const GC_CLASSNAMEUSERFORM As String = "ThunderDFrame"

Private llngptrMouseHook As LongPtr
Private llngptrControlHwnd As LongPtr
Private llngPage As Long
Private lblnHook As Boolean
Private lobjScrollObject As Object

Public Sub HookMouse(ByRef probjUserform As Object, ByRef probjScrollObject As Object, Optional ByVal opvlngPage As Long)
    Dim lngptrHinstance As LongPtr
    Dim lngptrFormHwnd As LongPtr
    Dim lngptrHwndUnderCursor As LongPtr
    Dim udtPoint As POINTAPI
    llngPage = opvlngPage
    Call GetCursorPos(udtPoint)
    lngptrHwndUnderCursor = WindowFromPoint(udtPoint.XY)
    If llngptrControlHwnd <> lngptrHwndUnderCursor Then
        Call UnhookMouse
        Set lobjScrollObject = probjScrollObject
        llngptrControlHwnd = lngptrHwndUnderCursor
        lngptrFormHwnd = FindWindowA(GC_CLASSNAMEUSERFORM, probjUserform.Caption)
        lngptrHinstance = GetWindowLongPtrA(lngptrFormHwnd, GWL_HINSTANCE)
        If Not lblnHook Then
            llngptrMouseHook = SetWindowsHookExA(WH_MOUSE_LL, AddressOf MouseProc, lngptrHinstance, 0&)
            lblnHook = llngptrMouseHook <> 0
        End If
    End If
End Sub

Public Sub UnhookMouse()
    If lblnHook Then
        Call UnhookWindowsHookEx(llngptrMouseHook)
        Set lobjScrollObject = Nothing
        llngptrMouseHook = 0
        llngptrControlHwnd = 0
        lblnHook = False
    End If
End Sub

Private Function MouseProc(ByVal pvlngCode As Long, ByVal pvlngptrParam As LongPtr, ByRef prudtParam As MOUSEHOOKSTRUCT) As LongPtr
    Dim lngptrHwndUnderCursor As LongPtr
    On Error GoTo err_exit
    If pvlngCode = HC_ACTION Then
        lngptrHwndUnderCursor = WindowFromPoint(prudtParam.pt.XY)
        If lngptrHwndUnderCursor = llngptrControlHwnd Then
            If pvlngptrParam = WM_MOUSEWHEEL Then
                If TypeOf lobjScrollObject Is MSForms.ListBox Or TypeOf lobjScrollObject Is MSForms.ComboBox Or _
                    TypeOf lobjScrollObject Is MSForms.TextBox Then
                    With lobjScrollObject
                        If GetKeyState(vbKeyControl) >= 0 Then
                            If prudtParam.hwnd = SCROLL_DOWN Then
                                If .TopIndex > 0 Then
                                    If .TopIndex > 3 Then
                                        .TopIndex = .TopIndex - 3
                                    Else
                                        .TopIndex = 0
                                    End If
                                End If
                            Else
                                .TopIndex = .TopIndex + 3
                            End If
                        Else
                            If TypeOf lobjScrollObject Is MSForms.ListBox Or TypeOf lobjScrollObject Is MSForms.TextBox Then
                                If prudtParam.hwnd = SCROLL_DOWN Then
                                    Call PostMessageA(llngptrControlHwnd, WM_KEYDOWN, vbKeyLeft, 0)
                                Else
                                    Call PostMessageA(llngptrControlHwnd, WM_KEYDOWN, vbKeyRight, 0)
                                End If
                            End If
                        End If
                    End With
                ElseIf TypeOf lobjScrollObject Is MSForms.MultiPage Then
                    With lobjScrollObject.Pages(llngPage)
                        If GetKeyState(vbKeyControl) >= 0 Then
                            If prudtParam.hwnd = SCROLL_DOWN Then
                                If .ScrollTop > 0 Then
                                    .ScrollTop = .ScrollTop - 30
                                Else
                                    .ScrollTop = 0
                                End If
                            Else
                                .ScrollTop = .ScrollTop + 30
                            End If
                        Else
                            If prudtParam.hwnd = SCROLL_DOWN Then
                                If .ScrollLeft > 0 Then
                                    .ScrollLeft = .ScrollLeft - 30
                                Else
                                    .ScrollLeft = 0
                                End If
                            Else
                                .ScrollLeft = .ScrollLeft + 30
                            End If
                        End If
                    End With
                ElseIf TypeOf lobjScrollObject Is MSForms.UserForm Or TypeOf lobjScrollObject Is MSForms.Frame Then
                    With lobjScrollObject
                        If GetKeyState(vbKeyControl) >= 0 Then
                            If prudtParam.hwnd = SCROLL_DOWN Then
                                If .ScrollTop > 0 Then
                                    .ScrollTop = .ScrollTop - 30
                                Else
                                    .ScrollTop = 0
                                End If
                            Else
                                .ScrollTop = .ScrollTop + 30
                            End If
                        Else
                            If prudtParam.hwnd = SCROLL_DOWN Then
                                If .ScrollLeft > 0 Then
                                    .ScrollLeft = .ScrollLeft - 30
                                Else
                                    .ScrollLeft = 0
                                End If
                            Else
                                .ScrollLeft = .ScrollLeft + 30
                            End If
                        End If
                    End With
                End If
                Exit Function
            End If
        Else
            Call UnhookMouse
        End If
    End If
    MouseProc = CallNextHookEx(llngptrMouseHook, pvlngCode, pvlngptrParam, ByVal prudtParam)
    Exit Function
err_exit:
    Call UnhookMouse
End Function

Der Code ist auf ein 64Bit-Office ausgelegt. Falls du noch 32Bit hast, dann sag Bescheid.

Damit lassen sich auch ListBoxen, ComboBoxen, Frames, MultiPages und UserForms scrollen.
Dazu einfach im MouseMove-Event des Controls die Prozedur HookMouse mit Me als ersten und dem entsprechenden Control als zweiten Parameter aufrufen.
Zum scrollen des UserForm so: Call HookMouse(Me, Me)
De fontibus non est disputandum

Gruß
Nepumuk 8-)
Benutzeravatar
Nepumuk
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 15215
Registriert: 10. Aug 2004, 08:40
Wohnort: Regensburg

Re: vertikal, horizontal scrollen

Beitragvon Gast » 15. Sep 2021, 12:39

Hallo,
@Nepomuk
Falls du noch 32Bit hast

Ich hatte damals die 32bit-Version installiert, da MS wegen Access diese empfahl. Vielleicht ist das jetzt anders.
Nett, wenn du die schickst
@Christian
Da am rechten Ende grundsätzlich ein Zeilenumbruch erzeugt wird

Ich machte dies. In eine Box soviel Text eingefügt, dass der Scrollbalken erschien.
Den Text wieder kopiert und in den Editor eingefügt. Da ist kein Zeilenumbruch zu sehen.
Beseitigt den die Zwischenablage automatisch?
VG Betty
Gast
 

Re: vertikal, horizontal scrollen

Beitragvon knobbi38 » 15. Sep 2021, 13:51

@Nepumuk:

Vielleicht solltest du dabeischreiben, daß das für MSForms.Controls gedacht ist?
Diese werden in Access tatsächlich eher selten verwendet.

Nicht, daß da von verschiedenen Dingen gesprochen wird.

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3485
Registriert: 02. Jul 2015, 14:23

Re: vertikal, horizontal scrollen

Beitragvon Bitsqueezer » 15. Sep 2021, 16:18

Hallo Betty,

der Zeilenumbruch ist "virtuell", es wird also kein CR+LF erzeugt. Genau wie bei Word etwa: Wenn Du den Text durchschreibst und nicht, wie manche Leute das immer noch machen, am Ende der Zeile Return drückst, gibt es einen automatischen Zeilenumbruch am Ende der Zeile. Es ist also ein rein optischer Zeilenumbruch, entsprechend braucht die Zwischenablage auch nichts zu konvertieren, denn es existieren keine Zeilenumbruchzeichen im Text.

Den Effekt kannst Du auch in Notepad sehen, wenn Du "Word Wrap" einschaltest oder ausschaltest. Der Text wird dadurch auch nicht verändert.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8475
Registriert: 21. Jun 2007, 12:17

Re: vertikal, horizontal scrollen

Beitragvon Gast » 15. Sep 2021, 16:36

Hallo Christian,
mal wieder was gelernt. Danke.
VG Betty
Gast
 


Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste