X作成講座 on FB[07] Events ファイルの修正
なかなか一筋縄では行かないFBです。
外部ウィンドウ作成に伴い、イベント処理のテンプレートである HyperXcmd Events.INCL (以下 Events ファイル)を調べてみました。結果、このファイルも少々の修正が必要であることが分かりました。
実際にはこのファイルは XCMD ごとの書き換えの方が多いのですが、取りあえず不適切なものだけは先に修正しておきます。
修正個所は3つです。
まず LOCAL FN DoMouseDown ルーチンにある CASE _inContent の部分です。ここは XCMD Projects フォルダにある AskUserName Project のための処理で、このまま使うとフリーズします。
CASE _inContent 以下、CASE _inZoomIn の手前までをゴッソリ削って以下のものを書き込んで下さい。
xWndPtr& = xWEventPtr&.evntWindow&
CALL SELECTWINDOW( xWndPtr& )
xCmdPtr&.passFlag% = _zTrue
これはウィンドウがクリックされた時に最前面に出すための処理です。全てのウィンドウで必要とは限りませんが、ほとんどのウィンドウはこのような動作をするでしょう。
次に、LOCAL FN DoUpdateEvt ルーチンに以下のものを書き込みます。
xWndPtr& = xWEventPtr&.evntWindow&
CALL BEGINUPDATE( xWndPtr& )
' drawing your window here
CALL ENDUPDATE( xWndPtr& )
xCmdPtr&.passFlag% = _zTrue
実際に XCMD を作る時はこの BeginUpdate と EndUpdate の間にウィンドウの描画処理を置きます。
最後に一番下にある LOCAL FN HandleHCEvent ルーチンの、これまた一番下、CASE ELSE の次の行に xCmdPtr&.passFlag% = _zTrue という一行を追加します。これが無いとウィンドウの show/hide が出来ないなど、いくつか不具合が起きる場合があります。
以上で HyperXcmd Events.INCL の修正は終わりです。以後外部ウィンドウを持つ XCMD を作るときは、この修正済みファイルを使って下さい。
−・−・−
Events ファイルと、Events ファイルの扱うイベントについて、簡単に解説してみましょう。
一番下にある LOCAL FN HandleHCEvent 関数がメインルーチン( HyperXcmd.MAIN )の 00057 行からの飛び先ですね。外部ウィンドウを持つ XCMD が HyperCard から「イベントが起きたよ」と呼び出された時にここに制御が移ります。
FN HandleHCEvent 関数はイベントごとにそれぞれのサブルーチンに振り分ける処理をしています。イベントの種類は以下のものがあります。
・ _xOpenEvt
ウィンドウを作成した直後に一度だけ送られてくるイベントです。ここでウィンドウを整え、必要なら ShowWindow します。
・ _xCloseEvt
ウィンドウが閉じられる直前に送られてくるイベントです。ウィンドウの破棄そのものは HyperCard が行いますが、それに伴って必要になる処理をここで行うわけです。 xCmdPtr&.passFlag% に false を書き込むと閉じることを拒否したことになり、HyperCard はウィンドウを閉じません。
・ _nullEvt
何もしない時に送られてくるイベントです。 HyperTalk の idle イベントに似ています。アニメーションさせたり常時何かを監視する必要がある時にここでその処理をします。グルールーチンの SetXWIdleTime 参照。
・ _mButDwnEvt
マウスボタンが押された時に送られてくるイベントで、普通は mouseDownEvt と呼ばれます。 HyperTalk の mouseDown イベントのようなものです。ウィンドウ内でマウスクリックした時だけでなく、タイトルバーをクリックした時にもこのイベントが送られて来ます。ので、どこでマウスボタンが押されたのかを調べた上で、例えばクローズボックスなどの処理もここでする必要があります。
・ _mButUpEvt
マウスボタンが離された時に送られてくるイベントで、普通は mouseUpEvt と呼ばれます。 HyperTalk の mouseUp イベントのようなものです。
・ _keyDwnEvt
キーが押された時に送られてくるイベントです。主にテキストを扱う時に利用します。
・ _keyUpEvt
キーが離された時に送られてくるイベントです。現システムでは正常に機能しないようです。
・ _autoKeyEvt
キーを押し続けてリピート機能が働いた時に送られてくるイベントです。 keyDwnEvt と区別した処理を書くことが出来ます。
・ _updatEvt
ウィンドウの再描画が必要になった時に送られてくるイベントです。通常、ウィンドウへの描画はここ(だけ)で行います。
・ _diskInsertEvt
新しいボリュームがマウントされた時に送られてくるイベントです。
・ _activateEvt
ウィンドウがアクティブになった(最前面に出た)時や、デアクティブになった(他のウィンドウの後ろに回った)時に送られてきます。それぞれのタイミングで何か処理が必要ならばここに書きます。ウィンドウの再描画が必要な時は別に _updatEvt も送られてくるのでここでは再描画処理は不要です。
・ _osEvt
アプリケーション(Xでは多くの場合 HyperCard )がアクティブになった(最前面に出た)時や、デアクティブになった(他のアプリがアクティブになった)時に送られて来ます。それぞれのタイミングで特別のことをしたい時にその処理を書きます。ウィンドウの再描画が必要な時は別に _updatEvt も送られてくるので、ここでは再描画処理は不要です。
アップルのガイドラインによるとアプリケーションがデアクティブになった時はパレットは隠しておくのが望ましいとされているので、パレットウィンドウの場合はここで ToolBox の ShowHide を呼び出すのが良いでしょう。
ちなみに CompileIt! ではこのイベントを app4Event という古い呼び方で呼んでます。
・ _kHighLevelEvent
ハイレベルイベント、つまりアップルイベントが送られてきた時にこのイベントが起きます。本当に使えるのか未検証。
ここまでは Events ファイルでサポートしているものですが、実際には他にも多くのイベントが送られて来ます。以下その解説をします。
・ _xHidePalettesEvt
パレットウィンドウを隠す要請があった時に送られてくるイベントです。スクリプトエディタを開いた時などに送られてきます。
・ _xShowPalettesEvt
パレットウィンドウを表示する要請があった時に送られてくるイベントです。スクリプトエディタを閉じた時などに送られてきます。
・ _xSendEvt
HyperTalk によってウィンドウに send された時に送られてくるイベントです。 send されたメッセージ名をチェックし、対応したいものに対して処理を行います。
・ _xGetPropEvt
HyperTalk の set the get of window によってウィンドウのプロパティを取得しようとした時に送られて来ます。ここで対応したいプロパティを処理して HyperTalk に返します。プログラムで対応しないプロパティは HyperCard に任せることが出来ます。
・ _xSetPropEvt
HyperTalk の set the xxx of window yyy yyy to zzz によってウィンドウのプロパティをセットしようとした時に送られて来ます。ここで対応したいプロパティを処理し、プログラムで対応しないプロパティは HyperCard に任せることが出来ます。
・ _xCursorWithin
カーソルがウィンドウ内に入った時に送られてくるイベントです。ウィンドウ内でカーソルを変えたい場合はここで ToolBox の SetCursor を実行して xCmdPtr&.passFlag% に _false を書き込みます。 xCmdPtr&.passFlag% に _zTrue を書き込むと、HyperCard が対応(カーソルをアローに設定)します。
以下高度なプログラミングをする時に必要なものです。 HyperCard XCMD の解説書や ToolBox の解説書を参照して下さい。
外部ウィンドウがテキストエディットを使用している時に必要になります。
_xGiveUpEditEvt、_xEditUndo、_xEditCut、_xEditCopy、_xEditPaste、_xEditClear
外部ウィンドウ独自のメニューを利用する時に必要になります。
_xMenuEvt、_xMBarClickedEvt
外部ウィンドウを利用してスクリプトエディタを作る場合に必要になります。
_xShowWatchInfoEvt、_xScriptErrorEvt、_xDebugErrorEvtcomplaint
_xDebugStepEvt、_xDebugTraceEvt、_xDebugFinishEvt
外部ウィンドウがサウンドチャンネルを使う場合に必要になります。
_xGiveUpSoundEvt
−・−・−
Events ファイルの修正と解説は以上です。解説は舌足らずな部分もありますが、これは以降のサンプルの解説や、HyperCard の文献を参照して下さい。外部ウィンドウの作成/管理はひとつのアプリを作るのとほとんど同じ作業が必要ですので、ToolBox の参考書も必要になるでしょう。外部ウィンドウの道は険しいです。
Next
FutureBASIC Lab.
UDI's HomePage