Tivoli 服务台 6.0 开发工具包脚本程序设计指南
事件驱动程序设计用来为图形用户接口(GUI)平台和网络开发应用程序。TSD 脚本的用户接口工具主要是事件驱动。要说明事件驱动程序的概念,请查看为捕获来自用户的信息而设计的交互式程序中的事件序列:
在事件驱动程序中,应用程序是个体窗口的集合。通过把个体窗口汇集成彼此对话的窗口的集合,建立应用程序。
每个窗口有与其相联系的例程,叫做事件处理器。当用户与窗口交互作用时,其事件处理器处理由该交互作用产生的事件。用户与计算机间的交互作用是动态的。即像需要的那样,事件或进程立即、同时发生。
经常使用基于对象的概念建立事件驱动程序:
鼓励重新使用封装的对象,因为不需要在每次使用时重新生成它们。
可以用与处理窗口和事件处理器同样的方法处理联网消息。即可把每个网络消息和每个网络连接当作封装的对象。请参见第 11 章,联网概念,获取关于 TSD 脚本联网功能的信息。
通过汇集一个或多个窗口对象,并允许它们通过传送消息的方法通信,来构造事件驱动应用程序。TSD 脚本有高效的工具,用于创建封装的窗口和传送消息。
在整个 TSD 脚本和开发工具包中都使用事件处理器,用以支持事件驱动环境。在事件驱动环境中,事件(如击键或鼠标点击)触发应用程序的相应响应(打开一个新对话框或选择字段中的一项)。要处理事件,每个应用程序使用为它们特别设计的事件处理器。当系统有事件要送给应用程序时,它调用事件处理器。单个对象或窗口可有多个事件处理器。
在 TSD 脚本程序的例程段定义事件处理器。要激活事件处理器,必须把它和事件源(如窗口、对话框或网络服务)相联系。
事件例程包括包括组成事件处理器的 TSD 脚本语句的集合。像过程和函数一样,事件处理器是 TSD 脚本语句的集合,包围在 ACTIONS...END 块中。像其它 TSD 脚本块一样,事件处理器也可包括:
事件处理器的特殊特性包括:
句柄包括在 $Handle 参数中,并传送给事件窗口。
$Handle 是隐式参数,它传送给每个事件处理器,用来唯一地标识接收消息的窗口或网络连接。
每当通知事件处理器有事件时,事件处理器接收两条重要信息:
句柄可以是另一个窗口句柄或网络句柄,这取决于说明事件处理器时采用的方法。
除了 $Handle 和 $Event,事件处理器可接收关于特定事件的附加信息。
例如,$MsgSize 事件带有两个附加的数据:
总可通过 $EventParm 事件访问这些附加信息。$EventParm 有两个自变量:
因此,在处理 $MsgSize 事件期间,像 $EventParm(1,Integer)这样的表达式允许您获取新窗口的宽度。
对很多系统定义消息的事件参数都有快捷方式函数。对表格有其它隐式参数。
当用户使用事件处理器时,也使用实例数据。这是与特别窗口或网络连接相联系的数据。如在本章末的实例应用程序中所示,实例数据通常是记录。实例数据属于窗口,并且只要窗口打开就存在。
在创建窗口的调用 WinCreate 中,可以初始化实例数据的内容。例如:
WinCreate($Desktop,context.mainWindow, MainEvent {context}, 1,1,100,30,'Main Window Title', BitOr($WinBorder,$WinResize, $WinTitle,$WinSysMenu, $WinMinMax,$WinIconBar,$WinTaskList));
当 TSD 脚本处理像上一段中的语句这样的语句时,它查看指示的事件处理器 MainEvent 的说明。它发现 MainEvent 把 ContextRecord 类型的记录作为其形式自变量。这告诉 TSD 脚本在新窗口的实例数据中为 ContextRecord 保留足够的空间。
然后 TSD 脚本查看 WinCreate 语句中事件处理器名称的右侧。在那里,它找到初始化表格 - {context}。此初始化表格导致把 context 记录变量的内容复制到窗口的实例数据中。
注释:出现在此表格中的变量必须与事件处理器的形式自变量的类型相同。
每当调用事件处理器,它都收到对窗口实例数据的引用。以这种方法,事件处理器可检查实例数据的当前内容并更改它。类似的初始化进程对于使用事件处理器的其他非窗口接口对象(如网络连接)是可用的。
窗口实例数据和事件处理器的组合使 TSD 脚本窗口和网络连接的行为像封装的对象。其实际含义是:
注释:在 TSD 脚本程序中避免使用全局变量。而使用窗口实例数据和消息传送以在程序中传播信息。
假使用户要维护当前项。至少有三种方法可达到此目的:
SendMessage(mainWindow,QUERY_CURRENT_ID,current_ID);
QUERY_CURRENT_ID 需要是一个全局常量如:
CONSTANTS QUERY_CURRENT_ID IS $MsgUser+1;
主窗口需要能处理此消息,如下所示:
EVENT MainEvent(REF context: ContextRecord) IS VARIABLES iconList: List of String; ACTIONS WHEN $Event IS $MsgCreate THEN iconList:={'ADDINV.ICO','SRCHINV.ICO', 'REPORTS.ICO'): LIST OF STRING; WinSetIconBar($Handle,iconList); ELSWHEN $MsgSelect THEN WHEN $EventParm(1,Integer) IS 1 THEN CreateAddWindow; ELSWHEN 2 THEN CreateSearchWindow; ELSWHEN 3 THEN CreateReportWindow; END; ELSWHEN QUERY_CURRENT_ID THEN $EventParm(1,String):=context.current_ID; END; END (* 主事件 *);
在此实例中,增强 MainEvent 以添加 QUERY_CURRENT_ID 事件的检查。当 MainEvent 检测到这样的事件时,它会将主窗口实例数据中的 current_ID 字段的值复制到调用者传送给 SendMessage 的第三个自变量的字符串变量中,current_ID 字段的值实际上是第一事件参数。调用者结束其 SendMessage 命令后,第三个自变量包括 MainEvent 赋给它的值。
Tivoli 服务台 6.0 开发工具包脚本程序设计指南