Tivoli Service Desk 6.0 Developer's Toolkit TSD Script 言語解説書
この変数は、イベント・ハンドラーに対するイベント番号 (たとえば、 $MsgPaint などのメッセージ番号) を含む暗黙のパラメーターであり、イベント番号はハンドラーの現行呼び出し用のものです。
適用されません。
ウィンドウ化された TSD Script アプリケーション中で、イベントはアプリケーションの基本的な影響力を表します。これらのイベントは、次のものを含む各種のソースから起こります。
イベントは、TSD Script によってイベント・ハンドラーに配布されます。さまざまな TSD Script ルーチン (ウィンドウまたはダイアログの作成など) によって、イベントの代行受信する、およびイベントへ反応するルーチンの指定を可能にします。
イベント・ハンドラーは、組み込み $Event パラメーターをアクセスします。$Event には、定義済みメッセージ定数の 1 つ、または TSD Script プログラマーにより定義されたメッセージ定数のどちらかを含みます。各メッセージ定数は、配布されるイベントのタイプを示します。
イベントの詳細については、Tivoli Service Desk 6.0 Developer's Toolkit TSD Script プログラミングの手引き を参照してください
イベント・ハンドラーがメッセージに組み込まれるエクストラ・パラメーターをアクセスできるよう許可します。
FUNCTION $EventParm(n: INTEGER, type: DATATYPE): DATATYPE;
引き数名 | 説明 |
n | この引き数は、イベント・パラメーターを識別します。イベント・パラメーターは、1 から始まる番号が付けられます。 |
Type | これは、定義済みか、あるいはユーザー定義のデータ・タイプであり、参照パラメーターのデータ・タイプと一致します。ここで指定されたデータ・タイプがメッセージに送信側により渡されたパラメーターのものと一致しない場合には、実行時エラー・メッセージが表示されます。 |
TSD Script イベント・ハンドラーは、常に 3 つの固定パラメーターを受け取ります。1 つめは、ウィンドウ・インスタンス・レコードのコピーです。このパラメーターは、イベント・ハンドラーの宣言の中に明示的に反映されます。次の 2 つは、暗黙のパラメーター $Event および $Handle は、それぞれ処理されるイベント、およびイベントの原因となるウィンドウを識別します。
イベント・ハンドラーは、追加パラメーターの変数番号を受け取ることができます。特定のシステム・イベント ($MsgSize など) には、追加パラメーターとして渡される追加情報が付いてきます。
SendMessage ステートメントによって送られるユーザー定義のメッセージは、追加パラメーターを渡すことができます。送信側および受信側は、これらのパラメーターの番号、タイプ、および意味に同意しなければなりません。イベント・ハンドラーは、$EventParm 経由でこれらのイベント・パラメーターをアクセスすることができます。
$EventParm は、 2 つの引き数を使用: どのエクストラ・パラメーターを検索するかを識別する整数、および送られるパラメーターのデータ・タイプと一致する有効なデータ・タイプ。 エクストラ・パラメーターの変数番号はイベント・ハンドラーに送られますが、パラメーターの番号とタイプはイベント番号自身により暗黙に指示されなければなりません。
たとえば、ユーザー定義のイベントは、任意のウィンドウがその名前で他の任意のウィンドウを要求できるようセットアップすることが必要となる場合があります。名前フィールドは、すべてのウィンドウのインスタンス・データ中に存在し、初期設定データを通して渡されるとみなします。ユーザー定義のメッセージは、次のようなグローバル定数を定義することでセットアップすることができます。
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 Service Desk 6.0 Developer's Toolkit TSD Script プログラミングの手引き を参照してください
メッセージを受け取るウィンドウを識別するすべてのイベント・ハンドラーに渡される暗黙のパラメーター。
注意: $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,
(* ウィンドウは (*OS/2 デスクトップの子ウィンドウ *) whdl,
(* 新規ウィンドウのハンドルを 戻す *) $NullHandler,
(* デフォルト・イベント 処理 *) 5, 5, 80, 20,
(* ウィンドウの場所と サイズ *) 'Example',
(* ウィンドウの タイトル *) '',
(* デフォルト・フォントの 使用 *) 0,
(* ポイント・サイズは デフォルトにより無視される *) BitOr($WinTitle, $WinBorder, $WinSysMenu )); WinWait( whdl ); END;
1 つのイベント処理ルーチンから他へとイベントを処理するのを代行します。
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 Service Desk Developer's Toolkit ステートメントは、次のとおりです。
|
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 Script は、強力なメッセージ受け渡しアーキテクチャーを提供します。最も普通のメッセージの受け取り側は、ウィンドウまたはダイアログ・ボックスと関連付けられたイベント・ハンドラーです。
SendMessage は、そのハンドラーによりサービスされるオブジェクト・ハンドル (たとえば、ウィンドウ・ハンドル) を指定すると、イベント・ハンドラー中のイベントを開始することができます。 SendMessage に対する 2 つめの引き数は、 イベント・ハンドラーの $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 Service Desk 6.0 Developer's Toolkit TSD Script プログラミングの手引き を参照してください
Tivoli Service Desk 6.0 Developer's Toolkit TSD Script 言語解説書