Tivoli Service Desk 6.0 Developer's Toolkit TSD Script 言語解説書

イベント処理

メイン・ページに戻る


$Event

説明

この変数は、イベント・ハンドラーに対するイベント番号 (たとえば、 $MsgPaint などのメッセージ番号) を含む暗黙のパラメーターであり、イベント番号はハンドラーの現行呼び出し用のものです。

構文

適用されません。

ウィンドウ化された TSD Script アプリケーション中で、イベントはアプリケーションの基本的な影響力を表します。これらのイベントは、次のものを含む各種のソースから起こります。

イベントは、TSD Script によってイベント・ハンドラーに配布されます。さまざまな TSD Script ルーチン (ウィンドウまたはダイアログの作成など) によって、イベントの代行受信する、およびイベントへ反応するルーチンの指定を可能にします。

イベント・ハンドラーは、組み込み $Event パラメーターをアクセスします。$Event には、定義済みメッセージ定数の 1 つ、または TSD Script プログラマーにより定義されたメッセージ定数のどちらかを含みます。各メッセージ定数は、配布されるイベントのタイプを示します。

次も参照してください

イベントの詳細については、Tivoli Service Desk 6.0 Developer's Toolkit TSD Script プログラミングの手引き を参照してください


$EventParm

説明

イベント・ハンドラーがメッセージに組み込まれるエクストラ・パラメーターをアクセスできるよう許可します。

構文

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 には、現行のイベントを受け取るウィンドウのウィンドウ・ハンドルが入っています $Handle は、イベント・ハンドラーの中にだけ表示されます。

EVENT MyEvent(REF r: MyData);
  ACTIONS
     WHEN $Event IS $MsgCreate THEN
 WinSetIconBar($Handle,{'CREATE.ICO','DESTROY.ICO'}: LIST
 OF STRING);
...

$NullHandler

説明

イベント・ハンドラーを必要とするステートメントのイベント処理がないことを指定します。

構文

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;

次も参照してください


DelegateEvent

説明

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

説明

ウィンドウ・イベント・ハンドラーにメッセージを通知します。

構文

PostMessage( VAL whdl: WINDOW, VAL message: INTEGER,
 [ VAL msgParm: ANY ... ] ): INTEGER;

引き数の注

引き数名 説明
whdl ウィンドウのような、イベント処理オブジェクトのハンドル。
message PostMessage は、ウィンドウにメッセージを通知し、メッセージが送られるのを待たず、ただちに成功またはエラー・コードを戻します。メッセージは、ターゲット・ウィンドウの処理メッセージ待ち行列に追加されます。アプリケーションがイベント・ハンドラーを入力した時に、これが宛先ウィンドウにディスパッチされます。
メッセージ処理ループを含む Tivoli Service Desk Developer's Toolkit ステートメントは、次のとおりです。
  • DlgBox
  • WinFileDialog
  • WinMessageBox
  • WinWait
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

説明

ウィンドウまたはダイアログ・ボックスにメッセージを送ります。

構文

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 言語解説書

メイン・ページに戻る

著作権