これは RuntimeRevolution 1.1.1 のヘルプにある文書を邦訳したものです。この文書の文責はUDIにあり、またUDIはこの文書についての一切の債務を負いません。 間違いがありましたら eudio@chabashira.co.jp までお知らせ下さい。この文書は必要と思われる時に適宜アップデートされます。

Help -> Revolution Documantation -> Development Guide -> Objects & messages -> About... messages and the message path


About messages and the message path
メッセージとメッセージパス
==============

参照:
--------------
About object types and object references, Development menu > Suppress Messages, mainStack property, me keyword, owner property, target function, target keyword


 Transcript はメッセージによって動いている。全てのスクリプトはそのスクリプトのあるオブジェクトに送られたメッセージによって起動する。

 このトピックでは、メッセージが送られてくるタイミング、そのオブジェクトがメッセージを扱わなかった時に起こること、メッセージが送られてくるのを防ぐ方法、そしてメッセージパスを変更する方法について解説する。

 このトピックを充分に理解するためには、オブジェクトの作り方と、簡単なスクリプトの書き方を知っている必要がある。もし 'Getting Started' が済んでいるなら、このトピックを読むための充分な知識を持っている。


Contents:
Messages and Message Sending
The Object Hierarchy and the Message Path
Trapping and Passing Messages
Overriding the Message Path


Messages and Message Sending
メッセージと、メッセージの送信
 メッセージとは、イベントによって影響を受けるオブジェクトで、何かのイベントが起きたという告知である。イベントには、ユーザーアクション(キーボードをタイプした、マウスボタンをクリックした、など)と、プログラムアクション(ファイルのダウンロードが終了した、アプリケーションを終了しようとしている、など)がある。 Revolution はイベントを監視して、イベントが起きたときに、適切なオブジェクトにメッセージを送る。 mouseDown、mouseUp、keyDown、openCard などは組み込みメッセージであり、Transcript Dictionary にリストアップされている。

 また Revolution は、組み込みコマンド以外のコマンドを実行する時にもメッセージを送る。(組み込みコマンドはメッセージパスをバイパスして、エンジンで直接実行される)

 メッセージと同じ名前のハンドラを書いて、そのメッセージに反応することが出来る。例えばフィールドに送られた keyDown メッセージ(そのフィールドに挿入ポインタがある時に、ユーザーがキーをタイプすると送られてくる)を受け取るには、そのフィールドのスクリプトに keyDown ハンドラを置く:

  on keyDown theKey
    if theKey is a number then beep
  end keyDown
 全てのメッセージは適切なオブジェクトに送られる。例えばユーザーがあるオブジェクトをクリックすると、Revolution はクリックされたオブジェクトに mouseDown メッセージを送る。もしオブジェクトのスクリプトにそのメッセージに対応するハンドラが無い場合は、メッセージはメッセージパスに沿って、そのオブジェクトのオーナーに送られる。


The Object Hierarchy and the Message Path
オブジェクト階層とメッセージパス
 Revolution のオブジェクトはひとつのオブジェクト階層を形成している。それぞれのオブジェクトはひとつ上のレベルのオブジェクトの所有物であり、そのオブジェクトもまた上の階層のオブジェクトの所有物である。例えばボタンのオブジェクト階層には、ボタン自身と、ボタンの乗っているカードと、そのカードのあるスタックが含まれている。(各オブジェクトタイプのオブジェクト階層については、'Object Types and Object References' を参照のこと)

 メッセージパスとは、あるメッセージに応答するオブジェクトの順番を決めるルールである。メッセージパスはオブジェクト階層がベースになっている。

 例えばユーザーがボタンをクリックすると、Revolution はそのボタンに mouseUp メッセージを送る。もしボタンのスクリプトに mouseUp メッセージに対応するハンドラが無ければ、そのボタンの乗っているカードにメッセージが送られる。そしてそのカードが mouseUp ハンドラを持っていればそれが実行されるが、もしそのカードも mouseUp メッセージを扱わなかった場合は、カードのあるスタックにメッセージが送られる。

 メッセージパスは一般的にこのようなルールで出来ている:

* コントロールに送られたメッセージは、次にそのコントロールの乗っているカードに渡される。

* グループ化されたコントロールに送られたメッセージは、次にそのコントロールを含んでいるグループに渡される。

* カードを通らずにグループに送られたメッセージは、次にそのグループの乗っているカードに渡される。

* グループがひとつも無いカードに送られたメッセージは、次にそのカードのスタックに送られる。カードにグループがある場合は、次に、まだメッセージを受け取ってない backgroundBehavior が true のグループに渡される。

* サブスタックに送られたメッセージは、次にそのサブスタックのメインスタックに渡される。

* メインスタックに渡されたメッセージは、次に Revolution の開発環境に渡される。或いはそのスタックがスタンドアローンアプリケーションから開かれた場合は、そのスタンドアローンをビルドする時に指定したメインスタックに渡される。

 ハンドラでトラップされたメッセージは、メッセージパスに沿ってそれ以上送られることはない。つまり、ハンドラが明示的に次のオブジェクトにメッセージを渡さない限り、それぞれのメッセージをトラップ出来るハンドラはひとつだけである。

The message target:
メッセージのターゲット:
 最初にメッセージを受け取ったオブジェクトを、そのメッセージのターゲットと呼ぶ。ターゲットを調べるには、メッセージパスにあるハンドラの中から target 関数を使用する。

 一般的にはターゲットのスクリプトがメッセージを処理するが、必ずしもそうである必要はない。例えばあなたがボタンをクリックすると、mouseUp メッセージがボタンに送られる。もしそのボタンに mouseUp メッセージに対応したハンドラが無ければ、そのボタンの乗っているカードにメッセージが送られる。そしてそのカードに mouseUp ハンドラがあればそのハンドラが実行される。このケースではカードスクリプトが実行されているが、このカードはターゲットではない。最初にクリックされ、Revolution から mouseUp メッセージを送られたボタンが、ターゲットである。

Unhandled messages:
処理されなかったメッセージ:
 組み込みのメッセージがオブジェクト階層の中にハンドラを見つけられなかった場合は、そのメッセージは無視される。

 カスタムコマンドと同名のメッセージがオブジェクト階層の中にハンドラを見つけられなかった場合は、そのメッセージはエラーになる。


Trapping and Passing Messages
メッセージのトラップとパス
 オブジェクトがメッセージを受け取った時、そのメッセージ用のハンドラがあれば実行される。通常、処理されたメッセージは、それ以上メッセージパスに沿って進むことはない。目的を達したのでメッセージは消える。このような状態を、メッセージがハンドラにトラップされた、と呼ぶ。

 そのメッセージで何かをする必要はないが、しかしメッセージパスに沿って送られて行くのは止めたい、という場合は、そのメッセージをトラップする空のハンドラを使うことが出来る。このサンプルは、空のハンドラによって、オブジェクト階層の下にある他のオブジェクトに keystrokes が渡るのを妨げる:
  on keyDown
  end keyDown
 メッセージパスに沿って次のオブジェクトにメッセージを送るには、pass 制御構造を使う。 pass 制御構造は、現在のハンドラの実行を中止して、丁度そのオブジェクトがメッセージハンドラを持たなかった時と同じように、メッセージパスの次の階層にあるオブジェクトにメッセージを送るものである:
  on openCard
    doSpecialSetupForThisCard
    pass openCard -- スタックもメッセージを受け取るようにする
  end openCard
 一般的に、組み込みメッセージを処理する時は、ハンドラの最後に pass コマンドを置いて、メッセージをパスする必要がある。アクションを起こす組み込みメッセージをトラップして完全に妨害することも出来る。これは数字キーをタイプした時だけ keyDown メッセージをパスするサンプルである:
  on keyDown theKey
    if theKey is a number then pass keyDown
  end keyDown
 このハンドラをフィールドのスクリプトに置いた場合、ユーザーは数字キーを入力することが出来る。しかし keyDown ハンドラはその他のキーがタイプされた時に pass を実行しないので、数字キー以外のキーストロークはトラップされる。

Blocking messages:
メッセージをブロックする:
 lockMessages プロパティを true にして、カード移動で起こるメッセージをブロックすることが出来る。例えばスクリプトから他のスタックを開く時、Revolution は openCard メッセージと openStack メッセージをそのスタックに送る。もしそのスタックにこれらのメッセージに対応するハンドラがあった場合、この操作によって意図しない動作が起こるかも知れない。しかしスタックを開く前に lock messages コマンドを実行しておけば、一時的にこれらのメッセージをブロックすることが出来る。ハンドラの実行が終了すると lockMessages プロパティは自動的に初期値である false にリセットされ、メッセージの送信は通常に戻る。

 ティップス: スタックのテストやデバッグのためにカード移動で起こるメッセージをブロックしたいなら、Development メニューの 'Suppress Messages' にチェックを付ける。


Overriding the Message Path
メッセージパスを越える
 オブジェクトを追加することで、通常のメッセージパスをオーバーライドすることが出来る。コードライブラリを作るには、再利用したいハンドラを入れたオブジェクトをスタック上に作って、そのオブジェクトを階層に加えるために、insert script コマンドを実行する。これでそのオブジェクト内のハンドラは、Revolution の任意のハンドラからアクセス可能になる。

 オブジェクトはメッセージパスの前( front )にも後ろ( back )にも挿入可能である。 front にあるオブジェクトは全てのメッセージを、メッセージを受け取ったオブジェクトよりも先に、一番最初に受け取る。 back にあるオブジェクトは全てのメッセージを、メッセージパスにある全てのオブジェクトやスタックよりも、一番後にメッセージを受け取る。

 start using コマンドは insert script コマンドに良く似ているが、メッセージパスの中にスタック以外のオブジェクト入れることは出来ない。 start using コマンドはメッセージパスの最後に、オブジェクトのあるスタックやメインスタックよりも後ろにスタックを挿入するが、insert script で back に入れられたオブジェクトよりは前になる。

 start using と insert script はひとつのオブジェクトを、これらのコマンドを使ったオブジェクトのメッセージパスの中だけでなく、全てのオブジェクトのメッセージパスの中に入れる。 start using や insert script によって挿入されたオブジェクトも、start using や insert script で挿入された他のオブジェクトのハンドラを利用することが出来る。

 オブジェクトに send コマンドで直接メッセージを送ることによって、メッセージパスを越えることが出来る。 send コマンドで送られたメッセージは通常のメッセージパスをスキップして、そのオブジェクトに直接辿り着く。

邦訳/文責:UDI
2002.01.02

inserted by FC2 system