Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
608to612
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
608to612
608to612
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Listbox Scroll

Listbox Scroll
10.05.2005 16:27:56
Kristin
Hallo Excel-Freunde,
ich hab ja nur eine kleine Frage :) ich habe mir eine Listbox in einer Userform gebastelt - alles super, aber wieso scrollt der Text nicht via Mausrad? Muss ich das etwa extra irgendwie aktivieren? Oder was mache ich falsch?
Liebe Grüße und danke für die Mühe,
Kristin

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Listbox Scroll
10.05.2005 16:31:23
Herbert
Hi,
Mousewheel wird in den Forms nicht unterstützt.
mfg Herbert
AW: oh schade, aber danke :) oT
10.05.2005 16:38:08
Kristin
.
AW: Listbox Scroll
10.05.2005 16:34:28
Reinhard
Hallo Kristin,
habe mal gegoogelt, eine Antwort zur gleichen Frage wr:
Nein, das Listbox-Control kennt die Ereignisse noch nicht.
Gruß
Reinhard
scheinbar geht es doch $29
10.05.2005 16:40:41
Reinhard
Hallo Kristin,
perfect for any object that utilizes scrolling, such as list boxes, speadsheets, File and Directory lists, etc.
aus:
http://www.mabry.com/mwheel/index.htm
Gruß
Reinhard
AW: scheinbar geht es doch $29
10.05.2005 16:57:47
Christoph M
Hallo Rainer,
hab auch mal gegoogelt ...allerdings hab ich das Teil noch nicht zu laufen gebracht. (weil wegen kein API-Crack und alles...), sprich Excel verabschiedet sich bei meinen Versuchen komplett.
solltest du oder jemand anderes damit Erfolg haben, wäre ich an dieser Lösung sehr interessiert.
http://www.xtremevbtalk.com/showthread.php?t=178071
Gruß
Christoph
Anzeige
AW: scheinbar geht es doch $29
10.05.2005 18:14:27
Reinhard
Hallo Christoph,
das ist aber auch um Längen zu hoch, nach Nepumuk umschue :-)
Ich habe mir ne Userform mit einer leeren Listbox gebastelt, gestartet wird sie per Button mit tt().
Dann habe ich in alle Proceduren an der ersten Möglichkeit einen Haltepunkt gesetzt. Dann Editor und Fenster nebeneinander, gestartet ud dann mit F8 step by step. Nach jedem Step mal auf die Tabelle oder die UF geklickt, der Code läuft durch, erst beim/nach dem letzten End End, wenn man dann , die Tabelle nur mit der Maus anhaucht steigt Excel aus.
Das nurmal al sinfo für den nachstehenden Code. Ich kann da nix mehr machen bei so hightec Problemen.
Achja. der Autor warnt:
Warning!!!
1- Don't ever forget to UnHook.
2- Unhandled errors will cause Excel to crash.
End of Warning!
IT WORKS SOOOOO GREAT!
Wegen Punkt 2 muss man m.E. das on error resume next durch Fehlerroutinen ersetzen und dann die Fehler auch interpretieren können.
Gruß
Reinhard
(der erst mal googeln muss was hook bzw unhook genau bedeutet)
In ein Modul:
Option Explicit
'To be able to scroll with mouse wheel within Userform
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" ( _
ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal Wparam As Long, _
ByVal Lparam As Long) As Long
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
'To get hWnd long value of the UserForm
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Const GWL_WNDPROC = -4
Private Const WM_MOUSEWHEEL = &H20A
Dim LocalHwnd As Long
Dim LocalPrevWndProc As Long
Dim MyForm As UserForm
Sub tt()
UserForm1.Show
End Sub

Private Function WindowProc(ByVal Lwnd As Long, ByVal Lmsg As Long, ByVal Wparam As Long, ByVal Lparam As Long) As Long
'To handle mouse events
Dim MouseKeys As Long
Dim Rotation As Long
If Lmsg = WM_MOUSEWHEEL Then
MouseKeys = Wparam And 65535
Rotation = Wparam / 65536
'My Form s MouseWheel function
GROUPSDLG.MouseWheel Rotation
End If
WindowProc = CallWindowProc(LocalPrevWndProc, Lwnd, Lmsg, Wparam, Lparam)
End Function

Public Sub WheelHook(PassedForm As UserForm)
'To get mouse events in userform
On Error Resume Next
Set MyForm = PassedForm
LocalHwnd = FindWindow("ThunderDFrame", MyForm.Caption)
LocalPrevWndProc = SetWindowLong(LocalHwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub WheelUnHook()
'To Release Mouse events handling
Dim WorkFlag As Long
On Error Resume Next
WorkFlag = SetWindowLong(LocalHwnd, GWL_WNDPROC, LocalPrevWndProc)
Set MyForm = Nothing
End Sub
In die Userform:

Private Sub UserForm_Activate()
WheelHook Me 'For scrolling support
End Sub


Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
WheelUnHook     'For scrolling support
End Sub


Private Sub UserForm_Deactivate()
WheelUnHook     'For scrolling support
End Sub

Public Sub MouseWheel(ByVal Rotation As Long)
'************************************************
' To respond from MouseWheel event
' Scroll accordingly to direction
'
' Made by: Mathieu Plante
' Date: July 2004
'************************************************
If Rotation > 0 Then
'Scroll up
If ListBox1.TopIndex > 0 Then
If ListBox1.TopIndex > 3 Then
ListBox1.TopIndex = ListBox1.TopIndex - 3
Else
ListBox1.TopIndex = 0
End If
End If
Else
'Scroll down
ListBox1.TopIndex = ListBox1.TopIndex + 3
End If
End Sub '***************** End of MouseWheel *****************
Anzeige
du hast recht.... dann kann nur Nepumuk helfen
10.05.2005 20:27:15
Christoph M
Hallo Reinhard
...das hab ich mir auch schon gedacht. Ich hab mich in den letzten vier Wochen schon öfter an dem Teil versucht, aber weiter als du bin ich auch noch nicht gekommen.
weiter unter im genannten Thread wird noch bemerkt:
"In addition, a "subclassing convention" is to keep as many variables outside the WindowProc as possible in case deep recursion takes place. Very unlikely in this example, ..."
so ganz astrein ist der Code also wohl noch nicht, aber offensichtlich läuft er bei den Jungs ja.
Wenn ich Nepumuk mal wieder hier im Forum "sehe", werd ich ihm den Link zeigen... vielleicht kriegt er's ja hin.
(sorry für den falschen Namen - ja, du bist Reinhard und nicht Rainer)
Gruß
Christoph
Anzeige
AW: du hast recht.... dann kann nur Nepumuk helfe
10.05.2005 21:10:30
Reinhard
Hi Christoph,
hier sind noch 6 Links,
http://groups.google.de/groups?c2coff=1&q=%22Sub+MouseWheel%22&qt_s=Suche
den ersten musste man erst neu formatieren, vielleicht gng da was schief, jetzenfalls hänge ich an Synaxfehler in zeile:
Public Sub Hook(ByVal hControl As Long)
fest.
Gruß
Reinhard
UserForm1:
Private Sub UserForm_Activate()
Dim hwnd As Long
hwnd = hwndFenetreForm(Me.Caption)
If hwnd <> 0 Then Hook hwnd
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
UnHook
End Sub
Public Sub Controle_ActualiseWheel(Control As MSForms.Control, ByVal sens As Integer)
If sens = -1 Then
If UserForm1.ScrollBar1 - UserForm1.ScrollBar1.SmallChange > UserForm1.ScrollBar1.Min Then UserForm1.ScrollBar1 = UserForm1.ScrollBar1 - UserForm1.ScrollBar1.SmallChange
Else
UserForm1.ScrollBar1 = UserForm1.ScrollBar1.Min
End If
Else
If UserForm1.ScrollBar1 + UserForm1.ScrollBar1.SmallChange < UserForm1.ScrollBar1.Max Then UserForm1.ScrollBar1 = UserForm1.ScrollBar1 + UserForm1.ScrollBar1.SmallChange
Else
UserForm1.ScrollBar1 = UserForm1.ScrollBar1.Max
End If
End If
End Sub
'Modul1:
'Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
'Private Declare Function CallWindowProc Lib "" ()
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const MK_CONTROL = &H8
Public Const MK_LBUTTON = &H1
Public Const MK_RBUTTON = &H2
Public Const MK_MBUTTON = &H10
Public Const MK_SHIFT = &H4
Private Const GWL_WNDPROC = -4
Private Const WM_MOUSEWHEEL = &H20A
Private hControl As Long
Private lPrevWndProc As Long
'appelée quand l'événement mousewheel est déclenché
Private Sub MouseWheel(ByVal fwKeys As Long, _
ByVal zDelta As Long, _
ByVal xPos As Long, _
ByVal yPos As Long)
Dim sens As Integer
If UserForm1.ActiveControl.Name <> "ScrollBar1" Then
Exit Sub
If zDelta < 0 Then sens = 1 Else sens = -1
UserForm1.Controle_ActualiseWheel
UserForm1.ActiveControl , sens
End Sub
Private Function WindowProc(ByVal lWnd As Long, _
ByVal lMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Dim fwKeys As Long
Dim zDelta As Long, xPos As Long, yPos As Long
If lMsg = WM_MOUSEWHEEL Then
fwKeys = wParam And 65535
zDelta = wParam / 65536
xPos = lParam And 65535
yPos = lParam / 65536
MouseWheel fwKeys, zDelta, xPos, yPos
End If
WindowProc = CallWindowProc(lPrevWndProc, lWnd, lMsg, wParam, lParam)
End Function
'Hook
Public Sub Hook(ByVal hControl As Long)
lPrevWndProc = SetWindowLong(hControl, GWL_WNDPROC, AddressOfWindowProc)
End Sub
'UnHook
Public Sub UnHook()
Call SetWindowLong(hControl, GWL_WNDPROC, lPrevWndProc)
End Sub
Function DCFenetreForm(CaptionFenetre As String) As Long
Dim hwnd As Long
'renvoie le hdc d'un UserForm (mais pas d'un contrôle)
hwnd = FindWindow(vbNullString, Me.Caption)
'hwnd = FindWindow(vbNullString, CaptionFenetre)
DCFenetreForm = GetDC(hwnd)
End Function
Function hwndFenetreForm(CaptionFenetre As String) As Long
hwndFenetreForm = FindWindow(vbNullString, CaptionFenetre)
End Function
Function HwndFenetreXL() As Long
HwndFenetreXL = FindWindow("XLMAIN", Application.Caption)
End Function
wort, "*") + 1))
End Function

Anzeige
AW: du hast recht.... dann kann nur Nepumuk helfe
11.05.2005 22:00:33
Christoph M
Hallo Reinhard,
der von dir erwähnte Code (erster Link auf der URL) läuft nach entsprechender Korrektur durch das Kopieren, bis auf das erwähnte Fehlverhalten in "non-modal":
https://www.herber.de/bbs/user/22476.xls
Aber grade für non-modale Userforms wäre der MouseWheel-Event interessant!
Ich hab den Code auch eben mal auf einen Frame in einer UF Frame angewendet. Das läuft ebenso gut (ohne CPU-Load und ohne RAM zu fressen). In diesen könnte man ohne weiteres eine ListBox einsetzen, und schon wäre das Ziel erreicht - bis auf das gravierende "non-modal".
Am meisten verspreche ich mir von dem 5. Link auf der URL (von Bob Phillips). Allerdings hängt sich der bei "AddrOf_Callback_Routine" auf. Und ich hab keinen Schimmer, wie ich das in den Griff kriegen sollte.
Ich lass den Thread weiter auf Offen, mit der Hoffnung, dass Nepumuk vielleicht darüber stolpert...
Gruß
Christoph
Anzeige
AW: du hast recht.... dann kann nur Nepumuk helfe
12.05.2005 09:56:06
Kristin
hey Jungs,
ich bin gespannt wie sich das hier entwickelt und verfolge das ganze sehr interessiert :)
auch wenn ich nicht viel von allem verstehe...
macht weiter so :)
lieben Gruß,
kristin
AW: interessant o.T.
12.05.2005 20:17:15
kurzer
wirklich?
13.05.2005 00:42:07
Dicker
w
AW: wirklich?
13.05.2005 01:10:49
Reinhard
Hallo Dicker,
warum nimmmst du mir und anderen die Hoffnung dass noch jmd uns hilft dies zu lösen?
Lass doch die Frage auf offen stehen, danke.
Gruß
Reinhard
AW: scheinbar geht es doch $29
10.05.2005 17:08:52
Kristin
hey super sache :)))
ich werde mich aber erst mal mit der 'ist nicht möglich' -lösung zufrieden geben :) bis zum nächsten update :))
vielen Dank für's Xtreme-Googlen - gruß kristin

10 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige