天天看點

VBScript腳本運用(腳本程式與宿主程式的互動)

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

    想必大家都知道微軟提供了Micrsoft Script Control 1.0 控件,在VB版也見到了大家對這個控件的使用(如用ExecuteStatement方法執行腳本指令 ExecuteStatement("msgbox “你好””)??? )。但最重要的一點,ActiveX腳本與宿主應用程式資料互動與傳遞,卻沒有完整的解決方案。

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

示例程式介紹:

1、首先加載Micrsoft Script Control 1.0 控件。

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

Private Sub chkRun_Click()

If chkRun.value = 1 Then

tmrRun.Interval = cmbRunTime.Text '運作間隔

tmrRun.Enabled = True '開始運作 以固定間隔循環運作

txtEdit.Enabled = False

Else

tmrRun.Enabled = False '停止運作

txtEdit.Enabled = True

End If

End Sub

'**函 數 名:cmbType_Click

'**功能描述:操作類型切換

'**日 期:2004-10-15 12:56:19

Private Sub cmbType_Click()

cmdSCDemo1_Click

'**函 數 名:cmdRun_Click

'**功能描述:單次運作腳本

'**日 期:2004-10-15 11:51:29

Private Sub cmdRun_Click()

Call tmrRun_Timer

'**函 數 名:cmdSCDemo1_Click

'**功能描述:參數傳遞示範

'**日 期:2004-10-15 11:03:29

Private Sub cmdSCDemo1_Click()

Dim strType As String

'内部變量定義 類似組态王中的資料字典

valMem.Clear

valMem.SetValue "Value1", txtValue(0)

valMem.SetValue "Value2", txtValue(1)

valMem.SetValue "Value3", 0

Select Case cmbType.ListIndex

Case 0:

strType = "+"

Case 1:

strType = "-"

Case 2:

strType = "*"

Case 3:

strType = "/"

End Select

txtEdit = "dim lngValue1" & vbCrLf

txtEdit = txtEdit & "dim lngValue2" & vbCrLf

txtEdit = txtEdit & "dim lngValue3" & vbCrLf

txtEdit = txtEdit & "lngValue1=vm.getvalue(" & Chr(34) & "Value1" & Chr(34) & ")" & vbCrLf

txtEdit = txtEdit & "lngValue2=vm.getvalue(" & Chr(34) & "Value2" & Chr(34) & ")" & vbCrLf

txtEdit = txtEdit & "lngValue3=CInt(lngValue1)" & strType & "CInt(lngValue2)" & vbCrLf

txtEdit = txtEdit & "vm.setvalue " & Chr(34) & "Value3" & Chr(34) & ",lngValue3 " & vbCrLf

'**函 數 名:cmdSCDemo2_Click

'**功能描述:對象操作示範

'**日 期:2004-10-15 13:41:23

Private Sub cmdSCDemo2_Click()

txtEdit = "dim lngC" & vbCrLf

txtEdit = txtEdit & "lngC=clng(fm.txtdemo.text)" & vbCrLf

txtEdit = txtEdit & "lngC=lngC+10" & vbCrLf

txtEdit = txtEdit & "if lngC>255 then lngC=0" & vbCrLf

txtEdit = txtEdit & "fm.picdemo.backcolor=rgb(lngC,0,0)" & vbCrLf

txtEdit = txtEdit & "fm.txtdemo.text=cstr(lngC)" & vbCrLf

'**函 數 名:Form_Load

'**功能描述:初始化

'**日 期:2004-10-15 11:13:03

Private Sub Form_Load()

'添加參數運用的 内部可使用的變名 外部實際變量名

scCommand.AddObject "vm", valMem, True

'向腳本添加外部可用的對象

'最後一個參數: True表示它的子類屬性方法在腳本中可以操作 false 表示今該對象本身的方法屬性可用

scCommand.AddObject "fm", Me, True

'腳本運作間隔設定

cmbRunTime.ListIndex = 0

'參數操作類型

cmbType.ListIndex = 0

'**函 數 名:tmrRun_Timer

'**功能描述:腳本運作

'**日 期:2004-10-15 11:29:46

Private Sub tmrRun_Timer()

On Error GoTo ToExit '打開錯誤陷阱

'------------------------------------------------

Dim i As Long

'參數輸入

valMem.SetValue "Value1", txtValue(0).Text

valMem.SetValue "Value2", txtValue(1).Text

'腳本運作

scCommand.ExecuteStatement txtEdit.Text

'參數輸出

lstValueOut.Clear

For i = 1 To valMem.Count

lstValueOut.AddItem valMem.GetValue("", i)

Next

Exit Sub

'----------------

ToExit:

txtError = "錯 誤 号:" & Err.Number & " 時間:" & Format(Now, "YYYY-MM-DD HH:MM:SS") & vbCrLf

txtError = txtError & "錯誤資訊:" & Err.Description & vbCrLf

txtError = txtError & "錯誤來源:" & Err.Source

3、添加一個子產品(mdlBase),裡面添加如下代碼:

'**模 塊 名:mdlBase

'**日 期:2004-10-15 11:10:58

'**描 述:公共變量區

Public valMem As New clsScriptIO '腳本語言參數交換的變量設定區

4、添加一個類(clsScriptIO),類名為clsScriptIO,裡面添加如下代碼:

'**模 塊 名:clsScriptIO

'**日 期:2004-10-15 11:56:32

'**描 述:與腳本語言參數互動的類子產品

Private cltScriptMem As New Collection '變量設定區

'**函 數 名:Count

'**輸 出:(Variant) -

'**功能描述:記憶體變量個數

'**日 期:2004-10-15 12:00:57

Public Property Get Count() As Variant

Count = cltScriptMem.Count

End Property

'**函 數 名:GetValue

'**輸 入:strKey(String) - 變量名稱

'** :Optional lngNo(Long = 0) - 變量索引

'**輸 出:(Variant) - 傳回值

'**功能描述:取得制定名稱的變量值

'**日 期:2004-10-15 12:01:59

Public Function GetValue(strKey As String, Optional lngNo As Long = 0) As Variant

If lngNo > 0 Then '如果輸入索引号,則傳回索引号指定的變量

GetValue = cltScriptMem.Item(lngNo)

GetValue = cltScriptMem.Item(strKey)

Exit Function

End Function

'**函 數 名:SetValue

'**輸 入:strKey(String) - 變量名

'** :value(Variant) - 設定變量

'**功能描述:為指定的變量指派

'**日 期:2004-10-15 12:07:05

Public Sub SetValue(strKey As String, value As Variant)

cltScriptMem.Remove (strKey)

cltScriptMem.Add value, strKey

Resume Next

'**函 數 名:DelValue

'** :Optional lngNo(Long = 0) -索引号

'**功能描述:删除制定的變量

'**日 期:2004-10-15 12:08:55

Public Sub DelValue(strKey As String, Optional lngNo As Long = 0)

If lngNo > 0 Then '如果輸入索引号,則删除索引号指定的變量

cltScriptMem.Remove (lngNo)

'**函 數 名:Clear

'**功能描述:删除變量

'**日 期:2004-10-15 13:15:15

Public Sub Clear()

While cltScriptMem.Count > 0

cltScriptMem.Remove (1)

Wend

  功能示範:

1、  參數傳遞(單擊【傳遞參數示範】按鈕,自動添加相應腳本代碼。可以執行加減乘除等操作。

 

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

2、對象操作(單擊【對象操作示範】按鈕,自動添加相應腳本代碼。可以執行控件的指派和背景色變化操作。

VBScript 使用 ActiveX(R)腳本與宿主應用程式對話。使用 ActiveX Script,浏覽器和其他宿主應用程式不再需要每個腳本部件的特殊內建代碼。ActiveX腳本使宿主可以編譯 Script、擷取和調用入口點及管理開發者可用的命名空間。通過 ActiveX Script,語言廠商可以建立标準腳本運作時語言。Microsoft 将提供 VBScript 的運作時支援。

繼續閱讀