HyperCard tribute

ハンドラについて


 先に説明したメッセージは、メッセージを受けとめるメッセージハンドラがなければ意味をなしません。すなわち、メッセージが発生したときに同じ名前のメッセージハンドラがあれば、そのハンドラがメッセージを受けとめ、ハンドラ内のスクリプトを実行します。
 ハンドラの構造は以下のようになっています。

1 on <メッセージ名> [<パラメータ>]
2  命令文・・・
3  命令文・・・
4 end <メッセージ名>

 ハンドラは自分で作成することも可能です。例えば、mainというハンドラを作ったなら、スクリプト中にmainと書くことでmainメッセージを発生させることができます。そしてその、mainメッセージはmainハンドラに送られ実行されます。このハンドラ「main」は、カードやバックグラウンドなど共有するオブジェクトに書き込んで下さい。ボタンやフィールドなどに書き込んでしまうと、メッセージの継承が起こらないため、どのメッセージハンドラを実行すればいいのかHyperCardがわからなくなってしまうからです。

 パラメータとは、メッセージと共に送られてくるデータのことです。例えば、arrowKeyメッセージには、押した矢印キーの情報がパラメータとして送られてきます。
 パラメータは、自分で付けて送ることもできます。mainハンドラに、speedとmodeをパラメータとして送ることとします。

例:main speed,mode

 これらのパラメータはmainハンドラ中で、そのままの形で使用することが可能です。パラメータはmainハンドラが終われば消滅します。


 ハンドラを実行中に途中で処理を抜けたいときは exit を用います。

例:exit main

 exit は処理を抜けるという意味ですので、もし現在のハンドラが他のハンドラから呼ばれていたものであれば、そのハンドラへと処理は戻ります。
 もし、全ての処理を終わらせたいというのなら、exit to HyperCard と記述します。HyperCardは、idle状態となります。



 次にもう一つのメッセージを送る方法を説明します。先の方法では、スクリプト中にメッセージ名を記述するだけでそのメッセージハンドラを実行することができました。しかし、この方法ではある制限があるのです。それは「メッセージハンドラを、共通するオブジェクトに置かなくてはいけない」という事でした。つまり、オブジェクトに対して直接メッセージを送ることができなかったのです。

 例えば、以下のような2つのボタンを考えてみて下さい。


 ここで左のボタンをクリックしてみることにします。とはいっても、ユーザーがクリックするのではなく、私たちプログラマーがスクリプトを用いてクリックするのです。
 以下の命令をメッセージボックスから打ち込んでみて下さい。

  • send "mouseUp" to cd btn "ボタン1"
     ボタン1のスクリプトが実行されたことと思います。今回はオブジェクトに対して直接メッセージを送っているので、mouseUpの部分を変えることでどんなメッセージでも送ることができるようになったわけです。
     それではsend命令でどんな凄いことができるでしょうか? 答えは「基本的には先の方法と同じである」ということになります。send命令では、他のスタックに(制限付きではありますが)メッセージを送るやreturn命令を使って値を返すことができます。ですが、これらは他の命令の組み合わせでも実現可能ですのであまり凄いこととは言えません。
     自分の覚えやすい方法で使っていけばよいでしょう。簡単にメッセージ名だけを書き込むか、汎用性の高いsend命令を使うかという点で考えればよいと思います。