XCMDについてのいくつかの話
ハイパーカードは、XCMD(外部命令)を組み込むことで機能を拡張し、高度な操作を行うことが可能になります。
XCMDとは
ハイパーカードは標準の構成に、フォント、カーソル、アイコンなど様々なリソースを追加して機能を拡張することができます。外部命令(XCMD)、外部関数(XFCN)もこの追加リソースの一種で、マッキントッシュが直接実行できる命令をコードリソースという形式で作成し、スタックに組み込みます。
ハイパーカードにはスクリプト言語としてHyperTalkが用意されていることはご存知の通りです。HyperTalkにはもちろん色々な命令や関数が用意されていて、これだけでも多彩なプログラミングをすることが可能ですが、ファイルの操作など、どうしても組み込み命令だけでは実行不可能な作業もあります。こうした場合、ハイパーカードにはXCMDやXFCNを追加して機能を拡張する手段が用意されています。適切なXCMDやXFCNを用意すると、ハイパーカードでできることが飛躍的に広がります。
例えばハイパーカード自身、バージョン2.2以降に導入されたカラー機能はAddColorというXCMDを使って実現していますし、絵(PICT)を表示するPicture命令もXCMDです。
HyperTalkのメッセージハンドラ(on xxx)に相当するものを外部命令(XCMD)、関数(function xxx)に相当するものを外部関数(XFCN)と呼びますが、両方を合わせて外部命令、XCMDと総称することもあります。ここでは、特に明記しない場合、総称としてXCMDを使用します。
XCMDを使う
XCMDが既にスタックに組み込まれている場合、これを使うには難しい手続きは必要ありません。XCMDなら普通のメッセージハンドラと同様に、XFCNなら関数と同様にスクリプトの中に記述するだけです。
別のスタックに組み込まれているXCMDを利用するには、そのスタックをライブラリとして指定する方法があります。目的のXCMDのあるスタックを"XStack"とすると
start using stack "XStack"
という命令を実行することで、これ以降、このスタックが持つXCMDを自分のスタックにあるのと同様に利用することができるようになります。
XCMDを自分のスタックに組み込むためにはApple社のユーティリティResEditなどを使わなければなりません。ハイパーカード内で簡単にXCMDをコピーするには、製品版のハイパーカードに含まれる「Power Tools」スタックを開き、「リソースムーバー」を使う方法もあります。また、フリーのスタック(XCMD)であるResCopyを使っても良いでしょう。これらを使うと、XCMDだけでなくカーソルやアイコンなどの他のリソースもコピーすることが可能です。
ResEditの最新版はアップル・ジャパンのFTPサイトからダウンロードできます。
役に立つXCMDを見つける
数多くの優れたXCMDがフリーウェアとしてパソコン通信などからダウンロードできます。例えばNIFTY-Serveなら「日本語環境フォーラム(FJAMEA)」、「マッキントッシュ ハイパーメディア フォーラム(FMACHYP)」「マッキントッシュ プログラミング フォーラム(FMACPRO)」などのライブラリに多彩なXCMDが登録されています。
- 日本のXCMD作者として有名な田中之氏のハイパーカード 青空広場からは、同氏のXCMDのコレクションがダウンロードできます。
- フランス・アップル社のF. Rinaldi氏は極めて高機能なXCMDを多数発表しています。同氏のXCMDはパソコン通信の他にFTPサイトから 直接ダウンロードする(695KB)ことも可能です
- ミシガン大学のMac archiveへのハイパーインデックスを提供しているUBUdexには豊富な XCMDや XFCN がリストされています。
XCMDを自作する
プログラミングの知識があれば、XCMDを自作することも可能です。XCMDはコードリソースというタイプで、マッキントッシュのプログラミングとしては比較的簡単な部類に入ります。最も困難なユーザーインターフェイスを作成する必要がない(ハイパーカードに任せられる)ので、プログラミングの入門に好適かもしれません。
- XCMDは、ハイパーカードと情報をやりとりするためにXCmdBlockと呼ばれるパラメータブロックを使用します。XCMDに引数を渡したり、返り値を受け取ったりするのはすべてこのブロックを経由します。また、ハイパーカードはXCMDのためにデータを渡したり処理したりするためのコールバックを用意しており、これもパラメータブロックを経由して手続きを行います。これらを利用するために、C言語の場合はHyperXCmd.hというヘッダファイルをincludeします。
(加筆する時間がないので、以下、当面完結する予定はありません。申し訳ありません)