MicrosoftAccess秘密技巧和陷阱
|
不正确地调用Windows应用程序接口可能会产生一些意想不到的副作用,以及潜在地对一个应用程序的代码及数据段的破坏。正确地使用一个空的32位指针在Microsoft Access 中是十分必要的。 当对表格和报表进行操作时,Microsoft Access有一个无正式文本的特性。这个特性允许你从设计视窗性质sheet window中进行过程调用,调用的方法时同时按下shift和F2键。 介绍 提高速度和减少代码量 使用整形数据类型进行数学运算 避免使用过程调用 谨慎使用不定长数据类型 用变量存放经常使用的属性 预载表格 Access Basic中的陷阱 使用唯一的别名 你尝试安装的模块要么是包含有相同的函数名,要么是包含在已存在的模块中有的过程名。删除这些过程,在EDIT菜单中使用FIND命令找到重复的过程名,要解决这一问题,你需要使用一种叫做“别名使用“的技术。这种技术允许你给你的过程一个独一无二的名字。但是,你选择的别名也有可能不是独一无二的,所以要使你取的名字唯一,你可以用初始值和下划线优先声明你所有从动态链接库中调用的过程,比如,声明getActiveWindow为: Declare bcb_GetActiveWindow Lib "Kernel" Alias "GetActiveWindow" () As Integer. 如何传递一个空指针给动态链接库 下面的编码示范了一个正确的方法,告诉你如何声明一个给动态链接库中的过程传递一个空指针参数的Access Basic函数。这段声明了WriteProfileString应用程序接口函数。这个函数来自于外部Windows动态链接库“kernel"。 Declare Function WriteProfileString Lib "Kernel" (ByVal lpApplicationName As Any, ByVal lpKeyName As Any, ByVal lpString As Any) 接下来的函数调用了一个外部过程,位每个参数指定一个空值。这将使WriteProfileString充满它的内部高速缓冲区,并且WIN.INI的任何变化写到磁盘上。
重要的 Function nFlushIniCache() nFlushIniCache = WriteProfileString (0&, 0&, 0&) End Function 如何从动态链接库中传递和接收无符号整型数 Access Basic整型数的范围使从-32768到32767。一个无符号整型数的范围是从0到65535。Access Basic用最明显的一位来放置数值的符号位,所以当数值超过32767,第16位将被置成负数符号。要计算一个无符号整型数,你必须人工调整第16位。 从无符号整型数转换到Access Basic长整型数或从Access Basic的长整型转换成无符号整型数有两种方法。第一种方法用到了最基本的数学运算(65535被无符号整型值加或减)。第二种方法使用Bitwise操作。实际上,算术方法和Bitwise方法工作起来效果一样,只不过,算术方法可能可读性更强一些,而Bitwise方法在执行时可能更快一些。 算术方法 Function lArithUintToInt (nUint As Integer) If nUint < 0 Then lArithUintToInt = nUint + 65536 Else lArithUintToInt = nUint End If End Function
Function nArithIntToUnint (lBytes As Long) If lBytes > 32767 Then nArithIntToUnint = lBytes - 65536 Else nArithIntToUnint = lBytes End If End Function 按位操作方法 1010001111100000 (-23584) AND 1111111111111111 (FFFF&) ---------------- 1010001111100000 (41952)
The functions follow: Function lBWIntToUint(nUint As Integer) lBWIntToUint = nUint And &HFFFF& End Function
Function nBWUintToInt(lBytes As Long) Dim nTemp As Integer If lBytes > 65535 Then MsgBox "You passed a value larger than 65535" Exit Function End If
nTemp = lBytes And &H7FFF nBWUintToInt = nTemp Or -(lBytes And &H8000) End Function
注意:&HFFFF&要求“&”在16进制数的末尾。这样能保证32位的16进制数通过16位的值表示出来。
Access Basic中的技巧 BUILDER FORM函数 如果在一个模块中一个函数的定义是以“Builderr Form"开始同时包含一个类似于Onclose属性或事件标识符,按下SHIFT和F2键就可以调用这个过程。例如,当你在一个form的设计窗口中,而当前的光标落在属性窗口中的Onclose事件的编辑控制上,按下SHIFT和F2键将能调用BuilderFormOnclose函数。这使用于form和reports的大部分属性和所有事件。下面的代码将说明函数的格式: Function BuilderFormOnClose (szFormName As String, szControlName As String, szCurrentValue As String, szReserved As String)
If szCurrentValue = "" Then DoCmd SelectObject A_MACRO, "", True SendKeys "%n%fs" & "New Macro" & "{Enter}" Forms(szFormName).OnClose = "New Macro" Else DoCmd SelectObject A_MACRO, szCurrentValue, True SendKeys "%d" End If
End Function 参数szFormName, szControlName, szCurrentValue, 和 szReserved必须声明,即使你从不使用它们。当你的函数被调用时,这些参数总是要被传递的。如果它们没有被声明,那么Microsoft Access将不会调用你的函数。如果有一个参数被分配到Onclose事件上,那么前面的过程将打开一个宏,如果编辑控制是空,那么代码产生一个名为“New Macro”的新宏,同时把编辑控制值设置为“New Macro”。诚然,前面的例子并不是非常完美,但它的确说明了要产生一个完美而有效的程序所必须的条件。 |
