X作成講座 on TC(3) HyperTalk との値のやりとり(まとめ)
ここで HyperTalk との引数のやりとりについてまとめてみます。
HyperTalk から引数を受け取る: パラメータブロック内のC文字列ハンドルから希望する型へ変換します。 1番目の引数を得る時は n は 0、2番目は 1、以下16番目( n = 15 )まで。 C文字列ハンドルとして受け取る paramPtr->params[n] が文字列ハンドルです。 文字列ハンドルを必要とするルーチンにそのまま渡すことが出来ます。 例えば myStrHand = paramPtr->params[n] とすれば myStrHand が 引数文字列の入ったハンドルになります。 C文字列ポインタとして受け取る *paramPtr->params[n] が文字列ポインタです。 文字列ポインタを必要とするルーチンにそのまま渡すことが出来ますが、 ハンドルをロックしてからでないと思った動作が出来ないことが多いです。 myStrHand = paramPtr->params[n]; HLock myStrHand; myStrPtr = *myStrHand とした場合に myStrPtr が引数文字列のポインタとなります。 P文字列として受け取る ZeroToPas( paramPtr, *paramPtr->params[n], myPStr ); で myPStr に引数を受け取れます。255文字を越えるものは無視されます。 数値として受け取る 一旦P文字列にしてから myNum = PasToNum( paramPtr, myPStr ); で myNum に数値を得られます。±21億程度の数値を扱えます。 数値として受け取る 一旦P文字列にしてから myLong = PasToLong( paramPtr, myPStr ); で myLong に long型の数値を得られます。0 から 4294967295 の数値を扱え ますが、0以下(マイナス)の数値は正しく受け取れません。 そのほかグルールーチンにはP文字列から値を得る関数として StrToBool、StrToExt、StrToPoint、StrToRect が用意されています。 ZeroToPas とこれらの関数を組み合わせれば、例えばレクトを受け取って Rect型の変数に入れるというようなことが出来ます。 HyperTalk へ値を返す: 返したい値をC文字列ハンドルに変換してパラメータブロックに書き込みます。 XFCNの場合はXの返値として、XCMDの場合はX実行後の the result にこの値が入ります。 C文字列ハンドルを返す returnValue = myStrHand; で渡せます。 myStrHand は以後 HyperCard の 管理下に入るので破棄しないこと。 P文字列を返す returnValue = PasToZero( paramPtr, myPStr ); で渡せます。 数値を返す NumToStr( paramPtr, myNum, myPStr ); でP文字列に変換してから、 returnValue = PasToZero( paramPtr, myPStr ); で渡せます。 数値を返す LongToStr( paramPtr, myLong, myPStr ); でP文字列に変換してから、 returnValue = PasToZero( paramPtr, myPStr ); で渡せます。 そのほかグルールーチンには他の値からP文字列に変換する関数として BoolToStr、ExtToStr、PointToStr、RectToStr が用意されています。 これらの関数でP文字列を作ったあとに PasToZero を使うことによって、 渡したい値を HyperTalk の分かる形にすることが出来ます。
マネージャは初期化しない 通常のプログラムはまずマネージャの初期化から始まりますが、Xは HyperCard の下で働く特殊なプログラムです。X中でマネージャを 初期化すると、HyperCard に重大な被害をもたらします。 スタックのリソースの扱いは慎重に 通常のプログラムではファイルを独占的に使うことが出来ます。使いたい時に 開いて、いらなくなったら閉じるだけです。 ところがXでは HyperCard が使用中のファイル(スタック)のリソース フォークにアクセスしなければならないことがあります。アクセスが済んだ からと言ってそのリソースフォークを勝手に閉じてしまうと、HyperCard は そのリソースフォークにアクセス出来なくなり、問題が起きます。 具体的な方法はまたいつか書くとして、とりあえずリソースフォークを 開いたり閉じたりするのは面倒であるということだけ覚えておいて下さい。 ただし現在開いているリソースフォーク(スタック自身、Using している スタック、Home スタック、HyperCard 本体、システム)のリソースを読むだけ なら、それほど難しくはありません。 HyperCard オブジェクトの扱い HyperCard のオブジェクト(カードやボタンなど)に直接アクセスすることは 出来ません。これらの値を読み出したり変更したりする時は必ずグルールーチン を利用します。グルールーチンでサポートされていない処理は出来ません。 どうしてもうまく操作出来ない場合はX内で HyperTalk 文字列を作って、 それを HyperCard に実行させたり、その結果を読み出すという手も使える ことがあります。 例:SendHCMessage( paramPtr, "\pgo next card" ); 外部ウィンドウ Xからウィンドウを作る場合はグルールーチンを利用します。 グルールーチンを使って作ったウィンドウは通常のプログラムから作った ウィンドウと違い、半ば HyperCard の管理するウィンドウとなります。 例えば CloseWindow を直接実行するのはタブーです。 CloseXWindow という グルールーチンを使って「 HyperCard に閉じてもらう」という処理を しなければなりません。ウィンドウの扱いは少々面倒なので、これについても ここではあまり突っ込んだ解説は避けます。またいつか項を改めて。