ECLKeyNotify クラス

ECLKeyNotify は、抽象基本クラスです。アプリケーションは、このクラスの インスタンスを直接作成することはできません。アプリケーションでこのクラスを使用するには、ECLKeyNotify から派生した 独自のクラスを定義しなければなりません。アプリケーションは、 その派生クラス内に NotifyEvent() メンバー関数を実装しなければなりません。また、 オプションで NotifyError() および NotifyStop() メンバー関数を実装することも できます。

アプリケーションがキー・ストローク・イベントの通知を受けられるように するには、ECLKeyNotify クラスを使用します。またアプリケーションは、キー・ストロークをフィルターに掛ける (除去する) ことにより、キー・ストロークがホスト画面に送られないようにしたり、 キー・ストロークを他のキー・ストロークに置換したりすることができます。アプリケーションがすべてのキー・ストロークについて常に通知を受けられるようにするため、キー・ストローク通知がキューに入れられます。実際の物理キーボードで行われたキー・ストロークだけが、このオブジェクトで 検出されます。他の ECL オブジェクト (ECLPS::SendKeys など) からホストに送られた キー・ストロークの場合、キー・ストローク通知イベントは生じません。

アプリケーションがキー・ストローク・イベントの通知を受けるには、 次に示すステップを実行しなければなりません。
  1. ECLKeyNotify から派生したクラスを定義します。
  2. その派生クラスを採用し、NotifyEvent() メンバー関数を実装します。
  3. オプションで、NotifyError() または NotifyStop() 関数 (あるいはその両方) を 実装します。
  4. 派生クラスのインスタンスを作成します。
  5. そのインスタンスを ECLPS::RegisterKeyEvent() 関数で登録します。

ここに示された例は、それがどのように行われるかを例示しています。上記のステップを完了すると、エミュレーター・ウィンドウでの各キー・ストロークのたびに、 アプリケーションの NotifyEvent() メンバー関数が呼び出されます。この関数には、キー・ストロークのタイプ (プレーンな ASCII キーまたは 特殊ファンクション・キー) およびキーの値 (単一の ASCII 文字、または ファンクション・キーを表すキーワード) を示すパラメーターが渡されます。アプリケーションは、ECLPS::SendKeys() などの他の ECL 関数の呼び出しを含め、 NotifyEvent() プロシージャーで必要な任意の関数を実行できます。アプリケーションは、キー・ストロークをフィルターに掛けるかどうか (フィルターに掛ける (廃棄) する場合は 1 を戻し、通常に処理する場合は 0 を戻します) を 示すため NotifyEvent() から値を戻します。

キー・ストローク・イベントの生成時にエラーが検出された場合、 ECLErr オブジェクトを使用して NotifyError() メンバー関数が呼び出されます。エラーの特性に応じて、エラー後にキー・ストローク・イベントが続けて生成される かどうかが決まります。イベント生成が終了したとき (エラーか、ECLPS::UnregisterKeyEvent の呼び出しか、 または ECLPS オブジェクトの破棄のいずれかが原因で)、NotifyStop() メンバー関数が呼び出されます。イベント通知が終了するときには、NotifyStop() メンバー関数が常に呼び出され、 アプリケーション・オブジェクトの登録が抹消されます。

アプリケーションが NotifyError() メンバー関数の実装を行わない場合、 デフォルトの実装が使われます (単純なメッセージ・ボックスがユーザーに対して表示されます)。アプリケーションがデフォルトの振る舞いをオーバーライドするには、 アプリケーションの派生クラス内に NotifyError() 関数を実装します。同様に、アプリケーションがこの関数を提供しない場合、 デフォルトの NotifyStop() 関数が使われます (デフォルトの振る舞いでは何も行われません)。

またアプリケーションは、派生したクラス用に自身のコンストラクターおよび デストラクターを任意で提供できることに注意してください。これが便利なのは、 アプリケーションが特定のインスタンス別データをそのクラス内に保管してから、 その情報をコンストラクター上のパラメーターとして渡したい場合です。例えば、アプリケーションにおいて、キー・ストロークが発生したら アプリケーション・ウィンドウにメッセージをポストしたい場合があります。アプリケーションは、ウィンドウ・ハンドルをグローバル変数として定義する (このハンドルを、NotifyEvent() 関数に見えるようにするため) 代わりに、 ウィンドウ・ハンドルを受け取ってクラス・メンバーのデータ域に保管する クラス用のコンストラクターとして定義することができます。

アプリケーションは、イベントを受け取るために通知オブジェクトを 登録しているかぎり、そのオブジェクトを破棄してはなりません。

複数の接続でのキー・ストロークを受け取れるように、 キー・ストローク通知オブジェクトの同一のインスタンスを、 複数の ECLPS オブジェクトに登録することができます。つまり、アプリケーションは、このオブジェクトの 1 つのインスタンスを使用して、 さまざまなセッションにおいてキー・ストロークを処理できるということです。アプリケーションが別々の接続でのイベントをそれぞれ区別できるように、 イベントの発生対象の ECLPS オブジェクトを指すポインターがメンバー関数に渡されます。ここに示した例は、2 つの接続においてキー・ストロークを処理するために 同一のオブジェクトを使用しています。

実装上の制約事項: 現在、ECLPS オブジェクトでは、1 つの指定された接続に対して 1 つしか通知オブジェクトを登録できません。その ECLPS オブジェクト用に通知オブジェクトが既に登録されて いる場合、ECLPS::RegisterKeyEvent からエラーがスローされます。