Identificativo articolo: 278379 - Ultima modifica: venerdì 27 gennaio 2006 - Revisione: 3.1 ACC2000: Rilevamento e impedimento dello scorrimento dei record di una maschera mediante la rotellina del mouseUtenti esperti: sono richieste conoscenze avanzate di gestione di codice, interoperabilità e funzioni multiutente.
Le informazioni contenute in questo articolo si applicano ai database di Microsoft Access (mdb) e ai progetti di Microsoft Access (adp).
Microsoft Access non fornisce metodi per impedire che gli utenti utilizzino la rotellina del mouse per scorrere i record di una maschera. In questo articolo viene mostrato come impedire a livello di programmazione che gli utenti utilizzino la rotellina del mouse per scorrere i record di una maschera.
NOTA: se il codice fornito in questo articolo non funziona come previsto, potrebbe essere necessario installare il software più recente del mouse Microsoft IntelliPoint o del mouse di terze parti. Per scaricare il software IntelliPoint, visitare il seguente sito Web Microsoft (informazioni in lingua inglese):
Microsoft fornisce esempi di programmazione a scopo puramente illustrativo, senza alcuna garanzia di qualsiasi tipo, sia espressa che implicita, ivi incluse, senza limitazioni, le garanzie implicite di commerciabilità o idoneità per uno scopo particolare. In questo articolo si presuppone che l'utente conosca il linguaggio di programmazione in questione e gli strumenti utilizzati per creare ed eseguire il debug delle procedure. Gli esperti Microsoft sono autorizzati a fornire spiegazioni in merito alla funzionalità di una particolare procedura, ma in nessun caso a modificare questi esempi per fornire funzionalità aggiuntive o a creare procedure atte a soddisfare specifiche esigenze.
Per impostazione predefinita, gli utenti possono utilizzare la rotellina del mouse per scorrere una serie di record in una maschera di Microsoft Access. Per impedire l'utilizzo di questa funzionalità, è possibile utilizzare l'API Win32 per declassare le maschere e ignorare i messaggi inviati tramite la rotellina del mouse alla maschera. Per effettuare questa operazione sono disponibili due metodi. Il primo consiste nell'utilizzare Microsoft Visual Basic o Microsoft Visual C++ per creare una DLL ActiveX con cui declassare le maschere di Microsoft Access e, quindi, fare riferimento a tale DLL dall'applicazione Microsoft Access. Il secondo consiste nello scrivere tutto il codice in Microsoft Access senza utilizzare una DLL ActiveX. Dato il rischio che si verifichino problemi con le finestre di declassamento dopo il caricamento di Microsoft Office Visual Basic Editor, si consiglia di creare la DLL ActiveX mediante Microsoft Visual Basic o Microsoft Visual C++ e di farvi, poi, riferimento dall'applicazione Microsoft Access.
Creazione dell'evento MouseWheel mediante una DLL ActiveX in Visual Basic- Avviare Microsoft Visual Basic 6.0.
- Creare un nuovo progetto DLL ActiveX, quindi aprirlo.
- Aggiungere il seguente codice alla finestra del modulo di classe che verrà visualizzata:
Option Compare Text
Option Explicit
Private frm As Object
Private intCancel As Integer
Public Event MouseWheel(Cancel As Integer)
Public Property Set Form(frmIn As Object)
Set frm = frmIn
End Property
Public Property Get MouseWheelCancel() As Integer
MouseWheelCancel = intCancel
End Property
Public Sub SubClassHookForm()
lpPrevWndProc = SetWindowLong(frm.hwnd, GWL_WNDPROC, _
AddressOf WindowProc)
Set CMouse = Me
End Sub
Public Sub SubClassUnHookForm()
Call SetWindowLong(frm.hwnd, GWL_WNDPROC, lpPrevWndProc)
End Sub
Public Sub FireMouseWheel()
RaiseEvent MouseWheel(intCancel)
End Sub
- Impostare le proprietà del modulo di classe come segue:
Modulo di classe: CMouseWheel
-------------------------
Nome: CMouseWheel
Istanze: 5 - MultiUse
- Aggiungere un modulo standard al progetto, quindi aggiungere il seguente codice:
Option Compare Text
Option Explicit
Public CMouse As CMouseWheel
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 Function WindowProc(ByVal hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
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
- Scegliere Gestione progetti dal menu Visualizza per visualizzare Gestione progetti.
- Selezionare il nodo del progetto nella parte iniziale della finestra di Gestione progetti.
- Scegliere Proprietà dal menu Visualizza per visualizzare la finestra delle proprietà del progetto.
- Impostare la proprietà Name del progetto su MouseWheel.
- Scegliere Salva progetto dal menu File.
- Salvare i file del progetto rispettivamente come basSubClassWindow.bas, CMouseWheel.cls e MouseWheel.vbp.
- Scegliere Crea MouseWheel.dll dal menu File, quindi scegliere OK per creare la DLL.
- Chiudere Microsoft Visual Basic.
- Avviare Microsoft Access e aprire il database di esempio Northwind.mdb.
- Aprire la maschera Clienti in visualizzazione Struttura.
- Scegliere Codice dal menu Visualizza per visualizzare il modulo della maschera in Visual Basic Editor.
- Scegliere Riferimenti dal menu Strumenti.
- Selezionare la casella di controllo accanto a MouseWheel per selezionare il riferimento. Se il riferimento non è elencato, scegliere il pulsante Sfoglia, fare clic su MouseWheel.DLL nella cartella in cui si è salvata tale DLL al passaggio 12 e scegliere Apri.
- Scegliere OK per chiudere la finestra di dialogo Riferimenti.
- Aggiungere il seguente codice al modulo della maschera:
Option Compare Database
Option Explicit
Private WithEvents clsMouseWheel As MouseWheel.CMouseWheel
Private Sub Form_Load()
Set clsMouseWheel = New MouseWheel.CMouseWheel
Set clsMouseWheel.Form = Me
clsMouseWheel.SubClassHookForm
End Sub
Private Sub Form_Close()
clsMouseWheel.SubClassUnHookForm
Set clsMouseWheel.Form = Nothing
Set clsMouseWheel = Nothing
End Sub
Private Sub clsMouseWheel_MouseWheel(Cancel As Integer)
MsgBox "You cannot use the mouse wheel to scroll records."
Cancel = True
End Sub
- Scegliere Chiudi e torna a Microsoft Access dal menu File.
- Salvare la maschera, quindi chiuderla.
- Aprire la maschera Clienti in visualizzazione Maschera.
- Muovere la rotellina del mouse.
Verrà visualizzato il messaggio:
Non è possibile utilizzare la rotellina del mouse per scorrere i record.
Si noti, inoltre, che il record corrente non è stato modificato, a indicare che il messaggio della rotellina del mouse non è stato elaborato in Microsoft Access.
Creazione completa dell'evento MouseWheel in Microsoft AccessAVVISO: se possibile, utilizzare il metodo elencato nella sezione "Creazione dell'evento MouseWheel mediante una DLL ActiveX in Visual Basic" di questo articolo. È possibile utilizzare il metodo discusso in questa sezione solo nei casi in cui gli utenti dell'applicazione non caricano Visual Basic Editor in Microsoft Access, ad esempio perché utilizzano un'applicazione runtime di Microsoft Access. Se si implementa questa soluzione e gli utenti aprono Visual Basic Editor, il codice fornito in questa sezione causerà il blocco di Microsoft Access. Inoltre, se si è caricato Visual Basic Editor almeno una volta durante la sessione di Microsoft Access, sarà necessario uscire da Microsoft Access e riavviarlo prima di poter testare questo codice. Si consiglia di salvare il lavoro con frequenza e di conservare copie di backup aggiornate del database quando si utilizza questo metodo.
Mediante il metodo illustrato in questa sezione viene mostrato come utilizzare un modulo di classe personalizzato per creare un evento personalizzato denominato MouseWheel, utilizzabile nelle maschere per rilevare quando l'utente muove la rotellina del mouse. L'evento personalizzato espone un argomento Cancel che può essere utilizzato per impedire che il messaggio relativo al movimento della rotellina del mouse venga intercettato in Microsoft Access, impedendo lo scorrimento dei record nella maschera.
Per creare le procedure personalizzate, attenersi alla seguente procedura:
- ATTENZIONE: la procedura riportata in questo esempio comporta la modifica del database Northwind.mdb. È consigliabile fare una copia di backup del file Northwind.mdb sulla quale eseguire la procedura.
- Avviare Microsoft Access.
- Aprire il database di esempio Northwind.mdb.
- Scegliere Modulo dal menu Inserisci per creare un nuovo modulo in Visual Basic Editor.
- Aggiungere al modulo il seguente codice:
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
- Scegliere Salva <nome progetto> dal menu File. Salvare il modulo come basSubClassWindow.
- Scegliere Modulo di classe dal menu Inserisci.
- Aggiungere il seguente codice al modulo di classe:
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
- Scegliere Salva <nome progetto> dal menu File. Salvare il modulo di classe come CMouseWheel.
- Aprire la maschera Clienti in visualizzazione Struttura.
- Scegliere Codice dal menu Visualizza per visualizzare il modulo di classe della maschera.
- Aggiungere il seguente codice al modulo di classe della maschera:
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 - Scegliere Chiudi e torna a Microsoft Access dal menu File.
- Salvare la maschera, quindi chiuderla.
NOTA: non aprire la maschera in visualizzazione Maschera in tale fase. In caso contrario, Microsoft Access cesserebbe di rispondere poiché è stato caricato Visual Basic Editor. - Chiudere Microsoft Access.
- Riavviare Microsoft Access e aprire il database di esempio Northwind.mdb.
- Aprire la maschera Clienti in visualizzazione Maschera.
- Muovere la rotellina del mouse.
Verrà visualizzato il messaggio:
Non è possibile utilizzare la rotellina del mouse per scorrere i record.
Si noti, inoltre, che il record corrente non è stato modificato, a indicare che il messaggio della rotellina del mouse non è stato elaborato in Microsoft Access.
Le informazioni in questo articolo si applicano a- Microsoft Access 2000 Standard Edition
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO. | |