

前言:
EDF(EventsDistributionFrame)是本人在Access学习中开发的一个功能强大的程序,能够使许多不同类型的Access事件编程简化,为更好地介绍这个程序的使用方法,我将陆续介绍多个EDF的应用范例,及其代码的详细讲解。以便使用者更快地掌握其功能。 注:最新发布的EDF V1.2版本中已经包含了这个示例程序的最新版本,并且使用了1.2的新特性,不必再占用控件的Tags属性,改为使用EDF V1.2新增的自定义属性功能。 程序介绍: 本程序为EDF功能演示程序之一。本程序使用了EDF 1.11,实现了以下功能: 1、窗体上任何控件均能随意拖动。与多数拖动程序不同的是,开始拖动时,本程序将保持鼠标与控件的相对位置不变,而不是绑定到窗体左上角。当然前提是这个控件本身要支持鼠标事件。2、选择控件后使用ALT加方向键,可以进行1缇为单位的位置微调。当前前提是这个控件本身要支持键盘事件。3、可拖动的控件包括所有Access标准控件,包括窗体上已有的,和你自己加上去的控件。(你可以自己添加几个标准控件试试)4、程序中使用了防错以避免超出窗体范围。 以上全部功能,使用EDF后,在不到30行代码内完成。 实现代码:'定义EDF环境变量Public edfCtls As New CollectionPublic edfPorts As New Collection
Public Sub Form_Load() '截获窗体所有控件的事件 edfInitEvents edfCtls, edfPorts, Me, 0 '设定事件处理程序为DragDrop edfInitPorts edfPorts, AddressOf DragDrop, 0End SubPublic Sub DragDrop(ByRef acCtl As Control, ByRef strEvent As String, ByRef Params As Collection, ByRef reserved As Long) Dim Tags() As String '开始拖动,在标记中保存鼠标相对位置 If strEvent = "MouseDown" Then acCtl.Tag = Params("X") & "," & Params("Y") Exit Sub End If '结束拖动,清除标记 If strEvent = "MouseUp" Then acCtl.Tag = "" '防止越界On Error GoTo Exit_Sub '键盘移动 If strEvent = "KeyDown" Then Select Case Params("KeyCode").Value Case 37: '左方向键 acCtl.Left = acCtl.Left - 1 Case 38: '上方向键 acCtl.Top = acCtl.Top - 1 Case 39: '右方向键 acCtl.Left = acCtl.Left + 1 Case 40: '下方向键 acCtl.Top = acCtl.Top + 1 End Select End If '鼠标拖动 If strEvent = "MouseMove" And acCtl.Tag <> "" Then Tags = Split(acCtl.Tag, ",") acCtl.Left = acCtl.Left + Params("X") - CLng(Tags(0)) acCtl.Top = acCtl.Top + Params("Y") - CLng(Tags(1)) End If Exit_Sub:End Sub