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