Script.NET 1.0版本的Tcl+Html界面编程原理

Script.NET的很多界面都是采用的Tcl+Html的方式编写的,现在越来越多的本地应用程序中都采用了类似的html作为界面表现形式的方法,例如: Visual Studio 7以上的起始页面、Outlook的起始页面、QQ程序中的很多界面、
CodeGear Delphi for PHP的起始页面等等。
我觉得用Html做本地界面有下面几个好处:
1、Html界面通过Javascript、图片等修饰之后可以做的很漂亮,而且很方便就可以做到各种动态效果;
2、代码简单,并且有大量可以参考的例子,用C++写一大堆代码可能Html只有短短的几行就可以做到了;
3、修改方便,改一下页面文件就可以马上看到效果。

当然也有很多缺点:
1、本地代码和页面之间的交互比较困难;
2、有时候本地代码很简单可以实现的,在Html中可能很复杂或者基本无法实现,对于这部分代码可以在本地代码中实现,由Html来调用;
3、页面的局部刷新比较困难(如果要解决可以参考AJAX的思路)。

Script.NET从1.0版本开始就已经大量采用了这种编程方法,并封装了一个简单的Tcl库,我在自己负责开发的几个项目中都应用了这种方法。Script.NET 2.0版本中对这种方法进一步完善,封装了一整套本地web界面开发的类库(TclFace),关于TclFace的详细原理和用法以后会详细说明,下面主要介绍Script.NET 1.0中的TPageMake界面生成类。

Script.NET页面编程是指在Script.NET环境下编写基于Html页面的应用,这和动态网页(ASP/PHP/JSP等) 的概念有些类似,不同的是动态网页是基于网络的应用,动态网页脚本是在服务器端运行的,由服务器端脚本生成WEB页面之后送到客户端浏览。Script.NET页面编程则是完全在客户端运行的一种动态网页,由Script.NET客户端的某种脚本(目前只支持Tcl脚本)直接在客户端生成页面,然后在Script.NET中浏览。这种客户端动态生成页面的好处是可以不用花费很大的精力去编写各种复杂的界面,而是一律用页面的形式来表示各种界面,因为Html页面内容非常丰富,可以满足各种复杂界面需求,而且界面风格统一,可以象做网页那样做出非常好看的界面,修改起来也非常方便,工作量相比C++来说应该会小一些。

Script.NET页面编程的原理是将通过Html模板和用户数据来生成页面,生成一个页面需要由模板文件、用户脚本、用户数据、页面生成器几个部分来配合完成。模板文件就是Html页面的模板,一般是由网页开发人员先创作一个原型页面,然后将原型页面改造为模板,改造的方法是按照Script.NET页面模板的要求在页面中加一些特殊标记。用户数据可能是来源于用户的某个数据库或别的地方,例如做一个日志的页面应用,则用户数据就是日志数据库,对数据库的读写操作可以通过ADO等方式,Script.NET 中封装了一个Tcl的ADO模块,可以方便的通过Tcl脚本来访问各种数据库。用户脚本负责将模板和用户数据组合在一起生成最终的页面,页面生成器则负责最终的页面生成,是被用户脚本来调用的。

一般来说一个页面对应了两个模板文件,后缀分别是.tph和.tpf,.tph文件是原型页面经过改造后的文件,生成的页面就是在tph文件的基础上替换其中一些标记和生成的,tpf文件是一些标记的替换集合,存储的是每一种标记对应的一段替换文本,这些替换文本也可以存在其他的标记,实际上如果不要tpf文件也是可行的,但是这样就要把替换内容都写到生成脚本中,灵活性就会降低,因为如果写到 tpf文件中,则只要修改tpf文件中的替换内容,就可以修改生成的页面的风格。

tph文件中替换标记的格式为"%标记名%",也就是用两个%包围的一个标记名字,例如下面这一段中的 %TABLE_ALL%:


	  <TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
		%TABLE_ALL%
	  </TABLE>

tpf文件中每一个用于替换的段落用[替换名]...内容...[/替换名]来表示,在各个替换段之间可以有注释,注释的格式为#开头的文字,例如下面这一段就是tpf文件中的一个替换段,替换名为TR_VAR_LINE,并且其中还可以有替换标记:


# 用于表示变量的表格行
[TR_VAR_LINE]
	<TR>
	  <TD class=text_all bgColor=#ffffff>%NAME%</TD>
	  <TD class=text_all bgColor=#ffffff>%VALUE%</TD>
	</TR>
[/TR_VAR_LINE]

可以参考FtpClient演示工程中的FTP页面的模板文件。

页面生成器为一个iTcl类,类定义如下:


#-------------------------------------------------------------
# TPageMake class define
#-------------------------------------------------------------
::itcl::class  TPageMake {
	constructor {targetHtml templateHtml templateFile} {};
	destructor {};
	
	### data member ###
	private variable _targetHtml;	#目标页面
	private variable _templateHtml;	#模板页面
	private variable _templateFile;	#模板文件
	private variable _tclTr;		#存储Tr的Tcl内部变量
	private variable _targetVarList;#存储目标页面中所有变量
	
	### public methods ###
	#添加表格项到内部标记变量_tclTr
	public method  AppendItemFromTpf {tagTr {names ""} {values ""}}
	
	#标记段存储到目标缓冲区中
	public method  SaveToTargetBuf {tagTr {cleartag "-cleartag"}}
	
	#替换目标缓冲区中的一个标记
	public method  ReplaceTargetTr {tagTr replaceTr}
	
	#创建目标页面
	public method  MakeTargetHtml {}
	
	#从目标页面中读取所有变量信息
	public method  LoadTargetHtmlVar {}
	
	#将指定变量信息写入目标缓冲区
	public method  SaveTargetVar {varName varValue}
	
	#获取目标页面中指定变量的值
	public method  GetTargetVar {varName}
}

构造函数的参数有3个,分别为要生成的目标页面文件、tph文件和tpf文件。除了一些用于生成页面的函数之外,这个类还有一些函数用于存取目标页面中存储的一些变量,这些变量存放在html文件的注释中,这样对页面是没有任何影响的,之所以提供在页面中存储变量的方法,是因为这种页面编程中,脚本的作用创建页面,一旦一个页面创建完成,则脚本就会结束,而脚本解释器中的内部状态信息等变量也会随着脚本的结束而消失,下一次生成页面再调用脚本的时候也就无法记住以前的信息,但有时候我们确实需要获得以前的信息,例如FTP应用中需要记住FTP的地址和上一次的访问路径,因此才提供了这种在页面中保存变量的方法,在脚本结束之前把变量存储在目标页面的注释中,下一次启动脚本以后就可以从页面中读取上一次存储的信息。存储的变量的格式为如下:


<!-- varName=varValue -->

下面是一个页面编程的应用实例,tph模板文件如下:


<HTML><HEAD><TITLE>表格演示</TITLE>
<BODY>
<TABLE>
%TABLE_ALL%
</TABLE>
</BODY>
</HTML>

其中%TABLE_ALL%是用于替换的标记,这个例子中tph文件已经搭了一个表格的框架,只要填内容就可以了,因此我们的目的就是将%TABLE_ALL%替换为一个表格的内容。

tpf模板文件如下:


# 表格的标题行
[TABLE_WITH_TITLE]
<TR>
	<TD>%COL1%</TD>
	<TD>%COL2%</TD>
</TR>
%ROW%
[/TABLE_WITH_TITLE]

# 表格行
[TABLE_ROW]
<TR>
	<TD>%COL1%</TD>
	<TD>%COL2%</TD>
</TR>
[/TABLE_ROW]

这里有两种替换段,分别是表格的标题和内容。

生成脚本的例子如下:


source "$platform_path/lib/plat/pagemake.tcl";

#-------------------------------------------------------------
#	main
#-------------------------------------------------------------
if {[itcl_info objects pageMake -class TPageMake] != "pageMake"} {
	set _htmlCurrentFile "$platform_path/Samples/page/demo1.htm"
	TPageMake pageMake  "$ _htmlCurrentFile" /
         "$platform_path/Samples/page/demo1.tph" /
         "$platform_path/Samples/page/demo1.tpf";
}
# 创建标题行
set value [list "列1" "列2" "%TABLE_ROW%"];
pageMake AppendItemFromTpf "TABLE_WITH_TITLE" {"COL1" "COL2" "ROW"} $value;
pageMake SaveToTargetBuf "TABLE_ALL" -append;
# 创建表格内容行
set value [list "1-1" "1-2"];
pageMake AppendItemFromTpf "TABLE_ROW" {"COL1" "COL2"} $value;
set value [list "2-1" "2-2"];
pageMake AppendItemFromTpf "TABLE_ROW" {"COL1" "COL2"} $value;
pageMake SaveToTargetBuf "TABLE_ROW";
# 存储到缓冲区
pageMake SaveToTargetBuf "TABLE_ALL";
# 生成页面
pageMake MakeTargetHtml;
# 释放生成器
::itcl::delete object pageMake;
::itcl::delete class TPageMake;
# 设置页面转移
set _htmlNewURL "$platform_path/Samples/page/demo1.htm";

最后创建的页面如下所示:

列1列2
1-11-2
2-12-2

 Script.NET 1.0采用Tcl+Html的方式编写的一些界面截图如下:

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Script.NET是通用的脚本语言开发平台,目前支持Tcl、Python、Lua、NSIS脚本的开发,支持脚本语言的开发、运行、调试、编译、生成可执行文件等功能。Script.NET采用类似于Eclipse的插件化开发方式,大部分功能都以插件的形式提供,可以灵活扩展,除了用于脚本开发之外,也可以扩展为各种富客户端应用程序。<br>Script.NET从2000年开始开发,发布过V1.0和V2.0两个大版本,经过8年的不断优化完善,目前在架构方面已经比较合理,完善的插件机制,使得Script.NET平台可以非常容易的扩展更多的功能。可以访问主页 http://www.blueantstudio.net 了解更多信息。<br><br>Script.NET V2.0.2版本开始将基础平台和脚本开发包分离,此处下载的是基础运行平台,要使用某种脚本语言的开发功能,可以到蓝蚂蚁工作室网站下载相应语言的开发包,下载地址:<br>http://www.blueantstudio.net/scriptnet/download/download.htm<br><br>Script.NET主要功能特性如下: <br>1、编辑、调试、运行tcl、python、lua脚本; <br>2、脚本的编译/加密和生成可执行文件(每种脚本语言支持的程度不同); <br>3、效率分析等辅助功能(目前只有tcl脚本支持了此功能); <br>4、关键字帮助,通过F1键或鼠标移动到关键字上,获取详细的帮助信息; <br>5、收集了较多的脚本扩展包、帮助文档和演示程序,目前tcl的扩展包收集较多,其他脚本也正在收集完善,除了常用的tk、wx、pmw,还有图象、多媒体、界面库等很多各种各样的扩展包,以后我们打算通过在线更新的方式使用户可以更方便的获取到各种扩展包; <br>6、附带了ftp、代码统计、正则表达式等一些扩展工具; <br>7、采用灵活的可扩展架构,整个系统可以灵活的扩展各种解释器、界面组件、工具、工程、界面风格等; <br>8、支持控制台功能(目前仅有tcl控制台、telnet控制台、串口控制台可用,其他脚本控制台正在开发); <br>9、Script.NET作为一个通用平台对外提供了很多接口,可以通过脚本等方式调用平台的各种功能,其中的tcl语言支持很多平台扩展命令,可以通过tcl操纵平台的各种功能,对平台进行扩展; <br>10、封装的TclFace页面扩展包,可以通过面向对象的tcl脚本生成各种平台的页面功能。
Script.NET是蓝蚂蚁工作室开发的一套用于Tcl/Python/Ruby/Lua/NSIS 等脚本语言开发的集成开发环境,刚刚发布的2.1.1版本新增了Ruby脚本的支持,可以支持Ruby脚本的开发、调试、生成可执行文件、控制台等功能,可以支持wxRuby、RubyTk等界面库,目前还不支持Rails的调试,后续版本会不断完善。 下载地址和详细介绍请请参考蓝蚂蚁工作室的主页: http://www.blueantstudio.net Script.NET主要功能特性如下: 1、编辑、调试、运行tcl、python、lua、ruby脚本; 2、脚本的编译/加密和生成可执行文件(每种脚本语言支持的程度不同); 3、效率分析等辅助功能(目前只有tcl脚本支持了此功能); 4、关键字帮助,通过F1键或鼠标移动到关键字上,获取详细的帮助信息; 5、收集了较多的脚本扩展包、帮助文档和演示程序,目前tcl的扩展包收集较多,其他脚本也正在收集完善,除了常用的tk、wx、pmw,还有图象、多媒体、界面库等很多各种各样的扩展包,以后我们打算通过在线更新的方式使用户可以更方便的获取到各种扩展包; 6、附带了ftp、代码统计、正则表达式等一些扩展工具; 7、采用灵活的可扩展架构,整个系统可以灵活的扩展各种解释器、界面组件、工具、工程、界面风格等; 8、支持控制台功能(目前支持tcl/python/lua/ruby控制台、telnet控制台、串口控制台可用,其他脚本控制台正在开发); 9、Script.NET作为一个通用平台对外提供了很多接口,可以通过脚本等方式调用平台的各种功能,其中的tcl语言支持很多平台扩展命令,可以通过tcl操纵平台的各种功能,对平台进行扩展; 10、封装的TclFace页面扩展包,可以通过面向对象的tcl脚本生成各种平台的页面功能,此扩展包除了可以用于本地应用程序生成页面之外,还可以运行于AOLServer WEB服务器,作为一种类似于JSF的服务器端脚本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值