X作成講座 on FB[06] Glue ファイルの追加修正
外部ウィンドウを作ってみました。
それに伴って XonFB[01] で修正しきれなかったルーチンを細かく調べた結果、追加の修正が必要であることが分かりました。同様の手順で修正/解説を試みてみます。
出来るだけ多くのルーチンを解説するよう努めましたが、例えばスクリプトエディタを作るためのルーチンなどは検証作業が困難だったので、使える(使えた)ものだけを解説しています。
−・−・−
以下私の分かる範囲でチェックして、修正が必要な部分について変更法方を書いてあります。また各ルーチンの簡単な説明も添えてありますので、グルールーチンの使い方の参考にして下さい。変更した部分は全て実際にコンパイルして HyperCard 上でテストしてあります。
凡例:
○ = 動作確認済み
● = ソース書き換えが必要
Θ = 未確認
theStr$..... FB文字列。
cStrPtr&.... C文字列ポインタ。 例:[cStrHandl&]
cStrHandl&.. C文字列ハンドル。 例:[xCmdPtr& + _params + 0 * 4]
−・−・−
' ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
' script routines
' ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
○FN FormatScript (xCmdPtr&, scrptHndl&, insertPt&, quickFormat&)
スクリプトエディタを作成する時に使います。
スクリプト文字列ハンドル scrptHndl& をフォーマット(段落付け)します。
○FN ZeroTermHandle (xCmdPtr&, hndl&)
ハンドルを1バイト拡張して最後にゼロを書き込みます。
C文字列の終端処理ですね。
○FN PrintTEHandle (xCmdPtr&, handleTE&, header&)
TE(テキストエディット)ハンドルを渡すと、それをプリントします。
ΘFN SendHCEvent (xCmdPtr&, hcEvent&)
HyperCard にイベントを送ります。
hcEvent& はイベントレコードのポインタです。
ΘwordBreakProc& = LOCAL FN HCWordBreakProc (xCmdPtr&)
TEに渡すワードブレークルーチンポインタを得ます。
' ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
' sound routines
' ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
○FN BeginXSound (xCmdPtr&, wndPtr&)
外部ウィンドウがサウンドチャンネルを使うことを宣言します。
以後 HyperCard がサウンドチャンネルを必要とするときに
xGiveUpSoundEvt が送られて来るようになります。次項参照。
○FN EndXSound (xCmdPtr&)
外部ウィンドウが使用していたサウンドチャンネルを解放する宣言です。
HyperCard がサウンドチャンネルを必要として xGiveUpSoundEvt を
送ってきた時に、チャンネルを譲り渡す場合に使います。
以後外部ウィンドウはサウンドチャンネルを使えません。逆にサウンド
チャンネルを譲らない場合は HyperCard がサウンドチャンネルを使えません。
○FN RunHandler (xCmdPtr&, handler&)
handler& に収められたC文字列ハンドルをスクリプトとして実行します。
' ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
' general utility routines
' ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
●FN GetXResInfo (xCmdPtr&, resFileRef&, resID%, rType&, resName$)
実行中の XCMD/XFCN の情報を得ます。
各パラメータに以下の値が返ってきます。
resFileRef& は XCMD/XFCN の存在するスタックのリファレンスナンバー。
resID% はリソースID。
rType& はリソースタイプ( _"XCMD" または _"XFCN" )
resName$ はリソース名。
:関数定義の1行目を以下のように書き換えて下さい。
:LOCAL FN GetXResInfo (xCmdPtr&, @resFilePtr& , @resID&, @rType&, @resNamePtr&)
○wndPtr& = FN FrontDocWindow (xCmdPtr&)
最前面のドキュメントウィンドウのポインタを返します。
フローティングウィンドウは無視されます。
最前面のフローティングウィンドウのポインタが欲しい場合は
ToolBox の FrontWindow を使います。
●FN GetObjectName (xCmdPtr&, object&, objName$)
指定したオブジェクトの名前を objName$ に得ます。
オブジェクトの指定については下記参照。
:関数定義の1行目を以下のように書き換えて下さい。
:LOCAL FN GetObjectName (xCmdPtr&, object&, @objNamePtr&)
●FN GetObjectScript (xCmdPtr&, object&, scriptHndl&)
指定オブジェクトのスクリプトの入ったC文字列ハンドルを
scriptHndl& に得ます。オブジェクトの指定については下記参照。
:関数定義の1行目を以下のように書き換えて下さい。
:LOCAL FN GetObjectScript (xCmdPtr&, object&, @scriptHndl&)
○FN SetObjectScript (xCmdPtr&, object&, scriptHndl&)
指定オブジェクトのスクリプトを設定します。
オブジェクトの指定については下記参照。
オブジェクトを指定するための xTalkObject 構造体を以下に記します。
DIM RECORD xTalkObject
DIM objectKind%
DIM stackNum&
DIM bkgndID&
DIM cardID&
DIM buttonID&
DIM fieldID&
DIM END RECORD .xTalkObject
objectKind% には _xStackObj、_xBkgndObj、_xCardObj、_xFieldObj、_xButtonObj のいづれかを指定します。
stackNum& はスタックのファイルリファレンスナンバーです。bkgndID&、cardID&、buttonID&、fieldID& は必要なら設定します。
xTalkObject構造体は使いたい時に自分で作ります。例えば stackPath$ にスタックのフルパスが入っているとして、そのスタックスクリプトを得るには以下のようにします。
myXTalkObjPtr& = FN NEWPTR( 22 )
myXTalkObjPtr&.objectKind% = _xStackObj
myXTalkObjPtr&.stackNum& = FN StackNameToNum( xCmdPtr&, stackPath$ )
myXTalkObjPtr&.bkgndID& = 0
myXTalkObjPtr&.cardID& = 0
myXTalkObjPtr&.buttonID& = 0
myXTalkObjPtr&.fieldID& = 0
FN GetObjectScript ( xCmdPtr&, myXTalkObjPtr&, result& )
err% = FN DISPOSPTR( myXTalkObjPtr& )
xCmdPtr&.returnValue& = result&
' ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
' external windows (called windoids, or xWindows)
' ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
●wndPtr& = FN NewXWindow (xCmdPtr&, winRect, title$, visible%, procID%, wndColor%, floating%)
外部ウィンドウを作ります。
winRect はウィンドウレクト。
title$ はウィンドウタイトル文字列。
visible% はウィンドウを表示状態で作るかを _zTrue か _false で指定。
procID% はウィンドウのスタイル。
wndColor% はカラーウィンドウを作るかを _zTrue か _false で指定。
floating% はフローティングウィンドウかを _zTrue か _false で指定。
基本的に ToolBox の NewWindow と同じです。
ウィンドウスタイル procID% には ToolBox 定義の他、HyperCard が独自に
定義したものが利用できます。
:関数定義の一行目を以下のように書き換えて下さい。
:LOCAL FN NewXWindow (xCmdPtr&, @rctPtr&, @titlePtr&, visible%, procID%, wndColor%, floating%)
○wndPtr& = LOCAL FN GetNewXWindow (xCmdPtr&, templateType%, templateID%, wndColor%, floating%)
テンプレートリソースから外部ウィンドウを作ります。
"WIND" または "DROG" リソースでウィンドウを定義しておきます。
templateType% はテンプレートタイプ "WIND" または "DROG"。
templateID% はテンプレートリソースID。
wndColor% はカラーウィンドウを作るかを _zTrue か _false で指定。
floating% はフローティングウィンドウかを _zTrue か _false で指定。
基本的に ToolBox の GetNewWindow と同じです。
○FN CloseXWindow (xCmdPtr&, xWindowPtr&)
HyperCard に対してウィンドウを閉じるよう要請します。
ウィンドウを閉じる処理そのものは HyperCard が行います。
ToolBox の CloseWindow は使ってはいけません。
○FN SetXWIdleTime (xCmdPtr&, xWindowPtr&, interval%)
_nullEvt の送られる周期を interval% に指定します。
これを実行しない限り、外部ウィンドウに _nullEvt が送られて来ません。
また、0 を設定すると _nullEvt が送られて来なくなります。
interval% に指定する時間は目標値であり、保証はされません。
○FN XWHasInterruptCode (xCmdPtr&, xWindowPtr&, haveCode%)
外部ウィンドウが割り込み処理を含むことを宣言します。
ΘFN RegisterXWMenu (xCmdPtr&, xWindowPtr&, mHndl&, registering%)
外部ウィンドウが使うメニューを宣言します。
' ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
' editing with windoids
' ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
ΘFN BeginXWEdit (xCmdPtr&, xWindowPtr&)
外部ウィンドウがTE(テキストエディット)を使うことを宣言します。
これ以降のイベントはTEに送られます。
ΘFN EndXWEdit (xCmdPtr&, xWindowPtr&)
外部ウィンドウがTE(テキストエディット)の使用を終了したことを
宣言します。これ以降のイベントはTEに送られません。
ΘFN SaveXWScript (xCmdPtr&, scriptHndl&)
スクリプトエディタを作成する時に使います。
外部ウィンドウで編集していたスクリプトをセーブします。
ΘcheckPoints& = FN GetCheckPoints (xCmdPtr&)
スクリプトエディタを作成する時に使います。
実行中のスクリプトのチェックポイントを返します。
ΘFN SetCheckPoints (xCmdPtr&, checkLines&)
スクリプトエディタを作成する時に使います。
実行中のスクリプトの指定行にチェックポイントを置きます。
○FN XWAllowReEntrancy (xCmdPtr&, xWindowPtr&, allowSysEvts%, allowHCEvts%)
XCMD/XFCN がリエントラント(再入)可能であることを宣言します。
外部ウィンドウでは必須となるので、xOpenEvt 処理の時に実行しておきます。
●FN SendWindowMessage (xCmdPtr&, xWindowPtr&, winName$, message$)
外部ウィンドウに対してメッセージを送ります。
HyperTalk の send message to window winName と同じです。
ウィンドウのポインタが分かっている場合は xWindowPtr& にポインタ、
名前しか分からない時は winName$ に名前を渡します。
:関数定義の一行目を以下のように書き換えて下さい。
:LOCAL FN SendWindowMessage (xCmdPtr&, xWindowPtr&, @wndNamePtr&, @messagePtr&)
○FN XWAlwaysMoveHigh (xCmdPtr&, xWindowPtr&, moveHigh%)
コードを上位メモリに取るよう要請します。
メモリの断片化を避けるために、xOpenEvt 処理の時に実行しておきます。
' ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
' script routines
' ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
ΘFN GoScript (xCmdPtr&)
スクリプトエディタ/デバッガを作成する時に使います。
現在のスクリプトを実行します。
ΘFN StepScript (xCmdPtr&, stepInto%)
スクリプトエディタ/デバッガを作成する時に使います。
現在のスクリプトを1行だけ実行します。
○FN AbortScript (xCmdPtr&)
実行中のスクリプトを停止します。
○FN CountHandlers (xCmdPtr&, handlerCount%)
実行中のハンドラの数(階層)を返します。
XCMD/XFCN がメッセージボックスから直接実行された場合は
ゼロが返ってきます。
●FN GetHandlerInfo (xCmdPtr&, handlerNum%, handlerName$, objectName$, varCount&)
デバッガ用のルーチンです。
現在実行中のハンドラの情報を得ます。
handlerNum% に 1 を渡すと現在のハンドラの情報、2 を渡すと
現在のハンドラを呼び出した親ハンドラの情報が得られます。
handlerName$ にハンドラ名、objectName$ にオブジェクト名、varCount& に
変数の数がそれぞれ返ってきます。
:関数定義の一行目を以下のように書き換えて下さい。
:LOCAL FN GetHandlerInfo (xCmdPtr&, handlerNum%, @handlerNamePtr&, @objectNamePtr&, @varCount&)
○FN GetVarInfo (xCmdPtr&, handlerNum%, varNum%, varName$, isGlobal%, varValue$, varHndl&)
デバッガ用のルーチンです。
現在実行中のハンドラの変数情報を得ます。
handlerNum% の指定は GetHandlerInfo と同じです。
varNum% は変数を指定するインデックスです。1から GetHandlerInfo で得た
varCount& までの数を指定します。
varName$ には変数名が返ります。
isGlobal% はグローバル変数なら _zTrue、そうでなければ _false が返ります。
varValue$ には変数の内容(255バイトまで)が返ります。
最後の varHndl& にハンドルを渡すと変数の内容がコピーされます。
(ハンドルの大きさは適宜調整されます。0を渡すと無視されます)
ΘFN SetVarValue (xCmdPtr&, handlerNum%, varNum%, varHndl&)
スクリプトエディタ/デバッガを作成する時に使います。
handlerNum% と varNum% で指定された変数に値 varHndl& をコピーします。
Θhand& = FN GetStackCrawl (xCmdPtr&)
スクリプトエディタ/デバッガを作成する時に使います。
メッセージ表示ウィンドウ関連のもののようです。
ΘFN TraceScript (xCmdPtr&, traceInto%)
スクリプトエディタ/デバッガを作成する時に使います。
StepScript を連続して実行します。
−・−・−
以上で Glue ファイルの追加修正は終わりです。良く分からないルーチンについては各自研究のこと(笑)
ファイルを書き換えたら保存し、プロジェクトウィンドウの「命令」メニューから「全てをコンパイル」を実行しておいて下さい。
もし「 ファイルが見つからないかコンパイルされていない」というエラーが出た時は、以下の手順でそのファイルだけをコンパイル出来ます。
・一旦FBを終了する
・新しいフォルダを作って、目的のファイルをそこに移動する
・そのファイルが INCLUDE または GLOBALS しているファイルも一緒に入れる
・目的のファイルをダブルクリックしてFBを起動する
・メニューバーの「命令」メニューから「実行」する
・FBを終了する
・ファイルを元のフォルダに戻す
・新しく作られたプロジェクトファイルは不要なのでフォルダごと捨てる
この「コンパイルされていない」エラーにどれだけ悩まされて来たことか・・・どなたか「正式な」対処法をご存じの方はご教授下さい(^^;)
ファイルを保存する時は「トークン」形式で保存しないで下さい。「テキスト」形式にしておかないと正しく読み込めません。これは全てのファイルに共通です。
以後外部ウィンドウを持つ XCMD を作る時はこのファイルを使用します。
Next
FutureBASIC Lab.
UDI's HomePage