Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き

第 5 章: イベント・ドリブン・プログラミング

目次に戻る


概要

イベント・ドリブン・プログラミングは、グラフィカル・ユーザー・インターフェース (GUI) プラットフォームおよびネットワークのアプリケーションを開発するために使用されます。 TSD Script のユーザー・インターフェース機能は、主としてイベント・ドリブンです。 イベント・ドリブン・プログラムの概念を図解するには、ユーザーから情報を取り込むために設計された対話式プログラムでイベントの順序を検討します。

  1. アプリケーションはメニューでメイン・ウィンドウを作成します。
  2. アプリケーションはユーザーがメニュー選択を行うのを待機します。
  3. ユーザーはメニュー (イベント) からコマンドを選択します。
  4. アプリケーションはユーザーの要求に応答します。
  5. アプリケーションは待機します。

定義

イベント・ドリブン・プログラムでは、アプリケーションは個々のウィンドウのコレクションです。 個々のウィンドウを相互に会話するウィンドウのコレクションにアセンブルすることによって、アプリケーションはビルドされます。

各ウィンドウには、イベント・ハンドラーと呼ばれるウィンドウと関連したルーチンがあります。 ユーザーがウィンドウで対話する時には、その対話によって生成されるイベントはイベント・ハンドラーが処理します。 ユーザーとコンピューターとの対話は動的です。つまり、イベントまたは処理が必要に応じて即時に平行して起こります。

オブジェクト指向の影響

イベント・ドリブン・プログラムは、オブジェクト基本の概念を使用して頻繁にビルドされます。

オブジェクトのカプセル化は、オブジェクトを使用する度に再作成する必要がないので、再利用を促します。

ネットワーキング・メッセージは、ウィンドウおよびイベント・ハンドラーを扱う場合と同じ方法で扱うことができます。 つまり、各ネットワーク・メッセージおよび各ネットワーク接続をカプセル化されたオブジェクトとして扱うことができます。 TSD Script のネットワーキング機能については、 第 11 章 ネットワーキングの概念を参照してください。

イベント・ドリブン・アプリケーションは、 1 つまたは複数のウィンドウ・オブジェクトをアセンブルし、メッセージを渡すことで通信できるようにすると構成されます。 TSD Script には、カプセル化されたウィンドウを作成してメッセージを渡すための有効な機能があります。

イベント・ハンドラー

イベント・ハンドラーは、イベント・ドリブン環境をサポートするために TSD Script および Developer's Toolkit 全体で使用されます。イベント・ドリブン環境では、イベント (たとえば、キーストロークまたはマウス・クリックなど) がアプリケーション (新規ダイアログ・ボックスのオープンまたはフィールドの項目の選択) によって適切な応答を起動します。 イベントを処理するには、各アプリケーションは特にそれ用に設計されたイベント・ハンドラーを使用します。 イベント・ハンドラーは、イベントをアプリケーションに送達する時に、システムによって呼び出されます。 単一のオブジェクトまたはウィンドウが、複数のイベント・ハンドラーをもつことができます。

イベント・ハンドラーの定義

TSD Script プログラムのルーチン・セクションでイベント・ハンドラーを定義します。 イベント・ハンドラーをアクティブ化するには、それがイベント・ソース (たとえば、ウィンドウ、ダイアログ・ボックス、またはネットワーク・サービスなど) と関連していなければなりません。

イベント・ハンドラー機能

イベント・ルーチンには、イベント・ハンドラーを作成する TSD Script ステートメントのコレクションが入っています。 プロシージャーおよび機能のように、イベント・ハンドラーは ACTIONS...END ブロックで囲まれた TSD Script ステートメントのコレクションです。 また、他の TSD Script ブロックのように、イベント・ハンドラーは次を入れることもできます。

イベント・ハンドラーの特殊機構には次が組み込まれます。

$Handle

ハンドルは $Handle パラメーターに入っていて、イベント・ウィンドウに渡されます。

$Handle は、メッセージを受け取るウィンドウまたはネットワーク接続を一意的に識別する各イベント・ハンドラーに渡される暗黙のパラメーターです。

暗黙のパラメーター

イベント・パラメーターの受け取り

イベント・ハンドラーは、イベントを通知される度に重要な次の 2 つの情報を受け取ります。

ハンドルは、イベント・ハンドラーを宣言する方法によっては、別のウィンドウ・ハンドルまたはネットワーク・ハンドルである可能性があります。

イベント特定の情報

$Handle および $Event の他に、イベント・ハンドラーは特定のイベントに関した追加情報を受け取ることができます。

たとえば、 $MsgSize イベントには次の 2 つの追加データが付属します。

これらの追加情報は、常に $EventParm イベントを介してアクセスできます。 $EventParm には次の 2 つの引き数があります。

そのため、 $EventParm(1,Integer) のように表すことよって、 $MsgSize イベントの処理中に新規ウィンドウの幅を入手できます。

ショートカット機能は、システム定義メッセージのイベント・パラメーターの多くに対して存在します。 その他の暗黙のパラメーターは、フォームに対して存在します。

インスタンス・データ

イベント・ハンドラーを処理する時には、インスタンス・データも処理します。これは、特定のウィンドウまたはネットワーク接続と関連したデータです。 この章の最後にあるサンプル・アプリケーションに示すように、インスタンス・データは通常はレコードです。 インスタンス・データはウィンドウによって所有され、ウィンドウがオープンしている間だけ存在します。

インスタンス・データの内容は、ウィンドウ WinCreate を作成するための呼び出しで初期化することができます。 例:

WinCreate($Desktop,context.mainWindow,
          MainEvent {context}, 
          1,1,100,30,'Main Window Title', 
          BitOr($WinBorder,$WinResize,
                $WinTitle,$WinSysMenu, 
                $WinMinMax,$WinIconBar,$WinTaskList)); 

イベント・ハンドラーとインスタンス・データ

最後のセクションにあるようなステートメントを処理する時には、 TSD Script は示されたイベント・ハンドラー MainEvent の宣言を調べます。 MainEvent が正式な引き数としてタイプ ContextRecord のレコードを使用していることがわかります。 これは、新規ウィンドウのインスタンス・データにある ContextRecord 用に十分なスペースを確保することを TSD Script に通知します。

次に、 TSD Script は WinCreate ステートメントのイベント・ハンドラー名の右を調べます。 そこでは初期化形式 - {context} がわかります。 この初期化フォームによって、コンテキスト・レコード変数の内容がウィンドウのインスタンス・データに複写されます。

注: このフォームで表示される変数は、イベント・ハンドラーの正式な引き数と同じタイプでなければなりません。

イベント・ハンドラーは、呼び出される度にウィンドウ・インスタンス・データに対する参照を受け取ります。 この方法で、イベント・ハンドラーはインスタンス・データの現在の内容を検査し、変更を行うことができます。 類似の初期化処理は、イベント・ハンドラー (たとえばネットワーク接続) を使用する他の非 Windows インターフェース・オブジェクトに使用可能です。

ウィンドウ・インスタンス・データとイベント・ハンドラーの組み合わせは、 TSD Script ウィンドウおよびネットワーク接続をカプセル化されたオブジェクトのように動作させます。 これの実際的な含意は次の通りです。

注: TSD Script プログラムでグローバル変数を使用しないでください。 その代わりにウィンドウ・インスタンス・データおよびメッセージ・パスを使用し、プログラムを介して情報を広めます。

現在アイテムの保守

現在アイテムを保守したいと仮定します。これを行う方法には、少なくとも次の 3 つがあります。

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 (* Main Event *); 

この例では、 MainEvent が拡張されて QUERY_CURRENT_ID イベントの検査を追加します。 そのようなイベントを検出すると、MainEvent は current_ID フィールドの値を、メイン・ウィンドウのインスタンス・データから、呼び出し元によって 3 番目の引き数として SendMessage に渡されたストリング変数にコピーします。これは、実際には最初のイベント・パラメーターです。呼び出し元がその SendMessage コマンドを終了した後に、 3 番目の引き数には MainEvent によって割り当てられた値が入ります。


Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き

目次に戻る

著作権