首页 > temp > 简明python教程 >
-
C#发现之旅第十四讲 基于动态编译的VB.NET脚本引擎(3)
编辑脚本
工具条上有一个“编辑脚本”的按钮,该按钮是点击事件处理过程为
/// <summary> /// 编辑脚本按钮事件处理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnLoadScript_Click(object sender, EventArgs e) { //显示脚本文本编辑对话框 using (dlgEditScript dlg = new dlgEditScript()) { int VersionBack = myVBAEngine.ScriptVersion; dlg.VBAEngine = this.myVBAEngine; dlg.ShowDialog(this); if( VersionBack != myVBAEngine.ScriptVersion ) { // 若脚本引擎内容发生改变则刷新脚本方法下拉菜单项目 RefreshScriptMethodList(); } } } |
这段代码中使用了脚本引擎的ScriptVersion属性,脚本引擎中每进行一次编译时都会更新因此ScriptVersion属性,因此比较该属性可以判断脚本引擎中当前执行的脚本代码是否修改过。【袁永福原创,转载请注明出处】
dlgEditScript是一个脚本代码编辑对话框,其用户界面如下
运行脚本
该文本编辑器中,只能点击工具条的“运行脚本”的下拉菜单的某个项目才能运行脚本方法。在属性该下拉菜单的RefreshScriptMethodList中为每个菜单项目的点击事件绑定了ScriptItem_Click方法,该ScriptItem_Click代码为
/// <summary> /// 运行脚本的下拉菜单项目点击事件处理 /// </summary> /// <param name="sender"></param> /// <param name="args"></param> private void ScriptItem_Click(object sender, System.EventArgs args) { ToolStripMenuItem item = (ToolStripMenuItem)sender; try { // 调用脚本执行指定名称的脚本方法 myVBAEngine.Execute(item.Text, null, true); } catch (Exception ext) { System.Console.WriteLine("执行脚本 " + item.Text + " 错误:" + ext.ToString()); MessageBox.Show(this, "执行脚本 " + item.Text + " 错误:" + ext.Message); } } |
ScriptItem_Click方法中,首先获得用户点击的菜单项目,然后调用脚本引擎的Execute方法来执行脚本,菜单项目显示的文本就是脚本方法的名称。
演示用脚本代码说明
程序目录下有一个demo.vbs的文本文件,该文件内容就是演示实用的VBA.NET脚本。该脚本代码为
sub 显示当前使用的脚本代码() document.text = window.engine.ScriptText end sub
sub 插入当前时间() document.Selection = DateTime.Now().ToString("yyyy年MM月dd日HH:mm:ss") end sub
sub 屏幕状态() window.alert("屏幕大小:" & window.ScreenWidth & " * " & window.ScreenHeight _ & vbcrlf & "窗体位置:" & window.left & " " & window.top _ & vbcrlf & "窗体大小:" & window.Width & " * " & window.height ) end sub
sub ShowText() window.alert( document.text ) end sub
sub MoveWindow() window.left = 100 end sub
sub ShowFileName() window.alert( "当前文件名为:" & document.FileName ) end sub
sub AniMoveWindow() window.left = window.left - 10 if( window.left > 10 ) window.SetTimeout( 500 , "AniMoveWindow" ) end if end sub
dim Rate as double sub 模拟显示正铉曲线() Rate = Rate + 0.1 if( Rate > 50 ) exit sub end if dim strText as new string( " " , 50 + cint( math.sin( Rate ) * 30 )) document.AppendText( vbcrlf & strText & "######" ) window.SetTimeout( 100 , "模拟显示正铉曲线") window.Title = math.sin( Rate ) end sub
dim strTitle as string = "《C#发现之旅》系列课程的VB.NET脚本演示袁永福编写版权所有2008年" dim TitleCount as integer sub 在标题栏显示移动字幕() TitleCount = TitleCount + 1 if( TitleCount > strTitle.Length ) TitleCount = 0 exit sub end if window.Title = strTitle.SubString( strTitle.Length - TitleCount , TitleCount ) window.SetTimeOut( 100 , "在标题栏显示移动字幕") end sub |
这里说明一下“模拟显示正铉曲线”这个脚本方法,首先定义一个Rate的全局变量作为计数器,每执行一次该计数器加一,若超过50则退出方法,脚本中使用sin函数计算出空白字符串的长度生成一个空白字符串,然后使用文档对象的AppendText方法向当前编辑的文档添加空白字符和结尾字符,这里脚本调用window对象的SetTimeout方法来延期调用这个脚本方法自己。于是这个脚本方法每隔100毫秒执行一次,并使用文本模拟显示正铉曲线,若显示了50次则停止执行。
这样袁某就完成了一个简单的文本编辑器程序,而且该程序能使用VBA.NET脚本引擎来扩展功能,能方便的进行二次开发。
部署脚本引擎
在实际开发中,开发人员可以将XVBAEngine等C#代码拷贝到应用程序中即可添加脚本功能,也可以将修改本C#工程的属性使其单独编译成一个DLL然后供其他.NET程序使用。部署起来非常方便。
小结
在本次课程中,笔者使用动态编译技术实现了VBA.NET脚本引擎,目前很多商业软件,比如OFFICE,VS.NET等等都具有二次开发用的VBA脚本技术,使用本课程介绍的知识我们也可以为应用系统配置功能强大的脚本引擎,这能比较大的提高应用系统的灵活性。脚本引擎技术是一个非常实用的软件开发技术,值得推广。