Tivoli 服务台 6.0 开发工具包 TSD 脚本语言参考
该变量是一个隐式参数,包含事件处理器的事件数值(例如,像 $MsgPaint 这样的消息数值等),用于处理器的当前调用。
不可用。
在窗口化 TSD TSD 脚本应用程序中,事件代表应用程序的主要作用。这些事件来自一系列源,其中包括:
TSD TSD 脚本将事件发送给事件处理器。各种 TSD TSD 脚本例行程序(例如,那些创建窗口或对话框的例行程序)允许用户指定例行程序截取并对事件作出反应。
事件处理器访问内置的 $Event 参数。$Event 要么包含预定义消息常量之一,要么包含由 TSD TSD 脚本程序员定义的消息常量。各个消息常量指示所发送事件的类型。
有关事件的其他信息,请参见 Tivoli 服务台 6.0 开发工具包 TSD 脚本编程指南。
允许事件处理器访问消息中包含的附加参数。
FUNCTION $EventParm(n: INTEGER, type: DATATYPE): DATATYPE;
自变量名称 | 说明 |
n | 该自变量标识事件参数。事件参数的编号从 1 开始。 |
Type | 这是预定义或用户定义的数据类型,与被引用参数的数据类型相对应。如果在这里指定的数据类型跟消息发送者传送的参数不匹配,将显示一个运行时错误消息。 |
TSD 脚本事件处理器一直接收三个固定的参数。第一个是窗口实例记录的拷贝。该参数被显式地反映在事件处理器声明中。另外两个是隐式参数: $Event 和 $Handle,它们分别标识要处理的事件和引发该事件的窗口。
事件处理器可以接收附加参数的变量数值。某些系统事件(例如,$MsgSize)伴随有附加信息,它们作为附加参数而传送。
由 SendMessage 语句发送的用户定义的消息可以传送附加参数。发送者和接收者必须同意这些参数的数值、类型和含义。事件处理器通过 $EventParm 来访问这些事件参数。
$EventParm 有两个自变量:一个标识要检索的附加参数的整数,以及一个跟被发送参数的数据类型相匹配的有效数据类型。尽管可以向事件处理器发送附加参数的变量数值,但事件数值本身必须包含参数的数值和类型。
例如,可以设置一个用户定义的事件,以便任何窗口都可以请求其他任何窗口的名称。假定每个窗口的实例数据中都存在一个名称字段,并且该字段是通过初始化数据传送的,则可以通过像下例那样定义一个全局常量来设置用户定义的消息:
CONSTANTS QUERY_WINDOW_NAME IS $MsgUser+1;
之后,只要给定一个窗口句柄,就可以通过下述方式获得该窗口的名称:
VARIABLES window_name: String; ACTIONS SendMessage(some_window,QUERY_WINDOW_NAME,window_name);
每个窗口都必须具有下列事件处理器:
ACTIONS WHEN $Event IS ... ... ELSWHEN QUERY_WINDOW_NAME THEN $EventParm (1,String):=myData.myName; ELSWHEN ...
EVENT MyEvent(REF r: MyRecord); VARIABLES width, height: INTEGER; ACTIONS WHEN $Event IS $MsgSize THEN width:=$EventParm(1,Integer); height:=$EventParm(2,Integer); ...
关于事件的其他信息,请参见 Tivoli 服务台 6.0 开发工具包 TSD 脚本编程指南。
传送给每个事件处理器的隐式参数,用于标识接收消息的窗口。
注意:$Handle 始终包含接收当前事件的窗口的窗口句柄。$Handle 只出现在事件处理器里。
EVENT MyEvent(REF r: MyData); ACTIONS WHEN $Event IS $MsgCreate THEN WinSetIconBar($Handle,{'CREATE.ICO','DESTROY.ICO'}: LIST OF STRING); ...
指定对需要一个事件处理器的语句不进行事件处理。
EVENT $NullHandler{initializationData}: INTEGER;
自变量名称 | 说明 |
initilizationData | 此自变量是可选的。如果有,它将创建跟它本身是同一种类型的实例数据。该实例数据将被初始化为此自变量的值。 |
$NullHandler 所用的语法跟用于事件处理器的所有美圆值所用的语法相同。
KNOWLEDGEBASE Desktop; ROUTINES PROCEDURE Example; PRIVATE ROUTINES (* Create a scroll window parented by the desktop with default event processing *) PROCEDURE Example IS VARIABLES whdl: WINDOW; ACTIONS WinCreateScrollWindow($Desktop,
(* Window is a child of (*OS/2 desktop *) whdl,
(* return handle of new window *) $NullHandler,
(* Default event processing *) 5, 5, 80, 20,
(* Window location and size *) 'Example',
(* Window title *) '',
(* Use default font *) 0,
(* Point size is ignored for default *) BitOr($WinTitle, $WinBorder, $WinSysMenu )); WinWait( whdl ); END;
代表从一个事件处理例行程序到另一个事件处理例行程序的事件处理。
FUNCTION DelegateEvent ( VAL handler: EVENT, [ REF userData: ANY ] ): INTEGER;
自变量名称 | 说明 |
handler | 事件处理函数的名称。 |
userData | 引用传递给指定事件处理函数的变量。 |
注意:对 DelegateEvent 函数的调用必须在事件处理例行程序的域中进行。
通常,几个对话框或其他消息处理对象以同样的方式处理相同类型的数据,并响应许多相同的消息。DelegateEvent 可用于避免每个这类对象在消息处理例行程序中重复相同的代码。
DelegateEvent 调用指定的事件处理例行程序,并传送所有来自包入处理器的伪参数(即 $Event、$Handle 和所有 $EventParm 参数)。如果指定的处理器使用显式参数来作为用户数据,并且在 DelegateEvent 调用中没有指定参数,则将按缺省情况传送传送给包入处理器的用户数据。
KNOWLEDGEBASE Test; ROUTINES PROCEDURE Main; PRIVATE TYPES BaseData IS RECORD f1: INTEGER; f2: STRING; END; DerivedData IS RECORD base: BaseData; f3: REAL; END; CONSTANTS MSG_ONE IS $MsgUser + 1; MSG_TWO IS $MsgUser + 2; MSG_THREE IS $MsgUser + 3; ROUTINES EVENT BaseHandler (REF userData: BaseData) IS ACTIONS WHEN $Event IS MSG_ONE THEN userData.f1 := $EventParm(1, INTEGER); WinWriteLn($Handle, 'f1 set to [' & userData.f1 &']'); ELSWHEN MSG_TWO THEN userData.f2 := $EventParm(1, STRING); WinWriteLn($Handle, 'f2 set to [' & userData.f2 & ']'); END; END; EVENT DerivedHandler (REF userData: DerivedData) IS ACTIONS WHEN $Event IS MSG_THREE THEN userData.f3 := $EventParm(1, REAL); WinWriteLn($Handle, 'f3 set to [' & userData.f3 & ']'); ELSE $Result := DelegateEvent(BaseHandler, userData.base); END; END; PROCEDURE Main IS VARIABLES w: WINDOW; ACTIONS IF 0 > WinCreateScrollWindow($Desktop, w, DerivedHandler, 10, 10, 80, 25, 'Test', $Courier, 8, $WinDefaultStyle) THEN EXIT; END; WinWriteLn(w, 'Ready to send MSG_ONE.'); SendMessage(w, MSG_ONE, 37); WinWriteLn(w, 'Ready to send MSG_TWO.'); SendMessage(w, MSG_TWO, 'I''m pink, therefore I''m Spam.'); WinWriteLn(w, 'Ready to send MSG_THREE.'); SendMessage(w, MSG_THREE, $Pi); WinWriteLn(w, 'Test complete.'); SendMessage(w, $MsgClose); END; END;
从 DelegateEvent 返回的整数值是调用的事件处理器返回的值。返回值的语义随 $Event 消息而变化。
向窗口事件处理器传送一个消息。
PostMessage( VAL whdl: WINDOW, VAL message: INTEGER, [ VAL msgParm: ANY ... ] ): INTEGER;
自变量名称 | 说明 |
whdl | 事件处理对象(例如,窗口)的句柄。 |
message | PostMessage 向窗口传送消息,并立即返回一个成功或错误消息,而不等待消息的发出。消息将添加到目标窗口的消息处理队列。在应用程序进入事件处理器时,它被分配到目标窗口。 包含消息处理回路的 Tivoli 服务台开发工具包语句是:
|
messageParameters | 任意值。传送者和接收者都有责任同意要传送的消息参数的类型、顺序和数值。所有参数都是按值来传送的。 |
KNOWLEDGEBASE PostMsg; ROUTINES PROCEDURE PostMessageExample; PRIVATE CONSTANTS menuList IS { 'Options', 'Post message', 'Exit' }: LIST OF STRING; ROUTINES EVENT PostMessageEvent( REF whdlTarget: WINDOW ) IS VARIABLES i: INTEGER; ACTIONS WHEN $Event IS $MsgCreate THEN WinSetMenuBar( $Handle, menuList ); ELSWHEN $MsgMenu THEN WHEN $MenuSelection IS 101 THEN FOR i := 1 TO 5 DO WinWriteLN( $Handle, 'Posting message #' & i ); PostMessage( whdlTarget, $MsgUser + i ); END; WinWriteLN( $Handle ); WinWriteLN( $Handle, 'Wait in for 5 seconds' ); WinWriteLN( $Handle ); SysDelay( 5000 ); ELSWHEN 102 THEN SendMessage( $Handle, $MsgClose ); SendMessage( whdlTarget, $MsgClose ); END; ELSE IF $Event = $MsgUser THEN WinWriteLN( $Handle, 'Received target window handle' ); whdlTarget := $EventParm( 1, WINDOW ); ELSIF $Event > $MsgUser THEN WinWriteLN( $Handle, 'Received message #' & $Event - $MsgUser ); END; END; NOTHING; END; PROCEDURE PostMessageExample IS VARIABLES whdl1: WINDOW; whdl2: WINDOW; ACTIONS WinCreateScrollWindow( $Desktop, whdl1, PostMessageEvent{whdl1 }, 0, 0, 40, 25, 'Post message Window 1', $TimesRoman, 14, BitOr($WinBorder, $WinTitle, $WinMenu, $WinAutoPos ) ); WinCreateScrollWindow( $Desktop, whdl2, PostMessageEvent{ whdl2 }, 0, 0, 40, 25, 'Post message Window 1', $TimesRoman, 14, BitOr($WinBorder, $WinTitle, $WinMenu, $WinVScroll, $WinAutoPos ) ); PostMessage( whdl1, $MsgUser, whdl2 ); PostMessage( whdl2, $MsgUser, whdl1 ); WinWait( whdl1 ); END;
返回码 | 说明 |
>0 | 成功 |
0 | 消息投递失败 |
-1 | 窗口句柄不引用一个有效的窗口。该窗口可能不再存在或不支持该命令。 |
-2 | 未知值 |
-9 | 错误的语法 |
-11 | 值超出范围 |
向窗口或对话框发送一个消息。
SendMessage( VAL whdl: WINDOW, VAL message: INTEGER, [ VAL or REF messageParm: ANY ... ] ): INTEGER;
自变量名称 | 说明 |
whdl | 事件处理对象(例如,窗口)的句柄。 |
Message | 要发送的消息。 |
messageParm | 一个任意类型的表达式的变量数值。接收事件处理器可以通过 $EventParm 值访问这些表达式。 |
TSD 脚本具有一种强健的消息传送结构。最常见的消息接收者是跟窗口或对话框关联的事件处理器。
SendMessage 可以在事件处理器中启动事件,该事件处理器有一个它服务的对象句柄(例如,窗口句柄)。SendMessage 的第二个自变量映射到事件处理器的 $Event 参数。以后的自变量映射到事件处理器中的事件参数。
事件处理器访问这些自变量的方法是调用 $EventParm、提供自变量号码(1 到 n) 和该自变量的数据类型。如果发送者传送了一个可赋值的值(例如一个变量),则将自动地采用引用传递。否则将采用值传递。SendMessage 的作用类似于一个函数调用,因为在事件处理器处理完该消息并返回之前,控制并不返回到 SendMessage 调用的下一句。
调用的例行程序将暂停,直到事件处理器返回为止。事件处理器的返回值是 SendMessage 返回的值。
GLOBALS.KB ---------- CONSTANTS ADD_WINDOW_TO_LIST IS $MsgUser+1; REMOVE_WINDOW_FROM_LIST IS $MsgUser+2; VARIABLES mainWindow: WINDOW; SENDER.KB --------- USES Globals; ROUTINES EVENT MyEvent(REF r: MyRecord); ACTIONS WHEN $Event IS $MsgCreate THEN SendMessage(mainWindow,ADD_WINDOW_TO_LIST, $Handle); ELSWHEN $MsgDestroy THEN SendMessage(mainWindow, REMOVE_WINDOW_FROM_LIST,$Handle); ... MAIN.KB ------- USES Globals; TYPES MainRecord IS RECORD ... openList: LIST OF WINDOW; END; ROUTINES EVENT MainEvent(REF r: MainRecord); ACTIONS WHEN $Event IS ... ... ELSWHEN ADD_WINDOW_TO_LIST THEN ListInsert(r.openList,$EventParm(1,Window)); ELSWHEN REMOVE_WINDOW_FROM_LIST THEN ListDelete(r.openList,$EventParm(1,Window));
返回码 | 说明 |
事件处理器返回值 | 事件处理器的返回值是 SendMessage 返回的值。 |
-1 | 窗口句柄不引用一个有效的窗口。该窗口可能不再存在或不支持该命令。 |
-2 | 未知值 |
-9 | 错误的语法 |
-11 | 值超出范围 |
有关事件处理器的信息,请参见 Tivoli 服务台 6.0 开发工具包 TSD 脚本编程指南。
Tivoli 服务台 6.0 开发工具包 TSD 脚本语言参考