VB编辑经验集 长期用VB5.0进行应用软件的编程，遇到过不少问题,走了不少弯路，也积累了不少经验。在此，将它们做个小结，希望对同样从事VB5.0编程的朋友有所帮助。 在Form_Load事件中不能对Data控件进行控制 如果确实需在窗体被打开时使用Data控件,可在Form_Activate事件中进行控制。由于Activate事件在窗体被激活时发生，就是说在窗体被打开时发生，同时在窗体得到焦点时也会发生。要区分是否为窗体被打开的情况，只要设置一变量，在第一次Activate事件发生时对Data控件进行控制，然后对此变量进行设置，使以后的Activate事件不再执行对Data控件进行控制的语句。
DBGrid控件列宽的控制
在设计时可通过DefColWidth属性来设置列宽，但这样无法为不同的列设置不同的宽度。那么到底要怎么分别设置每一列的宽呢?这同样可在窗体的Activate事件中实现。
Form_Activate()
DBGrid1.Columns(0).Width=1000　′为第一列设置宽度
DBGrid1.Columns(1).Width=2500　′为第二列设置宽度
DBGrid1.Columns(2).Width=1000　′为第三列设置宽度
End Sub
IsNull函数的应用
判断一值是否为空，要用IsNull函数来实现，而不能用判断语句来实现，例如：
If Data1.Recordset.Fields(1).Value=NULL Then
′要执行的语句
End If
这样无论Data1.Recordset.Fields(1).Value的值是否为NULL,要执行的语句都执行不了,因为(Data1.Recordset.Fields(1).Value=NULL)永远等于False,所有含有“NULL”的判断式的值都是False。正确的处理方法为：
If IsNull（Data1.Recordset.Fields(1).Value)=True Then
′要执行的语句
End If
不明白的地方可查找关于“IsNull”函数的说明和帮助。
使用FoxPro数据库
大家知道打开Access数据库很简单,比如要打开一个当前目录下名为“book.mdb”的数据库文件,如下所示:
Dim db1 As Database　′定义变量
Set db1=OpenDatabase(″book.mdb″)　′打开数据库文件
如果要打开的是FoxPro数据而不是Access数据怎么办呢?首先要明白FoxPro中所谓的数据库只是Access中的表而已。其打开方法亦很简单，如下：
Dim db1 As Database
Set db1=OpenDatabase(″C:\BOOK″,False,False,″FoxPro 2.5″)
′BOOK为一包含所要FoxPro数据库文件(＊.dbf)的目录
在这里用FoxPro数据库文件的目录来代替Access中的数据库名。在使用中，“C:\BOOK”目录下的所有dbf文件都是db1的表,表名即为文件名除去“.dbf”。其它的使用方法都和用Access数据库时一样。如有不明之处，请查阅关于“OpenDatabase”函数的说明和帮助。
轻松调用帮助文件
提及VB中的控件CommonDialog(内置对话框控件)，想必大多数VB开发人员都有所应用。利用它实现对文件的打开和存盘、字体的调用、颜色的设定和打印任务的完成等，可极大地减轻编程工作量。实际上除此以外，该控件还可实现应用系统中帮助文件的调用。
在利用内置对话框控件实现帮助文件的调用前，主要须设置属性值HelpFile和HelpCommand。其中，HelpFile为欲调用的帮助文件，HelpCommand为帮助类型，依据其设定值的不同，可分别显示帮助文件中的帮助主题、帮助关键词等等不同页面的帮助信息。
下面附一简单程序，以说明其实现过程。该程序仅由一个窗体组成，窗体中包含有一个Command控件和一个CommonDialog控件。在添加好以上控件后，编制程序如下：
Private Sub Command1_Click()
Dim Fname as string
Fname=″C:\Windows\System\Odbcjet.hlp″
′指定帮助文件
CommonDialog1.HelpFile=Fname
′显示帮助文件中的主题页
CommonDialog1.HelpCommand=cdHelpContents
′显示调用
CommonDialog1.ShowHelp
End Sub
运行该程序，点击Command控件即可实现在屏幕上显示出帮助文件Odbcjet.hlp中的帮助信息了，很轻松吧。
让时间更精确
在应用VB编程的时候，你是否发现VB的时间控制并不十分精确，在VB中我们有时需要一个比VB自带的now()更精确的计时函数，下面的BetterNow()就是这样的一个函数，在Pentium 166 MMX的机器上，它大概每10微秒执行一次，而VB自带的函数是每180微秒执行一次。ButterNow()更精确，它支持1毫秒的事件触发，而VB的now()只支持1000毫秒的事件触发。同样的它也比Timer()更快更精确，因而它可以在记录时间流逝方面替代Timer()，比Timer()更好的是它不会在每天午夜自动清零。
＃If Win16 Then
Private Declare Function timeGetTime Lib _
″MMSYSTEM.DLL″ () As Long
＃Else
Private Declare Function timeGetTime Lib
″winmm.dll″ _　() As Long
＃End If
Function BetterNow() As Date
Static offset As Date
Static uptimeMsOld As Long
Dim uptimeMsNew As Long
′定义一秒
Const oneSecond=1/(24＃＊60＊60)
′定义一毫秒
Const oneMs=1/(24＃＊60＊60＊1000)
uptimeMsNew=timeGetTime()
′如果是第一次调用函数或运行时间超过47天，重新计算时间。
If offset=0 Or uptimeMsNew < uptimeMsOld Then
offset=Date－uptimeMsNew＊oneMs＋CDbl(Timer)＊_
oneSecond
uptimeMsOld=uptimeMsNew
End If
BetterNow=uptimeMsNew＊oneMs＋offset
End Function
优化ＶＢ程序
Visual Basic作为一种高级编程语言，它也有着不可避免的缺点——开发出的程序运行速度慢。如果我们能够对程序做一些优化，那么情况将会大大改善。
要优化程序运行的实际速度，常用的方法有三种：
1.尽量避免使用Variant变量。由于VB不能确定Variant变量的具体类型，所以它会给该类型变量分配16个字节的空间，而且在用变量进行运算时还要考虑到数据类型的转换。这既占用了内存，又影响了速度，会使涉及到复杂运算的程序变慢。注意，一个变量的缺省类型就是Variant，其它类型的变量要用Dim语句单独声明。
2.在遇到整型数据时尽量使用Long变量。因为Long变量是32位CPU的本机数据类型，所以处理速度会很快，尤其是在循环体中。
3.将控件的常用属性保存在变量中。一般控件存在于DLL或OCX之类的外部程序中。众所周知，调用DLL远比访问内存慢。所以对于那些放在循环体中的常用属性，如果将它们保存在变量中，那么速度将会有成百上千倍的提升。
我们在编写程序时应注意到，在进行长时间等待操作时，可以做一些动画之类的效果，好让用户知道程序运行正常。下面是几个常用优化方法：
1.使用Splash屏幕。也就是我们常见的欢迎窗口。大的应用程序在启动时，往往会主动或被动地载入一大堆DLL，这要花费很长时间。所以我们在启动时可以先显示一个简单的窗口，上面只放一些作者、版权之类的信息,在这个窗口的Form_Load事件中用Load方法读入那些最常用的窗体模块。这样，虽然实际等待的时间延长了，但用户所看到的屏幕总是变化的，所以感觉上程序启动加快了。而且由于常用窗体模块事先已载入内存，以后只需用Show方法来显示它，跳过了载入过程，在程序运行过程中也会很快的。
2.使用Timer控件。由于Timer控件的出现，使得后台作业有了可能。我们可以在每次Timer事件中完成一小部分任务。这样，由于Timer中的事件能够在很短的时间内完成，用户一般查觉不到速度的变化。如果一定要在一个循环内完成某个任务，那么不要忘了用DoEvents来释放用户。
3.使用进度条。要使用进度条，需要事先知道数据量，所以它很适合用于对已知数据的操作，如数据库的排序。
总之，优化程序要从自己、从用户等多方面考虑，使程序开发周期短，且高效易用。
(梁永胜）