Microsoft(R) Script 控件使用戶(hù)可以創(chuàng)建運(yùn)行任何 ActiveX(R) scripting 引擎,例如 Microsoft(R) Visual Basic (R) Scripting Edition 或Microsoft(R) JScript(TM) 的應(yīng)用程序。用戶(hù)可以將任何 Automation 對(duì)象的對(duì)象模型添加到 Script 控件中,這樣該對(duì)象的方法和屬性就可以為 scripting 引擎所使用。通過(guò)將某個(gè)應(yīng)用程序的對(duì)象模型和某個(gè)scripting 引擎加以綜合,用戶(hù)就可以創(chuàng)建一個(gè)結(jié)合了兩方面優(yōu)點(diǎn)的 scripting 應(yīng)用程序。應(yīng)用程序不但具有 scripting 語(yǔ)言的簡(jiǎn)單化特點(diǎn),而且綜合了一種更高級(jí)、具有完整特性的專(zhuān)業(yè)應(yīng)用程序的對(duì)象、方法,以及屬性。
創(chuàng)建 Script 控件的實(shí)例
Microsoft Script 控件可作為一個(gè)控件或者作為一個(gè)獨(dú)立的 Automation 對(duì)象創(chuàng)建出來(lái)。該特性可以使得用任何語(yǔ)言書(shū)寫(xiě)的應(yīng)用程序都可以用 ScriptControl 宿主任何兼容的 scripting 語(yǔ)言。
下面的示例可使用任意格式。請(qǐng)注意變量 sc 并未聲明為類(lèi)型 ScriptControl,因?yàn)樵摽丶皇?,也不必要是工程中所引用的。只?Script 控件出現(xiàn)并進(jìn)行注冊(cè),下面的代碼就可正常工作:
代碼如下:
Private Sub Command1_Click()
Dim sc
Dim strProgram As String
strProgram = "Sub Main" & vbCrLf & _
"MsgBox ""Hello World""" & vbCrLf & _
"End Sub"
Set sc = CreateObject("ScriptControl")
sc.language = "VBScript"
sc.addcode strProgram
sc.run "Main"
End Sub
如果用戶(hù)在自己的工程中的引用中對(duì) Script 控件進(jìn)行顯式引用,那么用戶(hù)就可以用下面的代碼創(chuàng)建 Script 控件的一個(gè)
實(shí)例:
代碼如下:
Dim sc As ScriptControl
顯示用戶(hù)接口元素 AllowUI 屬性決定了 scripting 引擎是否可以顯示用戶(hù)接口元素。這可以應(yīng)用于 Script 控件本身,例如顯示超時(shí)消息。
這也可以應(yīng)用于使用 ActiveX scripting 接口的 scripting 引擎。例如,下面的代碼將在試圖顯示 Hello World 消息框時(shí)產(chǎn)生一個(gè)錯(cuò)誤:
代碼如下:
ScriptControl1.AllowUI = False
Dim strX As String
strX = "Sub Hello" & vbCrLf & _
"MsgBox ""Hello World""" & vbCrLf & _
"End Sub"
ScriptControl1.AddCode strX
ScriptControl1.Run "Hello" ' 沒(méi)有允許的 UI!
創(chuàng)建 Scripting 代碼
Microsoft Script 控件使用戶(hù)可以創(chuàng)建一個(gè)運(yùn)行 scripting 語(yǔ)言,例如 VBScript 或 JScript 的應(yīng)用程序。例如,假設(shè)用戶(hù)在窗體上有一個(gè)按鈕,用戶(hù)希望在按下該按鈕時(shí)運(yùn)行某些 VBScript 代碼。該按鈕稱(chēng)為 Run NameMe,而用戶(hù)希望scripting 代碼運(yùn)行一個(gè)叫 NameMe 的過(guò)程。意圖是當(dāng)用戶(hù)單擊 Run NameMe 按鈕時(shí),VBScript scripting 引擎執(zhí)行 NameMe 過(guò)程。
這個(gè) Run NameMe 按鈕使用 Script Control 的 Run 方法來(lái)執(zhí)行腳本。下面就是應(yīng)當(dāng)出現(xiàn)在 Run NameMe 按鈕的 Click 事件中的代碼:
代碼如下:
' Script Control 的名字是 ScriptControl1。
Private Sub RunNameMe_Click()
ScriptControl1.Run "NameMe"
End Sub
為了創(chuàng)建該腳本所需要代碼的其余部分,請(qǐng)選擇一種 scripting 語(yǔ)言,并將代碼添加到某個(gè)過(guò)程中,然后運(yùn)行該過(guò)程。
選擇一種Scripting 語(yǔ)言
第一步是為 Script Control 配置正確的 scripting 語(yǔ)言。當(dāng)在某頁(yè)上作為控件創(chuàng)建 Script Control 時(shí),Language 屬性就被自動(dòng)初始化為 "VBScript"。當(dāng)作為一個(gè) Automation 對(duì)象來(lái)創(chuàng)建 Script Control 時(shí),則 Language 屬性留作未初
始化的狀態(tài),而必須由代碼作者對(duì)其進(jìn)行設(shè)置。
若要將 Language 屬性設(shè)置為 JScript,可使用 Properties 窗口。用戶(hù)也可以在代碼中使用 Language 屬性,如下所
示:
代碼如下:
ScriptControl1.Language = "JScript"
其他 scripting 語(yǔ)言,例如 PERL 和 REXX,都不是由 Microsoft 所提供的,也可以為 Script 控件所用。
將代碼添加到某個(gè)過(guò)程中
在用戶(hù)運(yùn)行 NameMe 過(guò)程之前,可使用 AddCode 方法將完整的過(guò)程添加到 Script 控件中。如果用戶(hù)試圖將一個(gè)不完整的過(guò)程(一個(gè)沒(méi)有 End Sub 或者 End Function 的過(guò)程)添加進(jìn)去,則將會(huì)出錯(cuò)。下面的代碼將過(guò)程代碼添加到 Script
Control 中:
代碼如下:
' 當(dāng) ScriptRun 應(yīng)用程序加載時(shí),添加下面的代碼
' 將 NameMe 過(guò)程添加到 Control 中。
Private Sub Form_Load()
Dim strCode As String
strCode = "Sub NameMe()" & vbCrLf & _
" Dim strName As String" & vbCrLf & _
" strName = InputBox(""Name?"")" & vbCrLf & _
" MsgBox ""Your name is "" & strName" & vbcrLf & _
"End Sub"
ScriptControl1.AddCode strCode
End Sub
另外,用戶(hù)也可以從某個(gè) TextBox 控件添加過(guò)程代碼:
代碼如下:
Private Sub Form_Load()
' 該代碼包含在名為 frmScript 的窗體上
' 名為 txtScript 的 Textbox中。
ScriptControl1.AddCode frmScript.txtScript.Text
End Sub
用戶(hù)可以將參數(shù)添加到某個(gè)過(guò)程或者函數(shù)中。
代碼如下:
Private Sub EvalFunc()
' 創(chuàng)建函數(shù)。
Dim strFunction As String
strFunction = _
"Function ReturnThis(x, y)" & vbCrLf & _
" ReturnThis = x * y" & vbCrLf & _
"End Function"
' 添加代碼,然后運(yùn)行該函數(shù)。
ScriptControl1.AddCode strFunction
MsgBox ScriptControl1.Run("ReturnThis", 3, 25)
End Sub
運(yùn)行過(guò)程
Run 方法運(yùn)行任何已被添加到 Script 控件中的完整過(guò)程。下面的代碼段運(yùn)行三個(gè)已定義過(guò)程:
代碼如下:
ScriptControl1.Run "FindName"
ScriptControl1.Run "AddName"
ScriptControl1.Run "Quit"
執(zhí)行 Scripting 語(yǔ)句,并計(jì)算結(jié)果,用戶(hù)可以用 ExecuteStatement 方法執(zhí)行一條 scripting 語(yǔ)句。用戶(hù)可以用 eval 方法計(jì)算某個(gè)表達(dá)式值。在下面的示例
中,用 ExecuteStatement 方法將值 100 賦給變量 x。下面的兩行用 eval 方法來(lái)測(cè)試語(yǔ)句 x = 100 和 x = 100/2。第二行返回 True;而第三行則返回 False。
復(fù)制代碼 代碼如下:Private Sub TryThis()
ScriptControl1.ExecuteStatement "x = 100"
MsgBox ScriptControl1.Eval("x = 100") ' 返回 True
MsgBox ScriptControl1.Eval("x = 100/2") ' 返回 False
End Sub
使用 Error 屬性
Script 控件錯(cuò)誤有兩個(gè)可能來(lái)源:Script 控件自身,或者該控件試圖運(yùn)行的 script。為了對(duì) scripting 代碼進(jìn)行調(diào)試,可使用 Error 屬性,該屬性返回對(duì) Error 對(duì)象的引用。利用 Error 對(duì)象,Script 控件可以返回錯(cuò)誤數(shù)目和對(duì)它的
描述,以及錯(cuò)誤在 script 中出現(xiàn)的行號(hào)。
運(yùn)行下面的代碼,查看 Script 控件發(fā)現(xiàn)錯(cuò)誤的一個(gè)示例:
代碼如下:
Private Sub MyError()
' 下面的代碼被零除導(dǎo)致
' 一個(gè)錯(cuò)誤。
Dim strCode As String
strCode = _
"Sub DivideByZero()" & vbCrLf & _
"Dim prime" & vbCrLf & _
"prime = 3" & vbCrLf & _
"MsgBox prime/0" & vbCrLf & _
"End Sub"
On Error GoTo scError
With ScriptControl1
.AddCode strCode
.Run "DivideByZero"
End With
Exit Sub
scError:
' 使用 Error 對(duì)象向用戶(hù)通告
' 錯(cuò)誤,以及出錯(cuò)行。
Debug.Print ScriptControl1.Error.Number & _
":" & ScriptControl1.Error.Description & _
" in line " & ScriptControl1.Error.Line
Exit Sub
End Sub
更多信息請(qǐng)查看IT技術(shù)專(zhuān)欄