Tivoli 服务台 6.0 开发工具包脚本程序设计指南

第 5 章:事件驱动程序设计

返回目录


简介

事件驱动程序设计用来为图形用户接口(GUI)平台和网络开发应用程序。TSD 脚本的用户接口工具主要是事件驱动。要说明事件驱动程序的概念,请查看为捕获来自用户的信息而设计的交互式程序中的事件序列:

  1. 应用程序创建带菜单的主窗口。
  2. 应用程序等待用户进行菜单选择。
  3. 用户从菜单选择命令(事件)。
  4. 应用程序响应用户请求。
  5. 应用程序等待。

定义

在事件驱动程序中,应用程序是个体窗口的集合。通过把个体窗口汇集成彼此对话的窗口的集合,建立应用程序。

每个窗口有与其相联系的例程,叫做事件处理器。当用户与窗口交互作用时,其事件处理器处理由该交互作用产生的事件。用户与计算机间的交互作用是动态的。即像需要的那样,事件或进程立即、同时发生。

面向对象的影响

经常使用基于对象的概念建立事件驱动程序:

鼓励重新使用封装的对象,因为不需要在每次使用时重新生成它们。

可以用与处理窗口和事件处理器同样的方法处理联网消息。即可把每个网络消息和每个网络连接当作封装的对象。请参见第 11 章,联网概念,获取关于 TSD 脚本联网功能的信息。

通过汇集一个或多个窗口对象,并允许它们通过传送消息的方法通信,来构造事件驱动应用程序。TSD 脚本有高效的工具,用于创建封装的窗口和传送消息。

事件处理器

在整个 TSD 脚本和开发工具包中都使用事件处理器,用以支持事件驱动环境。在事件驱动环境中,事件(如击键或鼠标点击)触发应用程序的相应响应(打开一个新对话框或选择字段中的一项)。要处理事件,每个应用程序使用为它们特别设计的事件处理器。当系统有事件要送给应用程序时,它调用事件处理器。单个对象或窗口可有多个事件处理器。

定义事件处理器

在 TSD 脚本程序的例程段定义事件处理器。要激活事件处理器,必须把它和事件源(如窗口、对话框或网络服务)相联系。

事件处理器特性

事件例程包括包括组成事件处理器的 TSD 脚本语句的集合。像过程和函数一样,事件处理器是 TSD 脚本语句的集合,包围在 ACTIONS...END 块中。像其它 TSD 脚本块一样,事件处理器也可包括:

事件处理器的特殊特性包括:

$Handle

句柄包括在 $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 的说明。它发现 MainEventContextRecord 类型的记录作为其形式自变量。这告诉 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 开发工具包脚本程序设计指南

返回目录

版权所有