|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
对免费版的用户也具有充足的支持服务。在dev.mysql.com上,一个大型的MySQL学习教程强大社区用户和开发者可以讨论所有关于MySQL的事情。这个站点拥有博客、指南、视频、技术交流会、白皮书和论坛等方式的交流。MicrosoftAccess奥密、技能和圈套
布莱恩C.布莱克曼
体系撑持工程师,MicrosoftAccessBasic
择要
这篇文章归纳综合了当利用MicrosoftAccess时,经由过程利用AccessBasic能够增添使用程序的实行速率,削减编码量,同时也削减在为MicrosoftWindows使用程序接口编程时、在开辟使用程序中碰到的成绩的手艺。审慎地利用变量和它所占用的存储空间能无效地削减一个使用程序所损耗的资本,同时也周全进步了它的功能。
不准确地挪用Windows使用程序接口大概会发生一些意想不到的反作用,和潜伏地对一个使用程序的代码及数据段的损坏。准确地利用一个空的32位指针在MicrosoftAccess中是非常需要的。
当对表格和报表举行操纵时,MicrosoftAccess有一个无正式文本的特征。这个特征同意你从计划视窗性子sheetwindow中举行历程挪用,挪用的办法时同时按下shift和F2键。
先容
MicrosoftAccessBasic供应了一个丰厚的开辟情况。这个开辟情况给你充足的天真性和对MicrosoftWindows使用程序接口的把持,同时回护你使你免遭用初级或初级言语开辟情况开辟时所碰着的各类贫苦。不外,很多优化、无效数据和模块化方面只能是使用程序计划者才干利用。开辟者应努力于审慎地利用算法。除一样平常的程序计划观点,另有一些出格的存储空间的办理手艺,准确利用这些手艺能够进步使用程序的实行速率,削减使用程序所要好的存储资本。
进步速率和削减代码量
你能够用几种技能来进步你的编码速率,可是却找不到无效的算法的替换者。接上去的几点倡议能够进步你的编码速率同时又削减你的使用程序损耗的存储空间。
利用整形数据范例举行数学运算
即便MicrosoftAccess会利用一个团结处置器来处置浮点型算术,整型数算术也老是要快一些。当你的盘算不含有小数,只管利用整型或长整型而不是变量或双整型。整型除法一样也要比浮点除法要快。在利用其他一些无效的数据范例时会告诫:没有任何器材能够交换无效的运算法例。
制止利用历程挪用
制止在轮回体中利用子程序或函数挪用。每次挪用都因分外的事情和工夫而给编码增年夜了包袱。每次挪用都请求把函数的部分变量和参数压栈,而栈的巨细是流动的,不克不及任意加年夜,而且同时还要于MicrosoftAccess共享。
审慎利用不定长数据范例
不定长数据范例供应了更年夜的天真性,好比说同意准确处置空值和主动处置溢出。别的这类数据范例比传统的数据范例要年夜并损耗更多的存储空间。后面还已经提到过,不定长数据范例的变量在数学盘算中对照慢。
用变量寄存常常利用的属性
对变量举行查找和设置都比对属性举行这些操纵要快。假如你要失掉或查阅一个属性值很多次,那末把这个属性分派给一个变量,并用这个变量来取代属性,那末你的代码将要运转快很多。比方,在一个轮回中,你查阅某表格中得一个把持的属性,那末在轮回外把属性分派给一个变量,然后在轮回顶用查询一个变量来取代查阅一个属性的办法要对照快。
预载表格
当你的使用程序启动而且把它们的可见属性设置位‘false’时,假如你安装了你一切的表格,那末你的使用程序的功能会让你感到挺快。当你必要显现一个表格时,你只必要把该表格的可见属性设置为‘true’,这要比安装一个表格要快很多。必要记着的是,为你安装的每一个表格,你都要从使用程序的全局堆中损耗存储空间。
AccessBasic中的圈套
在AccessBasic中常常碰着的圈套是对静态毗连库(DLLS)中的内部历程的挪用。当你供应程序给你的用户,挪用内部静态链接库时将呈现利用告诫;不然,你将失掉一条毛病信息:试图用不异的函数界说安装模块。
利用独一的别号
在AccessBasic中,假如你晓得出口点(静态链接库中函数的名字),你能够挪用静态链接库中的内部函数。不外,利用这一办法的限定性在于你只能声明内部函数一次。假如你安装了挪用了你的模块挪用的不异的Windows使用程序接口,你不会失掉一个不为人所知的毛病:试图用不异的函数界说安装模块。
你实验安装的模块要末是包括有不异的函数名,要末是包括在已存在的模块中有的历程名。删除这些历程,在EDIT菜单中利用FIND命令找到反复的历程名,要办理这一成绩,你必要利用一种叫做“别号利用“的手艺。这类手艺同意你给你的历程一个举世无双的名字。可是,你选择的别号也有大概不是举世无双的,以是要使你取的名字独一,你能够用初始值和下划线优先声明你一切从静态链接库中挪用的历程,好比,声明getActiveWindow为:
Declarebcb_GetActiveWindowLib"Kernel"Alias"GetActiveWindow"()AsInteger.
怎样传送一个空指针给静态链接库
一个空的32位指针是无效的或是为一些静态链接库请求具有参数。要指定一个空值,利用0&。当你的函数挪用一个历程并传送一个表达式0&,“&”指定一个32位的空指针,在函数声明中,一个ASANY参数唆使AccessBasic对谁人参数不举行范例反省,同时把值传送到被挪用的函数。
上面的编码树模了一个准确的办法,告知你怎样声明一个给静态链接库中的历程传送一个空指针参数的AccessBasic函数。这段声了然WriteProfileString使用程序接口函数。这个函数来自于内部Windows静态链接库“kernel”。
DeclareFunctionWriteProfileStringLib"Kernel"(ByVallpApplicationNameAsAny,ByVallpKeyNameAsAny,ByVallpStringAsAny)
接上去的函数挪用了一个内部历程,位每一个参数指定一个空值。这将使WriteProfileString充斥它的外部高速缓冲区,而且WIN.INI的任何变更写到磁盘上。
主要的
对这个函数不准确的利用会引发一样平常性的回护妨碍或修正你的WIN.INI文件。
FunctionnFlushIniCache()
nFlushIniCache=WriteProfileString(0&,0&,0&)
EndFunction
怎样从静态链接库中传送和吸收无标记整型数
经常有如许一种情形,要从内部静态链接库挪用的过程当中前往一个两个字节长的无标记整型数。但是AccessBasic不撑持这类数据范例。准确地盘算这类数据范例必要把它从一个无标记整型数转换程AccessBasic长数据范例。
AccessBasic整型数的局限使从-32768到32767。一个无标记整型数的局限是从0到65535。AccessBasic用最分明的一名来安排数值的标记位,以是当数值凌驾32767,第16位将被置成正数标记。要盘算一个无标记整型数,你必需野生调剂第16位。
从无标记整型数转换到AccessBasic长整型数或从AccessBasic的长整型转换成无标记整型数有两种办法。第一种办法用到了最基础的数学运算(65535被无标记整型值加或减)。第二种办法利用Bitwise操纵。实践上,算术办法和Bitwise办法事情起来效果一样,只不外,算术办法大概可读性更强一些,而Bitwise办法在实行时大概更快一些。
算术办法
上面的lArithUintToInt(nUint)和lArithIntToUnint(lBytes)历程树模了怎样利用转换无标记整型数的算术办法。第一个函数读进一个无标记整型数同时前往一个已变化位长整型的值。第二个函数读进一个长整型值,然后前往一个变化成无标记整型的值。
FunctionlArithUintToInt(nUintAsInteger)
IfnUint<0Then
lArithUintToInt=nUint+65536
Else
lArithUintToInt=nUint
EndIf
EndFunction
FunctionnArithIntToUnint(lBytesAsLong)
IflBytes>32767Then
nArithIntToUnint=lBytes-65536
Else
nArithIntToUnint=lBytes
EndIf
EndFunction
按位操纵办法
上面的nBWUintToInt(lBytes)和lBWIntToUint(nUint)历程树模了怎样利用Bitwise办法转换无标记整型数。第一个函数读进一个无标记整型数,然后前往一个已转换发展整型的值。第二个函数读进一个长整型值,然后前往一个已转换的无标记整型值。第二个函数中利用了提醒框的语句是为了避免当传送到函数的值年夜于64KB时会呈现溢出信息。
1010001111100000(-23584)
AND1111111111111111(FFFF&)
----------------
1010001111100000(41952)
Thefunctionsfollow:
FunctionlBWIntToUint(nUintAsInteger)
lBWIntToUint=nUintAnd&HFFFF&
EndFunction
FunctionnBWUintToInt(lBytesAsLong)
DimnTempAsInteger
IflBytes>65535Then
MsgBox"Youpassedavaluelargerthan65535"
ExitFunction
EndIf
nTemp=lBytesAnd&H7FFF
nBWUintToInt=nTempOr-(lBytesAnd&H8000)
EndFunction
注重:&HFFFF&请求“&”在16进制数的开端。如许能包管32位的16进制数经由过程16位的值暗示出来。
AccessBasic中的技能
在MicrosoftAccess中有一些之前无正式文本的特征,它们同意你指定历程,这个历程是从一个from或report的属性事情表窗中挪用的。要进进最小窗口,只必要同时按下SHIFT和F2键。
BUILDERFORM函数
假如在一个模块中一个函数的界说是以“BuilderrForm”入手下手同时包括一个相似于Onclose属性或事务标识符,按下SHIFT和F2键就能够挪用这个历程。比方,当你在一个form的计划窗口中,而以后的光标落在属性窗口中的Onclose事务的编纂把持上,按下SHIFT和F2键将能挪用BuilderFormOnclose函数。这利用于form和reports的年夜部分属性和一切事务。上面的代码将申明函数的格局:
FunctionBuilderFormOnClose(szFormNameAsString,szControlNameAsString,szCurrentValueAsString,szReservedAsString)
IfszCurrentValue=""Then
DoCmdSelectObjectA_MACRO,"",True
SendKeys"%n%fs"&"NewMacro"&"{Enter}"
Forms(szFormName).OnClose="NewMacro"
Else
DoCmdSelectObjectA_MACRO,szCurrentValue,True
SendKeys"%d"
EndIfEndFunction
参数szFormName,szControlName,szCurrentValue,和szReserved必需声明,即便你从不利用它们。当你的函数被挪用时,这些参数老是要被传送的。假如它们没有被声明,那末MicrosoftAccess将不会挪用你的函数。假如有一个参数被分派到Onclose事务上,那末后面的历程将翻开一个宏,假如编纂把持是空,那末代码发生一个名为“NewMacro”的新宏,同时把编纂把持值设置为“NewMacro”。固然,后面的例子并非十分完善,但它切实其实申明了要发生一个完善而无效的程序所必需的前提。如果你在一个遵循GPL的自由(开源)项目中使用MySQL,那么你可以遵循GPL协议使用MySQL。然而,如果你的项目不是在GPL协议下的话,你必须为使用MySQL来支付许可费用,或者你可能因为这个因素而将你的项目改为遵循GPL。 |
|