FutureBASIC II 日本語版日記

4/17●現在、楽進、単福などの検索エンジンをパワーアップさせるために
「FutureBASIC II 日本語版」を購入、勉強中です。
いくつかのスタートアップ課題をおわらせて、なかなかハイパートーク
ライクな使いやすい言語と実感しているのですが、XCMDのサンプルコードが
コンパイルできずに、ゆきずまっています。
もうすこし練習課題をこなして、勉強していきたいと思っています。

(Windoid Projectを実行してみたのですがWindoid Glue.INCL内で
GLOBALS "Windoid.GLBL"が無効な構文としてコンパイルエラーになる。)

4/20●サンプルコードをすべてプリントアウトしました。
それらをながめたり、いろいろ試しているうちに
アップルメニューのFutureBASIC IIのFunctionヘルプに
HyperXcmdが書かれていることを発見。
HyperXcmd.MAIN・HyperXcmd.GLBL・HyperXcmd Glue.INCL・HyperXcmd Events.INCL
この4つのファイルのうちHyperXcmd.MAIN・HyperXcmd.GLBLの
2つだけでも最小限のXCMDが作れそうなのでこの2つで
コンパイルしましたが、_Constantの再定義というエラーがでます。
GROBALSのところでエラーがでるのですがどうしてかわからず。。。困っています。

5/7●GROBALSのエラーがわかりました。
モードにメールを出し返事をもらいました。『Windoid.GLBL』のコードを以下のように直します。
'checkSize = _maxCachedChecks * 2 コメント化
DIM RECORD CheckPts
DIM checks;32
DIM END RECORD .CheckPts
GLBLでは計算ができないようです。_maxCachedChecks * 2をコメント化することで解決します。

ところがまだまだ解決できない問題がでています。FutureBASICのメーリングリストに
登録して少しづつ情報をあつめていこうと思っています。

5/28● HyperCardのXCMDがコンパイルできないわけ
やっとわかった。FutureBASIC IIの環境設定に秘密があった。
プリファレンスで
「文字列/配列オーバーフローをチェック」
ボタンのチェックをはずす。これでOKだった。

リファレンスマニュアルで調べてみると、

この設定は、ミニ・ランタイム・パッケージでは使えません
(コンパイルタイム・エラーが起きます)。さらなる情報については、
付録のランタイムを参照してください。
と書いてあった。また、標準のランタイムパッケージでエラーを
返すための機能のような事が書いてある。
付録のランタイムを調べてみると、

ミニ・ランタイム
この小さなランタイムパッケージは、
RESOURCE文でリソースタイプを指定するプログラムに追加されます。
と書いてある。
XCMDはハンドブックのコード・リソースの章に書いてあるので、
まさに、これに違いない。
それにしても XCMDの章にはそんなこと書いてなかったぞ。
こっちは、真面目にFutureBASIC IIのプレファレンスの仕方に従っていたのに。。。
FutureBASIC IIで XCMDを作ろうという人は多いに違いない。
みんなここで悩むのかなぁ。。。

7/23●しばらく書き込んでいませんでしたが新しいことがいくつもわかってきました。
これも、FutureBASICのメーリングリストのおかげです。
まず、255文字以上変数に入れる方法 FutureBASICで作ったXFCNに送ったパラーメーターは
str255$(0)とかの配列?変数に格納されます。
で、str255$(0)をそのまま
xCmdPtr&.returnValue&にいれてHyperCardに返す実験をすると、
返り値は255文字以降は消えてしまいます。
これは、ZeroToPasを使って、str255$(15)へハンドルを渡すと、
FBIIでは、文字列変数は255バイトしか持てないため255バイト以上は消えてしまうのです。
これはZeroToPasを使わずにハンドルで全ての処理をすると解決します。
ハンドルは

[xCmdPtr& + _params + i*4] 'iはXCMDへ送った、パラメータの指定。

で取り出すことができます。パラメータの指定を詳しく説明すると、
HyperCardで

put XFCN_NAME(A,B,C,D) into A

というように"XFCN_NAME"というXFCNを呼び出すとします。
で変数Aの値をFBIIで取り出すには、[xCmdPtr& + _params + 0*4]というようにします。
変数Bなら[xCmdPtr& + _params + 1*4]です。
変数内の文字列が255バイト以下なら、

FN ZeroToPas (xCmdPtr&,[[xCmdPtr& + _params + 1*4]], MOZI$)

で文字列変数MOZI$に値を入れることができます。

もし255バイト以上なら、[xCmdPtr& + _params + 0*4]で
ハンドルを使って処理すればいいことになります。
このハンドルをHyperCardに返すには、
xCmdPtr&.returnValue& = hndl&
こうすれば、 hndl&に入っている、変数をHyperCardに返すことができます。
しかし、ここから先にも難関が数多くありました。

8/14●どうにもうまくいきません。
テスト用のアプリでは大丈夫な動作がXFCNではおかしな返り値がきます。
とりあえず前に使ったハンドルを使わずに検索するXFCNを
返り値だけをハンドルに入れる方法を考えます。そうしないと255文字以上処理できない。
以下は255文字以上処理できない版
LOCAL FN SssOffset(xCmdPtr&,str255$)
DIM 255 tmp$
strPtr& = @tmp$
FN ZeroToPas (xCmdPtr&, [[xCmdPtr& + _params + 0 * 4]], str255$(0))
FN ZeroToPas (xCmdPtr&, [[xCmdPtr& + _params + 1 * 4]], str255$(1))
'FN ZeroToPas (xCmdPtr&, [[xCmdPtr& + _params + j * 4]], str255$(2))
MOTO$ = str255$(0)
BYTBYT$ = str255$(1)
BYT& = LEN(BYTBYT$)
BYT& = BYT& - 1
startPos& = 1
DO
foundPos& = INSTR(startPos&,MOTO$,BYTBYT$)'"0は検索もと 1は検索文字"
startPos& = foundPos& + 1
foundPos2& = foundPos& + BYT&
AA$ = STR$(foundPos&)
BB$ = STR$(foundPos2&)
AA2% = LEN(AA$)
BB2% = LEN(BB$)
AA2% = AA2% - 1
BB2% = BB2% - 1
AA3$ = MID$(AA$,2,AA2%)
BB3$ = MID$(BB$,2,BB2%)
CC$ = AA3$ + "," + BB3$ + "," + str255$(2) + CHR$(13)
tmp$ = tmp$ + CC$
UNTIL foundPos& <= 0
'tmp$ = str255$(1)
xCmdPtr&.inArgs0& = strPtr&'convert error message to
xCmdPtr&.xRequest% = _xReqPasToZero'C-string format (chars + nul)
FN JumpToCallback(xCmdPtr&)'enter callback routine
xCmdPtr&.returnValue& = xCmdPtr&.outArgs&'put C-string hndl into xcmdBlock
END FN


NEXT