Q5:データベース接続複合コンポーネント内部のイベント番号について
Q5-1:
データベース接続複合コンポーネント内部のイベント番号についてですが、今までのチュートリアルと違ってここではイベント番号を分岐(区別)に使っています。
チュートリアルP.8の下辺りに「フレームが閉じられた時にアクションイベントがイベント番号0で発生するように設定しました」とあります。
この時のイベント番号は、単なる分岐のためだけじゃなくて、フレームからイベントが発生する条件がフレームが閉じた時で、その時のイベント番号が0だからということでしょうか?書いていて日本語が良く分からなくなってしまったのでもう少し説明します。
コンポーネントリファレンスのフレームを見ると、フレームが閉じた時に左にあるフレームコンポーネントからイベント番号0でアクションが発生します。
今の場合はフレームコンポーネントが複合コンポーネントの中にあるので、フレームをイベント番号0で上の階層に伝えているのかな、と思います。
ここでのイベント番号は分岐の0とフレームからアクションが繋がるための0の両方を兼ねているという理解でしょうか?
データベース接続フレーム複合コンポーネントからイベント番号0で繋がれているものが2経路あり、フレームが閉じた時だけ左から右に処理が走るはずですし、なんか良く分からなくなってきました。
ボタンコンポーネントは押した時にアクションが発生するから、それを上位の階層に伝えて、対応するイベント番号(1か2)のところに進むはずです。
フレームコンポーネントはフレームが閉じた時にアクションが発生するのでその時にアクションを上位階層に伝えてイベント番号0の処理をするということで合っている気もしますが、何か抜けている気もします^^;
分岐と通常のイベント番号の使い分けが多分良く分かってないのだと思いますが。
A5-1:
下位の階層から上位の階層へ情報を伝達するときに、下位の階層における「イベントを伝播させる(PFEvent)」メソッドを用いることは、複合コンポーネントチュートリアルにより、すでにご理解いただいていることと存じます。
この方法を用いるときに問題となるのは、下位の階層から複数の同種のイベント(例えばアクションイベント)を上位階層へ伝播させる際、それらをどのようにして区別するかということです。
仮に、下位の階層に複数のボタンがあり、各ボタンが押されたときに、それぞれに対応する処理を上位階層で行わせたい状況を想定します。ボタンが押されたときに発生するアクションイベントはどれも同じですので、単に「イベントを伝播させる(PFEvent)」メソッドを使った場合には、それらのイベントを上位階層で区別することは不可能です。
そこで、上位階層でこれらのイベントを区別できるように、複合コンポーネントには「イベント番号を指定してイベントを伝播させる(PFEvent,int)」メソッドが用意されています。これは、上位階層へ伝播させるときに限り、標準仕様で定められているイベント番号に替えて指定したイベント番号を与えた上で、上位階層へイベントを伝えるというメソッドです。
データベースアクセスチュートリアルの場合、下位の階層から上位階層へ伝達するアクションイベントが、以下の通り、3つ存在します。
(1) フレームが閉じたときに発生するアクションイベント
(2) 接続ボタンを押したときに発生するアクションイベント
(3) 切断ボタンを押したときに発生するアクションイベント
これらを上位階層で区別するために、
(1) フレームが閉じたときに発生するアクションイベントには0
(2) 接続ボタンを押したときに発生するアクションイベントには1
(3) 切断ボタンを押したときに発生するアクションイベントには2
を指定しているということです。この場合、指定する番号は、元々のアクションイベントの番号が何番であるかには関係なく、任意の番号を指定することができます。例えば、
(1) フレームが閉じたときに発生するアクションイベントには4892025
(2) 接続ボタンを押したときに発生するアクションイベントには-62965245
(3) 切断ボタンを押したときに発生するアクションイベントには8372525
などの番号を指定しても差し支えありません。もちろん、上位階層では、それぞれに対応した処理を行うために、起動メソッドに対してこれらの番号を正しく設定しておく必要があります。
データベースアクセスチュートリアルでは、データベース接続フレーム内のフレームが閉じたとき、イベント番号0のアクションイベントが上位階層に伝播され、イベント番号として0が指定された以下の2つのメソッドが順次実行されます。
(a) アプリケーションの「アプリケーションを終了する()」
(b) データベースの「データベースとの接続を切断する()」
アプリケーションの「アプリケーションを終了する()」メソッドを実行するとアプリケーションからアプリケーション終了イベントが発生し、データベース接続フレームの「フレームを閉じる()」メソッドが実行されます。
この部分は、「データベース接続フレーム内でフレームを閉じるとめぐりめぐって再度フレームを閉じるためのメソッドが実行される」ことになり、一見冗長な処理のように思えます。しかしながら、データベースアクセスチュートリアルで最終的に作成するアプリケーションは、「複数のフレームを表示させ、それらのうちの1つでも閉じられると全フレームを閉じてアプリケーションを終了する」という仕様ですので、このような構成になっています。
フレームは、閉じている状態のときには、「フレームを閉じる()」メソッドを実行してもアクションイベントは発生しませんので、このような構成をとっても無限ループに陥ることはありません。