Herbers Excel-Forum - das Archiv

Listbox-Error: "vom Client getrennt!?"

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
ComboBox Frame ListBox UserForm
Bild

Betrifft: Listbox-Error: "vom Client getrennt!?"
von: Andre

Geschrieben am: 24.03.2005 15:54:53
Hi zusammen,
seit neustem hab ich ein ganz "witziges!" Problem:
Ich lasse per VBA eine Listbox füllen, setzte Eigenschaften der Listbox fest und so weiter.
So ziemlich alles über UF.activate und .Initialize.
Beim ersten Start der UF gibt´s kein Problem, alles läuft genauso wie´s soll, aber nachdem ich die UF mittels "Kreuz" oder mittels VBA-Befehl (unloud) schließe und ein zweites Mal starte, bekomme ich folgende Fehlermeldung:

Laufzeitfehler '-2147417848 (80010108)':
Automatisierungsfehler
Das aufgerufene Objekt wurde von den Clients getrennt.

Leider ist dieser Fehler nicht so einfach in einer Beispieldatei nachzustellen, aber vielleicht hat jemand von euch schon mal Erfahrung mit diesem Effekt gemacht und kann mir einen kleinen Trick zeigen, wie ich den Fehler umgehen kann.
Aufgetreten ist dieses Problem erst, nachdem ich mit folgendem Code (aus diesem Forum adaptiert, danke nochmal) versucht hab in der Listbox mit Hilfe der Mouse zu Scrollen. Nehm ich den entsprechenden Befehl aus der UF.Initialize-Prozedur heraus, funzt es wieder, aber ich würde diese Funktion gern erhalten:
Option Explicit
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
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 collUF As New Collection
Dim collPrevHdl As New Collection
Dim collUFHdl As New Collection
Public 
Function WindowProc(ByVal Lwnd As Long, _
ByVal Lmsg As Long, _
ByVal Wparam As Long, _
ByVal Lparam As Long) As Long
Dim Rotation As Long
Dim Btn As Long
If Lmsg = WM_MOUSEWHEEL Then
Rotation = Wparam / 65536
Btn = Abs(Wparam) And 15
MouseWheel collUF(CStr(Lwnd)), Rotation, Btn
WindowProc = 0
Else
WindowProc = CallWindowProc(collPrevHdl(CStr(Lwnd)), Lwnd, Lmsg, Wparam, Lparam)
End If
End Function

Public
Sub UserformHook(PassedForm As UserForm, _
Cap As String)
Dim LocalHwnd As Long
Dim LocalPrevWndProc As Long
Dim cError As Long
Dim i As Long
LocalHwnd = FindWindow("ThunderDFrame", Cap)
' If Val(Application.Version) > 8 Then
'     LocalPrevWndProc = SetWindowLong(hWnd:=LocalHwnd, _
nIndex:=GWL_WNDPROC, _
dwNewLong:=AddrOf_Callback_Routine)
' Else
LocalPrevWndProc = SetWindowLong(hWnd:=LocalHwnd, _
nIndex:=GWL_WNDPROC, _
dwNewLong:=AddressOf WindowProc)
' End If
On Error GoTo DupKey
TryAgain:
collUF.Add PassedForm, CStr(LocalHwnd)
collPrevHdl.Add LocalPrevWndProc, CStr(LocalHwnd)
collUFHdl.Add LocalHwnd
Exit Sub
DupKey:
If cError = 0 Then
For i = 1 To collUFHdl.Count
If collUFHdl(i) = LocalHwnd Then
collUFHdl.Remove i
collUF.Remove i
collPrevHdl.Remove i
End If
Next
cError = 1
Resume TryAgain
End If
End Sub

Public
Sub UserformUnHook(UF As UserForm)
Dim i As Long
For i = 1 To collUF.Count
If UF Is collUF(i) Then Exit For
Next
SetWindowLong collUFHdl(i), GWL_WNDPROC, collPrevHdl(i)
collUF.Remove i
collPrevHdl.Remove i
collUFHdl.Remove i
End Sub

Public
Sub MouseWheel(UF As UserForm, _
ByVal Rotation As Long, _
ByVal Btn As Long)
Dim LinesToScroll As Long
Dim ListRows As Long
Dim Idx As Long
With UF
If TypeName(.ActiveControl) = "ListBox" Then
ListRows = .ActiveControl.ListCount
If Btn = 8 Then
LinesToScroll = Int(.ActiveControl.Height / 10)
Else
LinesToScroll = 1
End If
If Rotation > 0 Then
Idx = .ActiveControl.TopIndex - LinesToScroll
If Idx < 0 Then Idx = 0
.ActiveControl.TopIndex = Idx
Else
Idx = .ActiveControl.TopIndex + LinesToScroll
If Idx > ListRows Then Idx = ListRows
.ActiveControl.TopIndex = Idx
End If
End If
End With
End Sub

Wünsche allen schon mal frohe Feiertage und hoffe jemand hat für diese Problem ´ne Lösung.
Gruß Andre
Bild

Betrifft: AW: Listbox-Error: "vom Client getrennt!?"
von: Nepumuk
Geschrieben am: 24.03.2005 22:42:48
Hallo Andre,
benutze doch einfach das ImageComboBox - Control. Das lässt sich von Haus aus scrollen.
Gruß
Nepumuk
Bild

Betrifft: AW: Listbox-Error: "vom Client getrennt!?"
von: Andre

Geschrieben am: 26.03.2005 08:38:51
Hi Nepumuk,
danke für deine Antwort, aber du wirst mir sicherlich verzeihen, wenn ich nochmal nachfragen muß: ImageComboBox - Control?
Was meinst du damit? Wäre natürlich fantastisch, wenn es ein Steuerelement gäbe, das man sowieso schon scrollen kann.
Gruß Andre
Bild

Betrifft: AW: Listbox-Error: "vom Client getrennt!?"
von: Nepumuk

Geschrieben am: 26.03.2005 08:58:29
Hallo Andre,
hier eine Beispielmappe:
https://www.herber.de/bbs/user/20175.xls
Das Control findest du so: Rechtsklick auf die Werkzeugsammlung - Zusätzliche Steuerelemente. In der Liste nach "Microsoft ImageComboBox Control" suchen und durch ein Kreuzchen vorn aktivieren. Wenn die Seite mit Werkzeugen voll ist, dann eine Rechtsklick auf den Tabellenreiter - Seite hinzufügen.
Gruß
Nepumuk
Bild

Betrifft: AW: Listbox-Error: "vom Client getrennt!?"
von: Andre
Geschrieben am: 26.03.2005 09:05:00
Danke, man lernt nie aus, aber leider würde ich gern eine Listbox benutzen.
Für diese Art der ComboBox finde ich sicherlich auch Verwendung, aber eine Listbox mit Scroll-Möglichkeit wäre klasse.
mfg Andre
Bild

Betrifft: AW: Listbox-Error: "vom Client getrennt!?"
von: Andre

Geschrieben am: 26.03.2005 09:51:47
Ok, danke nochmal, hast mich wohl auf die richtige Spur gebracht.
Es gibt sowas auch für eine Listbox, heißt "ListView" und scrollen ist damit so einfach wie sonstwas!
Bis bald.
Gruß Andre
 Bild