1. 程式人生 > >VBScript指令碼運用(指令碼程式與宿主程式的互動)

VBScript指令碼運用(指令碼程式與宿主程式的互動)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

    做過工控的人都知道,對指令碼語言的支援是標準組態軟體應具備的一個基本功能(如iFix,組態王等)。如果我們用VB開發類似的功能,能實現嗎?

    想必大家都知道微軟提供了Micrsoft Script Control 1.0

控制元件,在VB版也見到了大家對這個控制元件的使用(如用ExecuteStatement方法執行指令碼命令 ExecuteStatement("msgbox “你好””??? )。但最重要的一點,ActiveX指令碼與宿主應用程式資料互動與傳遞,卻沒有完整的解決方案。

我也是探索了很長一段時間,才摸索出一點資料傳遞與互動的技巧,現在共享出來,供大家討論研究。

示例程式介紹:

1、首先載入Micrsoft Script Control 1.0 控制元件。

對它基本上不用配置,預設語言VBScript,對該部分的介紹請下載VBScript命令集 (

http://blog.csdn.net/yefanqiu   【葉帆資源】[03] VBScript指令集)

2、新增一個窗體(frmTest),裡面新增如下程式碼:

'*************************************************************************'**模 塊 名:frmTest'**說    明:YFsoft 版權所有2004 - 2005(C)'**創 建 人:葉帆'**日    期:2004-10-15 11:00:32'**修 改 人:'**日    期:'**描    述:指令碼語言運用探索'**版    本:V1.0.0'*************************************************************************Option Explicit'*************************************************************************'**函 數 名:chkRun_Click'**輸    入:無'**輸    出:無'**功能描述:指令碼執行控制'**全域性變數:'**呼叫模組:'**作    者:葉帆'**日    期:2004-10-15 11:19:31'**修 改 人:'**日    期:'**版    本:V1.0.0'*************************************************************************Private Sub chkRun_Click()If chkRun.value = 1 ThentmrRun.Interval = cmbRunTime.Text                          '執行間隔tmrRun.Enabled = True                                      '開始執行  以固定間隔迴圈執行txtEdit.Enabled = FalseElsetmrRun.Enabled = False                                     '停止執行txtEdit.Enabled = TrueEnd IfEnd Sub'*************************************************************************'**函 數 名:cmbType_Click'**輸    入:無'**輸    出:無'**功能描述:操作型別切換'**全域性變數:'**呼叫模組:'**作    者:葉帆'**日    期:2004-10-15 12:56:19'**修 改 人:'**日    期:'**版    本:V1.0.0'*************************************************************************Private Sub cmbType_Click()cmdSCDemo1_ClickEnd Sub'*************************************************************************'**函 數 名:cmdRun_Click'**輸    入:無'**輸    出:無'**功能描述:單次執行指令碼'**全域性變數:'**呼叫模組:'**作    者:葉帆'**日    期:2004-10-15 11:51:29'**修 改 人:'**日    期:'**版    本:V1.0.0'*************************************************************************Private Sub cmdRun_Click()Call tmrRun_TimerEnd Sub'*************************************************************************'**函 數 名:cmdSCDemo1_Click'**輸    入:無'**輸    出:無'**功能描述:引數傳遞演示'**全域性變數:'**呼叫模組:'**作    者:葉帆'**日    期:2004-10-15 11:03:29'**修 改 人:'**日    期:'**版    本:V1.0.0'*************************************************************************Private Sub cmdSCDemo1_Click()Dim strType As String'內部變數定義  類似組態王中的資料字典valMem.ClearvalMem.SetValue "Value1", txtValue(0)valMem.SetValue "Value2", txtValue(1)valMem.SetValue "Value3", 0Select Case cmbType.ListIndexCase 0:strType = "+"Case 1:strType = "-"Case 2:strType = "*"Case 3:strType = "/"End SelecttxtEdit = "dim lngValue1" & vbCrLftxtEdit = txtEdit & "dim lngValue2" & vbCrLftxtEdit = txtEdit & "dim lngValue3" & vbCrLftxtEdit = txtEdit & "lngValue1=vm.getvalue(" & Chr(34) & "Value1" & Chr(34) & ")" & vbCrLftxtEdit = txtEdit & "lngValue2=vm.getvalue(" & Chr(34) & "Value2" & Chr(34) & ")" & vbCrLftxtEdit = txtEdit & "lngValue3=CInt(lngValue1)" & strType & "CInt(lngValue2)" & vbCrLftxtEdit = txtEdit & "vm.setvalue " & Chr(34) & "Value3" & Chr(34) & ",lngValue3 " & vbCrLfEnd Sub'*************************************************************************'**函 數 名:cmdSCDemo2_Click'**輸    入:無'**輸    出:無'**功能描述:物件操作演示'**全域性變數:'**呼叫模組:'**作    者:葉帆'**日    期:2004-10-15 13:41:23'**修 改 人:'**日    期:'**版    本:V1.0.0'*************************************************************************Private Sub cmdSCDemo2_Click()txtEdit = "dim lngC" & vbCrLftxtEdit = txtEdit & "lngC=clng(fm.txtdemo.text)" & vbCrLftxtEdit = txtEdit & "lngC=lngC+10" & vbCrLftxtEdit = txtEdit & "if lngC>255 then lngC=0" & vbCrLftxtEdit = txtEdit & "fm.picdemo.backcolor=rgb(lngC,0,0)" & vbCrLftxtEdit = txtEdit & "fm.txtdemo.text=cstr(lngC)" & vbCrLfEnd Sub'*************************************************************************'**函 數 名:Form_Load'**輸    入:無'**輸    出:無'**功能描述:初始化'**全域性變數:'**呼叫模組:'**作    者:葉帆'**日    期:2004-10-15 11:13:03'**修 改 人:'**日    期:'**版    本:V1.0.0'*************************************************************************Private Sub Form_Load()'新增引數運用的  內部可使用的變名  外部實際變數名scCommand.AddObject "vm", valMem, True'向指令碼新增外部可用的物件'最後一個引數: True表示它的子類屬性方法在指令碼中可以操作  false 表示今該物件本身的方法屬性可用scCommand.AddObject "fm", Me, True'指令碼執行間隔設定cmbRunTime.ListIndex = 0'引數操作型別cmbType.ListIndex = 0End Sub'*************************************************************************'**函 數 名:tmrRun_Timer'**輸    入:無'**輸    出:無'**功能描述:指令碼執行'**全域性變數:'**呼叫模組:'**作    者:葉帆'**日    期:2004-10-15 11:29:46'**修 改 人:'**日    期:'**版    本:V1.0.0'*************************************************************************Private Sub tmrRun_Timer()On Error GoTo ToExit '開啟錯誤陷阱'------------------------------------------------Dim i As Long'引數輸入valMem.SetValue "Value1", txtValue(0).TextvalMem.SetValue "Value2", txtValue(1).TextvalMem.SetValue "Value3", 0'指令碼執行scCommand.ExecuteStatement txtEdit.Text'引數輸出lstValueOut.ClearFor i = 1 To valMem.CountlstValueOut.AddItem valMem.GetValue("", i)Next'------------------------------------------------Exit Sub'----------------ToExit:txtError = "錯 誤 號:" & Err.Number & "   時間:" & Format(Now, "YYYY-MM-DD HH:MM:SS") & vbCrLftxtError = txtError & "錯誤資訊:" & Err.Description & vbCrLftxtError = txtError & "錯誤來源:" & Err.SourceEnd Sub

3、新增一個模組(mdlBase),裡面新增如下程式碼:

'*************************************************************************'**模 塊 名:mdlBase'**說    明:YFsoft 版權所有2004 - 2005(C)'**創 建 人:葉帆'**日    期:2004-10-15 11:10:58'**修 改 人:'**日    期:'**描    述:公共變數區'**版    本:V1.0.0'*************************************************************************Option ExplicitPublic valMem As New clsScriptIO     '指令碼語言引數交換的變數設定區

4、新增一個類(clsScriptIO),類名為clsScriptIO,裡面新增如下程式碼:

'*************************************************************************'**模 塊 名:clsScriptIO'**說    明:YFsoft 版權所有2004 - 2005(C)'**創 建 人:葉帆'**日    期:2004-10-15 11:56:32'**修 改 人:'**日    期:'**描    述:與指令碼語言引數互動的類模組'**版    本:V1.0.0'*************************************************************************Option ExplicitPrivate cltScriptMem As New Collection     '變數設定區'*************************************************************************'**函 數 名:Count'**輸    入:無'**輸    出:(Variant) -'**功能描述:記憶體變數個數'**全域性變數:'**呼叫模組:'**作    者:葉帆'**日    期:2004-10-15 12:00:57'**修 改 人:'**日    期:'**版    本:V1.0.0'*************************************************************************Public Property Get Count() As VariantCount = cltScriptMem.CountEnd Property'*************************************************************************'**函 數 名:GetValue'**輸    入:strKey(String) - 變數名稱'**        :Optional lngNo(Long = 0) - 變數索引'**輸    出:(Variant) - 返回值'**功能描述:取得制定名稱的變數值'**全域性變數:'**呼叫模組:'**作    者:葉帆'**日    期:2004-10-15 12:01:59'**修 改 人:'**日    期:'**版    本:V1.0.0'*************************************************************************Public Function GetValue(strKey As String, Optional lngNo As Long = 0) As VariantOn Error GoTo ToExit '開啟錯誤陷阱'------------------------------------------------If lngNo > 0 Then    '如果輸入索引號,則返回索引號指定的變數GetValue = cltScriptMem.Item(lngNo)ElseGetValue = cltScriptMem.Item(strKey)End If'------------------------------------------------Exit Function'----------------ToExit:End Function'*************************************************************************'**函 數 名:SetValue'**輸    入:strKey(String) - 變數名'**        :value(Variant) - 設定變數'**輸    出:無'**功能描述:為指定的變數賦值'**全域性變數:'**呼叫模組:'**作    者:葉帆'**日    期:2004-10-15 12:07:05'**修 改 人:'**日    期:'**版    本:V1.0.0'*************************************************************************Public Sub SetValue(strKey As String, value As Variant)On Error GoTo ToExit '開啟錯誤陷阱'------------------------------------------------cltScriptMem.Remove (strKey)cltScriptMem.Add value, strKey'------------------------------------------------Exit Sub'----------------ToExit:Resume NextEnd Sub'*************************************************************************'**函 數 名:DelValue'**輸    入:strKey(String) - 變數名'**        :Optional lngNo(Long = 0) -索引號'**輸    出:無'**功能描述:刪除制定的變數'**全域性變數:'**呼叫模組:'**作    者:葉帆'**日    期:2004-10-15 12:08:55'**修 改 人:'**日    期:'**版    本:V1.0.0'*************************************************************************Public Sub DelValue(strKey As String, Optional lngNo As Long = 0)On Error GoTo ToExit '開啟錯誤陷阱'------------------------------------------------If lngNo > 0 Then    '如果輸入索引號,則刪除索引號指定的變數cltScriptMem.Remove (lngNo)ElsecltScriptMem.Remove (strKey)End If'------------------------------------------------Exit Sub'----------------ToExit:End Sub'*************************************************************************'**函 數 名:Clear'**輸    入:無'**輸    出:無'**功能描述:刪除變數'**全域性變數:'**呼叫模組:'**作    者:葉帆'**日    期:2004-10-15 13:15:15'**修 改 人:'**日    期:'**版    本:V1.0.0'*************************************************************************Public Sub Clear()On Error GoTo ToExit '開啟錯誤陷阱'------------------------------------------------While cltScriptMem.Count > 0cltScriptMem.Remove (1)Wend'------------------------------------------------Exit Sub'----------------ToExit:Resume NextEnd Sub

  功能演示:

 

1、  引數傳遞(單擊【傳遞引數演示】按鈕,自動新增相應指令碼程式碼。可以執行加減乘除等操作。

 

下圖演示了錯誤捕捉(被0除錯誤)

 

 

2、物件操作(單擊【物件操作演示】按鈕,自動新增相應指令碼程式碼。可以執行控制元件的賦值和背景色變化操作。

 

 

 

VBScript 使用 ActiveX(R)指令碼與宿主應用程式對話。使用 ActiveX Script,瀏覽器和其他宿主應用程式不再需要每個指令碼部件的特殊整合程式碼。ActiveX指令碼使宿主可以編譯 Script、獲取和呼叫入口點及管理開發者可用的名稱空間。通過 ActiveX Script,語言廠商可以建立標準指令碼執行時語言。Microsoft 將提供 VBScript 的執行時支援。           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述