ACC: How to Simulate Drag-And-Drop Capabilities (95/97) (137650)
The information in this article applies to:
- Microsoft Access for Windows 95 7.0
- Microsoft Access 97
This article was previously published under Q137650 SUMMARY
Advanced: Requires expert coding, interoperability, and multiuser skills.
Microsoft Access does not have a built-in DragDrop event for controls as
does Visual Basic. This article describes how to create a DragDrop
procedure that will run in response to a Microsoft Access control being
dragged to another control.
This article provides two examples that demonstrate the use of the DragDrop
procedure. The first example demonstrates how to drag the value in a
control on one form to a control on a second form. The second example
demonstrates how to move items from one list box to a second list box using
a drag-and-drop procedure. If you perform a drag-and-drop procedure with
the CTRL key held down, all items from one list will be moved to the second
list.
NOTE: This article explains a technique demonstrated in the sample
files, FrmSampl.exe (for Microsoft Access for Windows 95 version 7.0)
and FrmSmp97.exe (for Microsoft Access 97). For information about how
to obtain these sample files, please see the following articles in the
Microsoft Knowledge Base:
150895 ACC95: Microsoft Access Sample Forms Available in Download Center
175066 ACC97: Microsoft Access 97 Sample Forms Available in Download Center
MORE INFORMATION
The four procedures below, DragStart, DragStop, DropDetect, and DragDrop,
are required to implement drag-and-drop capabilities between controls in
Microsoft Access.
DragStart, DragStop
Enables a control to be dragged. DragStart and DragStop are called from the
MouseDown and MouseUp events respectively for each control that you want to
be capable of being dragged.
Syntax:
Sub DragStart (DragFrm As Form)
Sub DragStop ()
DragFrm: The form containing the control being dragged.
Example:
Private Sub MyControl_MouseDown (Button As Integer, Shift As ...
DragStart Me
End Sub
Private Sub MyControl_MouseDown (Button As Integer, Shift As ...
DragStop
End Sub
DropDetect
Enables a control to be a drop target. DropDetect should be called from the
MouseMove event for each control that you want to be a drop target for a
control being dragged.
Syntax:
Sub DropDetect (DropFrm As Form, DropCtrl As Control,
Button As Integer, Shift As Integer,
X As Single, Y As Single)
DropFrm: The form containing the control being dropped on.
DropCtrl: The control being dropped on.
Button, Shift, X, Y: The parameters from the MouseMove event.
Example:
Private Sub MyControl_MouseMove (Button As Integer, Shift As ...
DropDetect Me, Me![Employee ID], Button, Shift, X, Y
End Sub
NOTE: A control can be dragged and be a drop target by calling DragStart,
DragStop, and DropDetect from the MouseDown, MouseUp, and MouseMove events
respectively.
DragDrop
This procedure will be called in response to a drag-enabled control being
dragged to a drop-enabled control. You will add your own code to this
procedure to control what happens in response to a drop operation.
For example you could copy the contents of the dragged control to the
dropped control.
Syntax:
Sub DragDrop (DragFrm As Form, DragCtrl As Control, DropFrm As Form,
DropCtrl As Control, Button As Integer, Shift As _
Integer,
X As Single, Y As Single)
DragFrm: The form containing the control being dragged.
DragCtrl: The control being dragged.
DropFrm: The form containing the control being dropped on.
DropCtrl: The control being dropped on.
Button: The state of the mouse buttons when the drop occurred.
Shift: The state of the SHIFT, CTRL, ALT keys when the drop occurred.
X, Y: The x and y coordinates of the mouse where the drop occurred.
NOTE: For more information on Button, Shift, X, Y arguments, search
Help for the MouseMove event.
Example:
The following example will copy the contents of the drag control to the
drop control, trapping and displaying any error that occurs:
Sub DragDrop (DragFrm As Form, DragCtrl As Control, ...
On Error Resume Next
DropCtrl = DragCtrl
If Err Then MsgBox Error$
End Sub
EXAMPLE 1: Drag and Drop Between Controls on Two Forms
The following example demonstrates how to set the Salesperson combo box on
the Northwind Orders form by dragging the EmployeeID field from the
Employees form and dropping it into the Salesperson combo box.
- Open the sample database Northwind.mdb.
- Create a new module and type the following lines in the Declarations
section:
Option Explicit
Dim DragFrm As Form
Dim DragCtrl As Control
Dim DropTime
Const MAX_DROP_TIME = .1
Dim CurrentMode As Integer
Const NO_MODE = 0
Const DROP_MODE = 1
Const DRAG_MODE = 2
- Type the following three procedures:
Sub DragStart (SourceFrm As Form)
' NOTE: You should not use Screen.ActiveForm in place of
' SourceFrm because you may be dragging from a subform.
Set DragFrm = SourceFrm
Set DragCtrl = Screen.ActiveControl
CurrentMode = DRAG_MODE
End Sub
Sub DragStop ()
CurrentMode = DROP_MODE
DropTime = Timer
End Sub
Sub DropDetect (DropFrm As Form, DropCtrl As Control, _
Button As Integer, Shift As Integer, _
X As Single, Y As Single)
' If a drop hasn't happened, then exit.
If CurrentMode <> DROP_MODE Then Exit Sub
CurrentMode = NO_MODE
' The timer interval is permitted between the MouseUp event and
' the MouseMove event. This ensures that the MouseMove event does
' not invoke the Drop procedure unless it is the MouseMove event
' that Microsoft Access automatically fires for the Drop control
' following the MouseUp event of a drag control. Subsequent
' MouseMove events will fail the timer test and be ignored.
If Timer - DropTime > MAX_DROP_TIME Then Exit Sub
' Did we drag/drop onto ourselves?
If (DragCtrl.Name <> DropCtrl.Name) Or _
(DragFrm.hWnd <> DropFrm.hWnd) Then
' If not, then a successful drag/drop occurred.
DragDrop DragFrm, DragCtrl, DropFrm, DropCtrl, Button, Shift, X, Y
End If
End Sub
- Type the following DragDrop procedure.
NOTE: This procedure does not have to appear in the same module as the
procedures typed above. Because you will be customizing the contents
of the DragDrop procedure to respond to a successful drag-and-drop
operation, it may be better to place it in a separate module.
Sub DragDrop (DragFrm As Form, DragCtrl As Control, _
DropFrm As Form, DropCtrl As Control, _
Button As Integer, Shift As Integer, _
X As Single, Y As Single)
On Error Resume Next
DropCtrl = DragCtrl
If Err Then MsgBox Error$
End Sub
- Open the Orders form in Design view and add the following OnMouseMove
event procedure code for the Salesperson combo box:
Sub EmployeeID_MouseMove (Button As Integer, Shift As Integer, _
X As Single, Y As Single)
DropDetect Me, Me![EmployeeID], Button, Shift, X, Y
End Sub
NOTE: This control will only be a drop target.
- Open the Employees form in Design view and set the Enabled property of
the EmployeeID text box to Yes.
- Add the following OnMouseDown event procedure code for the EmployeeID
control:
Sub EmployeeID_MouseDown (Button As Integer, Shift As Integer, _
X As Single, Y As Single)
DragStart Me
End Sub
NOTE: This control will only be a drag target.
- Add the following OnMouseUp event procedure code for the EmployeeID
control:
Sub EmployeeID_MouseUp (Button As Integer, Shift As Integer, _
X As Single, Y As Single)
DragStop
End Sub
- View the Orders form in Form view and position it in the upper-left
corner of the screen.
- View the Employees form in Form view and position it on top of the
Orders form, but to the right in such a way that the Salesperson combo
box on the Orders form is still visible.
- Hold down the mouse button in the EmployeeID text box in the Employees
form, then move the mouse pointer (still holding the button down) over
the Salesperson combo box on the Orders form, and then release the
mouse button.
RESULT: The Salesperson combo box will contain the salesperson that you
dragged from the Employees form. Try navigating to different Employee
records and dragging the Employee ID to the Salesperson combo box.
EXAMPLE 2: Drag and Move Items from One List Box to Another List Box
The following example demonstrates how to present a list of items to a user
in one list box and how to move these items back and forth to a second list
box using a drag-and-drop operation.
- Complete the first four steps of EXAMPLE 1 to create the Drag and Drop
procedures in the Northwind database.
- Open the Customers table in Design view and add the following new field:
Field Name: Selected
Data Type : Yes/No
- Create a new, blank form called List Box Example with the following
properties:
RecordSelectors: No
NavigationButtons: No
ScrollBars: Neither
- Add a list box to the form with the following properties:
Name: List1
RowSourceType: Table/Query
RowSource: SELECT CustomerID, CompanyName FROM Customers WHERE
Selected=False ORDER BY CompanyName;
ColumnCount: 2
ColumnWidths: 0
Width: 1.5"
Height: 1.5"
- Add a second list box next to the first list box with the following
properties:
Name: List2
RowSourceType: Table/Query
RowSource: SELECT CustomerID, CompanyName FROM Customers WHERE
Selected=True ORDER BY CompanyName;
ColumnCount: 2
ColumnWidths: 0
Width: 1.5"
Height: 1.5"
- On the View menu click Code and enter the following event procedure
code for the List1 and List2 mouse events:
Private Sub List1_MouseDown (Button As Integer, Shift As Integer, _
X As Single, Y As Single)
DragStart Me
End Sub
Private Sub List1_MouseMove (Button As Integer, Shift As Integer, _
X As Single, Y As Single)
DropDetect Me, Me![List1], Button, Shift, X, Y
End Sub
Private Sub List1_MouseUp (Button As Integer, Shift As Integer, _
X As Single, Y As Single)
DragStop
End Sub
Private Sub List2_MouseDown (Button As Integer, Shift As Integer, _
X As Single, Y As Single)
DragStart Me
End Sub
Private Sub List2_MouseMove (Button As Integer, Shift As Integer, _
X As Single, Y As Single)
DropDetect Me, Me![List2], Button, Shift, X, Y
End Sub
Private Sub List2_MouseUp (Button As Integer, Shift As Integer, _
X As Single, Y As Single)
DragStop
End Sub
- Modify the DragDrop procedure created in step 4 in Example 1 to read
as follows:
Sub DragDrop (DragFrm As Form, DragCtrl As Control, _
DropFrm As Form, DropCtrl As Control, _
Button As Integer, Shift As Integer, _
X As Single, Y As Single)
' Which form was dropped on?
' It is a good idea to use the DragDrop procedure to
' determine which drag-and-drop operation occurred; then call
' appropriate code to handle the special cases.
Select Case DropFrm.Name
Case "List Box Example"
ListBoxExample DragFrm, DragCtrl, DropFrm, DropCtrl, _
Button, Shift, X, Y
Case Else
' For all other cases, copy contents of Drag to Drop
' control.
On Error Resume Next
DropCtrl = DragCtrl
If Err Then MsgBox Error$
End Select
End Sub
- Type the following new procedure in the module with the DragDrop
procedure:
Sub ListBoxExample (DragFrm As Form, DragCtrl As Control, _
DropFrm As Form, DropCtrl As Control, _
Button As Integer, Shift As Integer, _
X As Single, Y As Single)
Dim DB As Database
Dim SQL As String
Set DB = CurrentDB()
' Create SQL statement to update Selected field of
' .. drag/dropped list box item.
SQL = "UPDATE Customers SET Selected="
' Drag from List1 toggle Selected=True, List2 toggles False.
SQL = IIF(DragCtrl.Name = "List1", SQL & "True", SQL & "False")
' If CTRL key not used, alter dragged value only.
If (Shift And CTRL_MASK) = 0 Then
SQL = SQL & " WHERE [CustomerID]='" & DragCtrl & "'"
End If
' Run update query to toggle Selected field of Customer record(s).
DB.Execute SQL
' Requery the list box controls to show update lists.
DragCtrl.Requery
DropCtrl.Requery
End Sub
- View the List Box Example form in Form view, and then drag company names
from one list to the other and vice versa. Press the CTRL key and drag
to move ALL rows from one list to the other list.
Modification Type: | Major | Last Reviewed: | 10/22/2003 |
---|
Keywords: | kbhowto kbusage KB137650 |
---|
|