这篇文章概括了当使用Microsoft Access 时通过使用Access Basic可以增加应用程序的执行速度减少编码量同时也减少在为Microsoft Windows应用程序接口编程时在开发应用程序中遇到的问题的技术谨慎地使用变量和它所占用的存储空间能有效地减少一个应用程序所消耗的资源同时也全面提高了它的性能
不正确地调用Windows应用程序接口可能会产生一些意想不到的副作用以及潜在地对一个应用程序的代码及数据段的破坏正确地使用一个空的位指针在Microsoft Access 中是十分必要的
当对表格和报表进行操作时Microsoft Access有一个无正式文本的特性这个特性允许你从设计视窗性质sheet window中进行过程调用调用的方法时同时按下shift和F键
介绍
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
如何传递一个空指针给动态链接库
一个空的位指针是有效的或是为一些动态链接库要求具有参数要指定一个空值使用&当你的函数调用一个过程并传递一个表达式&&指定一个位的空指针在函数声明中一个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充满它的内部高速缓沖区并且WININI的任何变化写到磁盘上
重要的
对这个函数不正确的使用会引起一般性的保护故障或修改你的WININI文件
Function nFlushIniCache()
nFlushIniCache = WriteProfileString (& & &)
End Function
如何从动态链接库中传递和接收无符号整型数
常常有这样一种情况要从外部动态链接库调用的过程中返回一个两个字节长的无符号整型数然而Access Basic不支持这种数据类型正确地计算这种数据类型需要把它从一个无符号整型数转换程Access Basic长数据类型
Access Basic整型数的范围使从到一个无符号整型数的范围是从到Access Basic用最明显的一位来放置数值的符号位所以当数值超过第位将被置成负数符号要计算一个无符号整型数你必须人工调整第位
从无符号整型数转换到Access Basic长整型数或从Access Basic的长整型转换成无符号整型数有两种方法第一种方法用到了最基本的数学运算(被无符号整型值加或减)第二种方法使用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 > Then
nArithIntToUnint = lBytes
Else
nArithIntToUnint = lBytes
End If
End Function
按位操作方法
下面的nBWUintToInt(lBytes) 和 lBWIntToUint(nUint)过程示范了如何使用Bitwise方法转换无符号整型数第一个函数读进一个无符号整型数然后返回一个已经转换成长整型的值第二个函数读入一个长整型值然后返回一个已经转换的无符号整型值第二个函数中使用了提示框的语句是为了防止当传递到函数的值大于KB时会出现溢出信息
()
AND (FFFF&)
()
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 > Then
MsgBox You passed a value larger than
Exit Function
End If
nTemp = lBytes And &HFFF
nBWUintToInt = nTemp Or (lBytes And &H)
End Function
注意&HFFFF&要求&在进制数的末尾这样能保证位的进制数通过位的值表示出来
Access Basic中的技巧
在Microsoft Access 中有一些以前无正式文本的特性它们允许你指定过程这个过程是从一个from或report的属性工作表窗中调用的要进入最小窗口只需要同时按下SHIFT和F键
BUILDER FORM函数
如果在一个模块中一个函数的定义是以Builderr Form开始同时包含一个类似于Onclose属性或事件标识符按下SHIFT和F键就可以调用这个过程例如当你在一个form的设计窗口中而当前的光标落在属性窗口中的Onclose事件的编辑控制上按下SHIFT和F键将能调用BuilderFormOnclose函数这使用于form和rep