MicrosoftAccess秘密、技巧和陷阱
[摘要]
本文总结了在使用Microsoft Access时,通过使用Access Basic,可以提高应用程序的执行速度,减少编码量,同时减少在编写Microsoft Windows应用程序接口时开发应用程序所遇到的问题的技术。谨慎使用变量及其占用的存储空可以有效减少一个应用消耗的资源,同时全面提升其性能。
错误地调用Windows API可能会产生一些意想不到的副作用,并可能损坏应用程序的代码和数据段。有必要在Microsoft Access中正确使用空的32位指针。
当处理表格和报表时,Microsoft Access具有无正式文本的功能。此功能允许您从“设计”窗口的“属性表”窗口进行过程调用,并在调用方法时同时按shift和F2键。
简介
Microsoft Access Basic提供了一个丰富的开发环境。这种开发环境让你对微软Windows的应用界面有足够的灵活性和控制力,同时也让你免受用高级或低级语言开发环境开发时遇到的各种麻烦。然而,优化、有效数据和模块化的许多方面只能由应用程序设计人员使用。开发人员应该致力于谨慎使用算法。除了一般的编程概念,还有一些特殊的存储空管理技术。恰当地使用这些技术可以提高应用程序的执行速度,减少应用程序的良好存储资源。
提高速度,减少代码量
你可以使用几种技术来提高你的编码速度,但是你找不到有效算法的替代品。以下建议可以提高您的编码速度,同时减少应用程序消耗的内存空。
使用整数数据类型进行数学运算
尽管Microsoft Access将使用联合处理器来处理浮点运算,但整数运算总是更快。当您的计算不包含小数时,请尝试使用整数或长整数,而不是变量或双整数。整数除法也比浮点除法快。当使用其他一些有效的数据类型时,你会得到警告,没有什么可以取代有效的算法。
避免使用过程调用
避免在循环体中使用子例程或函数调用。由于额外的工作和时间,每个调用都增加了编码的负担。每次调用都需要将函数的局部变量和参数进行堆栈,堆栈的大小是固定的,不能任意放大,同时要与Microsoft Access共享。
谨慎使用可变长度数据类型
可变长度数据类型提供了更大的灵活性,例如允许正确处理空值和自动处理溢出。此外,这种数据类型比传统数据类型更大,消耗更多的存储空。如前所述,具有不定数据类型的变量在数学计算中速度较慢。
通过存储常用属性
比通过属性查找和设置变量更快。如果你想多次获取或查询一个属性值,那么把这个属性赋给一个变量,用这个变量替换它,那么你的代码运行起来会快很多。例如,在循环中,如果在表中查找一个受控属性,将该属性赋给循环外的一个变量,然后查找一个变量,比在循环中查找属性更快。
Preload tables
当你的应用程序启动并且它们的visible属性设置为' false '时,如果你安装了所有的表,你的应用程序的性能会让你觉得相当快。当需要显示表格时,只需要将表格的visible属性设置为‘true’,这比安装表格要快得多。请记住,对于您安装的每个表单,您必须从应用程序的全局堆中消耗storage 空空间。
Access中的陷阱
Access Basic中经常遇到的陷阱是在DLLS中对外部过程的调用。当你提供一个程序给你的用户,调用外部动态链接库时,会出现使用警告;否则,您将得到一个错误消息:试图用相同的函数定义安装模块。
别名使用
在Access Basic中,如果知道入口点(DLL中函数的名称),就可以调用DLL中的外部函数。但是,使用这种方法的限制是只能声明一次外部函数。如果你安装了调用你的模块的相同的Windows API,你不会得到一个未知的错误:试图用相同的函数定义安装模块。
您试图安装的模块或者包含相同的函数名,或者包含现有模块中的一些过程名。删除这些过程,并使用“编辑”菜单中的“查找”命令来查找重复的过程名。要解决这个问题,你需要使用一种叫做“别名使用”的技术。这种技术允许您为您的流程指定一个唯一的名称。但是,您选择的别名可能不是唯一的,所以为了使您的名字,您可以优先使用初始值和下划线来声明从动态链接库调用的所有过程。例如,将getActiveWindow声明为:
将BCB _ GetActiveWindow Lib“Kernel”别名“GetActiveWindow”()声明为整数。
如何将空指针传递给动态链接库
32位指针空是有效的,或者需要某些动态链接库的参数。若要指定空的值,请使用0&当您的函数调用过程并传递表达式0&时,“&”指定32位空指针。在函数声明中,AS ANY参数指示Access Basic不要对该参数进行类型检查,同时将值传递给被调用的函数。
下面的代码演示了声明Access Basic函数的正确方法,该函数将空指针参数传递给动态链接库中的过程。本节声明WriteProfileString API函数。这个函数来自外部的Windows动态链接库“内核”。
声明函数WriteProfileString Lib“Kernel”(ByVal lpApplicationName
Any,ByVal lpKeyName As Any,ByVal lpString As Any)
下一个函数调用一个外部过程,为每个参数指定一个空值。这将使WriteProfileString填充其内部缓存,并且WIN的任何更改。INI将被写入磁盘。
重要提示
此功能使用不当将导致常规保护失败或修改您的WIN。INI文件。
函数nFlushIniCache()
nFlushIniCache = WriteProfileString(0&,0&,0 &)
结束功能
如何从动态链接库中传递和接收无符号整数
经常有这样的情况,外部动态链接库的调用返回一个长度为两个字节的无符号整数。但是,Access Basic不支持这种数据类型。正确计算此数据类型需要将其从无符号整数转换为Access基本长数据类型。
基本整数的范围是从-32768到32767。无符号整数的范围从0到65535。Access Basic最明显的位来放置值的符号位,所以当值超过32767时,第16位将被设置为负号。要计算无符号整数,必须手动调整第16位数字。
有两种方法可以将Access Basic的无符号整数转换为长整数,或者将Access Basic的长整数转换为无符号整数。第一种方法使用最基本的数学运算(65535加上或减去无符号整数值)。第二种方法使用位运算。实际上,算术方法和位运算方法工作得一样好,只是算术方法的可读性可能更好,而位运算方法的执行速度可能更快。
算术方法
下面的lArithUintToInt (nUint)和larithinttouint(lBytes)过程演示如何使用算术方法转换无符号整数。第一个函数读取一个无符号整数,并返回一个已经转换为位长整数的值。第二个函数读入一个长整型值,然后返回一个转换为无符号整数的值。函数lArithUintToInt (nUint为整数)
如果nUint < 0,则
lArithUintToInt = nUint + 65536
其他
lArithUintToInt = nUint
如果…就会结束
结束功能
函数nArithIntToUnint(长为1字节)
如果lBytes > 32767,则
narithinttouint = lBytes-65536
其他
nArithIntToUnint = lBytes
如果…就会结束
结束功能
按位操作方法
下的nBWUintToInt(lBytes)和lBWIntToUint(nUint)过程演示了如何使用按位方法转换无符号整数。第一个函数读取一个无符号整数,然后返回一个已经转换为长整数的值。第二个函数读入一个长整型值,然后返回一个转换后的无符号整型值。第二个函数中使用了提示框语句,以防止传递给该函数的值大于64KB时信息溢出。
1010001111100000 (-23584)
还有11111111111111111(FFFF &)
-
1010001111100000 (41952)
这些功能如下:
函数lBWIntToUint(numint为整数)
lBWIntToUint = nUint和&HFFFF&
结束功能
函数nBWUintToInt(lBytes As Long)
Dim nTemp为整数
如果lBytes > 65535,则
MsgBox "您传递了一个大于65535的值"
退出功能
如果…就会结束
nTemp =字节和&H7FFF
nBWUintToInt = nTemp或-(千字节和&H8000)
结束功能
注意:&HFFFF&要求“&”在十六进制数的末尾。这确保了32位十六进制数由16位值表示。
基本技能
Microsoft Access中有一些功能以前没有正式文本。它们允许您指定从from或report的属性表窗口调用的过程。要进入最小窗口,只需同时按SHIFT和F2键来构建窗体函数。
如果模块中函数的定义以“BuilderForm”开头,并且包含类似Onclose的属性或事件标识符,请按SHIFT和F2来调用此过程。例如,当您在窗体的设计窗口中,并且当前光标落在属性窗口中Onclose事件的编辑控件上时,按SHIFT和F2键将调用BuilderFormOnclose函数。这适用于窗体和报表的大多数属性和所有事件。以下代码将解释该函数的格式:
函数builderformaonclose(SZ formname为字符串,szControlName为字符串,
szCurrentValue为字符串,szReserved为字符串)
如果szCurrentValue = " "那么
DoCmd SelectObject A_MACRO,"",True
SendKeys“% n % fs”&“新宏”&“{ Enter }”
表单(szFormName)。OnClose = "新宏"
其他
DoCmd SelectObject A_MACRO,szCurrentValue,True
发送键“%d”
如果…就会结束
结束功能
参数szformname、szcontrolname、szcurrentvalue和szReserved必须声明,即使您从未使用过它们。当您的函数被调用时,这些参数总是被传递。如果没有声明它们,Microsoft Access将不会调用您的函数。如果有一个参数分配给Onclose事件,那么前面的过程将打开一个宏。如果编辑控件是空,则代码会生成一个名为“新宏”的新宏,并将编辑控件的值设置为“New Macro”。诚然,前面的例子并不完美,但它确实说明了产生一个完美而有效的程序的必要条件。
位律师回复
0条评论