可视化编程应用: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与其他技术的结合将为开发者带来更多的可能性。
超级会员免费看
85万+

被折叠的 条评论
为什么被折叠?



