Microsoft(R) Script 控制項使使用者可以建立運行任何 ActiveX(R) scripting 引擎,例如 Microsoft(R) Visual Basic (R) Scripting Edition 或Microsoft(R) JScript(TM) 的應用程式。使用者可以將任何 Automation 對象的物件模型添加到 Script 控制項中,這樣該對象的方法和屬性就可以為 scripting 引擎所使用。通過將某個應用程式的物件模型和某個scripting 引擎加以綜合,使用者就可以建立一個結合了兩方面優點的 scripting 應用程式。應用程式不但具有 scripting 語言的簡單化特點,而且綜合了一種更進階、具有完整特性的專業應用程式的對象、方法,以及屬性。
建立 Script 控制項的執行個體
Microsoft Script 控制項可作為一個控制項或者作為一個獨立的 Automation 對象建立出來。該特性可以使得用任何語言書寫的應用程式都可以用 ScriptControl 宿主任何相容的 scripting 語言。
下面的樣本可使用任意格式。請注意變數 sc 並未聲明為類型 ScriptControl,因為該控制項不是,也不必要是工程中所引用的。只要 Script 控制項出現並進行註冊,下面的代碼就可正常工作:
複製代碼 代碼如下:
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
如果使用者在自己的工程中的引用中對 Script 控制項進行顯式引用,那麼使用者就可以用下面的代碼建立 Script 控制項的一個
執行個體:
複製代碼 代碼如下:
Dim sc As ScriptControl
顯示使用者介面元素 AllowUI 屬性決定了 scripting 引擎是否可以顯示使用者介面元素。這可以應用於 Script 控制項本身,例如顯示逾時訊息。
這也可以應用於使用 ActiveX scripting 介面的 scripting 引擎。例如,下面的代碼將在試圖顯示 Hello World 訊息框時產生一個錯誤:
複製代碼 代碼如下:
ScriptControl1.AllowUI = False
Dim strX As String
strX = "Sub Hello" & vbCrLf & _
"MsgBox ""Hello World""" & vbCrLf & _
"End Sub"
ScriptControl1.AddCode strX
ScriptControl1.Run "Hello" ' 沒有允許的 UI!
建立 Scripting 代碼
Microsoft Script 控制項使使用者可以建立一個運行 scripting 語言,例如 VBScript 或 JScript 的應用程式。例如,假設使用者在表單上有一個按鈕,使用者希望在按下該按鈕時運行某些 VBScript 代碼。該按鈕稱為 Run NameMe,而使用者希望scripting 代碼運行一個叫 NameMe 的過程。意圖是當使用者單擊 Run NameMe 按鈕時,VBScript scripting 引擎執行 NameMe 過程。
這個 Run NameMe 按鈕使用 Script Control 的 Run 方法來執行指令碼。下面就是應當出現在 Run NameMe 按鈕的 Click 事件中的代碼:
複製代碼 代碼如下:
' Script Control 的名字是 ScriptControl1。
Private Sub RunNameMe_Click()
ScriptControl1.Run "NameMe"
End Sub
為了建立該指令碼所需要代碼的其餘部分,請選擇一種 scripting 語言,並將代碼添加到某個過程中,然後運行該過程。
選擇一種Scripting 語言
第一步是為 Script Control 配置正確的 scripting 語言。當在某頁上作為控制項建立 Script Control 時,Language 屬性就被自動初始化為 "VBScript"。當作為一個 Automation 對象來建立 Script Control 時,則 Language 屬性留作未初
始化的狀態,而必須由代碼作者對其進行設定。
若要將 Language 屬性設定為 JScript,可使用 Properties 視窗。使用者也可以在代碼中使用 Language 屬性,如下所
示:
複製代碼 代碼如下:
ScriptControl1.Language = "JScript"
其他 scripting 語言,例如 PERL 和 REXX,都不是由 Microsoft 所提供的,也可以為 Script 控制項所用。
將代碼添加到某個過程中
在使用者運行 NameMe 過程之前,可使用 AddCode 方法將完整的過程添加到 Script 控制項中。如果使用者試圖將一個不完整流程(一個沒有 End Sub 或者 End Function 的過程)添加進去,則將會出錯。下面的代碼將過程代碼添加到 Script
Control 中:
複製代碼 代碼如下:
' 當 ScriptRun 應用程式載入時,添加下面的代碼
' 將 NameMe 過程添加到 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
另外,使用者也可以從某個 TextBox 控制項添加過程代碼:
複製代碼 代碼如下:
Private Sub Form_Load()
' 該程式碼封裝含在名為 frmScript 的表單上
' 名為 txtScript 的 Textbox中。
ScriptControl1.AddCode frmScript.txtScript.Text
End Sub
使用者可以將參數添加到某個過程或者函數中。
複製代碼 代碼如下:
Private Sub EvalFunc()
' 建立函數。
Dim strFunction As String
strFunction = _
"Function ReturnThis(x, y)" & vbCrLf & _
" ReturnThis = x * y" & vbCrLf & _
"End Function"
' 添加代碼,然後運行該函數。
ScriptControl1.AddCode strFunction
MsgBox ScriptControl1.Run("ReturnThis", 3, 25)
End Sub
運行過程
Run 方法運行任何已被添加到 Script 控制項中的完整過程。下面的程式碼片段運行三個已定義過程:
複製代碼 代碼如下:
ScriptControl1.Run "FindName"
ScriptControl1.Run "AddName"
ScriptControl1.Run "Quit"
執行 Scripting 語句,並計算結果,使用者可以用 ExecuteStatement 方法執行一條 scripting 語句。使用者可以用 eval 方法計算某個運算式值。在下面的樣本
中,用 ExecuteStatement 方法將值 100 賦給變數 x。下面的兩行用 eval 方法來測試語句 x = 100 和 x = 100/2。第二行返回 True;而第三行則返回 False。
複製代碼 代碼如下:
Private Sub TryThis()
ScriptControl1.ExecuteStatement "x = 100"
MsgBox ScriptControl1.Eval("x = 100") ' 返回 True
MsgBox ScriptControl1.Eval("x = 100/2") ' 返回 False
End Sub
使用 Error 屬性
Script 控制項錯誤有兩個可能來源:Script 控制項自身,或者該控制項試圖啟動並執行 script。為了對 scripting 代碼進行調試,可使用 Error 屬性,該屬性返回對 Error 對象的引用。利用 Error 對象,Script 控制項可以返回錯誤數目和對它的
描述,以及錯誤在 script 中出現的行號。
運行下面的代碼,查看 Script 控制項發現錯誤的一個樣本:
複製代碼 代碼如下:
Private Sub MyError()
' 下面的代碼被零除導致
' 一個錯誤。
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 對象向使用者通告
' 錯誤,以及出錯行。
Debug.Print ScriptControl1.Error.Number & _
":" & ScriptControl1.Error.Description & _
" in line " & ScriptControl1.Error.Line
Exit Sub
End Sub