日期:2013-04-12  浏览次数:20452 次

Microsoft Access秘密、技巧和圈套

布莱恩C.布莱克曼

系统支持工程师,Microsoft Access Basic

摘要

  这篇文章概括了当使用Microsoft Access 时,通过使用Access Basic可以添加使用程序的执行速度,减少编码量,同时也减少在为Microsoft Windows使用程序接口编程时、在开发使用程序中遇到的问题的技术。谨慎地使用变量和它所占用的存储空间能无效地减少一个使用程序所耗费的资源,同时也全面提高了它的功用。

  不正确地调用Windows使用程序接口可能会产生一些意想不到的副作用,以及潜在地对一个使用程序的代码及数据段的破坏。正确地使用一个空的32位指针在Microsoft Access 中是十分必要的。

  当对表格和报表进行操作时,Microsoft Access有一个无正式文本的特性。这个特性允许你从设计视窗性质sheet window中进行过程调用,调用的方法时同时按下shift和F2键。

引见

  Microsoft Access Basic提供了一个丰富的开发环境。这个开发环境给你足够的灵活性和对Microsoft Windows使用程序接口的控制,同时保护你使你免遭用高级或低级言语开发环境开发时所碰到的各种麻烦。不过,许多优化、无效数据和模块化方面只能是使用程序设计者才能使用。开发者应努力于谨慎地使用算法。除了普通的程序设计概念,还有一些特别的存储空间的管理技术,正确使用这些技术可以提高使用程序的执行速度,减少使用程序所要好的存储资源。

提高速度和减少代码量

  你可以用几种技巧来提高你的编码速度,但是却找不到无效的算法的替代者。接下来的几点建议可以提高你的编码速度同时又减少你的使用程序耗费的存储空间。

使用整形数据类型进行数学运算

  即便Microsoft Access 会使用一个联合处理器来处理浮点型算术,整型数算术也总是要快一些。当你的计算不含有小数,尽量使用整型或长整型而不是变量或双整型。整型除法同样也要比浮点除法要快。在使用其他一些无效的数据类型时会警告:没有任何东西可以替换无效的运算法则。

避免使用过程调用

  避免在循环体中使用子程序或函数调用。每一次调用都因额外的任务和时间而给编码增大了负担。每一次调用都要求把函数的局部变量和参数压栈,而栈的大小是固定的,不能随便加大,并且同时还要于Microsoft Access共享。

谨慎使用不定长数据类型

  不定长数据类型提供了更大的灵活性,比如说允许正确处理空值和自动处理溢出。另外这种数据类型比传统的数据类型要大并耗费更多的存储空间。前面还曾经提到过,不定长数据类型的变量在数学计算中比较慢。

用变量存放经常使用的属性

  对变量进行查找和设置都比对属性进行这些操作要快。如果你要得到或查阅一个属性值许多次,那么把这个属性分配给一个变量,并用这个变量来代替属性,那么你的代码将要运转快得多。例如,在一个循环中,你查阅某表格中得一个控制的属性,那么在循环外把属性分配给一个变量,然后在循环中用查询一个变量来代替查阅一个属性的方法要比较快。

预载表格

  当你的使用程序启动并且把它们的可见属性设置位‘false’时,如果你安装了你所有的表格,那么你的使用程序的功用会让你感觉挺快。当你需求显示一个表格时,你只需求把该表格的可见属性设置为‘true’,这要比安装一个表格要快得多。需求记住的是,为你安装的每个表格,你都要从使用程序的全局堆中耗费存储空间。

Access Basic中的圈套

  在Access Basic中经常碰到的圈套是对动态连接库(DLLS)中的外部过程的调用。当你提供程序给你的用户,调用外部动态链接库时将出现使用警告;否则,你将得到一条错误信息:试图用相反的函数定义安装模块。

使用独一的别名

  在Access Basic中,如果你知道入口点(动态链接库中函数的名字),你可以调用动态链接库中的外部函数。不过,使用这一方法的限制性在于你只能声明外部函数一次。如果你安装了调用了你的模块调用的相反的Windows使用程序接口,你不会得到一个不为人所知的错误:试图用相反的函数定义安装模块。

  你尝试安装的模块要么是包含有相反的函数名,要么是包含在已存在的模块中有的过程名。删除这些过程,在EDIT菜单中使用FIND命令找到反复的过程名,要处理这一问题,你需求使用一种叫做“别名使用“的技术。这种技术允许你给你的过程一个独一无二的名字。但是,你选择的别名也有可能不是独一无二的,所以要使你取的名字独一,你可以用初始值和下划线优先声明你所有从动态链接库中调用的过程,比如,声明getActiveWindow为:

  Declare bcb_GetActiveWindow Lib "Kernel" Alias "GetActiveWindow" () As Integer.

如何传递一个空指针给动态链接库

  一个空的32位指针是无效的或是为一些动态链接库要求具有参数。要指定一个空值,使用0&。当你的函数调用一个过程并传递一个表达式0&,“&”指定一个32位的空指针,在函数声明中,一个AS ANY参数指示Access Basic对那个参数不进行类型检查,同时把值传递到被调用的函数。

  下面的编码示范了一个正确的方法,通知你如何声明一个给动态链接库中的过程传递一个空指针参数的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的任何变化写到磁盘上。

重要的

  对这个函数不正确的使用会惹起普通性的保护毛病或修正你的WIN.INI文件。

Function nFlushIniCache()
  nFlushIniCache = WriteProfileString (0&, 0&, 0&)
End Function

如何从动态链接库中传递和接收无符号整型数

  常常有这样一种情况,要从外部动态链接库调用的过程中前往一个两个字节长的无符号整型数。然而Access Basic不支持这种数据类型。正确地计算这种数据类型需求把它从一个无符号整型数转换程Access Basic长数据类型。

  Access Basic整型数的范围使从-32768到32767。一个无符号整型数的范围是从0到65535。Access Basic用最明显的一位来放置数值的符号位,所以当数值超过32767,第16位将被置成负数符号。要计算一个无符号整型数,你必须人工调整第16位。

  从无符号整型数转换到Access Basic长整型数或从Access Basic的长整型转换成无符号整型数有两种方法。第一种方法用到了最基本的数学运算(65535被无符号整型值加或减)。第二种方法使用Bitwise操作。实际上,算术方法和Bitwise方法任务起来效果一样,只不过,算术方法可能可读性更强一些,而Bitwise方法在执行时可能更快一些。

算术方法

  下面的lArithUintToInt (nUint)和lArithIntToUnint(lBytes)过程示范了如何使用转换无符号整型数的算术方法。第一个函数读进一个无符号整型数同时前往一个曾经转变位长整型的值。第二个函数读入一个长整型值,然后前往一个转变成无符号整型的值。

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