39、可视化编程应用:Metric与ScripDem的技术解析

可视化编程应用:Metric与ScripDem的技术解析

1. Metric应用概述

Metric应用虽简单,却展现了将Visual Basic应用与帮助文件结合的强大技术,实现了两者优势互补。其中,METRIC.HLP文件能显示易读文本,具备弹出窗口和超文本热点;METRIC.EXE则可播放声音和视频文件、进行公制转换以及展示测验,以检验用户理解程度。

1.1 运行机制

运行METRIC.EXE时,程序会先检查是否有命令行参数。若通过双击启动,无参数则立即运行METRIC.HLP文件。帮助文件主主题窗口设有多个按钮,点击后会跳转回METRIC.EXE程序,并传递不同命令行参数。METRIC.EXE依据这些参数执行相应操作后终止,用户可继续与帮助文件交互。

1.2 功能展示

  • 多媒体播放 :点击帮助文件主主题窗口的“Video Clip”按钮,可播放示例视频片段;点击“Sound”按钮,能播放声音文件。
  • 测验展示 :点击“Quiz”按钮,会弹出包含测验问题的对话框。
  • 单位转换 :可进行米与英尺、厘米与英寸的转换。

1.3 运行注意事项

  • 运行时,METRIC.EXE和METRIC.HLP需位于同一目录。
  • 若要查看视频片段CLOUDS.AVI,需将该文件从配套光盘复制到Metric应用所在目录。

2. 构建Metric应用

2.1 主要文件

Metric应用的Visual Basic部分包含三个文件:
|文件名称|功能描述|
| ---- | ---- |
|METRIC.BAS|包含大部分应用代码,包括启动例程Sub Main,用于根据命令行参数做出操作决策。|
|METRIC.FRM|点击帮助文件中的“Quiz”按钮时,显示示例测验。|
|CONVERT.FRM|让用户进行米与英尺、厘米与英寸的转换。|

2.2 METRIC.BAS代码分析

2.2.1 功能概述

METRIC.BAS代码模块是Visual Basic部分的启动点,包含Sub Main过程,该过程调用GetParms过程分析和解析命令行参数,并根据参数执行相应操作。

2.2.2 代码示例
Option Explicit
Private Declare Function WinExec _
Lib "kernel32" ( _
    ByVal lpCmdLine As String, _
    ByVal nCmdShow As Long _
) As Long
Private Declare Function mciExecute _
Lib "winmm.dll" ( _
    ByVal lpstrCommand As String _
) As Long
Public gstrParm() As String
Sub Main()
    GetParms
    Select Case UBound(gstrParm)
    Case 0
        TakeAction
    Case 1
        TakeAction gstrParm(1)
    Case 2
        TakeAction gstrParm(1), gstrParm(2)
    End Select
End Sub
Private Sub TakeAction(Optional vntCmd, Optional vntFil)
    `If no parameters, open help file
    If IsMissing(vntCmd) Then
        WinExec "Winhelp.exe " & App.Path & "\Metric.hlp", 1
        Exit Sub
    End If
    `First parameter determines action to take
    Select Case UCase(vntCmd)
    `Display units conversion form
    Case "M2F", "C2I"
        frmConvert.Show
    `Play a sound file
    Case "WAV"
        Select Case vntFil
        Case 1
            mciExecute "Play Sound1.wav"
        End Select
    `Play a video clip
    Case "AVI"
        Select Case vntFil
        Case 1
            mciExecute "Play Clouds.avi"
        End Select
    `Display a quiz form
    Case "QUIZ"
        frmMetric.Show
    End Select
End Sub

Private Sub GetParms()
    Dim strCmd As String
    strCmd = Trim("X" & Space(1) & Command)
    gstrParm() = Split(strCmd)
    If Right(App.Path, 1) <> "\" Then
        gstrParm(0) = App.Path & "\" & App.EXEName
    Else
        gstrParm(0) = App.Path & App.EXEName
    End If
End Sub
2.2.3 代码解释
  • API函数 :使用了两个API函数,WinExec用于启动Windows应用(如WinHelp),mciExecute用于播放多媒体文件。
  • 命令行参数处理 :GetParms过程使用Split函数解析命令行,将参数存储在gstrParm数组中。
  • 操作决策 :Sub Main根据命令行参数的数量调用TakeAction过程,TakeAction过程根据参数执行相应操作,如打开帮助文件、显示单位转换表单、播放多媒体文件或显示测验表单。

2.3 METRIC.FRM表单分析

2.3.1 功能概述

该表单显示示例测验,包含一道判断题、一道填空题和一道选择题。

2.3.2 对象和属性设置
ID No.* Property Value
Form Name frmMetric
Form Caption Metric System - Quiz 1
Label 1 Name Label1
Label 1 Caption 1) A meter is slightly longer than a yard.
Label 2 Name Label2
Label 2 Caption 2) A hectare is equal to how many acres?
Label 3 Name Label3
Label 3 Caption 3) Select the correct prefix multiplier value(s) from the following:
Option1 4 Caption True
Option2 5 Caption False
Text1 6 Text (blank)
Check1 7 Caption exa 10^17
Check2 8 Caption giga 10^9
Check3 9 Caption femto 10^-15
Check4 10 Caption krypto 10^18
Check5 11 Caption deka 10^1
Check6 12 Caption atto 10^-18
CommandButton 13 Name cmdOK
2.3.3 代码示例
Option Explicit
Private Sub cmdOK_Click()
    MsgBox "This example quiz is not graded."
    Unload Me
End Sub
2.3.4 代码解释

点击“cmdOK”按钮时,弹出消息框提示该示例测验未评分,然后卸载表单。

2.4 CONVERT.FRM表单分析

2.4.1 功能概述

该表单显示对话框,让用户进行米与英尺、厘米与英寸的转换。

2.4.2 对象和属性设置
ID No.* Property Value
Form Name frmConvert
Form Caption Metric Conversions
Form BorderStyle 3 - Fixed Dialog
Label 1 Name lblMeters
Label 1 Caption Enter meters:
Label 2 Name lblFeet
Label 2 Caption Equivalent feet:
Label 3 Name lblCentimeters
Label 3 Caption Enter centimeters:
Label 4 Name lblInches
Label 4 Caption Equivalent inches:
TextBox 5 Name txtMeters
TextBox 6 Name txtFeet
TextBox 6 Enabled False
TextBox 7 Name txtCentimeters
TextBox 8 Name txtInches
TextBox 8 Enabled False
2.4.3 代码示例
Option Explicit
Private Sub Form_Load()
    txtMeters.Text = "0"
    txtCentimeters.Text = "0"
End Sub
Private Sub txtCentimeters_Change()
    txtInches.Text = CStr(CDbl(txtCentimeters.Text) * 0.393700787402)
End Sub
Private Sub txtMeters_Change()
    txtFeet.Text = CStr(CDbl(txtMeters.Text) * 3.28083989501)
End Sub
2.4.4 代码解释
  • Form_Load过程:表单加载时,将“txtMeters”和“txtCentimeters”文本框的初始值设置为“0”。
  • txtCentimeters_Change过程:当“txtCentimeters”文本框内容改变时,根据公式计算并更新“txtInches”文本框的内容。
  • txtMeters_Change过程:当“txtMeters”文本框内容改变时,根据公式计算并更新“txtFeet”文本框的内容。

2.5 METRIC.HLP文件分析

2.5.1 激活方式

可使用RoboHelp、Microsoft Help Workshop等工具为按钮或热点添加宏,通过这些宏激活METRIC.EXE应用并传递命令行参数。

2.5.2 宏示例
Conversions:
{button Meters to feet, ExecProgram("Metric.exe M2F")} 
{button Centimeters to inches, ExecProgram("Metric.exe C2I")} To hear 
a {button Sound, ExecProgram("Metric.exe wav 1")} click this button, 
and to see a sample {button Video clip, 
ExecProgram("Metric.exe avi 1")} click here. When you're ready, 
click this {button Quiz, ExecProgram("Metric.exe QUIZ 1")} button.
2.5.3 宏解释

每个按钮的宏由帮助文件编译器处理,创建可激活外部应用METRIC.EXE的按钮,并传递必要的命令行参数。

3. ScripDem应用

3.1 概述

Script控件未包含在Visual Basic中,可从Microsoft网站免费下载。安装后,可通过“Project”菜单的“Components”选项添加到应用中。ScripDem应用展示了如何使用Script控件创建独立的VBScript开发环境。

3.2 主要功能

  • 代码编辑与运行 :主窗体包含TextBox控件用于输入源代码,Script控件用于交互式运行代码。
  • 错误处理 :能处理语法错误,显示问题所在和出错行,但运行时错误较难跟踪。
  • 工具栏和菜单 :使用Toolbar控件和ImageList控件存储按钮图像,按钮功能与菜单重复。“Run”按钮点击时,会弹出菜单,可选择VBScript或JScript作为脚本语言,默认语言为VBScript。

3.3 构建ScripDem应用

3.3.1 主要文件

ScripDem应用主要围绕SCRIPDEM.FRM表单展开。

3.3.2 对象和属性设置
Property Value
Form Name: frmScripDem
Form Caption: Script Demo
Form Icon: Wrench.ico
Toolbar Name: tlbToolbar
Toolbar ImageList: ilsToolbar
ImageList Name: ilsToolbar
ImageList Images: New, Open, Save, Print, Cut, Copy, Paste, and Run
CommonDialog Name: cdlOne
TextBox Name: txtModule
TextBox Scrollbars: 3 - Both
TextBox MultiLine: True
Script Name: scrVB
Script Language: VBScript
3.3.3 代码示例
`SCRIPDEM
Option Explicit
Dim mfilScript As New Scripting.FileSystemObject
Dim mtexScript As TextStream
Dim mblnFileChanged As Boolean
Private Sub Form_Load()
    `Center this form
    Me.Move (Screen.Width - Me.Width) \ 2, _
        (Screen.Height - Me.Height) \ 2
End Sub
Private Sub Form_Resize()
    `Resize edit area to fill form
    txtModule.Move 0, tlbToolbar.Height, _
    Me.ScaleWidth, Me.ScaleHeight - tlbToolbar.Height
End Sub
Private Sub mnuAbout_Click()
    `Set properties and display About form
    About.Application = "ScripDem"
    About.Heading = _
        "Microsoft Visual Basic 6.0 Developer's Workshop"
    About.Copyright = "1998 John Clark Craig and Jeff Webb"
    About.Display
End Sub
Private Sub mnuJava_Click()
    mnuVB.Checked = False
    mnuJava.Checked = True
    scrVB.Language = "JScript"
End Sub
Private Sub mnuOpen_Click()
    `If previous file has changed, prompt user to save
    If mblnFileChanged Then mnuNew_Click
    `Display Open File common dialog box
    cdlOne.DialogTitle = "Open File"
    cdlOne.ShowOpen
    `If user doesn't select a file, exit procedure
    If cdlOne.FileName = "" Then Exit Sub
    `Create text stream from FileSystemObject object
    Set mtexScript = mfilScript.OpenTextFile( _
        cdlOne.FileName, ForReading, True)
    `If file is empty or doesn't exist, don't read it
    If mtexScript.AtEndOfStream Then
        `Clear text box
        txtModule.Text = ""
    Else
        `Load text from text stream into text box
        txtModule.Text = mtexScript.ReadAll
    End If
    `Close file and text stream
    Set mtexScript = Nothing
    `Reset mblnFileChanged flag
    mblnFileChanged = False
    `Update list of procedures
    mnuUpdate_Click
End Sub
Private Sub mnuPrint_Click()
    `Simple dump to printer
    Printer.Print txtModule.Text
    Printer.EndDoc
End Sub
Private Sub mnuSave_Click()
    `Display Save File common dialog box
    cdlOne.DialogTitle = "Save File"
    cdlOne.ShowSave
    `If user cancels, exit
    If cdlOne.CancelError Then Exit Sub
    `Create text stream using FileSystemObject object
    Set mtexScript = mfilScript.OpenTextFile( _
        cdlOne.FileName, ForWriting, True)
    `Write text box text to text stream
    mtexScript.Write txtModule.Text
    `Close text stream and FileSystemObject object
    Set mtexScript = Nothing
    `Reset mblnFileChanged flag
    mblnFileChanged = False
    `Update procedures
    mnuUpdate_Click
End Sub
Private Sub mnuRunSep2_Click(Index As Integer)
    `Catch runtime errors
    On Error GoTo RunErr
    `Run selected procedure
    scrVB.Run scrVB.Procedures(Index).Name
    Exit Sub
RunErr:
    HandleError
End Sub
Private Sub mnuSearch_Click()
    cdlOne.HelpFile = App.Path & "\..\..\Help\Mvbdw.hlp"
    cdlOne.HelpCommand = cdlHelpPartialKey
    cdlOne.ShowHelp
End Sub
Private Sub mnuUpdate_Click()
    `Check for errors when code is parsed during
    `loading
    On Error GoTo LoadErr
    `Clear code
    scrVB.Reset
    `Add new code to Script control
    scrVB.AddCode txtModule.Text
    Dim proItem As Procedure
    Dim intCount As Integer
    `Unload menu items
    For intCount = 1 To mnuRunSep2.UBound
        Unload mnuRunSep2(intCount)
    Next intCount
    intCount = 0
    `Add procedure names to menu
    For Each proItem In scrVB.Procedures
        intCount = intCount + 1
        Load mnuRunSep2(intCount)
        mnuRunSep2(intCount).Caption = proItem.Name
    Next proItem
    Exit Sub
LoadErr:
    HandleError
End Sub
Private Sub mnuNew_Click()
    Dim intSave As Integer
    `Check whether file has changed
    CheckForChange
    txtModule.Text = ""
    mblnFileChanged = False
    `Update procedure list
    mnuUpdate_Click
End Sub
Private Sub mnuExit_Click()
    Dim intSave As Integer
    `Check whether file has changed
    CheckForChange
    `Unload form (ends application)
    Unload Me
End Sub
Private Sub mnuVB_Click()
    mnuVB.Checked = True
    mnuJava.Checked = False
    scrVB.Language = "VBScript"
End Sub
Private Sub tlbToolbar_ButtonClick(ByVal Button As ComctlLib.Button)
    Select Case Button.Key
    Case "New"
        mnuNew_Click
    Case "Open"
        mnuOpen_Click
    Case "Save"
        mnuSave_Click
    Case "Print"
        mnuPrint_Click
    Case "Cut"
        txtModule.SetFocus
        SendKeys "^x"
    Case "Copy"
        txtModule.SetFocus
        SendKeys "^c"
    Case "Paste"
        txtModule.SetFocus
        SendKeys "^v"
    Case "Run"
        PopupMenu mnuRun
    Case Else
        MsgBox "Unknown toolbar button clicked!", vbCritical
    End Select
End Sub
Private Sub txtModule_Change()
    `Set mblnFileChanged flag
    mblnFileChanged = True
End Sub
Private Sub CheckForChange()
    If mblnFileChanged Then
        Dim intSave As Integer
        `If file has changed, prompt user to save changes
        intSave = MsgBox("File has changed, save changes?", _
            vbYesNo, "Save Changes?")
        `If user decides to save, run Save menu procedure
        If intSave = vbYes Then
            mnuSave_Click
        End If
    End If
End Sub
Private Sub HandleError()
    Dim intCount As Integer
    With scrVB.Error
        `Move cursor to beginning
        txtModule.SelStart = 0
        `Move cursor to line with error
        For intCount = 1 To .Line
            SendKeys "{Down}", True
        Next intCount
        `Move cursor to column with error
        For intCount = 1 To .Column
            SendKeys "{Right}", True
        Next intCount
        `Display error
        If .Number <> 0 Then
            MsgBox Join(Array(.Source, .Number, .Description)), _
                vbCritical
        End If
    End With
End Sub
Private Sub mnuContents_Click()
    cdlOne.HelpFile = App.Path & "\..\..\Help\Mvbdw.hlp"
    cdlOne.HelpCommand = cdlHelpContents
    cdlOne.ShowHelp
End Sub
3.3.4 代码解释
  • Form_Load过程 :窗体加载时,将窗体居中显示。
  • Form_Resize过程:窗体大小改变时,调整编辑区域大小以填充窗体。
  • mnuAbout_Click过程:显示关于窗体,设置相关属性。
  • mnuJava_Click过程:选择JScript作为脚本语言。
  • mnuOpen_Click过程:打开文件,若文件已更改,提示用户保存;读取文件内容到文本框。
  • mnuPrint_Click过程:将文本框内容打印到打印机。
  • mnuSave_Click过程:保存文件,若用户取消则退出;将文本框内容写入文件。
  • mnuRunSep2_Click过程:运行选定的过程,捕获运行时错误。
  • mnuSearch_Click过程:显示帮助文件搜索对话框。
  • mnuUpdate_Click过程:更新过程列表,处理加载时的错误。
  • mnuNew_Click过程:新建文件,若文件已更改,提示用户保存;清空文本框内容。
  • mnuExit_Click过程:退出应用,若文件已更改,提示用户保存。
  • mnuVB_Click过程:选择VBScript作为脚本语言。
  • tlbToolbar_ButtonClick过程:处理工具栏按钮点击事件,根据按钮的Key属性调用相应菜单过程。
  • txtModule_Change过程:文本框内容改变时,设置文件已更改标志。
  • CheckForChange过程:检查文件是否更改,若更改则提示用户保存。
  • HandleError过程:处理错误,将光标移动到出错位置并显示错误信息。
  • mnuContents_Click过程:显示帮助文件的目录。

4. 总结

Metric应用展示了Visual Basic应用与帮助文件结合的强大功能,通过命令行参数实现了多媒体播放、测验展示、单位转换等功能。ScripDem应用则展示了如何使用Script控件创建独立的VBScript开发环境,包括代码编辑、运行和错误处理等功能。这些应用为开发者提供了很好的参考,可根据实际需求进行扩展和优化。

5. 操作流程总结

5.1 Metric应用操作流程

graph LR
    A[启动METRIC.EXE] --> B{检查命令行参数}
    B -- 无参数 --> C[运行METRIC.HLP文件]
    C --> D{点击帮助文件按钮}
    D -- 视频按钮 --> E[播放视频片段]
    D -- 测验按钮 --> F[显示测验对话框]
    D -- 转换按钮 --> G[显示转换表单]
    B -- 有参数 --> H[根据参数执行相应操作]

具体操作步骤如下:
1. 确保METRIC.EXE和METRIC.HLP位于同一目录,若要查看视频片段CLOUDS.AVI,将该文件从配套光盘复制到Metric应用所在目录。
2. 启动METRIC.EXE,若通过双击启动,无命令行参数,程序会自动运行METRIC.HLP文件。
3. 在帮助文件主主题窗口中,点击不同按钮触发相应操作:
- 点击“Video Clip”按钮,播放示例视频片段。
- 点击“Quiz”按钮,弹出包含测验问题的对话框。
- 点击“Meters to feet”或“Centimeters to inches”按钮,显示相应的转换表单。

5.2 ScripDem应用操作流程

graph LR
    A[启动ScripDem应用] --> B[输入源代码]
    B --> C{选择脚本语言}
    C -- VBScript --> D[以VBScript运行代码]
    C -- JScript --> E[以JScript运行代码]
    D --> F{是否有错误}
    F -- 语法错误 --> G[显示错误信息]
    F -- 运行时错误 --> H[尝试跟踪错误]
    E --> I{是否有错误}
    I -- 语法错误 --> G
    I -- 运行时错误 --> H

具体操作步骤如下:
1. 从Microsoft网站下载Script控件并安装,通过“Project”菜单的“Components”选项将其添加到应用中。
2. 启动ScripDem应用,在TextBox控件中输入源代码。
3. 通过“Run”菜单或按钮选择脚本语言(VBScript或JScript,默认VBScript)。
4. 点击“Run”按钮运行代码,若出现语法错误,会显示错误信息;运行时错误较难跟踪,需根据具体情况处理。
5. 可使用工具栏按钮完成新建、打开、保存、打印、复制、粘贴等操作,功能与菜单重复。

6. 技术点分析

6.1 命令行参数处理技术

在Metric应用的METRIC.BAS代码模块中,使用GetParms过程处理命令行参数。该过程使用Split函数将命令行字符串分割成数组,存储在gstrParm数组中。Sub Main过程根据数组的上界(UBound)判断参数数量,并调用TakeAction过程执行相应操作。这种处理方式使得程序能够根据不同的命令行参数做出不同的响应,增强了程序的灵活性和扩展性。

6.2 多媒体播放技术

METRIC.BAS代码模块中使用mciExecute API函数播放多媒体文件。通过传递不同的命令字符串,如“Play Sound1.wav”和“Play Clouds.avi”,可以播放声音文件和视频片段。这种技术使得应用能够集成多媒体功能,提升了用户体验。

6.3 帮助文件与应用交互技术

在Metric应用中,通过在帮助文件(METRIC.HLP)中添加宏,激活外部应用METRIC.EXE并传递命令行参数。例如,{button Meters to feet, ExecProgram(“Metric.exe M2F”)} 宏创建了一个按钮,点击该按钮会激活METRIC.EXE并传递参数“M2F”,从而实现帮助文件与应用的交互。

6.4 Script控件应用技术

ScripDem应用使用Script控件实现代码编辑和运行功能。通过设置Script控件的Language属性,可以选择VBScript或JScript作为脚本语言。在代码运行过程中,能够处理语法错误,但运行时错误的跟踪相对复杂。这种技术为开发者提供了一个简单的脚本开发环境。

7. 扩展与优化建议

7.1 Metric应用扩展

  • 增加更多单位转换功能 :除了米与英尺、厘米与英寸的转换,可增加其他单位的转换,如千克与磅、升与加仑等。
  • 完善测验功能 :当前测验为非评分测验,可添加评分功能,记录用户的答题结果,并提供反馈和解释。
  • 优化多媒体播放体验 :添加播放控制按钮,如暂停、继续、停止等,提升用户对多媒体文件的控制能力。

7.2 ScripDem应用优化

  • 增强错误处理能力 :对于运行时错误,可添加更详细的错误信息和调试工具,帮助开发者更方便地定位和解决问题。
  • 添加代码自动完成功能 :类似于专业的开发环境,为用户提供代码自动完成和语法提示功能,提高开发效率。
  • 支持更多脚本语言 :除了VBScript和JScript,可考虑支持其他流行的脚本语言,如Python、JavaScript等。

8. 总结与展望

通过对Metric和ScripDem应用的分析,我们了解了Visual Basic应用与帮助文件结合的方法,以及如何使用Script控件创建脚本开发环境。这些应用展示了Visual Basic在多媒体处理、交互设计和脚本开发等方面的强大功能。

在未来的开发中,开发者可以借鉴这些应用的设计思路,结合实际需求进行扩展和优化。例如,在教育领域可开发更丰富的学习应用,在工业控制领域可开发更智能的监控系统。随着技术的不断发展,Visual Basic与其他技术的结合将为开发者带来更多的可能性。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值