今天翻Office中国论坛,看到这篇2008年的文章(网友摘录的),感觉对Access开发还是有些启发和借鉴,就整理一下发上来
贴子内容如下:
这篇感到写得太有才了,发出来,与各位分享.
一、感觉篇
1 瞒天过海
为了让用户感觉到应用程序执行很快,我们可以利用定时器事件在后台"悄悄"执行一些任
务。在一些连续性的操作(比如向导)中,用户可能会因为浏览提示信息等缘故而不会立即
对应用程序作出响应。这时我们可以用一个静态变量或全局变量来跟踪运行过程,一旦定时
器空闲就进行一小部分工作(如加载数据)。如果能保证每次的工作量都很少,那么用户不
会感到应用程序的应答有什么影响,相反他会发现后续工作将会完成得很快。
2 趁火打劫
在应用程序中可能会多次从磁盘中提取数据,这时我们可以尽可能一次多加载数据,只要这
些数据不是太大,用户就不会感到过多的延迟。但由于减少了磁盘操作的次数,用户会感到
应用程序的总体速度较快。
3顺手牵羊
可以在Windows启动时先运行一个小的实用程序来预加载VB或Access应用程序所需的动态链接库,
如Msvbvm50.dll等。这样,由于Windows动态链接库的唯一性,应用程序启动时就能跳过
加载这些文件的步骤,使启动时间大大缩短。
4 暗渡陈仓
当应用程序的主窗体包含较多数据时,它的启动就会显得非常慢。这时我们可以设计一个简
洁的窗体来显示诸如版权之类的信息,而显示这个窗体的同时则在后台用Load方法将主窗
体调入内存,之后将版权窗体卸载并用Show方法显示主窗体,从而让用户误以为主窗体一
下子就调出来了。
5金蝉脱壳
在应用程序中一些窗体会反复出现,这样我们在不需要时用Hide方法隐藏而不是用UnLoad
卸出内存,这样做的优点是再用到该窗体时可以立刻显示出来而不是延迟一段时间。
6美人计
一个Windows应用程序的成功在很大程度上取决于用户界面的优劣,今年很流行的WinAmp
就是不很典型的例子。关于优化界面的方法,有调整控件位置、保持元素一致、简化界面等。
二、速度篇
7调虎离山
当控件的某一属性需反复引用时,我们可以把它缓存到某一变量中以加快速度:
L=Picture1.Top
For I=0 To 15
Image(I).Top=L-1
Next I
8釜底抽薪
由于Windows的图形特性,图形及其它操作的显示速度在很大程度上决定了应用程序的感觉
速度,因此在窗体互相重叠的时候应尽量不使用ClipControls和Auto
Redraw,设置控件属性时应隐藏控件,以免多次重画,还有用Line代替Pset等等。
9李代桃僵
尽管过程调用使代码具有模块化风格而更易维护,但对于速度要求严格的场合,过程调用会
增加额外的操作和处理时间,尤其是当调用处于循环体内时,我们就有必要变过程调用为代
码内嵌,以牺牲维护性的代价换取宝贵的速度。
10 连环计
速度的优化不只是某一单方面的事,比如折半查找的算法效率就比顺序查找高。但要是循环
体采用Variant变量作计数器则会大大降低执行速度,因此最佳的方案是折半查找加Long
整型变量作计数器。
11 上屋抽梯
在应用程序中可能会有一些对象或变量已经完成任务却仍占据内存资源,这里提倡一种上屋
抽梯、过河折桥的方法卸载对象或变量:Set Object=Nothing
同样的,使用动态数组并在使用完毕后回收内存资源也能达到相同的效果。
12 反客为主
由于VB采用事件驱动,因此应用程序的操作总是靠用户或系统的响应来激发的,但对于一
些总是要执行的操作我们可以主动产生一些事件,以在应用程序空闲时合理地利用系统资
源。
三、大小篇
13 偷梁换柱
有时候我们仅仅是为了显示图形和文字,但却使用了图片框和文本框,实际上图像框和标签
在这种场合能很好地代替前二者,且大大节省内存。
14 树上开花
这里讲的是一种借局布势的方法,即当我们需要很多相同的控件和窗体时可以使用控件数组
和Forms集合。控件数组通过赋予多个同类控件相同的Name属性及相应的Index属性得到,
而Forms集合则通过使用New关键字获得。二者的引用方法分别为Object(n)和Forms(n)。
15 走为上
随着工程的日渐庞大,代码中难免会出现一些死代码和无用的变量及常数,VB在编译时会
自动删除无用的常数,但死代码和无用的变量仍然会被编译到.exe文件中。这不但会占用
宝贵的内存资源,而且会降低执行效率甚至导致应用程序的崩溃,因此把死代码和无用变量
请"走"是一个很好的习惯。
16 假痴不癫
虽然功能齐全是件令人称道的事,但重复的建设和为了一些很少用到的功能而耗费大量代码
和空间无疑是一种浪费,就好比Win95的任务条上已有一个时钟,你却非在应用程序中再加
一个一样没有多大意义。另一个例子就是WPS97虽然没有Word功能多却非常受欢迎。其实
软件同硬件一样:电脑,电脑,够用就好!
17 假道伐虢
尽管我们可以自己编写代码来完成诸如绘图、表格处理之类的工作,但若这些功能在应用程
序中不占重要位置时,可以考虑通过OLE或者DDE的方法调用画图、写字板、Excel之类的
现有程序来完成工作,既节省代码又节省空间。
18 无中生有
VB5提供了一种新的编程模式,即利用多个工程同时工作,这样我们可以将应用程序分段,
虽然内存里没有多少代码,但需要某项功能时可以将这个ActiveX控件随时调入内存使用。
四、数据篇
19 隔岸观火
在进行数据库操作时往往涉及到数据的检索,可以用FindFirst、FindNext及Seek等方法
来完成任务,但最简单也是最有效的方法,是给足查询条件并用类似英语的结构化查询语言
SQL来完成这个工作。SQL由Microsoft Jet支持,其语法和ANSI SQL基本一致:
SELECT字段名FROM表名WHERE 条件
其中"字段名"可包括多项值,"条件"项则可使用"And"、"Or"、"<"、"="、"Like"等逻
辑、比较操作符。一旦按照语法编写了SQL语句,即可将其提交给Data控件的Recordset
对象,并由Jet引擎处理,从而返回查询结果,以轻松实现组合查询。
20 空城计
随着NC、NetPC及低价PC的日益流行,网络中的客户机配置可能会越来越简单,因此把大
量的数据库及其操作放在客户机上是不太合适的,可以把控件同远程服务器上的数据库进行
绑定。这样,虽然客户机上只存在一丁点儿数据,但用户需要的任何数据库功能都可通过服
务器实现,并且由于数据存放集中而更加容易管理。
21 声东击西
在设计关系数据库软件并希望两个数据库表关联时,可以采用VB提供的DBListBox和
DBComboBox控件,利用它们能使两个表协调变更。当然,两个表必须有一个类型相同的字
段以确定其关系。这两个控件均具有以下五个特殊属性:
DataSource 被绑定的Data控件名称。
DataField 由DataSource属性指定的记录集的字段名称,它用来决定列表中什么元素被突
出显示。当作了新选择后,移动到一条新记录时该字段被更新。
RowSource 将用于填充列表的Data控件的名称。
BoundColumn 由RowSource属性指定的记录集中的字段名称,它必须与用来更新列表的
DataField字段类型相同。
ListField 用来填充列表的由RowSource指定的记录集中的字段名。
通过设置以上五个属性,我们可以轻松实现主副关系数据库应用程序的构造,当然我们也可
以不用这两个控件而用代码来实现,其事例可以通过使用数据窗体向导而得到。
22 借尸还魂
也许用户会希望应用程序有Undo功能,"事务"正是实现恢复数据库更改的工具,VB5通过
以下三个方法支持事务功能:
BeginTrans 开始一个新事务
CommitTrans 确认所作的更改
Rollbac 撤消所作的更改
事务功能可以嵌套,典型的例子如下:
Dim Table1 As Recordset
′定义表变量
Dim Work1 As Workspace
′定义工作空间
Dim Work2 As Workspace
Set Table1=Data1.Recordset
Set Work1=Workspace(0)
Set Work2=Workspace(1)
Work1.BeginTrans
…… ′一系列改变
Work2.BeginTrans ′撤消变更
…… ′一系列改变
Work1.CommitTrans ′确认变更
23 远交近攻
设计基于SQL Server的窗体时应考虑到网络的带宽:应用程序向服务器申请的数据越多网
络就越易塞车。因此,设计窗体时应在用户有明确要求或确实需要时才向服务器申请数据和
功能:
①用过滤器或SQL查询限制记录集记录数。
②只在服务器上查询窗体实际用到的字段。
③尽量少使用绑定控件,因为它们会独立向服务器递交查询。
④对始终不变的数据应尽量保存在本地Jet数据库以加速查询。
⑤对于很难改变的数据,在服务器和本地机上同时保存,仅在其改变时才下载。
24 围魏救赵
有些memo字段和长二进制格式(OLE对象) 字段并不常用,可以在用户要求显示时才把它调
入内存,这样可以大大降低内存负担。
五、调试篇
25 擒贼擒王
调试包含除错和优化,而优化必须找准方向。比如速度对游戏至关重要,而Internet下载
型软件则看重大小,所以找准方向、找对地方往往能事半功倍。优化速度应尽量优化循环体,
因为循环体的执行速度差会成倍影响应用程序,同理,对于经常调用的过程和函数也是如此。
26 欲擒故纵
测试应用程序和处理等价于VB运行错误的具体条件时,进行错误模拟是非常有用的。模拟
错误的格式为:
Object.Raise argumentlist
例如下面的语句模拟"磁盘未准备好"的错误:
Err.Raise Number:71
27 以逸代劳
无论我们写的程序有多么优秀,实际运行中的错误我们仍然无法预料。设置错误捕捉是个以
逸代劳的做法。一旦错误被捕获,我们就可以调用例程进行处理:
Sub A( )
on Error Goto CheckErr
……
Exit Sub
CheckErr :
……
End Sub
28关门捉贼
当应用程序变得庞大后,仅对整个工程进行表面测试难以保证可靠性。因此,对于一些可能
会出错的过程和函数应单独测试,满足其调用条件并检查返回结果,这对于发现错误尤其是
非运行错误和非语法错误(如计算错误)大有帮助。
29借刀杀人
对一个频繁使用的变量或对象逐步跟踪无疑是个庞大的工程,好在VB5提供了监视表达式,
利用它可随时监视变量或对象,并在满足指定条件时中断运行。通过"调试"菜单中的"添
加监视表达式"可获得这一功能。
30 打草惊蛇
为避免变量重名我们会使用一些长变量名,但这样很容易造成变量名拼写错误。这时我们可
以在"选项"对话框中确认"要求变量声明",如此VB就会自动在其后的每个模块中添加
"Option
Explicit",从而在运行程序时,VB一旦发现拼写错的变量名,而错的名字又未定义时,就
会告诉你"变量没有定义",并把光标停在该处。当然,这样做要注意两点:一是最好一开
始时就选择"要求变量声明",二是用到的变量都必须先声明(当然,这是个好习惯)。
六、杂谈篇
31 混水摸鱼
坐井观天往往不会有什么好成就,要跟上10倍速时代必须时刻注视新技术。网上有很多
ActiveX控件,融合了很多流行技术,可以去"摸"几个,至于地址可在《电脑爱好者》上
找到一些。
32 抛砖引玉
对于VB FAN,要想"烧"出水平必须和别人相互交流,往往你解决不了的难题恰好是别人
的拿手菜,而你自以为的高招却不如别人的优秀……
33 反间计
将彼之技用于我技,看看别人的程序是怎样写的,特别是VB和Access 中国 VBA的范例,相当一部分"贼棒"。
34 指桑骂槐
有时想让用户注意某处而用户偏偏视而不见,可以用高亮、鲜艳的色彩甚至声音来提醒他们:
"注意了,这里有问题!"
35 笑里藏刀
友好的提示总是更能博得喜爱,用户并不需知道那些晦涩的技术细节,他们只需要知道发生
了什么事情,该怎么办。像"C盘××××扇区严重损坏,重试?放弃?失败?"就比"存储
数据时C盘出错,改存到其它驱动器吗?"要令人讨厌。
36 苦肉计
计计归来,计计汇总,想要提高VB应用水平,勤学苦练必不可少,因此说,"VB三十六
计,勤奋是上策"。