1、"&"替换"+"
在很多人的编程语言中,用“+”来连接字符串,这样容易导致歧义。良好的习惯是用“&”来连接字符串.
不正确:
Dim sMessage As String
sMessage = "1" + "2"
正确:
Dim sMessage As String
sMessage = "1" & "2"
注意:"&"的后面有个空格
2、变量命名大小写,语句错落有秩,源代码维护方面
下面大家比较一下以下两段代码:
读懂难度很大的代码:
Dim SNAME As String
Dim NTURN As Integer
If NTURN = 0 Then
If SNAME = "vbeden" Then
Do While NTURN < 4
NTURN = NTURN + 1
Loop
End If
End If
容易读懂的代码:
Dim sName As String
Dim nTurn As Integer
If nTurn = 0 Then
If sName = "vbeden" Then
Do While nTurn < 4
nTurn = nTurn + 1
Loop
End If
End If
[返回索引]
3、请养成以下的“对象命名约定”良好习惯
推荐使用的控件前缀 |
控件类型 |
前缀 |
例子 |
3D Panel |
pnl |
pnlGroup |
ADO Data |
ado |
adoBiblio |
Animated button |
ani |
aniMailBox |
Check box |
chk |
chkReadOnly |
Combo box, drop-down list box |
cbo |
cboEnglish |
Command button |
cmd |
cmdExit |
Common dialog |
dlg |
dlgFileOpen |
Communications |
com |
comFax |
Control (当特定类型未知时,在过程中所使用的) |
ctr |
ctrCurrent |
Data |
dat |
datBiblio |
Data-bound combo box |
dbcbo |
dbcboLanguage |
Data-bound grid |
dbgrd |
dbgrdQueryResult |
Data-bound list box |
dblst |
dblstJobType |
Data combo |
dbc |
dbcAuthor |
Data grid |
dgd |
dgdTitles |
Data list |
dbl |
dblPublisher |
Data repeater |
drp |
drpLocation |
Date picker |
dtp |
dtpPublished |
Directory list box |
dir |
dirSource |
Drive list box |
drv |
drvTarget |
File list box |
fil |
filSource |
Flat scroll bar |
fsb |
fsbMove |
Form |
frm |
frmEntry |
Frame |
fra |
fraLanguage |
Gauge |
gau |
gauStatus |
Graph |
gra |
graRevenue |
Grid |
grd |
grdPrices |
Hierarchical flexgrid |
flex |
flexOrders |
Horizontal scroll bar |
hsb |
hsbVolume |
Image |
img |
imgIcon |
Image combo |
imgcbo |
imgcboProduct |
ImageList |
ils |
ilsAllIcons |
Label |
lbl |
lblHelpMessage |
Lightweight check box |
lwchk |
lwchkArchive |
Lightweight combo box |
lwcbo |
lwcboGerman |
Lightweight command button |
lwcmd |
lwcmdRemove |
Lightweight frame |
lwfra |
lwfraSaveOptions |
Lightweight horizontal scroll bar |
lwhsb |
lwhsbVolume |
Lightweight list box |
lwlst |
lwlstCostCenters |
Lightweight option button |
lwopt |
lwoptIncomeLevel |
Lightweight text box |
lwtxt |
lwoptStreet |
Lightweight vertical scroll bar |
lwvsb |
lwvsbYear |
Line |
lin |
linVertical |
List box |
lst |
lstPolicyCodes |
ListView |
lvw |
lvwHeadings |
MAPI message |
mpm |
mpmSentMessage |
MAPI session |
mps |
mpsSession |
MCI |
mci |
mciVideo |
Menu |
mnu |
mnuFileOpen |
Month view |
mvw |
mvwPeriod |
MS Chart |
ch |
chSalesbyRegion |
MS Flex grid |
msg |
msgClients |
MS Tab |
mst |
mstFirst |
OLE container |
ole |
oleWorksheet |
Option button |
opt |
optGender |
Picture box |
pic |
picVGA |
Picture clip |
clp |
clpToolbar |
ProgressBar |
prg |
prgLoadFile |
Remote Data |
rd |
rdTitles |
RichTextBox |
rtf |
rtfReport |
Shape |
shp |
shpCircle |
Slider |
sld |
sldScale |
Spin |
spn |
spnPages |
StatusBar |
sta |
staDateTime |
SysInfo |
sys |
sysMonitor |
TabStrip |
tab |
tabOptions |
Text box |
txt |
txtLastName |
Timer |
tmr |
tmrAlarm |
Toolbar |
tlb |
tlbActions |
TreeView |
tre |
treOrganization |
UpDown |
upd |
updDirection |
Vertical scroll bar |
vsb |
vsbRate |
推荐使用的数据访问对象 (DAO) 的前缀
用下列前缀来指示数据访问对象 |
数据库对象 |
前缀 |
例子 |
Container |
con |
conReports |
Database |
db |
dbAccounts |
DBEngine |
dbe |
dbeJet |
Document |
doc |
docSalesReport |
Field |
fld |
fldAddress |
Group |
grp |
grpFinance |
Index |
ix |
idxAge |
Parameter |
prm |
prmJobCode |
QueryDef |
qry |
qrySalesByRegion |
Recordset |
rec |
recForecast |
Relation |
rel |
relEmployeeDept |
TableDef |
tbd |
tbdCustomers |
User |
usr |
usrNew |
Workspace |
wsp |
wspMine |
应用程序频繁使用许多菜单控件,对于这些控件具备一组唯一的命名约定很实用。除了最前面 "mnu"
标记以外,菜单控件的前缀应该被扩展:对每一级嵌套增加一个附加前缀,将最终的菜单的标题放在名称字符串的最后。下表列出了一些例子。
推荐使用的菜单前缀 |
菜单标题序列 |
菜单处理器名称 |
File Open |
mnuFileOpen |
File Send Email |
mnuFileSendEmail |
File Send Fax |
mnuFileSendFax |
Format Character |
mnuFormatCharacter |
Help Contents |
mnuHelpContents |
当使用这种命名约定时,一个特定的菜单组的所有成员一个接一个地列在 Visual Basic
的“属性”窗口中。而且,菜单控件的名字清楚地表示出它们所属的菜单项。
为其它控件选择前缀
对于上面没有列出的控件,应该用唯一的由两个或三个字符组成的前缀使它们标准化,以保持一致性。只有当需要澄清时,才使用多于三个字符的前缀。
常量和变量命名约定
除了对象之外,常量和变量也需要良好格式的命名约定。本节列出了 Visual Basic 支持的常量和变量的推荐约定。并且讨论标识数据类型和范围的问题。
变量应该总是被定义在尽可能小的范围内。全局 (Public)
变量可以导致极其复杂的状态机构,并且使一个应用程序的逻辑非常难于理解。全局变量也使代码的重用和维护更加困难。
Visual Basic 中的变量可以有下列范围 |
范围 |
声明位置 |
可见位置 |
过程级 |
过程,子过程或函数过程中的 ‘Private’ |
在声明它的过程中 |
模块级 |
窗体或代码模块(.frm、.bas )的声明部分中的 ‘Private’ |
窗体或代码模块中的每一个过程 |
全局 |
代码模块(.bas)的声明部分中的 ‘Public’ |
应用程序中的每一处 |
在 Visual Basic
的应用程序中,只有当没有其它方便途径在窗体之间共享数据时才使用全局变量。当必须使用全局变量时,在一个单一模块中声明它们,并按功能分组。给这个模块取一个有意义的名称,以指明它的作用,如
Public.bas。
较好的编码习惯是尽可能写模块化的代码。例如,如果应用程序显示一个对话框,就把要完成这一对话任务所需要的所有控件和代码放在单一的窗体中。这有助于将应用程序的代码组织在有用的组件中,并减小它运行时的开销。
除了全局变量(应该是不被传递的),过程和函数应该仅对传递给它们的对象操作。在过程中使用的全局变量应该在过程起始处的声明部分中标识出来。此外,应该用
ByVal 将参数传递给 Sub 过程及 function 过程,除非明显地需要改变已传递的参数值。
随着工程大小的增长,划分变量范围的工作也迅速增加。在类型前缀的前面放置单字母范围前缀标明了这种增长,但变量名的长度并没有增加很多。
变量范围前缀 |
范围 |
前缀 |
例子 |
全局 |
g |
gstrUserName |
模块级 |
m |
mblnCalcInProgress |
本地到过程 |
无 |
dblVelocity |
如果一个变量在标准模块或窗体模块中被声明为 Public,那么该变量具有全局范围。如果一个变量在标准模块或窗体模块中被分别声明为
Private,那么该变量有模块级范围。
注意: 一致性是卓有成效地使用这种技术的关键;Visual Basic 中的语法检查器不会捕捉以 "p." 开头的模块级变量。
常量
常量名的主体是大小写混合的,每个单词的首字母大写。尽管标准 Visual Basic 常量不包含数据类型和范围信息,但是象 i、s、g 和 m
这样的前缀对于理解一个常量的值和范围还是很有用的。对于常量名,应遵循与变量相同的规则。例如:
mintUserListMax ' 对用户列表的最大限制
'( 整数值,本地到模块)
gstrNewLine ' 新行字符
'( 字符串,应用程序全局使用)
变量
声明所有的变量将会节省编程时间,因为键入操作引起的错误减少了(例如,究竟是 aUserNameTmp,还是 sUserNameTmp,还是
sUserNameTemp)。在“选项”对话框的“编辑器”标签中,复选“要求变量声明”选项。Option Explicit 语句要求在 Visual Basic
程序中声明所有的变量。
应该给变量加前缀来指明它们的数据类型。而且前缀可以被扩展,用来指明变量范围,特别是对大型程序。
用下列前缀来指明一个变量的数据类型。
变量数据类型 |
数据类型 |
前缀 |
例子 |
String (字符串类型) |
str |
strFName |
Integer (短整数类型) |
int |
intQuantity |
Long (长整数类型) |
lng |
lngDistance |
Single (单精度浮点数类型) |
sng |
sngAverage |
Double (双精度浮点数类型) |
dbl |
dblTolerance |
Boolean (布尔类型) |
bln |
blnFound |
Byte (字节类型) |
byt |
bytRasterData |
Date (日期类型) |
dte |
dteNow |
Currency (货币计算与定点计算类型) |
cur |
curRevenue |
Object (对象类型) |
obj |
objCurrent |
Variant (变体类型) |
vnt |
vntCheckSum |
描述变量和过程名
变量或过程名的主体应该使用大小写混合形式,并且应该足够长以描述它的作用。而且,函数名应该以一个动词起首,如 InitNameArray 或
CloseDialog。
对于频繁使用的或长的项,推荐使用标准缩略语以使名称的长度合理化。一般来说,超过 32 个字符的变量名在 VGA 显示器上读起来就困难了。
当使用缩略语时,要确保它们在整个应用程序中的一致性。在一个工程中,如果一会儿使用 Cnt, 一会儿使用 Count,将导致不必要的混淆。
用户定义的类型
在一项有许多用户定义类型的大工程中,常常有必要给每种类型一个它自己的三个字符的前缀。如果这些前缀是以 "u"
开始的,那么当用一个用户定义类型来工作时,快速识别这些类型是很容易的。例如,ucli 可以被用来作为一个用户定义的客户类型变量的前缀。
[返回索引]
4、在简单的选择条件情况下,使用IIf()函数
罗索的代码:
If nNum = 0 Then
sName = "sancy"
Else
sName = "Xu"
End If
简单的代码:
sName=IIf(nNum=0,"sancy","Xu")
5、尽量使用Debug.Print进行调试
在很多初学者的调试中,用MsgBox来跟踪变量值.其实用Debug.Print不仅可以达到同样的功效,而且在程序最后编译过程中,会被忽略.而MsgBox必须手动注释或删除.
通常:
MsgBox nName
应该:
Debug.Print nName
6、在重复对某一对象的属性进行修改时,尽量使用With....End With
通常:
Form1.Height = 5000
Form1.Width = 6000
Form1.Caption = "This is MyLabel"
应该:
With Form1
.Height = 5000
.Width = 6000
.Caption = "This is MyLabel"
End With
这种结构程序执行效率比较高,特别在循环语句里。
7、MsgBox中尽量使用消息图标,这样程序比较有规范
一般来说
vbInformation 用来提示确认或成功操作的消息
vbExclamation 用来提示警告的消息
vbCritical 用来提示危机情况的消息
vbQuestion 用来提示询问的消息
[返回索引]
8、在可能的情况下使用枚举
枚举的格式为
[Public | Private] Enum name
membername [= constantexpression]
membername [= constantexpression]
....
End Enum
Enum 语句包含下面部分:
部分 |
描述 |
Public |
可选的。表示该 Enum 类型在整个工程中都是可见的。Enum
类型的缺省情况是 Public。 |
Private |
可选的。表示该 Enum 类型只在所声明的模块中是可见的。 |
name |
必需的。该 Enum 类型的名称。name
必须是一个合法的 Visual Basic 标识符,在定义该 Enum 类型的变量或参数时用该名称来指定类型。 |
membername |
必需的。用于指定该 Enum 类型的组成元素名称的合法 Visual
Basic 标识符。 |
constantexpression |
可选的。元素的值(为 Long 类型)。可以是别的 Enum
类型。如果没有指定 constantexpression,则所赋给的值或者是 0(如果该元素是第一个 membername),或者比其直接前驱的值大
1。 |
说明
所谓枚举变量,就是指用 Enum 类型定义的变量。变量和参数都可以定义为 Enum
类型。Enum 类型中的元素被初始化为 Enum 语句中指定的常数值。所赋给的值可以包括正数和负数,且在运行时不能改变。例如:
Enum SecurityLevel IllegalEntry = -1 SecurityLevel1 = 0 SecurityLevel2
= 1 End Enum
Enum 语句只能在模块级别中出现。定义 Enum
类型后,就可以用它来定义变量,参数或返回该类型的过程。不能用模块名来限定 Enum 类型。类模块中的 Public Enum
类型并不是该类的成员;只不过它们也被写入到类型库中。在标准模块中定义的 Enum 类型则不写到类型库中。具有相同名字的 Public
Enum 类型不能既在标准模块中定义,又在类模块中定义,因为它们共享相同的命名空间。若不同的类型库中有两个 Enum
类型的名字相同,但成员不同,则对这种类型的变量的引用,将取决于哪一个类型库具有更高的引用优先级。
不能在 With 块中使用 Enum 类型作为目标。
Enum 语句示例
下面的示例演示用 Enum
语句定义一个命名常数的集合。在本例中是一些可以选择的颜色常数用于设计数据库的数据输入窗体。
Public Enum InterfaceColors
icMistyRose = &HE1E4FF&
icSlateGray = &H908070&
icDodgerBlue = &HFF901E&
icDeepSkyBlue = &HFFBF00&
icSpringGreen = &H7FFF00&
icForestGreen = &H228B22&
icGoldenrod = &H20A5DA&
icFirebrick = &H2222B2&
End Enum
好处是加快编程速度
[返回索引] |