rt

解决方案 »

  1.   

    个人体会:1 变量的定义 如: intA  strSQL  glngLenth 等等2 必要的缩进3 窗体过程函数、模块、类模块的功能划分,如全局变量统一放在
      一个叫MDLDefine的模块中等等(这些我也正在努力学习)
      

  2.   

    去买本《Visual Basic 编程规范》看看
      

  3.   

    公司软件部VB组代码撰写暂行约定 
     
    一、变量和对象     程序中的变量遵循匈牙利表示法,即“前缀+变量含义”,变量的含义为一个或多个英文单词,每个单词的第一个字母大写,不要用汉语拼音代替。变量前缀为三个小写字母示意其类型,所需添加的前缀遵循微软在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 
          除此之外,还要对于一些不同的级别的变量加额外的前缀,举例如下: 级别 
    前缀 
    示例 全局变量 

    gstrUserName 模块级变量 

    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、各个控件的字体建议为宋体五号字   
      

  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 
      
     
      

  5.   

    VB编程的七个优良习惯
    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 过程,除非明显地需要改变已传递的参数值。随着工程大小的增长,划分变量范围的工作也迅速增加。在类型前缀的前面放置单字母范围前缀标明了这种增长,但变量名的长度并没有增加很多。
      

  6.   


    变量范围前缀范围 前缀 例子 
    全局 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好处是加快编程速度
      

  7.   

    以上这些我觉得都是比较低层次的,只是规范一些代码的规则:变量命名规则、注册的规则已经一些简单的技巧。你写了三年,这些你肯定已经懂了。我觉得你的下一步是提供一些设计方面的只是,也就是怎么去组织程序的结构。看一些设计模式方面的书,同时要结合到自己的程序中去思考。等你过了设计这一关,我个人觉得应该向系统的框架结构和solution这个方向去思考。
      

  8.   

    关于变量使用方面,建议如下: 
    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 
      

  9.   

    赋值
    我一直用
    Let a=10
      

  10.   

    规范无非几个方面
    1命名规则,前缀后缀等等,这些上面讲得很详细了。
    2缩进
    3字母大小写。首字母大写,所写词全部大写,关键词全部大写。(例如SQL里的SELECT FROM WHERE 等等)设计模式就不是几句话的问题了。这个需要积累。
      

  11.   

    请教一下:VB学习设计模式的话有什么好的参考资料我只看到有一本 "VB & VB.net 设计模式" 的参考书
      

  12.   

    copy一点给你
    '=====================================================================================
    '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
      

  13.   

    同意 superxiumu(我想找个老婆):
    《VB编程标准》绝对是本好书!