机械振动设计计算与VB编程实例
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

5.3 生成的执行文件.exe文件中的帮助系统和纠错系统

对于生成参数化界面应用程序,即被生成的执行文件.exe文件,一般至少必须要具备帮助系统和纠错系统。Visual Basic具有强大的帮助系统。但执行文件里的帮助系统主要要告诉用户该软件的名称、版本号、运行环境;必要时写上公司名或编制者及联系方式等。还应对该程序作简要描述,或介绍本项目任务的输入参数,还应规定可供同类型产品借用计算的输入范围。使用户对该软件的概况有所了解。同样,Visual Basic具有强大的纠错系统。但执行文件里的纠错系统主要对用户超范围进行输入,为了保证不产生错误输出,应由执行文件里的纠错系统及时返回一信息框,告诉输入有错。详见5.3.1节、5.3.2节中所述。

5.3.1 参数化_频率计算的帮助系统

本例具有帮助系统,当打开文件时,如图5.12所示。

图5.12 具有帮助系统的执行文件

当点击时,便打开下拉菜单,见图5.13。

图5.13 帮助系统下拉菜单

当点击下拉菜单时,便打开了“关于本项目计算”的“关于窗体”frmAbout,如图5.14所示。

图5.14 “关于本项目计算”的 “关于窗体”frmAbout

在“关于窗体”frmAbout,模块中对本项目计算程序的名称、版本号、运行环境作了声明;必要时写上公司名或编制者及联系方式等。还应对程序作简要描述,或介绍本项目任务的输入参数,和规定了可供同类型产品借用计算的输入范围。因为:

① 本程序中有用实验数据来修正的因素。这种实验数据对结构相似,尺寸相近的同类型零件计算时可以借用,但只限于一定的尺寸范围,或在一定尺寸范围里作过验证,产生的误差在允许范围内。这一点在编制计算程序时是很重要的,像这类信息必须在帮助系统里加以声明。

② 本程序中有数表、图线的处理。采用这些处理,也就有一定的输入范围的限制。

“关于窗体”frmAbout,可在菜单里选择,再选择,如图5.15所示。

图5.15 由“工程”选“添加窗体”

点击“添加窗体”便出现对话框,如图5.16所示。

图5.16 “添加窗体”对话框

点击“关于”对话框,便在程序中添加了“关于窗体”,如图5.17、图5.18所示。

图5.17 在程序中添加了“关于窗体”

图5.18 “关于窗体”

经过编辑便成了图5.14“关于本项目计算”的“关于窗体”。Visual Basic在“关于窗体”设有“确定”、“系统信息”两按钮。点击钮,便会出现编程环境的系统信息。如图5.19所示。系统信息也可帮助用户对其编程环境的系统有所了解。

图5.19 编程环境的系统信息

在Visual basic中的“关于窗体”是模块,它有相应的模块代码作为支撑。

Option Explicit
' 注册表关键字安全选项...
Const READ_CONTROL = &H20000
Const KEY_QUERY_VALUE = &H1
Const KEY_SET_VALUE = &H2
Const KEY_CREATE_SUB_KEY = &H4
Const KEY_ENUMERATE_SUB_KEYS = &H8
Const KEY_NOTIFY = &H10
Const KEY_CREATE_LINK = &H20
Const KEY_ALL_ACCESS = KEY_QUERY_VALUE + KEY_SET_VALUE + _
                   KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + _
                   KEY_NOTIFY + KEY_CREATE_LINK + READ_CONTROL
' 注册表关键字 ROOT 类型...
Const HKEY_LOCAL_MACHINE = &H80000002
Const ERROR_SUCCESS = 0
Const REG_SZ = 1                         ' 独立的空的终结字符串
Const REG_DWORD = 4                     ' 32位数字
Const gREGKEYSYSINFOLOC = "SOFTWARE\Microsoft\Shared Tools Location"
Const gREGVALSYSINFOLOC = "MSINFO"
Const gREGKEYSYSINFO = "SOFTWARE\Microsoft\Shared Tools\MSINFO"
Const gREGVALSYSINFO = "PATH"
Private Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, ByRef phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, ByRef lpType As Long, ByVal lpData As String, ByRef lpcbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long
Private Sub cmdSysInfo_Click()
  Call StartSysInfo
End Sub
Private Sub cmdOK_Click()
  Unload Me
End Sub
Private Sub Form_Load()
    Me.Caption = "关于本项目计算"
End Sub
Public Sub StartSysInfo()
    On Error GoTo SysInfoErr
     Dim rc As Long
    Dim SysInfoPath As String
        ' 试图从注册表中获得系统信息程序的路径及名称...
    If GetKeyValue(HKEY_LOCAL_MACHINE, gREGKEYSYSINFO, gREGVALSYSINFO, SysInfoPath) Then
    ' 试图仅从注册表中获得系统信息程序的路径...
    ElseIf GetKeyValue(HKEY_LOCAL_MACHINE, gREGKEYSYSINFOLOC, gREGVALSYSINFOLOC, SysInfoPath) Then
       ' 已知32位文件版本的有效位置
       If (Dir(SysInfoPath & "\MSINFO32.EXE") <> "") Then
           SysInfoPath = SysInfoPath & "\MSINFO32.EXE"
                   ' 错误 - 文件不能被找到...
       Else
           GoTo SysInfoErr
       End If
    ' 错误 - 注册表相应条目不能被找到...
    Else
       GoTo SysInfoErr
    End If
       Call Shell(SysInfoPath, vbNormalFocus)
       Exit Sub
SysInfoErr:
    MsgBox "此时系统信息不可用", vbOKOnly
End Sub
Public Function GetKeyValue(KeyRoot As Long, KeyName As String, SubKeyRef As String, ByRef KeyVal As String) As Boolean
    Dim i As Long                                            ' 循环计数器
    Dim rc As Long                                           ' 返回代码
    Dim hKey As Long                                        ' 打开的注册表关键字句柄
    Dim hDepth As Long                                      '
    Dim KeyValType As Long                                  ' 注册表关键字数据类型
    Dim tmpVal As String                                   ' 注册表关键字值的临时存储器
    Dim KeyValSize As Long                                 ' 注册表关键自变量的尺寸
    '------------------------------------------------------------
    ' 打开 {HKEY_LOCAL_MACHINE...} 下的 RegKey
    '------------------------------------------------------------
    rc = RegOpenKeyEx(KeyRoot, KeyName, 0, KEY_ALL_ACCESS, hKey)  ' 打开注册表关键字
         If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError           ' 处理错误...
         tmpVal = String$(1024, 0)                               ' 分配变量空间
    KeyValSize = 1024                                           ' 标记变量尺寸
    '------------------------------------------------------------
    ' 检索注册表关键字的值...
    '------------------------------------------------------------
    rc = RegQueryValueEx(hKey, SubKeyRef, 0, _
                         KeyValType, tmpVal, KeyValSize)   ' 获得/创建关键字值
    If (rc <> ERROR_SUCCESS) Then GoTo GetKeyError          ' 处理错误
    If (Asc(Mid(tmpVal, KeyValSize, 1)) = 0) Then      ' Win95 外接程序空终结字符串...
        tmpVal = Left(tmpVal, KeyValSize - 1)          ' Null 被找到,从字符串中分离出来
    Else                                                     ' WinNT 没有空终结字符串...
        tmpVal = Left(tmpVal, KeyValSize)               ' Null 没有被找到, 分离字符串
    End If
    '------------------------------------------------------------
    ' 决定转换的关键字的值类型...
    '------------------------------------------------------------
    Select Case KeyValType                                 ' 搜索数据类型...
    Case REG_SZ                                              ' 字符串注册关键字数据类型
        KeyVal = tmpVal                                    ' 复制字符串的值
    Case REG_DWORD                                         ' 四字节的注册表关键字数据类型
        For i = Len(tmpVal) To 1 Step -1               ' 将每位进行转换
            KeyVal = KeyVal + Hex(Asc(Mid(tmpVal, i, 1))) ' 生成值字符。 By Char。
        Next
        KeyVal = Format$("&h" + KeyVal)                     ' 转换四字节的字符为字符串
    End Select
    GetKeyValue = True                                     ' 返回成功
    rc = RegCloseKey(hKey)                                 ' 关闭注册表关键字
    Exit Function                                           ' 退出
GetKeyError:      ' 错误发生后将其清除...
    KeyVal = ""                                              ' 设置返回值到空字符串
    GetKeyValue = False                                    ' 返回失败
    rc = RegCloseKey(hKey)                                 ' 关闭注册表关键字
End Function

以上在“关于窗体”是模块之中包含的代码,一般自动绑定,一般无需对其再作编辑。

5.3.2 参数化_频率计算的纠错系统

从图5.14“关于本项目计算”的“关于窗体”中,可看到有“同类型相似问题借用计算输入范围:

轴长 >1000,<6000;轴径>10,<30;

圆盘半径<30.>80;圆盘厚度<5,>15”,如果输入超过声明的范围,纠错系统通过程序中在前面的工程代码中就已编入如下代码:

'如若借用本程序计算相似问题,必须给出限定范围便于纠错
If l01 < 1000 Or l01 > 6000 Then
 MsgBox "输入的轴长l01 < 1000 Or l01 > 6000 超越尺寸范围,即超过程序借用范围。", 1
 End If
 If d01 < 10 Or d01 > 30 Then
 MsgBox "输入的轴径d01 <10 Or d01 > 30, 超越尺寸范围,即超过程序借用范围。", 1
 End If
 If r0 < 30 Or r0 > 80 Then
 MsgBox "输入的圆盘半径r0< 30 Or r0> 80 超越尺寸范围,即超过程序借用范围。", 1
 End If
 If b < 5 Or b > 15 Then
 MsgBox "输入的圆盘厚度b< 5 Or b> 15 超越尺寸范围,即超过程序借用范围。", 1
End If

即会返回一信息框来对这次输入进行纠错。如图5.20所示。

图5.20 由于输入轴长101=7000>6000便返回了纠错信息框

在以往产品设计计算程序里,输入范围主要靠产品设计的专业知识来保证,或在修改原输入,也看得到以往的输入参数。而在“参数化界面”应用程序里只能看到一个个空空的文本框。所以在“关于窗体”的程序描述里,应提示输入的范例和输入范围。如果还设置有超过输入范围时能返回纠错信息框才符合应用程序的基本要求。