PDA

Vollständige Version anzeigen : Abschalten der Wheel-Maus (Mausrad) für Access 2000/XP


Günther Kramer
30.12.2002, 14:40
Dieser Tipp ist nur für Access 2000 und XP.
Einen Tipp für Access 97 finden Sie auf unserer Partnerseite MS-Office-Wissen (http://www.ms-office-wissen.de/askdrmof/details.php?id=45).

Der Download beinhaltet zwei Beispiele.
Ein Beispiel greift auf eine externe DLL zurück und die zweite Möglichkeit zeigt, wie man mit Hilfe von VBA-Funktionen das Mausrad in Forumlaren abschalten kann.

Meine Erfahrungen haben gezeigt, dass es mit der zweiten (VBA) Vatiante immer wieder Probleme gibt und empfehle daher den Einsatz der DLL. Die DLL wurde von mir erstellt und greift auf denArtikel 278379 der Microsoft Knowledge Base (http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q278379) zurück. Die DLL kann frei verwendet werden.

Axel Kloss
25.02.2003, 18:15
Hallo Günther,

ich setze AccessXP unter WinXP ein und habe Deine Anleitung genau befolgt. Leider poppt bei mir, sobald ich das Formular öffne, folgende Fehlermeldung hoch:

"Objekterstellung durch ActiveX-Komponente nicht möglich (Fehler 429)"

Wenn ich den Debugger aufrufe, zeigt er mir das er an dieser Stelle hängt:

Private Sub Form_Load()
Set clsMouseWheel = New MouseWheel.CMouseWheel

clsMouseWheel hat an dieser Stelle den Wert "nothing".

Wenn ich den Debugger beende und das Formular schließe erscheint folgender Fehler:

"Objektvariable oder With-Blockvariable nicht festgelegt (Fehler 91)"

und er hängt an folgender Stelle:


Private Sub Form_Close()
clsMouseWheel.SubClassUnHookForm()

Ich habe jetzt schon diverse Artikel zu der Problematik gelesen und die verschieden Lösungsansätze getestet. Leider führte keiner zum Erfolg.
Deiner gefiel mir allerdings soweit am besten, insofern möchte ich Dich an dieser Stelle um Deine Unterstützung bitten. Ich hoffe, die Eingrenzung war präziese genug, um mir weiterhelfen zu können.

Diese Mausrad treibt mich noch in den Wahnsinn... :stupid:

Günther Kramer
26.02.2003, 06:35
Nachfrage

Ist die DLL-Datei in den Verweisen eingetragen?
Funktioniert denn die Original-Beispieldatei von mir auf deinem Rechner?
Welches Servicepack verwendest du? (Schaum mal ins Menü unter ? und dann Info.

Axel Kloss
26.02.2003, 07:22
Hi Günther,

ich habe wirklich alles so gemacht, wie es in Deiner Readme-Datei beschrieben war. Das heißt, ich habe es mit Deiner Datei probiert und auch der Verweis auf die DLL ist ok.
Ich arbeite mit Access 2002 (10.2627.3501) SP-1

moep
28.02.2003, 13:54
Hallo,
ich kenne diese Fehlermeldung wenn die dll-Datei nicht vorher mit dem Befehl "regsvr32" registriert wurde. Unter Start->Ausführen müsste man dann "regsvr32 [Laufwerk]\[Pfad]\MouseWheel.dll" eingeben. Vielleicht hilft das weiter...

Gruß,
Siegmar

Axel Kloss
28.02.2003, 15:07
Hi Siegmar,

das war's offensichtlich. :happy: Haut jetzt alles hin, wie es soll.

Besten Dank! :hands:

Crypton
04.03.2003, 21:36
Hallo Günther !

Ja, die Sache mit der MouseWheel.dll ist schon toll. Ich hab mir diese Lösung auch in meine DB eingebaut. Nur bin ich mit der Einbindung über Extras --> Verweise u.s.w. nicht ganz glücklich und suche schon seit geraumer Zeit eine Lösung um den Verweis per VBA zu integrieren. Gibts denn da gar keine Lösung ???????????? Die Kunden für die ich die Datenbank erstelle können nach der Installation nie und nimmer den Verweis manuell erstellen.

Für eine Antwort wär ich Dir sehr dankbar !

Viele Grüße Alex !

MarioR
05.03.2003, 11:58
Hallo Alex,

schau Dir in der Hilfe mal das Reference-Objekt bzw. die References-Auflistung an.

Sascha Trowitzsch
05.03.2003, 12:09
Wenn du in deiner DB den Verweis eingeschaltet hast, so ist er auch noch beim Kunden drin und muss nicht manuell eingeschaltet werden.
Nur die DLL muss vorhanden und registriert sein.

Ciao, Sascha

Crypton
05.03.2003, 17:16
Sorry Sascha, da muss ich Dir wiedersprechen. Nach meiner Erfahrung funktioniert gerade das nicht. Sonst hätt ich ja gar kein Problem mehr. Sofern der Verweis beim Kunden nicht schon vorher bestand wird er duch die Inst. der DB nicht automatisch übernommen.

Grüße Alex !

Sascha Trowitzsch
05.03.2003, 18:17
Doch! (Es sei denn, sonst was läuft schief.)

Nelix
07.03.2003, 17:36
Hallo

Über folgende Funktionen und Prozeduren kann man z.B. bei Drücken eines Buttons die Registrierung der WheelMouse.dll durchführen lassen.
Man kann allerdings das gleiche auch beim ersten Formularload durchführen lassen etc.
Man braucht folgende Funktionen, die einfach in ein Modul kopiert werden können: (Voraussetzung bei diesen Beispielprozeduren ist, dass sich die dll im Datenbankverzeichnis befindet und der Verweis vorher einmal gesetzt wurde)

Function getDBName()
getDBName = Dir(Application.CurrentDb.Name)
End Function


Function getDBPfad()
Dim strPfad As String
strPfad = Application.CurrentDb.Name
getDBPfad = Mid(strPfad, 1, Len(strPfad) - Len(getDBName()))
End Function


Folgender Eintrag wird dann erstellt und kommt in das gewünschte Formular, um beim Klicken eines Buttons die DLL zu registrieren:

Private Sub EigenerButton_Click()

Dim stAppName As String
stAppName = ("regsvr32.exe " & Chr(34) & getDBPfad & "MouseWheel.dll" & Chr(34))
Call Shell(stAppName, 1)

End Sub


Wenn Ihr regsvr32.exe /s benutzt, kommt auch keine Meldung, dass die dll registriert wurde! So merkt der Anwender nicht, dass die DLL registriert werden mußte

Falls man es nur beim ersten Start der DB ausführen lassen möchte, könnte man beim ersten Start der DB einen Wert in einer Tabelle speichern lassen. Sobald der Wert beim nächsten Start vorhanden ist, wird die Prozedur nicht mehr ausgeführt!

Viele Grüße

Nelix

Nelix
10.03.2003, 11:38
Hallo

Habe mal die zuvor aufgeführten Funktionen ein Modul gepackt!
Es kam bei mir beispielsweise nach dem Starten der Datenbank (Verweis gesetzt wie in der Anleitung beschrieben) unter WinME (Iaber auch officeXP) zu einer Fehlermeldung, sodaß die dll noch manuell registriert werden mußte.
Hier ist das oben beschriebene Verfahren noch einmal zu einem Modul zusammengefaßt, sodaß Ihr nur noch die bas-Datei in der VBA-IDE importieren müßt

Wenn Ihr die Registrierung nun irgendwo einbauen wollt, reicht nach dem Import der BAS-Datei einfach folgender Eintrag in einem Sub Eurer Wahl:

z.B beim Formularload

Private Sub Form_load

Registrierung

End Sub

Hoffe, es ist verständlich ausgedrückt

Viele Grüße

Nelix

sth_Weird
01.09.2003, 17:44
Auf der Seite

http://www.lebans.com/mousewheelonoff.htm

gibt es neben der MouseWheel.dll eine einfachere Alternative namens MouseHook.dll, welche die ganzen Einbindungen automatisiert, die DLL muss lediglich im selben Verzeichnis wie die Datenbank oder im Windows-Verzeichnis liegen.
Die downloadbare zip-Datei enthält auch eine Beschreibung dazu und den erforderlichen Code (1 Modul, 1:1 übertragbar auf die eigene Datenbank) für die Nutzung der DLL.
Leider funktioniert die aktuelle Version noch nicht, wenn der Fokus auf CheckBoxen/OptionsGruppen oder Registern liegt. Dann kann wieder gescrollt werden :mad:
Aus diesem Grund suche ich auch nach dem Quellcode für die MouseHook.dll, denn auf der besagten Seite gibt's nur den von der MouseWheel.dll, die ich aufgrund deren Komplexität nicht so gerne verwende. Also falls jemand dazu was weiß...wär toll!

Grüß'le
sth_Weird

Ein paar Worte vom Moderator dazu:

Ich weiß nicht, was du mit "die ganzen Einbindungen automatisiert, die DLL muss lediglich im selben Verzeichnis wie die Datenbank oder im Windows-Verzeichnis liegen." meinst.
Die von Lebans ist genauso eine ActiveX-DLL wie die von Günther.
Alle ActiveX-DLLs müssen in VB/VBA nur dann nicht registriert werden, wenn sie im Anwendungsverzeichnis liegen. An anderem Ort schon. Das gilt auch für Lebans' DLL. Des weiteren ist selbige ja wohl ebenfalls manuell in die Verweise aufzunehmen.
Warum du den Quellcode haben willst, weiß ich auch nicht... Willst du die wahrscheinlich mit VB programmierte DLL weiterentwickeln oder den Code selbst als Modul in die DB kopieren. Letzteres ist nämlich eben gerade nicht der Sinn der Sache. Die DLLs laufen gerade deshalb stabiler, weil der Thread besser abgeschottet ist, als laufender Code eines VBA-Projekts.
Der Code der Lebans-DLL dürfte im übrigen noch deutlicher komplexer sein, als der von MS, der geradewegs die Minimallösung darstellt!

Ciao, Sascha

sth_Weird
08.09.2003, 19:15
@ moderator:

bei lebans gibt es zwei dlls: mousewheel.dll und die neue mousehook.dll.
mousewheel ist eine für anfänger sehr komplizierte version der mausrad-abschaltung. außerdem muss die dll per hand eingebunden werden.
mousehook ist die neue, einfachere form, die selbst ein neuling verwenden kann, man muss die datei nur in das selbe verzeichnis kopieren, und über den mitgelieferten code, den man 1:1 kopieren kann, erfolgt die einbindung automatisch, das einzige was noch zu tun ist, ist eine einzige methode beim öffnen des formulars aufzurufen.

den code wollte ich, da die dll für checkboxen, optionbuttons und register (noch) nicht funktioniert. ich erhoffte mir vom code aufschluss zu erhalten, weshalb, und ihn falls. so umzuändern, dass er für meine zwecke funktioniert. ich habe nichts kriminelles oder illegales mit dem code vor ;-)

so long.
sth_Weird

Sascha Trowitzsch
08.09.2003, 20:08
OK, da hatte ich übersehen, dass es was neues bei Lebans gibt... Tschuldjung.

Soweit man das im Hex-Editor ersehen kann, ist die DLL in Visual C programmiert.
Wenn du die Source willst, so frage doch einfach bei Lebans nach... würde mich nicht wundern, wenn er es rausrücken würde.

Die DLL funktioniert mit einer API-Hook-Funktion, die Mausmeldungen abfängt, noch bevor sie an ein Fenster gelangen.
Da hatte Lebans die gleiche Idee wie ich ;) ;)
In diesem Thread kannst du (siehe am Ende) sehen, wie ich das in VBA gemacht habe:
http://www.ms-office-forum.net/forum/showthread.php?s=&threadid=94759&highlight=%2Ahook%2A
bzw. das Demo:
http://www.moss-soft.de/public/HookMouse.zip

So ähnlich dürfte auch Lebans Code funktionieren. Vielleicht reicht dir die Demo als "Grundlage"

Ciao, Sascha

Gregor0310
05.08.2004, 15:58
hallo Leute,

die Mausradabschaltung funktioniert ja bei einem Formular. Aber wenn ich ein Unterformular darin verwende, sperrt es das Unterformular. Natürlich habe ich die Variable 'clsMouseWheel' im Unterformular umbenannt.

Kann mir vielleicht jemand einen Tipp geben, wie ihr das in Unterformularen gelöst habt?!

Übrigens, mein Formular befindet sich selbst in einem Formular, in welchem(klassisch) auf der linken sich ein TreeView befindet und auf der rechten Seiten dann die Formulare geladen werden.
Da meldet er mir manchmal, die 'Variable wäre bereits entladen', obwohl ich in jedem verwendeten Formular den Code

Private WithEvents clsMouseWheel As MouseWheel.CMouseWheel

Private Sub Form_Close()
' die Mausrad-Deaktivierungs-Variablen entladen
clsMouseWheel.SubClassUnHookForm
Set clsMouseWheel.Form = Nothing
Set clsMouseWheel = Nothing
End Sub

Private Sub Form_Load()
' die Deaktivierung des Mausrades initiieren
Set clsMouseWheel = New MouseWheel.CMouseWheel
Set clsMouseWheel.Form = Me
clsMouseWheel.SubClassHookForm
End Sub
Private Sub clsMouseWheel_MouseWheel(Cancel As Integer)
Cancel = True
End Sub
verwende.
Vielleicht weiß da jemand auch einen alternativen 'Strukturierungstyp'?

Viele Grüße und Dank im Voraus. :biggrinl:
GreLo

Sascha Trowitzsch
20.10.2004, 00:47
Alternative zu Günthers DLL:

http://www.moss-soft.de/public/whms.zip

Ist (sorry!) auch eine ActiveX-DLL. Sollte aber weniger problematisch sein. Siehe readme.

Ciao, Sascha

Nachtrag: Diese DLL ist mittlerweile bei Daimler-Chrysler im Einsatz.

WeinGeist
11.11.2004, 09:48
Hallo Zusammen

Also ich hab jetzt diverse dieser lustigen DLL's ausprobiert. Keine funktioniert wirklich zuverlässig. Leider. Vor allem wenn man mehrere Formulare offen hat kann es sein dass mal der ganze Rotz abschmiert oder einfach nicht mehr funktioniert. Auch ein Wechsel in die Entwurfsansicht und zurück ist nicht immer gesund.
Die letzte version die ich hatte war zwar ziemlich zuverlässig, aber auch ned 100% und hat mir immer wal wieder irgendwo dazwischengefunkt.

Die Lösung mit der OCX-Datei funktioniert absolut perfekt, bis jetzt noch kein Fall wo das nicht sauber funktioniert hat. Egal wie viele formulare ich offen habe.
EDIT: http://www.papwalker.com ->> MouseTrap
War eine richtige Erleichterung. Ist auch sehr einfach per Toggle-Button ein und auschaltbar machbar. Wie das herz begehrt halt.

Falls jemand nachteile der OCX-Variante weiss, bitte melden, ich habe noch nichts gefunden. ;)

Viele Grüsse
Urs

snami
19.11.2004, 16:35
Hallo,

auf meinem Rechner funktioniert MouseWheel perfekt. Deshalb erstmal vielen Dank für diese Lösung.

Allerdings habe ich noch folgendes Problem:
Meine DB liegt auf dem Server und wird auch von Leuten genutzt, die mit A2k SP3 auf W2k Pro SP4 arbeiten. Dort funktioniert MouseWheel auch perfekt, allerdings wird beispielsweise die Funktion "Datum()" nicht mehr ausgeführt. Es kommt keine Fehlermeldung, aber die Textfelder, die standardmäßig das aktuelle Datum anzeigen sollen, bleiben leer. Nach weiteren Fehlern hab ich noch nicht gesucht, ist aber auch so schlimm genug für die Anwendung.

Hat da schon jemand Erfahrung gesammelt, wo dort der Hase im Pfeffer liegen könnte?

Gruß
Snami

sodah
17.12.2004, 21:44
Hi,

ich arbeite seit geraumer Zeit mit der Lösung von Microsoft ganz ohne DLL's.
Meine DB ist in Access XP kompelliert und läuft unter Windows XP + SP1 bzw. teilweise SP2.

- Klicken Sie im Menü Einfügen auf Modul, um ein neues Modul im Visual Basic Editor zu erstellen.
- Fügen Sie den folgenden Code zu dem Modul hinzu: Option Compare Database
Option Explicit

Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long

Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, _
ByVal msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long


Public Const GWL_WNDPROC = -4
Public Const WM_MouseWheel = &H20A
Public lpPrevWndProc As Long
Public CMouse As CMouseWheel

Public Function WindowProc(ByVal hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

'Look at the message passed to the window. If it is
'a mouse wheel message, call the FireMouseWheel procedure
'in the CMouseWheel class, which in turn raises the MouseWheel
'event. If the Cancel argument in the form event procedure is
'set to False, then we process the message normally, otherwise
'we ignore it. If the message is something other than the mouse
'wheel, then process it normally
Select Case uMsg
Case WM_MouseWheel
CMouse.FireMouseWheel
If CMouse.MouseWheelCancel = False Then
WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
End If


Case Else
WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
End Select
End Function


- Speichern Sie das Modul als basSubClassWindow.
7. Klicken Sie im Menü Einfügen auf Klassenmodul.
8. Fügen Sie den folgenden Code zu dem Klassenmodul hinzu:

Option Compare Database
Option Explicit

Private frm As Access.Form
Private intCancel As Integer
Public Event MouseWheel(Cancel As Integer)

Public Property Set Form(frmIn As Access.Form)
'Define Property procedure for the class which
'allows us to set the Form object we are
'using with it. This property is set from the
'form class module.
Set frm = frmIn
End Property

Public Property Get MouseWheelCancel() As Integer
'Define Property procedure for the class which
'allows us to retrieve whether or not the Form
'event procedure canceled the MouseWheel event.
'This property is retrieved by the WindowProc
'function in the standard basSubClassWindow
'module.

MouseWheelCancel = intCancel
End Property

Public Sub SubClassHookForm()
'Called from the form's OnOpen or OnLoad
'event. This procedure is what "hooks" or
'subclasses the form window. If you hook the
'the form window, you must unhook it when completed
'or Access will crash.

lpPrevWndProc = SetWindowLong(frm.hwnd, GWL_WNDPROC, _
AddressOf WindowProc)
Set CMouse = Me
End Sub

Public Sub SubClassUnHookForm()
'Called from the form's OnClose event.
'This procedure must be called to unhook the
'form window if the SubClassHookForm procedure
'has previously been called. Otherwise, Access will
'crash.

Call SetWindowLong(frm.hwnd, GWL_WNDPROC, lpPrevWndProc)
End Sub

Public Sub FireMouseWheel()

'Called from the WindowProc function in the
'basSubClassWindow module. Used to raise the
'MouseWheel event when the WindowProc function
'intercepts a mouse wheel message.
RaiseEvent MouseWheel(intCancel)
End Sub


- Speichern Sie das Klassenmodul als CMouseWheel.
- Fügen Sie den folgenden Code zu dem Klassenmodul Ihres Formulars hinzu, in welchem die Mausscrollfunktion deaktiviert werden soll:

Option Compare Database
Option Explicit

'Declare a module level variable as the custom class
'and give us access to the class's events
Private WithEvents clsMouseWheel As CMouseWheel

Private Sub Form_Load()
'Create a new instance of the class,
'and set the class's Form property to
'the current form
Set clsMouseWheel = New CMouseWheel
Set clsMouseWheel.Form = Me

'Subclass the current form by calling
'the SubClassHookForm method in the class
clsMouseWheel.SubClassHookForm
End Sub

Private Sub Form_Close()
'Unhook the form by calling the
'SubClassUnhook form method in the
'class, and then destroy the object
'variable

clsMouseWheel.SubClassUnHookForm
Set clsMouseWheel.Form = Nothing
Set clsMouseWheel = Nothing
End Sub

Private Sub clsMouseWheel_MouseWheel(Cancel As Integer)
'This is the event procedure where you can
'decide what to do when the user rolls the mouse.
'If setting Cancel = True, we disable the mouse wheel
'in this form.

MsgBox "You cannot use the mouse wheel to scroll through records."
Cancel = True
End Sub

- Klicken Sie im Menü Datei auf Schließen und zurück zu Microsoft Access.
- Speichern Sie das Formular, und schließen Sie es.

Hinweis: Öffnen Sie das Formular jetzt nicht in der Formularansicht. Wenn Sie dies jetzt tun, reagiert Microsoft Access nicht mehr, weil der Visual Basic Editor geladen wurde.
- Beenden Sie Microsoft Access.
- Starten Sie Microsoft Access neu mit ihrer Datenbank

Jetzt ist das Mausrad deaktiviert.

[Anm. Moderator: Diese Lösung ist definitiv unstabil und es lohnt nicht, sie auszuprobieren!]

Pras4our
22.12.2004, 09:39
Achtung Noobalarm

ich habe mich für die wariante mit der "MouseWheel.dll" entschieden. [Anm. Moderator: Und das war ganz klar die falsche Wahl!]

ich habe diese dll auf einen server gelegt
kann man das nun so gestallten das wenn ein user access öffnet automatisch diese dll regestreirt wird (ich habe sie sonnst immer manuel über extras/activX-steuerelemente hinzugefügt)

danke schon mal

Mfg der Pras

WeinGeist
07.01.2005, 08:59
Richtig schwierig ist das nicht, kann man recht einfach realisieren (Forumsuche!) allerdings ist es mit den Zugriffsrechten ned so einfach. Geht ned mit jedem Benutzerkonto.

Hab nun das OCX-Modul noch einige Zeit länger im Einsatz und das Teil überzeugt mich mehr denn je. Kein Einziger absturz/Fehlfunktion bis jetz und das bei mehreren offenen forms sowie wechsel in die Entwurfsansicht. Kann ich jedem ans herz legen des auszuprobieren.

Grüssle Urs

hanspeterludwig
07.02.2006, 14:36
Hallo An Euch Allen!

Warum ihr so ein Problem mit den Verweisen habt, keine Ahnung! Ich habe einfach einen Datenordner Verweise angelegt. In diesem Ordner sind alle Verweise enthalten, die ich für meine Anwendung benötige. Wenn ein Kunde die Anwendung auf seinen Rechner installiert, gab es bisher keine Probleme.

Aber nun zum Problem! (Access 2003)! Ich habe die Funktionalität der MouseWheel.dll in meine anwendung integriert. Funktioniert auch super! Seither werden alle Module - auch wenn sie mal nicht benötigt werden - im Hintergund - selbst im Entwicklungsmodus - gestartet. Ich habe das Gefühl, der schafft sich kaputt! Ich habe keine Möglichkeit mehr, z.B. in einem Endlosformular mit der Mouse (Shift Taste gedrückt) das Bezeichnungsfeld und das Eingabefeld zu markieren um es z.B. gemeinsam verschieben zu können. Ich Klick erst auf das eine, dann auf das untere, aber erst nach dem schsten ober siebten Klick wird es markiert und das Obere Bezeichnungsfeld hat seine Markierung verloren!

Kann mir hier jemand helfen? oder gbit es zwischenzeitlich eine andere Möglichkeit?

Freue mich auf jede Unterstützung!

Danke im voraus..

Liebe Grüße Hans-Peter

Sascha Trowitzsch
27.02.2006, 10:52
@ Hans-Peter: "Funktioniert super!" - nur die DB hat seitdem Macken und man kann nicht mehr richtig mit ihr arbeiten?

Also: Entweder man nimmt die DLLs aus #14, #18, #19 oder man lässt es besser. Die aus #1 definitiv nicht und schon gar nicht sowas wie in #21. (Wenn man nicht weiß, was Subclassing ist, wie es genau funktioniert und wie sich Subclassing unter VBA verhält, dann lässt man tunlichst die Finger davon!)
Mehr gibt's zu dem Thema IMHO nicht zu sagen.

Ciao, Sascha

hanspeterludwig
28.02.2006, 09:40
@ Hans-Peter: "Funktioniert super!" - nur die DB hat seitdem Macken und man kann nicht mehr richtig mit ihr arbeiten?

Also: Entweder man nimmt die DLLs aus #14, #18, #19 oder man lässt es besser. Die aus #1 definitiv nicht und schon gar nicht sowas wie in #21. (Wenn man nicht weiß, was Subclassing ist, wie es genau funktioniert und wie sich Subclassing unter VBA verhält, dann lässt man tunlichst die Finger davon!)
Mehr gibt's zu dem Thema IMHO nicht zu sagen.

Ciao, Sascha
Wäre doch nett, wenn Du mir sagen könntest, wo ich mich hier, weil ich ja keine Ahnung hab, mir das Wissen aneignen könnte. Denn #1 , #21 usw sagen mir überhaupt nichts. Mir wurde das Wissen - wie es anscheinend bei dir der Fall war - nicht in die Wiege gelegt! MfG Hans-Peter Ludwig

Sascha Trowitzsch
07.03.2006, 13:02
@Hans-Peter: Die "#" beziehen sich auf die Nummerierung der Beiträge in diesem Thread, die rechts oben in jedem Beitrag angezeigt werden.

Wie kannst du dir das Wissen aneignen, das mir in die Wiege gelegt wurde, und das du anscheinend nicht hast?
Sehr witzig! Man kann sich ja einfach mal auf das Urteil von Leuten verlassen, die sich anscheinend mit der Materie auskenne, ohne jetzt die genauen Begründungen wissen zu müssen. Ich kenne mich mit Subclassing aus, nicht, weil mir meine Gene das einflüstern, sondern weil ich damit einige Zeit verbracht habe. Unter VBA, VB, Delphi. Und da steckt ein gerüttelt Maß an Windows-API- und VBA-Interna-Kenntnissen dahinter, ohne die man dieses Thema einfach nicht verstehen kann.
Aber ich habe keine Lust, hier einen ellenlangen Artikel über Subclassing zu verfassen, nur um zu begründen, warum man es unter VBA lassen und stattdessen externe DLLs verwenden sollte - Du kannst mir einfach glauben, dass das der richtige Weg ist.

Warum ich so kurz angebunden reagiert habe liegt daran, dass du unter #24 die bisherigen Beiträge und Empfehlungen einfach in den Wind geschlagen hast. Und ich will eben nicht, dass irgendjemand auf die Idee kommt, diesem Beispiel zu folgen, so er Interesse an einer stabil funktionierenden Datenbankanwendung hat.

Ciao, Sascha

Stefan Bisig
02.08.2006, 10:22
Hallo, zusammen,

diese Lösungen sind schön und gut; nun habe ich aber ein sehr langes Formular, und da wärs ja schön, wenn der Benutzer das Mousewheel zum Scrollen innerhalb des Formulars (auf gut Deutsch: für einen Bildlauf, wie in anderen Programmen auch) verwenden könnte.

Kennt jemand von Euch dafür eine Lösung?

Herzlichen Dank!

WeinGeist
02.08.2006, 11:35
ääähm dann einfach nicht diese Sperre für das Formular verwenden ;)

Ansonsten dieses OCX von Peter Walker (http://www.papwalker.com).
Damit kannst du jedes Unterformular absolut simpelst separat einstellen und funktioniert wirklich zuverlässig. (Die erste Variante, wie ich schon erwähnt habe, die immer funktioniert).

Also du fügst das Steuerlement in ein formular ein, machst nen doppelklick drauf und aktivierst oder deaktivierst es. Kann man sogar via VBA zbsp. einfach wieder einschalten falls gewünscht. Wenn du nichst einfügst, ist MouseWheel aktiviert. Bei mehreren Unterformularen brauchts in jedem ein eigenes Steuerelement.

Grüssle Urs

Stiftleander
21.12.2006, 13:03
Inno Setup
Ich habe nicht jede Antwort zu diesen Beitrag gelesen, aber um Software-Lösungen sauber auf Benutzerrechnern zu installieren bzw. zu deinstallieren ist die Freeware Inno Setup eine sehr gute Alternative.
Damit lassen sich Setup-Packete sehr schnell und relativ einfach erstellen.
Das automatische Registrieren von Dll's kann damit während der Installation sehr elegant erledigt werden.

http://www.innosetup.com

Gruß
Stifleander (stiftlaender)

ach übrigens, kann mir jemand verraten wie ich meinen Benutzernamen von Stiftleander auf stiftlaender (Tippfehler!) ändern kann ohne ein neues Konto eröffnen zu müssen!?

Zyrano
13.08.2007, 09:00
Hi, ich habe in meiner datenbank die 2. variante ohne der dll verwendet, da mehrere leute auf die datenbank zugreifen und ich die dll nicht bei jedem ins windows verzeichnis kopieren möchte.

die 2. variante funktioniert auch zurzeit prima in meiner datenbank, aber gibt es eine möglichkeit, mithilfe der 2. variante das mausrad für alle formulare auszuschalten, ohne das ich das modul in jedem formular neu aufrufen muss?

vielen dank.

Kuli139
16.10.2007, 13:05
Hallo,

ich habe die OCX-Datei aus #19 eingesetzt funktioniert auch super! Nun hat sich leider ein neues Problem ergeben.

Habe in dem Formular ein Datumfeld. Format Datum kurz und Eingabeformat 99.99.00;0;_
Gültigkeitsregel >#01.02.2007# Und <=Datum()

Wenn ich nun z.B. das Datum 01.09.07 eingebe bekomme ich die Fehlermeldungen im Anhang. Vorher hat Access das selbst auf z.B. 01.09.2007 geändert. Besteht da irgend ein zusammenhang?

Sascha Trowitzsch
06.10.2009, 11:39
Hi zusammen,

Folgender interessanter Artikel ist mir beim Rumsurfen untergekommen:

http://www.everythingaccess.com/tutorials.asp?ID=A-new-method-for-disabling-the-Mouse-Scroll-Wheel-in-Access-forms

Mit dieseer Lösung von Wayne Philips kann man nach ersten Tests das Scrollen durch die Datensätze in Formularen mit einem ziemlich überschaubaren Modul zuverlässig unterbinden - mit Assembler-Code!
Ich hab damit ein paar Extremtests angestellt, aber keinen Absturz provozieren können.
Der Typ ist einfach ein Genie!!!

Diese Lösung ersetzt IMHO alle anderen bisher in diesem Thread vorgestellten.
Weg mit den DLLs und OCXen!

Ciao, Sascha

TommyK
06.10.2009, 12:04
@Sascha

Das ist wirklich Spitze.
Jetzt muss ich aber ganz dumm Fragen was das für ein Code ist den
er in die Variable "NativerCode" schreibt?
Ist das reiner Assembler-Code und wie funktioniert das? :confused:

Sascha Trowitzsch
06.10.2009, 12:54
Ist das reiner Assembler-Code und wie funktioniert das?
Tja, ich bin ja nicht Wayne, aber wie er weiter unten in den Comments schreibt, besteht der Code aus einer Mischung von Objektstruktur und Assembler-Routine.
Der Text in der Variablen ist ja eine Folge von Bytes, die in den Adressraum von Access geladen wird, nachdem dieser Speicher mit VirtualAlloc angelegt und die Bytes über CopyMemory dahin gespeichert wurden.
Dieser Speicher stellt nun ein Grundgerüst in Form einer Struktur für ein COM-Objekt dar. Was das für ein Objekt ist, das weiß nur Wayne - erschreibt ja, dass er selbst einen Compiler programmiert hatte, um dieses zu erzeugen! Jedenfalls wird das Objekt auf die Prozedurrückgabe gecastet, so dass NewMouseHook nun ein Objekt Irgendwas darstellt.
Im Objekt werden dann einige Bytes gepatcht - Adressen in VTABLE des Objekts und Zeiger auf QueryInterface-Methode.
Nun wird die wichtigste Funktion des Objekt aufgerufen: Init.
Der ist offenbar die Einsprungsadresse der API GetProcAddress in kernel32 zu übergeben und das Handle des Formularfensters.
Schließlich folgt der Aufruf der Methode bzw. Eigenschaft Scroll des Objekts.
Was sie tut, ist Waynes Geheimnis. Möglicherweise ist es aber auch Subclassing auf die WheelMouse-Messages.

Zu Assembler in VB(A) gibt's übrigens hier diverse Beispiele: http://www.activevb.de/tipps/tipkat/kat2.html

Gut ist auch, dass das Teil ebenfalls für Unterformulare funktioniert, wobei der Modus auch Endlosansicht sein kann.
Nur mit Datenblattansicht hab ich's noch nicht getestet.

Ciao, Sascha

TommyK
06.10.2009, 14:41
Hallo Sascha,

danke für die informative Erklärung.

Sascha Trowitzsch
08.12.2010, 13:42
Falls übrigens jemand eine supereinfache Methode für Access 2003 sucht, die das Mausradweiterschalten verhindert:
Einfach das ins Formular:
Private Sub Form_MouseWheel(ByVal Page As Boolean, ByVal Count As Long)
On Error Resume Next
DoCmd.GoToRecord acDataForm, Me.Name, IIf(Count > 0, acPrevious, acNext), 1
End Sub
Zuckelt zwar etwas, aber erfüllt auch den Zweck. ;)

Ciao, Sascha

Lichu
27.02.2011, 12:20
Die Lösung aus Post #33 ist einfach nur genial. Super einfach zum einbinden und funktioniert 1a.
Mit dem Mouswheel-Ereignis unter A2003+ hatte ich keinen Erfolg.

LG
Martin

Kuli139
30.08.2011, 13:12
Hi zusammen,

Folgender interessanter Artikel ist mir beim Rumsurfen untergekommen:

http://www.everythingaccess.com/tutorials.asp?ID=A-new-method-for-disabling-the-Mouse-Scroll-Wheel-in-Access-forms

Mit dieseer Lösung von Wayne Philips kann man nach ersten Tests das Scrollen durch die Datensätze in Formularen mit einem ziemlich überschaubaren Modul zuverlässig unterbinden - mit Assembler-Code!
Ich hab damit ein paar Extremtests angestellt, aber keinen Absturz provozieren können.
Der Typ ist einfach ein Genie!!!

Diese Lösung ersetzt IMHO alle anderen bisher in diesem Thread vorgestellten.
Weg mit den DLLs und OCXen!

Ciao, Sascha

Hallo,

ich habe nachdem es bei uns einige Probleme mit der mousetrap.ocx gab, nun diesen Code in ein Formular eingebaut. Das Scrollen wird auch schon einmal verhindert. Wenn ich jedoch wie in der Beispieldatenbank die Funktion mittels Button umschalten will bringt er mir die Fehlermeldung "Fehler beim Kompilieren - Methode oder Datenbankobjekt nicht gefunden" Die Markierung im Debugger setzt er auf .Value

Ich finde aber keinen Unterschied mehr zu der Demodatenbank?