确实,我装的是VB英文版可补全单词的快捷键偏偏是CTRL+空格,想了很多办法最后放弃了,如有知道快捷键设置方法的还请不吝赐教!

解决方案 »

  1.   

    '想不移动当前记录访问第N条记录的某个字段值
    '其实还是移动记录了!
    '用ado方法实现
    '需引用ado2.1
    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim strbook
    cn.Open "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=d:\数据库\tiku.mdb"
    rs.CursorLocation = adUseClient
    rs.Open "select * from 命题信息", cn, 3, 1
    strbook = rs.Book '把当前书签付给指定变量
    rs.Move 3, adBookFirst '移动到指定记录
    Debug.Print rs.Fields("某字段")
    rs.Book = strbook '返回当前记录
    Debug.Print rs.Fields(1)
    rs.Close
    cn.Close
    Set cn = Nothing
      

  2.   

    正确的除错 (Debug) 方式当程式执行起来怪怪的,很多人在除错 (Debug) 时,都喜欢在程式中使用中断点 (Break) 加上 MsgBox 来看执行结果,但有些时候,这样子的作法会造成某些事件 (Event) 无法触发,甚至改变事件原来触发的顺序!比较正确的作法是在程式中使用 Debug.Print "事件名称/要显示的讯息" ,而不要用中断点 (Break)。
      

  3.   

    不方便的 Msdn -- VB6.0 的 Help很多 VB 程序设计师抱怨为了存取 VB6.0 的 Help,必须一直将 Msdn 光碟放在光碟机中,否则就必须安装 680MB 的 Help 到硬盘中!其实还有一个比较人性化的方法,就是在安装 Msdn 时,选择【自订安装】,然后只要选择 Visual Basic 文件 (13792K) 即可。如此您便可以直接由硬盘存取 VB 的相关主题,若您想看其他非 VB 主题,再由光碟存取。
      

  4.   

    如何快速设定 Form 上所有控制项的 TabIndex 顺序由于在设计 Form 上的控制项时,不一定会依照输入的顺序,在完成设计之后,我们通常会重设各控制项的 TabIndex 顺序,当 Form 上的控制项比较多时,设定起来相当麻烦,常常还会设错。有一个很简单又不容易出错的方法,是从画面上的右下角往左上角 (方向是先向左再往上),逐一的将控制项的 TabIndex 属性设成 0。
    1:右手用滑鼠点一下右下角的控制项,左手按 F4,将 TabIndex 设成 0。
    2:右手往左用滑鼠点一下倒数第二个控制项,左手按 F4,左手按 0。
    3:右手往左用滑鼠点一下倒数第三个控制项,左手按 F4,左手按 0。
    4:重复以上动作直到左上角第一个控制项为止。好了,您已经设定好整个 Form 上所有控制项的 TabIndex 顺序了!其原理就是当您设定一个控制项的 TabIndex 为 0 时,原来 TabIndex 为 0 的控制项,TabIndex 就变成了 1、而 1 的变成 2...依序 +1 改变。
      

  5.   


    VB编程的七个优良习惯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
      

  6.   

    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 
      

  7.   

    推荐使用的数据访问对象 (DAO) 的前缀 用下列前缀来指示数据访问对象 数据库对象               前缀               例子 
    Container                con                conReports 
    Database                 db                 dbAccounts 
    DBEngine                 dbe                dbeJet 
    Document                 doc                docSalesReport 
    Field                    fld                fldAddress 
    Group                    grp                grpFinance 
    Index                    idx                idxAge 
    Parameter                prm                prmJobCode 
    QueryDef                 qry                qrySalesByRegion 
    Recordset                rec                recForecast 
    Relation                 rel                relEmployeeDept 
    TableDef                 tbd                tbdCustomers 
    User                     usr                usrNew 
    Workspace                wsp                wspMine 
      

  8.   

    应用程序频繁使用许多菜单控件,对于这些控件具备一组唯一的命名约定很实用。除了最前面 "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 可以被用来作为一个用户定义的客户类型变量的前缀。
      

  9.   

    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好处是加快编程速度
      

  10.   

    VisualBasic 软件设计中的几个问题
    作者:顾岱鸿 
    在 软 件 开 发 过 程 中, 有 一 些 看 似 很 简 单 的 问 题, 却 很 容 易 被 一 般 的 开 发 人 员 所 忽 略, 这 些“Bugs” 的 存 在, 影 响 我 们 软 件 走 向 商 品 化。 下 面 所 列 出 的 是 笔 者 在 使 用Visual Basic 开 发 软 件 时, 碰 到 了 几 个 这 类 问 题, 这 里 给 出 其 解 决 方 法, 供 大 家 探 讨 交 流。 一  防 止 应 用 程 序 加 载 两 份
    当 我 们 的 应 用 程 序 在Windows 下 运 行 后, 在 操 作 过 程 中, 有 时 会 把 它 最 小 化 隐 藏 起 来, 或 者 切 换 到 程 序 管 理 器 下 进 行 其 它 操 作, 而 后 又 想 进 入 原 来 的 应 用 程 序, 这 时 如 果 忘 记 了 刚 才 启 动 的 应 用 程 序, 又 去 重 新 启 动 该 应 用 程 序, 在 内 存 中 就 同 时 加 载 了 两 份 同 样 的 应 用 程 序, 这 样 不 但 占 用 了 内 存 空 间, 而 且 容 易 引 起 误 操 作, 造 成 数 据 的 损 失。 为 了 避 免 这 种 情 况 发 生, 就 需 要 程 序 能 够 给 出 提 示“ 已 经 加 载 过” 或 直 接 进 入 第 一 次 被 加 载 的 应 用 程 序 中。 对 于 这 个 问 题, 看 起 来 比 较 难 办, 其 实 我 们 只 要 对Windows 管 理 应 用 程 序 的 机 理 有 所 了 解, 就 很 容 易 解 决。 
    我 们 知 道, 对 于 每 一 个 运 行 着 的 应 用 程 序,Windows 都 分 配 给 一 个 唯 一 的“ 句 柄(Handle)” 和 一 个 模 块 代 码(Module)。 当 同 时 运 行 两 份 相 同 的 程 序 时, 两 份 程 序 的 模 块 代 码 都 相 同, 因 此, 只 要 找 到 内 存 中 两 个 相 同 的 模 块 代 码, 我 们 就 知 道 有 两 份 程 序 在 运 行, 从 而 可 以 控 制 它。Windows 提 供 的 两 个 接 口 函 数GetModuleHandle 和GetModuleUsage 可 以 完 成 此 任 务。 具 体 方 法 如 下, 首 先 在 一 个 新 的 模 块 文 件( *.Bas) 中 声 明API 函 数。 Declare Function GetModuleHandle Lib"Kernel"(ByVallpProgName$) Declare Function GetModuleUsage Lib"Kernel"(ByVal hModule) 同 时 建 立 一 个 子 过 程, 名 字 为main, 子 过 程 中 的 代 码 如 下: Sub Main()
    On Error GoTo errMain‘错误处理
    Dim hModule% ‘模块句柄
    Dim AppCount% ‘应用程序的个数
    appPath$=app.Path + "\" ‘应用程序的启动路径
    hModule %=GetModuleHandle(appPath$+app.EXEName+".exe")‘获得该程序的句柄。
    AppCount %=GetModuleUsage(hModule)‘获得模块代码,即运行的应用程序数目。
    lf AppCount%>1 Then‘同一应用程序数大于1
    MsgBox"程序已经加载",64
    End ‘结束当前启动的应用程序
    Elsc
    mainForm.Show ‘mainForm是程序的主窗体
    End lf
    Exit Sub
    errMain:
    lf Err<>0 Then
    MsgBox"启动程序时发生错误",64
    Exit Sub
    End lf
    End Sub
    该 过 程 完 成 后, 在VB3.0 主 菜 单 [options ] 下, 选 择 [Project ] 菜 单 项, 设 定 [Start up From ] 项 为Sub main, 即 程 序 运 行 时, 最 先 从Sub main 子 程 序 开 始。 这 样 保 证 上 面 的 代 码 一 定 被 执 行。Sub main 是VB3.0 约 定 的 子 过 程 名, 不 能 用 其 它 的 名 字 来 代 替。 
    重 新 生 成EXE 文 件, 在 程 序 管 理 器 下, 启 动 该 应 用 程 序, 然 后 把 产 生 的 窗 体 最 小 化, 接 着 从 程 序 管 理 器 下 再 运 行 它, 用 户 将 看 到 一 个 消 息 框, 告 诉 用 户, 应 用 程 序 已 被 加 载 过 了, 第 二 份 程 序 终 止 执 行。 上 面 的 程 序 仅 用 来 防 止 加 载 二 份 程 序, 但 还 没 有 做 到 当 不 能 启 动 第 二 份 时, 自 动 进 入 到 第 一 份 程 序。 要 做 到 这 一 点, 所 涉 及 的 程 序 较 复 杂, 这 里 就 不 详 细 介 绍 了。 二判 断Windows 的 安 装 路 径
    在 我 们 开 发 的 软 件 中, 有 时 会 直 接 调 用Windows 提 供 的 小 应 用 程 序, 如 计 算 器、 计 事 本 等; 或 需 要 把 一 些 特 殊 的 文 件 放 到Windows 或SYSTEM 的 路 径 下。 通 常,Windows 都 安 装 在C: \WINDOWS 目 录 下, 但 用 户 可 以 任 意 修 改Windows 的 主 目 录 名, 因 此, 在 我 们 的 软 件 中, 就 需 要 判 断Windows 的 安 装 路 径。 对 于 这 个 问 题,Windows 提 供 了 两 个API 函 数:GetWindowsDirectory 和GetSystemDirectory, 可 以 返 回Windows 目 录 和SYSTEM 目 录 的 名 称。 
    为 此, 编 制 一 个 通 用 函 数 GetWinDir, 它 返 回Windows 的 安 装 目 录 名 称。 类 似, 可 以 写 出GetSysDir, 略。 在*.BAS 模 块 文 件 中 声 明API 函 数 Declare Function GetWindowsDirectory Lib "Kernel" (ByVal IpBuffer As String,ByV al nSize As Integer) as IntegerFunction GetWinDir () As String Dim Windir$ Windir$=Space$(144) ‘144 是WINDOWS 目 录 名 称 理 论 上 的 最 大 长 度。 lf GetWindowsDirectory(Windir$,144)=0Then
    MsgBox" 不 能 确 定WINDOWS 的 安 装 路 径",16
    GetWinDir=""
    Else
    Windir$=ALLTrim$(Windir$)
    if Right$(Windir$,1)<>“\” then Windir$=Windir$+“\” 
    ‘加上反斜杠
    GetWinDir=Windir$
    End lf
    End Function
    其 中ALLTRIM 是 用 来 去 掉 字 符 串 中 空 字 符 的 函 数
    FunctionALLTrim(FatStr$)As String
    'this Function delete Space char in string of FatStr$
    Dim SlimStr$,I% 
    SlimStr$=FatStr$
    I%=lnStr(SlimStr$,Chr$(0)) ‘ 空 格 的 位 置
    IfI% Then SlimStr$=Left$(SlimStr$,I%-1)
    SlimStr$=Ltrim$(Rtrim$)(SlimStr$))
    AIITrim$=SlimStr$
    End Function
    三  在 关 掉 窗 体 前 提 示 保 存 数 据
    一 般 说 来, 通 常 用5 种 方 式 可 以 关 闭 一 个 应 用 程 序:
    1. 用 户 选 择 了 当 前 窗 体Control Box 中 的 [ 关 闭 ] 命 令
    2. 激 发 程 序 中 的 结 束 命 令 代 码( 如End,Unload)
    3. 退 出Windows
    4. 在Windows 的 任 务 列 表 中 关 闭 应 用 程 序。
    5. 多 文 档 操 作 时, 关 闭 主MDI 窗 体, 引 起 子MDI 窗 体 关 闭。
    在 关 闭 一 个 应 用 程 序 前, 我 们 要 给 用 户 一 个 机 会, 提 示“ 是 否 保 存 数 据”, 或 者 取 消“ 关 闭” 的 操 作。 在VB 中, 窗 体 的 关 闭 引 发 的 是Form _Unload 事 件, 我 们 可 以 对 该 事 件 进 行 编 程, 来 控 制“ 关 闭” 操 作。 假 设 现 已 有 一 个 过 程FileSave 用 来 保 存 文 件, 则 可 以 这 样 来 编 写 程 序。 
    Sub Form_Unload(CancelAs lnteger)
    select cast Msagbox (“ 是 否 保 存 数 据?”,3+32)
    ‘Yes,No,Cnacel 三 种 选 择
    case 6 ‘YES
    FileSave ‘ 保 存 数 据
    case2‘cancel
    Cancel=TRUE ‘ 取 消 关 闭 操 作
    case else ‘NO‘ 不 保 存, 执 行 关 闭 操 作
    End select
    End Sub
    上 面 代 码 中 的Cancel 变 量, 是Form _unload 事 件 本 身 的 固 有 传 出 变 量, 它 给Windows 控 制 过 程 传 递 消 息, 从 而 控 制 程 序 的 走 向。 上 面 三 个 例 子, 只 是 软 件 完 善 过 程 中 的 一 些 小 问 题, 要 使 软 件 稳 定 可 靠, 需 要 做 大 量 细 致 认 真 的 工 作。 有 些 问 题, 我 们 可 以 通 过 发 掘VB 本 身 的 潜 力, 深 入 掌 握 一 些 过 程 的 操 作 技 巧 来 解 决; 而 有 些 较 复 杂 的 问 题, 涉 及 到Windows 底 层 方 面 的 操 作, 采 用Windows 的API 函 数, 可 以 很 容 易 实 现。 当 然 这 需 要 对Windows 的 函 数 和 机 理 有 一 定 的 了 解。 随 着Windows 编 程 水 平 的 提 高, 我 们 会 逐 渐 学 会 并 喜 欢 利 用API 函 数 来 辅 助 完 成 程 序 编 码。