メニュー
【以下【】の中は訳者が付け足したものです。】
Mopsプログラムは、別途リソースとして保存されたメニューを用いています。これは、Macでメニューを定義する通常の方法です。そうするとユーザーがメニューの文字をRezillaのようなリソースエディターでカスタマイズすることが容易になるからです。
プログラムがメニューハンドラーワードの定義を持ち、メニューの選択によってそのワードが呼び出される、という点で、メニューはコントロールに類似した働き方をします。メニューの選択は、Macプログラムでは、通常はコントロールよりも強力です。なぜなら、メニューは、プログラムのモードを比較的大きく変えるのに用いられるのが典型的だからです。例えば、典型的なファイルメニューでは、Load... オプションを選ぶと、メインプログラムは停止し、ユーザの注意は、開くべきファイルを選択するダイアローグボックスに仕向けられます。grDemoでは、主要なメニューであるGraphicsは、プログラムが描画するであろう図像のタイプを変更するものであり、例えば、リサージュモードからドラゴン曲線モードへと遷します。
メニューはコントロールよりも、もう少し設定の手間が要ります。というのは、別々の二段階のステップが必要だからです。第一に、メニューリソースを含むリソースファイルを作らなければなりません。これは、リソースエディターで行うことができます。このデモプログラムについては、'demo.rsrc'という名前のリソースが提供されています。Mops ƒフォルダ(68k Mopsの場合)かDemo folder (PowerMopsの場合)にあります。それから、第二のステップとして、そのリソースに対応するMopsメニューオブジェクトを設定しなければなりません。 — ここでは、これについてお話ししましょう。
メニューはそれぞれに結びつくID番号を持っています。このメニューIDは、そのメニューのリソースIDとは異なるものであることに留意するのは重要なことです。ひとつのメニューに二つの異なるID番号があるのは、しばしば混乱のもととなります。しかし、これらの番号を一致させることによって、この混乱は最小限に抑えることができます。
規約上、アップルメニューはID=1を持っています。GraphicsメニューにはID=2を割り当てました。これらのID番号は、メニューリソースに格納され、選択されたメニューを特定するために、Macシステムが利用します。このメニューIDを用いてメニューを特定し、特定のメニューに一群のアクションを結びつけるシンプルな方法がMopsにはあるのですが、それを説明しましょう。
grDemoプログラムにリストに戻って、わたしたちは、Grafmenという名前のメニューオブジェクトを定義し、それが六つのメンバーを持つことを特定しています。Applemenは、ここでは作る必要はありません。Mopsが作ってくれているからです。
次は、Grafmenのためのメニューハンドラーワードを定義しています。各々が、dWindのDraw
インスタンス変数に、描画ワードのxtを置いています。ワードのxtを取るためのもうひとつの構文がここで示されています。:['] ljです。[']は、 ' のワード定義内における等価物です。各定義はまた、そのタイプの描画のための最大コントロール値をも格納しています。それから、ウィンドウ全域にアップデートメッセージを送り、これが改訂されたスクロールバー値と現在の設定での図像とを描画します。
SetRepsは、ペンBicと多角形Annaを用いてつくり出される描画のための、繰り返しの最大数を確立しています。スクロールバーの特定の選択値に対して図形が完全に描き切れていないことがわかったときには、Bicに対するその値を増加させたいと考えるでしょう。逆に、ある描画では、たった100かそれより少ない回数で既に描かれた部分を繰り返し始めることもあり、その場合には、プログラムが数秒の間反応しなくなることもあるでしょう。
次は、メニューを準備します。これは、各メニューにINIT:メッセージを送ることで行います。ご覧のように、このメソッドはスタック上にxtのリストを取り、これはxt{ ... }構文を使って特定しています。これはまた、もうひとつの数値をパラメターにとります。それは、上で既に触れたメニューID番号です。各リストのxtは、そのメニューのトップアイテムから始まって、各アイテムが選択されたときに実行されるワードを参照しています。ですから、GrafMenの第一アイテムが選択されたならば、実行されるワードはdolissになるでしょう。これは、メニューリソースにある'Lissajous'に対応しています。xtリストに入れるワードが、アイテム順に、メニューリソースのアイテムに置いたテキストに対応するようにするのは、あなたの責任です。MacにはdoLissがテキスト'Lissajous'に対応するかどうかを知るすべはありません。もしもxtを間違った順序で置いたならば、メニューを選択したとき面白いことが起こるでしょう。しかし、それはあなたが望んでいたことではないでしょう!
GrafMenリソースには、'Dragon curves'と'Quit'の間に灰色の線を含ませてあります。'Quit'は(習慣上)最後のアイテムとされます【ご承知のようにOS X では規約がちがいます】。この灰色線も、リスト内に対応するxtを持たなければなりません。それは実行されることは決してないのですから、ここにはどんなワードでも用いることができます。;しかし、意図を明らかにするため、わたしたちは'NULL'を使っています。これは何もしないワードです。
【次の段落の記述は、Carbon PowerMopsには当てはまりません。】
アップルメニュー、AppleMenのためのxtリストには二つのアイテムしかないことにお気づきでしょう。それでは、アップルメニューに含めることのできるその他の多くのアイテムはどうするのでしょう?これについては、実際にわたしたちはMopsのもうひとつの特性を用いることで配慮しています。— xtリストにあったものよりも多くのアイテムがメニューにあって、'余っている'アイテムが選択された場合には、リストの最後のxtが呼び出されます。ワードDoDskはDAあるいは何であれアップルメニューの下にあるものの起動を扱います。ここでのわたしたちのプログラムでは、第一のアイテムを除く、すべてを扱っています。その第一のアイテムは(Macでは通常のやり方ですが)'About...'で、この場合には'About Curves'になります。
プログラムを起動する
このプログラムの最後は、プログラム全体を走らせるワードの定義です。ここで、ここまで行われた全てが、ワードGOを打ち込んだときに、統合されます。
初めの行では、バリューInstld?がFalse【またはMachO?がTrue】のときにいくつかのことをしています。それがスタンドアローン(ダブルクリックできる)アプリケーションである場合に、そのバリューはTrueになり、そうでない場合、つまり、そのプログラムを
Mops辞書にロードしただけである場合にはFalseとなります。次のレッスンで、デモプログラムをダブルクリックできるアプリケーションとしてインストールする方法を見ることにします。
これらの動作は、ですから、Mopsでわたしたちのプログラムをテストするときに必要なものです。中核となる動作は、リソースファイルdemo.rsrcを開くことです。それはわたしたちが必要とするメニューリソースを含んでいます。スタンドアローンアプリケーションでは、別々のリソースファイルを持ちたくはありません。そこで、わたしたちの通常のやり方では、特別に必要なリソースはリソースエディターでアプリケーションファイル自体に追加することです。この場合、そのリソースは、特別に開く必要のあるファイルを持つことなくして利用できます。他方で、Mach-O実行ファイルはリソースフォークを持つべきではないので、Mach-Oスタンドアローンアプリケーションでは、別個のリソースファイルを維持しなければなりません。しかし、テスト中は、PEF/CFM PowerMopsの場合であっても、追加的リソースは別個のファイルに入れておくのが便利です。
次にメニューオブジェクトを始動しています。GetNew:メッセージが各Mopsメニューオブジェクトに送られ、必要なメニューリソースが確保されメニューが初期化されます。それから、わたしたちのMenubarオブジェクトにINIT:メッセージを送って、メニューバー(スクリーンの上端にあります)を設定します。このメッセージはスタック上にメニューオブジェクトのアドレスを取り、メニューの個数がそれに続きます。
BicとAnnaは、それぞれの対応する最大繰り返し数を設定され(SETREPS)、三つのスクロールバーの最大値が入れられ、カーソルがオフにされます。
次の行では、NEW:メッセージにより、わたしたちのウィンドウであるdWindに命が吹き込まれます。ここでは、そのウィンドウのタイトルとして現れるテキストのアドレスと長さが渡されます。構文" Curves"(最初の " の後には空白があります)、テキスト'Curves'を辞書にコンパイルし、ランタイムにそのテキストのアドレスと長さをスタックに置きます。これがNEW:メッセージと共に渡さなければならないものです。
最後に、ワードEventLoopにより、コントロールやメニューに影響を与えるマウスイベントを'聴き'続ける、無限ループに入ります。
一番最後の定義は、エラーワードの定義です。これは、インストールされるアプリケーションには必要です。というのは、Mopsシステム全体は、もうそこには存在していないので、通常はMopsのエラーメッセージが与えられるような何らかのエラーが起ったときに実行されるべきワードを、あなたが提供しなければならないからです。習慣的に、このワードはCRASHと呼ばれています。よく内容を表しています!ここでは、ただ、二回ビープ音をならしてFinderに抜けるだけです。'現実の'アプリケーションでは、おそらくアラートボックスを出して、何かもっと助けとなることをする必要があるでしょう。しかし、ここでは、まあ、デモなわけですから。
ロード後直ちにプログラムを起動したいならば、grDemoソースファイルの最後のワードとして、起動ワードgoを入力すればよいだけです。ファイルがロードされたとき、Mopsは、あなたがMopsプロンプトにそれを打ち込んだときと同じように、起動ワードに感応するでしょう。
まとめ
これでgrDemoプログラムの全体を見たわけですが、Mopsプログラムの幾つかのキーポイントにお気づきのはずです。
第一に、スクリーン上に現れるオブジェクトのクラスの定義があります。プログラムのバランスは、コントロールやメニューがマウスでアクティベートされたときにその奇跡を行うハンドラーワードを定義することに関わっていきます。プログラムの動作をハンドラーワードによって考えるのは賢明なことです。
そして最後に、あなたのプログラムを開始するワードの定義になります。それは、あなたが辞書内に定義した、オブジェクトをつくり出したりプログラムを入力に反応させたりするワードを呼び出すことになります。
最終更新:2018年12月10日 18:35