SeraphyScriptToolsはActiveXオブジェクトです。
このオブジェクトはWSH環境に簡単にユーザー対話能力を持たせることを目的として作成されました。
Windows Scripting Host(WSH)のスクリプト上で利用するのが本来の利用方法です。
WSHがインストールされている環境では、ファイル拡張子「VBS」または「JS」がVBScript/JavaScriptに対応するスクリプトファイルになります。
ツールによっては、そのほかの言語でも利用できるように拡張されていることがあります。
イベントをハンドルするためには、Version5以降のスクリプトエンジンを使用する必要があります。
このエンジンはIE5に含まれています。
ActiveXオブジェクトを生成するコマンドは一般的にはCreateObjectを使います。
VBSなら
dim Obj
set Obj = CreateObject( ・・・・)
この方法でも、SeraphyScriptToolsは動作しますが、ユーザーインターフェイスに柔軟性を持たせるならば、イベントをハンドリングできる方法が望ましいといえます。
SeraphyScriptToolsは、作成したフレームウィンドウやボタンをユーザーがクリックするなどの動作を行ったとき、イベントを発生することができます。
WSHでは、イベントに対応してスクリプトを実行させることができます。
VBSならば
dim Obj
set Obj = WScript.CreateObject(・・・・ , "eventhandler_")
WSHのメソッドである、WScript.CreateObjectでオブジェクトを生成すると、そのオブジェクトが発生するイベントで指定した名前で始まるサブルーチン(JScritpではファンクション)を実行することができるようになります。
また、SeraphyScriptToolsオブジェクトは、しばしば新たなオブジェクトを生成して返します。
このオブジェクトが発生するイベントをハンドルする方法もあります。
WScript.ConnectObject(Obj,"Eventhandler_")
WScript.DisconnectObject(Obj)
この2つのWSHのメソッドはオブジェクトが発生するイベントをハンドルしたり解除したりできます。
VBScript Version5.0よりサポートされたクラス・オブジェクトを使えば、イベントハンドラは、さらに簡単になります。
WSHのConnectObjectを使う必要もありません。
この方法については、応用編にて説明します。
また、旧SeraphyScriptDialogのモードレスダイアログのようにスクリプト上でイベントをハンドルすることも可能です。
この方法についても、応用編にて説明します。
従来のVBScriptでのスクリプトは多少の分岐はあっても、上から下へ流れて終わる、というパターンであることが多かったと思います。
これは動作があらかじめ決められているバッチ処理などの一般的な形式です。
しかし、ユーザーの応答を待って動作を行うプログラムでは、このようにはいきません。
いつ何をするかはユーザーの操作で決定され、プログラムは分かりません。
このような処理を行う場合には「メッセージループ」というものが必要となります。
ユーザーからの指示などを「メッセージ」と呼び、このメッセージを待機しつづけるためのループ処理のことです。
メッセージが入ると、メッセージループは、そのメッセージに対応した指定された処理(イベント)を行わせます。
この処理が終われば、またユーザーからの指示をまつループに戻ります。
このループはウィンドウが閉じられる、などの状況にならない限り永久に続きます。
メッセージループが終了するのは、ウィンドウが閉じられてユーザーとの対話の必要性がなくなったときです。
このような構造をもつ場合、ユーザーからの指示で実行されるコードはサブルーチンの形式をとって、メッセージループから呼び出されるようになります。
このようなコードを、イベントに対応するコード = イベント・ハンドラ、と呼びます。
SeraphyScriptToolsでは、このイベントハンドラは、ウィンドウに関連付けられたクラスオブジェクトのメソッドか、あるいはWSHのConnectObjectメソッドによって接続されたサブルーチンとなります。
ここまでの説明で、ユーザーインターフェイスをもつスクリプトにはメッセージループがあるということが分かったと思います。
では、実際に簡単なダイアログボックスを作成してみましょう。
下記のリストをコピー&ペーストして拡張子VBSで保存して実行してみます。
|
このサンプルはボタンを押すごとにカラフルなウィンドウが、どんどん開いてゆきます。
ここではメッセージループが、どこにあるのかだけ、簡単に説明します。
WScript.CreateObjectで、まず、SeraphyScriptTools.Instanceオブジェクトを生成します。
この時点で、ウィンドウとなるOverlappedWindowはInstanceオブジェクトのプロパティとして生成済みです。
つぎに、ユーザーからのボタン操作を感知し、それをスクリプトで反応できるようにするために、オブジェクトを接続します。
WScript.ConnectObjectで、ウィンドウからの通知をスクリプトで処理できるように接続しました。
ユーザーからの操作をうけとったウィンドウは、スクリプトに通知し、「Main_」ではじまるサブルーチンが実行されるようになります。
オブジェクトの接続が終わった後で、ウィンドウの定義を行います。
ここでは、ウィンドウの大きさと、ウィンドウの中にボタンを1つだけ作っています。
定義がおわったら、「open」メソッドでウィンドウを開き、表示させます。
表示するだけではユーザーからの操作を受け付けられないので、ここからユーザーの操作をうけつけるループに入ります。
「DoModal」メソッドで、ユーザーがウィンドウの「閉じる」ボタンを押すか、ウィンドウがスクリプトによって閉じられるまで、ユーザーの操作を待ちつづけるメッセージループを開始します。
このメソッドが終了して、つぎのコードを実行するのはウィンドウが閉じられたあとになります。
ウィンドウが閉じられたあとに、WScript.DisconnectObjectでオブジェクトとの通知を切断します。
スクリプトは、このあとに続いていますが、すべてサブルーチンの定義です。
したがって、この例では、実際に実行されるコードは、DoModalが最後となります。
スクリプトが終端に達すると、オブジェクトは自動的に切断・破棄されるので後始末は必要ありません。
(今回のケースでは、DisconnectObjectメソッドは実際は呼び出さなくても正常に終了します。)
このように、通常のバッチ処理的なスクリプトと決定的に違うのは、メッセージループが存在し、そこで終了までループしつづけている、ということです。