rt
解决方案 »
- 控件数组的问题
- 发布一个自己写的解释器。
- 新手上路:关于MSFlexGrid控件显示数据的问题?急!急!急!
- 我的程序打包后安装时出现“不能注册msado25.tlb"错误,请问是怎么回事啊?
- 为什么会有弱类型语言(如:VB)?
- 如何得知一Object的类型啊?
- API中怎样声明所需要的常数????急!
- inet控件:运行时提示“仍在执行上一请求”???!!!!!!
- 怎样设置richtextbox行间距至单倍行间距以内,甚至将其设置为0???
- connection1.CursorLocation是什么????
- 请问谁那里有VB组件开发的电子教程?(急!)
- 请教DATAGRID 刷新显示问题,在线等
一个叫MDLDefine的模块中等等(这些我也正在努力学习)
一、变量和对象 程序中的变量遵循匈牙利表示法,即“前缀+变量含义”,变量的含义为一个或多个英文单词,每个单词的第一个字母大写,不要用汉语拼音代替。变量前缀为三个小写字母示意其类型,所需添加的前缀遵循微软在MSDN中的建议。列表如下: 基本数据类型 变量类型
前缀
示例 Boolean
bln
blnFound Byte
byt
bytRasterData Collection object
col
colWidgets Currency
cur
curRevenue Date (Time)
dtm
dtmStart Double
dbl
dblTolerance Error
err
errOrderNum Integer
int
intQuantity Long
lng
lngDistance Object
obj
objCurrent Single
sng
sngAverage String
str
strFName User-defined type
udt
udtEmployee Variant
vnt
vntCheckSum
控件或窗体、模块对象 控件类型
前缀
示例 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
数据库对象 数据库对象
前缀
示例 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
除此之外,还要对于一些不同的级别的变量加额外的前缀,举例如下: 级别
前缀
示例 全局变量
g
gstrUserName 模块级变量
m
mblnCalcInProgress 过程级变量
None
dblVelocity
对于用户使用type关键字定义的数据类型,在三个字母的前缀前再加u。例如:一个用户定义的叫Client类型的变量,其前缀为ucli。 关于变量使用方面,建议如下: 1、变量要先声明再使用(在窗体代码的第一行加上Option Explicit,来禁止未声明变量的调用,或者在菜单Tools->Options->Editor中选中Require Variable Declaration项。) 2、尽量使用Long型的变量来代替Integer类型,这样做可以减少一些数据溢出的错误,而且,在Win32平台上,CPU处理32位的数据比16位的数据速度更快。 3、尽量少用Variant变量,尽可能地给出每一个变量明确的类型 4、尽量不在API声明中使用As Any,如果遇到其默认的参数为As Any的情况,则针对每一个所需的参数类型声明该API函数,例如ReadFile函数默认的声明为: Public Declare Function ReadFile Lib "kernel32" Alias "ReadFile" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long 小组成员须将其改为: Public Declare Function ReadFileByt Lib "kernel32" Alias "ReadFile" (ByVal hFile As Long, lpBuffer As Byte, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long Public Declare Function ReadFileInt Lib "kernel32" Alias "ReadFile" (ByVal hFile As Long, lpBuffer As Integer, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long Public Declare Function ReadFileLng Lib "kernel32" Alias "ReadFile" (ByVal hFile As Long, lpBuffer As Long, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long 5、不要将类型转换的工作交给VB自动去做,而使用以下类型转换函数 CBool(expression) CByte(expression) CCur(expression) CDate(expression) CDbl(expression) CDec(expression) CInt(expression) CLng(expression) CSng(expression) CStr(expression) CVar(expression) 二、窗体布局 窗体内各个控件的布局,建议如下: 1、所有与窗体上、下、左、右四条边界相邻的控件与窗体的边缘相距120缇 2、各个控件之间的间距为:相关控件60缇,非相关控件120缇 3、按钮控件大小建议为高300缇,长1200缇,这也是操作系统默认按钮的大小 4、各个控件的字体建议为宋体五号字
三、代码 1、程序的启动对象 程序一率从Main()函数开始执行(选择菜单View->Project Explorer,在工程窗口内右键点击当前项目,选择菜单“… Properties”->General,在Startup Object下拉框中选择sub main) 2、代码缩进与间距 每个单位的代码缩进为一个TAB,非相关代码留一行空白的间隔,例如: Private Function GetMax(Byref lngArray() As Long) As Long GetMax=0 Dim lngMax As Long Dim lngCount as long For lngCount =0 to Ubound(lngArray) If lngArray (lngCount)>lngMax Then lngMax=lngArray(lngCount) End If Next End Function 3、注译 程序的注译越详尽,越仔细越好。以下提及的,必须加注译。 程序中声明的每一个变量,能加上注译最好,至少用来运算或者保存关键数据的变量必须加上注译。 对于每一段逻辑上实现某个基本功能的几句代码,最好在其上一行加上简单注译。 对于每一个自定义的函数,不管大小都必须加上注译,而且注译的格式如下: '****************************************************** ' '函数所实现的功能 '函数的参数1的含义:XXXXX '函数的参数2的含义:XXXXX '…… '函数返回值所代表的错误信息:XXXXX(函数尽可能声明为Function,不要声明为Sub, '函数的返回值为0表示执行成功,为其它值表示执行失败) ' '****************************************************** Public(Private) Function ForExample(……………………) As Long '………………………………………… End Function 4、错误处理(未定) 在Main()函数或主窗体Load过程中添加如下代码: '****************************************************** ' '打开错误日志文件,在Form_Unload()中关闭 ' '****************************************************** Dim strExePath As String If Right(App.Path, 1) = "\" Then strExePath = App.Path Else strExePath = App.Path & "\" End If intErrLogFileHandle = FreeFile() Open strExePath + "Err.log" For Append Shared As intErrLogFileHandle 在主窗体退出函数中添加如下代码:
'******************************************************
'关闭错误日志文件
'******************************************************
Close #intErrLogFileHandle 在某个Module中添加: '******************************************************
'写入错误日志
'****************************************************** Public Sub WriteErrLogFile(ByVal strSub As String, ByVal strErr As String)
Print #intErrLogFileHandle, Date, Time, strSub, strErr
End Sub 在每个过程或自定义的函数中,使用如下的系统错误捕获机制: Public Function ForExample(…………) As Long
On Error Goto FuncError
ForExample=True
………………………
………………………
Exit Function FuncError:
ForExample=False
WriteErrLogFile " ForExample ", "错误号:" & Err.Number & ",错误源:" & Err.Source & ",错误描述:" & Err.Description
MsgBox "……… ", vbCritical
'在此作内存资源回收工作
End Function
1、"&"替换"+" 2、变量命名大小写,语句错落有秩,源代码维护方面
3、请养成以下的“对象命名约定”良好习惯 4、在简单的选择条件情况下,使用IIf()函数
5、尽量使用Debug.Print进行调试 6、在重复对某一对象的属性进行修改时,尽量使用With....End With
7、MsgBox中尽量使用消息图标,这样程序比较有规范 8、在可能的情况下使用枚举 1、"&"替换"+"
在很多人的编程语言中,用“+”来连接字符串,这样容易导致歧义。良好的习惯是用“&”来连接字符串. 不正确:
Dim sMessage As String
sMessage = "1" + "2" 正确:
Dim sMessage As String
sMessage = "1" & "2" 注意:"&"的后面有个空格2、变量命名大小写,语句错落有秩,源代码维护方面下面大家比较一下以下两段代码: 读懂难度很大的代码:Dim SNAME As String
Dim NTURN As IntegerIf 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 IntegerIf 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 nName6、在重复对某一对象的属性进行修改时,尽量使用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 EnumEnum 语句包含下面部分:部分 描述
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好处是加快编程速度
1、变量要先声明再使用(在窗体代码的第一行加上Option Explicit,来禁止未声明变量的调用,或者在菜单Tools->Options->Editor中选中Require Variable Declaration项。)
2、尽量使用Long型的变量来代替Integer类型,这样做可以减少一些数据溢出的错误,而且,在Win32平台上,CPU处理32位的数据比16位的数据速度更快。
3、尽量少用Variant变量,尽可能地给出每一个变量明确的类型
4、尽量不在API声明中使用As Any,如果遇到其默认的参数为As Any的情况,则针对每一个所需的参数类型声明该API函数,例如ReadFile函数默认的声明为:
Public Declare Function ReadFile Lib "kernel32" Alias "ReadFile" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long
小组成员须将其改为:
Public Declare Function ReadFileByt Lib "kernel32" Alias "ReadFile" (ByVal hFile As Long, lpBuffer As Byte, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long
Public Declare Function ReadFileInt Lib "kernel32" Alias "ReadFile" (ByVal hFile As Long, lpBuffer As Integer, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long
Public Declare Function ReadFileLng Lib "kernel32" Alias "ReadFile" (ByVal hFile As Long, lpBuffer As Long, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long
5、不要将类型转换的工作交给VB自动去做,而使用以下类型转换函数
CBool(expression)
CByte(expression)
CCur(expression)
CDate(expression)
CDbl(expression)
CDec(expression)
CInt(expression)
CLng(expression)
CSng(expression)
CStr(expression)
CVar(expression)
二、窗体布局
窗体内各个控件的布局,建议如下:
1、所有与窗体上、下、左、右四条边界相邻的控件与窗体的边缘相距120缇
2、各个控件之间的间距为:相关控件60缇,非相关控件120缇
3、按钮控件大小建议为高300缇,长1200缇,这也是操作系统默认按钮的大小
4、各个控件的字体建议为宋体五号字
三、代码
1、程序的启动对象
程序一率从Main()函数开始执行(选择菜单View->Project Explorer,在工程窗口内右键点击当前项目,选择菜单“… Properties”->General,在Startup Object下拉框中选择sub main)
2、代码缩进与间距
每个单位的代码缩进为一个TAB,非相关代码留一行空白的间隔,例如:
Private Function GetMax(Byref lngArray() As Long) As Long
GetMax=0
Dim lngMax As Long
Dim lngCount as long
For lngCount =0 to Ubound(lngArray)
If lngArray (lngCount)>lngMax Then
lngMax=lngArray(lngCount)
End If
Next
End Function
3、注译
程序的注译越详尽,越仔细越好。以下提及的,必须加注译。
程序中声明的每一个变量,能加上注译最好,至少用来运算或者保存关键数据的变量必须加上注译。
对于每一段逻辑上实现某个基本功能的几句代码,最好在其上一行加上简单注译。
对于每一个自定义的函数,不管大小都必须加上注译,而且注译的格式如下:
'******************************************************
'
'函数所实现的功能
'函数的参数1的含义:XXXXX
'函数的参数2的含义:XXXXX
'……
'函数返回值所代表的错误信息:XXXXX(函数尽可能声明为Function,不要声明为Sub,
'函数的返回值为0表示执行成功,为其它值表示执行失败)
'
'******************************************************
Public(Private) Function ForExample(……………………) As Long
'…………………………………………
End Function
4、错误处理(未定)
在Main()函数或主窗体Load过程中添加如下代码:
'******************************************************
'
'打开错误日志文件,在Form_Unload()中关闭
'
'******************************************************
Dim strExePath As String
If Right(App.Path, 1) = "\" Then
strExePath = App.Path
Else
strExePath = App.Path & "\"
End If
intErrLogFileHandle = FreeFile()
Open strExePath + "Err.log" For Append Shared As intErrLogFileHandle
在主窗体退出函数中添加如下代码:
'******************************************************
'
'关闭错误日志文件
'
'******************************************************
Close #intErrLogFileHandle
在某个Module中添加:
'******************************************************
'
'写入错误日志
'
'******************************************************
Public Sub WriteErrLogFile(ByVal strSub As String, ByVal strErr As String)
Print #intErrLogFileHandle, Date, Time, strSub, strErr
End Sub
在每个过程或自定义的函数中,使用如下的系统错误捕获机制:
Public Function ForExample(…………) As Long
On Error Goto FuncError
ForExample=True
………………………
………………………
Exit Function
FuncError:
ForExample=False
WriteErrLogFile " ForExample ", "错误号:" & Err.Number & ",错误源:" & Err.Source & ",错误描述:" & Err.Description
MsgBox "……… ", vbCritical
'在此作内存资源回收工作
End Function
我一直用
Let a=10
1命名规则,前缀后缀等等,这些上面讲得很详细了。
2缩进
3字母大小写。首字母大写,所写词全部大写,关键词全部大写。(例如SQL里的SELECT FROM WHERE 等等)设计模式就不是几句话的问题了。这个需要积累。
'=====================================================================================
'get the disk info
'get vol,sn,filesystem,size
'ver1.0
'time 2003-10-14 19:44 to 2003-10-14 20:16
'=====================================================================================
Public Function GetDiskInfo(ByVal In_Driver As String) As Long
On Error GoTo GetDiskInfoErrDim SectorsPerCluster As Long
Dim BytesPerSector As Long
'Dim NumberOfFreeClustors As Long
Dim TotalNumberOfClustors As Long
strVOL = String(256, 0)
strFileSystem = String(256, 0)
In_Driver = Left(In_Driver, 2) & "\"
If GetVolInformation(In_Driver, _
strVOL, _
255, _
lngSN, _
ByVal 0&, _
ByVal 0&, _
strFileSystem, _
255) = 0 Then GoTo GetDiskInfoErr
Else
strVOL = VBA.Replace(strVOL, VBA.Chr(0), "")
lngSN = lngSN
strFileSystem = VBA.Replace(strFileSystem, VBA.Chr(0), "")
GetDiskFreeSpace In_Driver, _
SectorsPerCluster, _
BytesPerSector, _
ByVal 0&, _
TotalNumberOfClustors lngSize = TotalNumberOfClustors * SectorsPerCluster * BytesPerSector / 1024
End If
GetDiskInfoOK:
GetDiskInfo = 1
GoTo GetDiskInfoExit
GetDiskInfoErr:
GetDiskInfo = 0
GoTo GetDiskInfoExit
GetDiskInfoExit:
Let SectorsPerCluster = 0
Let BytesPerSector = 0
Let TotalNumberOfClustors = 0
Exit Function
End Function
《VB编程标准》绝对是本好书!