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

第 7 章: フォーム・システム

目次に戻る


概要

定義

TSD Script は記述 (リソース) ファイルからウィンドウ作成するために使用されるフォーム・システムを提供します。

フォームはデータ入力フォームのタイプが入っているウィンドウです。GUI 環境では、フォームは、ユーザーとアプリケーションとの間で対話するための主要な手段です。開発者は、ツールバーからコントロールを選択して、それをブランク・フォームに入れます。 フォーム・コントロールには次があります。

フォーム・コントロール

フォーム・コントロールは、ユーザーから情報を得るため、またはユーザーに情報を送るために使用される要素です。たとえば、データ入力フォームには通常は 1 つまたは複数のテキスト・ボックス・コントロール、「了解」ボタン、および「取消」ボタンがあります。 Developer's Toolkit Interface Designer は、フォームにコントロールを追加するために使用することができます (詳細説明については、 Tivoli Service Desk 6.0 Developer's Toolkit Interface Designer の手引き を参照してください) 。

次のリストには、 TSD Script によってサポートされるすべてのフォーム・コントロールが入っています。

コントロール名 説明
サブフォーム 他のいくつかのコントロールを含む複雑なコントロール
テキスト・ボックス ユーザーが 1 行の情報を入力することができる長方形の領域。 ユーザーが 1 行に適するテキストよりも長く入力すると、ボックスは自動的にスクロールします。
複数行テキスト・ボックス 複数行のテキストを入力するために使用される長方形の領域。オプションでテキストをボックス内部でワード・ラップすることができます。
リスト・ボックス 選択可能項目のリストが入った方形のボックス。 ユーザーはリスト・ボックスで選択を入力することはできません。
コンボ・ボックス リスト・ボックスが付加されたテキスト・ボックス。ユーザーはテキスト・ボックスに値を入力するか、またはドロップダウン・リストで値を選択できます。 選択された値はテキスト・ボックスに表示されて、リスト・ボックスは消えます。
ツリー 階層データを表示するコントロール。
オプション・ボタン 相互排他的な選択項目のセットの 1 つを選択するために使用されるボタン。 ユーザーがボタンを選択すると、そのボタンは埋め込みされます。
チェック・ボックス オプションをオンまたはオフにするために選択またはクリアできるオプションが入った正方形のボックス。 複数のチェック・ボックスを 1 度に選択することができます。
スライダー 対話式に移動するバー。
ボタン アクションを開始する長方形のボタン。
テキスト テキストを表示するフィールド。ユーザーはテキストを変更できません。
クロック 実行時刻クロックまたは経過時間カウンター機構。
テーブル 行および列で構造化されたデータ。
ハイパーテキスト ハイパーテキスト・フォーマットでテキストを表示する領域。
グループ・ボックス いくつかのコントロールを意味または機能別にグループ化した長方形フレーム。
イメージ ファイルからのイメージを表示するフィールド。

フォーム・ファイル

フォームは別個のアプリケーション・リソースとして保守されます。 Developer's Toolkit によってフォーム仕様のコレクションを作成し、それを .df の拡張子を付けたファイルに保管することができます。知識ベース・ファイルと同様に、そのような仕様に対してソース・フォームおよびオブジェクト・フォームの両方があります。 .df ファイルにはメニュー、ツールバー、およびストリングが使用できます。

インターフェース生成プログラムは、ソース .df ファイルを使用してオブジェクト .dfc ファイルを作成する TSD Script プログラムです。 .dfc ファイルは Developer's Toolkit によって実行時にロードおよび表示されます。

サンプル・フォーム・コード

次の TSD Script コード断片化の例はフォームを使用します。

  TYPES 
    EmployeeRecord IS RECORD 
      first, last, ssn : STRING; 
      salary : REAL; 
      department : STRING; 
       END; 
      VARIABLES 
      employee: EmployeeRecord; 
   ACTIONS 
  IF DlgBox($Desktop,'EMPLOYEE.DFC[ADDFORM]',
            $NullHandler,employee) > 0 THEN 
        SQLInsert('EMPLOYEES',employee); 
       END; 

この例では、新規 EmployeeRecord タイプはタイプ・セクションで宣言されています。 また、変数セクションにもこのタイプの変数があります。 レコード・フィールド名はフォーム・コントロール名と同じです。

アクションのセクションにある DlgBox ステートメントは、次を実行します。

また、フォームには一般的に「了解」ボタンおよび「取消」ボタンがあります。

DlgBox ステートメント引き数

DlgBox ステートメントは次の 4 つの引き数を使用します。

引き数のタイトル 説明
親ウィンドウ 新規フォームの親であるウィンドウに対するハンドル。
フォーム・ファイル コンパイルされたフォーム仕様ファイルの名前。ファイルに複数のフォーム仕様が入っている場合には、
必要なフォームの名前をファイル名の次に大括弧で囲む必要があります。
イベント・ハンドラー 前に説明した一般ウィンドウと同様に、すべてのフォームにはそれと関連したイベント・ハンドラーがあります。

時には、ハンドラーに各イベントのデフォルト・アクションを実行させたい場合があります。その場合には、
$NullHandler を指定することができます。この場合には、$NullHandler によってユーザーはフォーム・コントロールからフォーム・コントロールに移動し、
値をフォームに入力することができます。

ユーザーが「受諾」プロパティーをもつボタンを選択すると、 TSD Script はフォーム・コントロールの内容を結果変数にある対応するフィールドに、
自動的にコピーします。

結果変数 フォームのコントロールに対応するフィールドをもつレコード変数。

ユーザーが「受諾」プロパティーをもつボタンを押してフォームを終了すると、フォームのすべてのコントロールの内容が、
レコード変数の対応するフィールドにコピーされます。これで、レコード変数のデータベースへの書き込み、ウィンドウへの表示が可能になり、
また、すべてがアプリケーションに該当するようになります。

DlgBox 例

別の例を考えてみます。

  TYPES 
    EmployeeRecord IS RECORD 
      first, last, ssn : STRING; 
      salary : REAL; 
      department : STRING; 
       END; 
      VARIABLES 
      employee: EmployeeRecord; 
   ACTIONS 
  SQLSelectInto('SELECT * FROM EMPLOYEES WHERE 
              SSN=305-33-4111',employee); 
  IF DlgBox($Desktop,'EMPLOYEE.DFC[EDITFORM]',
            $NullHandler{employee},employee) >> 0 THEN 
    SQLUpdate('EMPLOYEES','WHERE SSN=''' & 
            employee.snn & '''',employee); 
       END; 

この例では次のコードを表示します。

この DlgBox ステートメントに対して 2 つの変更を行いました。

この例では、ユーザーはフォームの EMPLOYEES テーブルから検索された情報を参照し、フォームに移動して情報を変更できます。

フォーム・イベント・ハンドラー

拡張機能 (ユーザーがボタンを選択すると従業員の写真を表示したり、社会保障番号のフォーマットを妥当性検査するなど) を操作するには、イベント・ハンドラーを使用しなければなりません。 これを行うには、フォーム・イベント・ハンドラーを作成する必要があります。

イベント・ハンドラー例

このセクションでは、イベント・ハンドラーをもつフォームを説明します。この例では、従業員と呼ばれる知識ベース全体を表示します。従業員は AddEmployee と呼ばれる単一の共通機能を設定します。 AddEmployee の本文は前の例と類似していますが、 $NullHandler を使用する代わりに、 EmployeeEvent と呼ばれるイベント・ハンドラーを参照します。

KNOWLEDGEBASE Employees; 
  USES 
  Globals; 
  TYPES 
    EmployeeRecord IS RECORD 
      first, last, ssn : STRING; 
      salary : REAL; 
      department : STRING; 
          END; 
    ROUTINES 
    FUNCTION AddEmployee: BOOLEAN; 
PRIVATE 
    ROUTINES 
    EVENT EmployeeEvent(REF employee: 
                        EmployeeRecord) IS 
    ROUTINES 
      FUNCTION ValidSSN(VAL ssn: STRING): BOOLEAN IS 
      VARIABLES 
        i: INTEGER; 
   ACTIONS 
        IF StrLength(ssn) <> 11 THEN 
        EXIT(FALSE); 
       END; 
        FOR i:=1 TO 11 DO 
          IF (i = 4 OR i = 7) AND (ssn[i] <> '-') THEN 
        EXIT(FALSE); 
          ELSIF StrPos('0123456789',ssn[i]) = 0 THEN 
        EXIT(FALSE); 
       END; 
       END; 
        EXIT(TRUE); 
      END (* Valid SSN *); 
       ACTIONS 
WHEN $Event IS $MsgSelect THEN 
        WHEN $FieldName IS 'SSN' THEN 
          IF NOT ValidSSN(employee.ssn) THEN 
            Exit(0); 
       END; 
        ELSWHEN 'PICTURE_BUTTON' THEN 
          ShowPicture(employee.last_name & '.BMP'); 
       END; 
       END; 
    END (* Employee Event *); 
    FUNCTION AddEmployee: BOOLEAN IS 
      VARIABLES 
      employee: EmployeeRecord; 
   ACTIONS 
      IF DlgBox(mainWindow, 'EMPLOYEE.DFC[ADDFORM]',
                EmployeeEvent{employee},employee) > 0 THEN 
        SQLInsert('EMPLOYEES',employee); 
        EXIT(TRUE); 
      ELSE 
        EXIT(FALSE); 
       END; 
    END (* Add Employee *); 

EmployeeEvent は、DlgBox で渡された戻り変数と同じタイプの参照による単一パス・パラメーターを使用するイベント・ハンドラーです。

イベント・ハンドラーがテストするのはイベント $MsgSelect 1 つだけであり、フォームがカーソルを現行コントロールの外側に移動しようとする時に生成されます。

ユーザーが値をテキスト・コントロールに入力して TAB キーを押すと、 $MsgSelect イベントが生成されます。 ユーザーが離れようとしているコントロールの名前は、このイベントと一緒に $FieldName と呼ばれる「不可視の」パラメーター中に入ります。

次の例は EmployeeEvent の本文でさらに詳しく説明します。

WHEN $Event IS $MsgSelect THEN 
        WHEN $FieldName IS 'SSN' THEN 
          IF NOT ValidSSN(employee.ssn) THEN 
            Exit(0); 
       END; 
        ELSWHEN 'PICTURE_BUTTON' THEN 
          ShowPicture(employee.last_name & '.BMP'); 
       END; 
       END; 

この例は次を図示します。

デフォルトの結果は "1," であり、これは正常に実行されたことを示します。ただし、異なる値を戻す必要がある場合があります。

$MsgSelect イベント

TSD Script が自動的に生成する特定のイベントは、イベント・ハンドラーが値 0 で終了すると拒否されます。 $MsgSelect はそのようなイベントです。

EmployeeEventSSN フィールドの $MsgSelect イベントを処理中に無効な社会保障番号が指定されたことを検出すると、値 0 で終了されます。

このオカレンスはイベントの拒否として知られます。この拒否の結果は、次の 2 つになります。

$MsgSelect イベントの生成

通常は、 $MsgSelect イベントはフォームの一部が変更されたことを通知します。 $MsgSelect は次の 3 つの方法の 1 つで生成できます。

注: $MsgSelect が生成されるのは、新しい値が古い値とは異なる時だけです。

注: ENTER を押すことは、デフォルト・コマンド・ボタン (定義されている場合) を選択することと同じです。 これは $MsgAccept イベントを生成します。 デフォルト・コマンド・ボタンがない場合には、 $MsgSelect イベントが生成されます。

イベント・ハンドラーが $MsgSelect イベントを受け取ると、ウィンドウ・インスタンス・データ (イベント・ハンドラーがそのレコード引き数で参照する) が更新されて変更を反映します。たとえば、ユーザーが値を SSN テキスト・ボックスに入力して TAB キーを押すと、値はウィンドウ・インスタンス変数の SSN フィールドにコピーされて $MsgSelect イベントが生成されます。 前のフィールド値は最初の名前なしイベント・パラメーターで使用可能です。

コントロールの値は選択メッセージが完了するまで未定義であり、そのためにコントロール値は照会できません。

その他のフォーム・イベント

フォームは次のような多数の追加イベントを生成できます。

フォーム・イベント 説明
$MsgInitialize フォームの作成段階中にだけ起こる $MsgSelect の特殊バージョン。
$MsgCreate フォームが表示される直前に受け取ります。この時点は、選択可能項目のリストをリスト・ボックスに追加するなど、
初期化の実行に適しています。
$MsgDestroy フォームがクローズされる直前に受け取ります。
$MsgAccept ユーザーがフォームを受け入れる時 (通常は ENTER を押すか「了解」を選択する) に受け取ります。
$MsgCancel ユーザーがフォームを取り消す時 (通常は ESCAPE を押すか「取消」を選択する) に受け取ります。
$MsgEnterField カーソルが新しいコントロールを指定しようとする時に受け取ります。 $FieldName には
新しいコントロールの名前が入っています。
$MsgExitField カーソルがコントロールを離れようとする時に受け取ります。 $FieldName にはそのコントロールの名前が入っています。
$MsgHelp ユーザーが HELP または F1 キーを選択する時に受け取ります。
$MsgMandField 1 つまたは複数の必須テキスト入力ボックスが埋まっていない状態で、ユーザーがフォームを受け入れようとする時に受け取ります。

$FieldName には、ブランクになっている最初の必須テキスト入力ボックスの名前が入っています。デフォルトでは、システムにより
ユーザーに問題を通知するメッセージが表示されます。このボックスを表示しないようにするには 0 を戻します。

フォーム・コントロール名

フォームの各コントロールには名前があります。前の例では、フォームはタイプ EmployeeRecord の変数を埋めるために必要な情報を得るために使用されました。レコードに FIRST_NAME と呼ばれるフィールドがあるために、 FIRST_NAME と呼ばれるフォーム・コントロールも必要です。 ユーザーが値を FIRST_NAME フォーム・コントロールに入力すると、情報は FIRST_NAME レコード・フィールドにコピーされます。

注: 一部のコントロールはデータを運びません。たとえば、コマンド・ボタンは値をもたず、イベントを生成します。 そのために、フォームのボタンにはレコード・フィールドをもたせる必要はありません。

追加のコントロール属性

次のフォーム・コントロールの追加の属性を指定できます。

属性 説明
読み取り専用 コントロールのデータは、ウィンドウ・インスタンス・レコードによって初期化され、ユーザーによって変更できません。
必須 すべての必須コントロールに値が指定されるまで、ユーザーはフォームを受け入れることができません。
入力長 ユーザーがテキスト・フィールドでコントロールに入力できる文字数を指定します。

特定のコントロールだけに影響するその他の属性があります。たとえば、複数行テキスト・ボックスのワード・ラップをオンまたはオフにすることができます。

テーブル

説明

テーブルは SQL 結果テーブルを表示するために使用されるウィンドウです。 SQL 結果テーブルは行と列のセットです。

テーブルはフォーム・コントロールとして使用され、次を行うことができます。

テーブル内部の列はサイズ変更可能です。細い垂直バーが隣接する列を分離し、ユーザーはこのバーを位置変更して列の幅を変更できます。

選択ステートメントは .df ファイルまたは方針に基づいて指定される場合があります。

ステートメント 説明
DlgSQLSelect このステートメントによって、 TSD Script は指示された SQL 照会を出し、指示されたテーブル・コントロールの内容を照会の結果で最新表示することができます。

このステートメントは次の 3 つの引き数を使用します。

  • フォームのウィンドウ・ハンドル
  • テーブル・コントロールの名前
  • SQLSelect ステートメントを表示しているストリング式

これはデータベースからテーブル・コントロールにデータを得るための最も有効な方法です。

DlgFieldValue このステートメントは選択された行を検索するために使用できます。
このステートメントは次の 3 つの引き数を使用します。
  • フォーム・ウィンドウ・ハンドル
  • コントロール名
  • 強調表示された行から情報を受け取るレコード変数

その行からの列が同じ名前のレコード・フィールドにコピーされます (たとえば、 "FIRST_NAME" 列は r.FIRST_NAME にコピーされます) 。

DlgListBoxInsert このステートメントは新しい行をテーブルに挿入します。 このコマンドは SQLInsert ステートメントを実行しませんが、新しい行を指示されたフォーム・コントロールに追加します。

このステートメントは次の 3 つの引き数を使用します。

  • フォーム・ウィンドウ・ハンドル
  • コントロール名
  • フィールドがテーブルの列名と一致するレコード変数

突き合わせ値は該当する列にコピーされ、列が一致しないレコード・フィールドは無視されます。

DlgListBoxUpdate このステートメントはテーブルで選択された行を更新します。このコマンドは SQLUpdate ステートメントを実行しませんが、フォームの情報を更新します。

このステートメントは次の 3 つの引き数を使用します。

  • フォーム・ウィンドウ・ハンドル
  • コントロール名
  • フィールドがテーブル・コントロールの列名と一致するレコード変数。

突き合わせ値は該当する列にコピーされます。列が一致しないレコード・フィールドは無視されます。

DlgListBoxDelete このステートメントはテーブル・コントロールで選択された行を削除します。このコマンドは SQLDelete 操作を実行しませんが、フォーム・ウィンドウの指示されたコントロールから行を消去します。

このステートメントには、次の 2 つの引き数があります。

  • フォーム・ウィンドウ・ハンドル
  • テーブル・コントロールの名前

テーブルの例

この例は WorkWithUsers と呼ばれる単一の共通プロシージャーをもつ Users と呼ばれる知識ベースを作成します。

KNOWLEDGEBASE Users; 
  TYPES 
    UserRecord IS RECORD 
      $Select : String; 
      user_ID : String; 
      user_name : String; 
      user_rights : Integer; 
       END; 
    ROUTINES 
    PROCEDURE WorkWithUsers; 
PRIVATE 
    ROUTINES 
    EVENT UserEvent(REF user: UserRecord) IS; 
      VARIABLES 
      i: Integer; 
    ROUTINES 
      PROCEDURE AddUser IS; 
      VARIABLES 
        newUser: UserRecord; 
   ACTIONS 
        IF DlgBox($Desktop,'USERS.DFC[ADDFORM]',$NullEvent,
           newUser) > 0 AND 
           SQLInsert('USERS',newUser) > 0 THEN
           DlgListBoxInsert($Handle,'USERLIST',newUser); 
       END; 
     END (* Add User *); 
     PROCEDURE EditUser IS; 
   ACTIONS 
       IF DlgFieldValue($Handle,'USERLIST',user) 
          > 0 AND 
          DlgBox($Desktop,'USERS.DFC[ADDFORM]',$NullEvent
         {user},user) > 0 AND 
         SQLUpdate('USERS','USER_ID=''' 
          user.user_ID & '''',user) > 0 THEN 
          DlgListBoxUpdate($Handle,'USERLIST',user);
       END; 
     END (* Edit User *); 
     PROCEDURE DeleteUser IS; 
   ACTIONS 
       IF DlgFieldValue($Handle,'USERLIST',user) > 0 AND 
          SQLDelete('USERS','USER_ID='''&user.user_ID&'''')
              > 0 THEN 
          DlgListBoxDelete($Handle,'USERLIST',user);
       END; 
     END (* Delete User *); 
      ACTIONS 
     WHEN $Event IS $MsgCreate THEN 
       DlgSQLSelect($Handle,'USERLIST',user.$select);
     ELSWHEN $MsgSelect THEN 
       WHEN $FieldName IS 'ADD_BUTTON' THEN 
         AddUser; 
       ELSWHEN 'EDIT_BUTTON' THEN 
         EditUser; 
       ELSWHEN 'DELETE_BUTTON' THEN 
         DeleteUser; 
       END; 
       END; 
   END (* User Event *); 
   PROCEDURE WorkWithUsers IS; 
      VARIABLES 
     UserWindow: WINDOW; 
     user: UserRecord; 
   ACTIONS 
     user.$select = 'SELECT * FROM USERS'; 
     DlgCreate($Desktop,userWindow,
               'USERS.DFC [WORKWITHUSERS]',
               UserEvent{user}); 
   END (* Work With Users *); 

例の説明

WorkWithUsers の役割は、次のコントロールでフォームを作成することです。

フォームの UserEvent イベント・ハンドラーは次のイベントを処理します。

テーブルが保持するのは、その列記述によって指定された情報だけです。 これは SQL 結果テーブルに入っている列のサブセットである可能性があります。 DlgFieldValue コマンドを使用してテーブル・コントロールから行を検索する時には、そのコントロールの列に対応するフィールドだけが戻されます。 残りのレコードを完了するには、 SQLSelectInto または SQLSelect を実行する必要がある場合があります。

フォームの作成

TSD Script は、次のいくつかのステップを行う処理で新しいフォームを作成します。

注: レコード・インスタンス変数のデータは、フォーム・ファイルで指定された初期値を上書きします。

モーダル・フォーム

モーダル・フォームは、先に進む前にユーザーがフォームを受け入れるか取り消すのをプログラムが待つフォームです。 モーダル・ダイアログ・ボックスが表示され、その他のウィンドウは選択できません。

モーダル・フォームは DlgBox で作成されます。 DlgBox の次のステートメントは、ユーザーが作成するフォームを完了するまで実行されません。 ユーザーによって指定される情報は、 DlgBox に対する 4 番目の引き数に戻されます。 これは出力レコード変数です。

モーダル・フォームは、重要なエラー・メッセージまたはユーザーが照会を応答しなければ続行できないクリティカル・ダイアログ・ボックス用に最初に予約される必要があります。 フォームのこのタイプの例は、ファイル削除に関連するメッセージである場合があります。

モードレス・フォーム

モードレス (非モーダル) ・フォームは、先に進む前にアプリケーションがユーザーを待たないフォームです。 これは、フォームを表示中に他のウィンドウに切り替えできることを意味します。

モードレス・フォームは DlgCreate で作成されます。 DlgCreate に呼び出しを行う時には、フォームの作成の処理がモーションに設定されます。 ただし、次のステートメントの実行は同時に起こります。

新しいフォームには、それ固有のユーザー・インターフェースとプログラム (イベント・ ハンドラー) があります。これは、ユーザーがフォームを受け入れるか取り消すまで、あるいはアプリケーションの別のパーツがクローズ・メッセージ ($MsgClose) を送るまで存在します。

注: イベント・ドリブン・プログラミングでは、モードレス・フォーム好まれます。

タブ操作されたフォーム

TSD Script は、タブ操作された「ページ」をもつ特殊なフォームを提供します。ページからページに移動するには、ユーザーはタブを選択します。

1 つまたは複数のフォームを結合して指定することにより、 Developer's Toolkit Interface Designer でタブ操作されたフォームを作成します。 実行時には、これらのフォームを使用できるのはフォームの他のタイプを実行する時だけです。 DlgBox または DlgCreate で作成することができます。 そのイベントを管理するために、イベント・ハンドラーを作成することができます。

タブ操作されたフォームを処理する時には、次に気を付けてください。


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

目次に戻る

著作権