GO BACK

Windows Scripting Host教室 その4


「HTMLとの連係とプロシージャ」



■HTMLでインターフェイスを作る

 WSHを多少使えるようになってくると、WSHというものが意外に応用範囲の狭いものであることがわかってくることでしょう。「要するに単なるバッチ処理機能であって、自動的にファイルをコピーしたり削除したりといったことしかできないわけだ」と少しがっかりするわけですね。実は、これは大いなる誤解なのですが、まあ確かに最初の内は「単なるファイル処理言語」にしか見えないのは仕方ありません。

 なにより「インターフェイスが作れない」ということが、大きな欠点となっていると言えるでしょう。とりあえずメッセージを表示するぐらいは覚えましたが、例えば他の開発ツールのようにウィンドウやボタンなどを使って、マウスで操作するようなものはWSHでは作れません。これでは、ちょっと凝ったものを作ろうと思っても、複雑な機能は実現できないことになります。

 が、本当にWSHではボタンなどのユーザーが操作するインターフェイスは作れないのでしょうか。実は、そういうわけでもないのです。いえ、確かにWSH自体にはそういう機能はありませんが、他の「インターフェイスを作れるモノ」を利用すればいいのですよ。

 WSHは、もともと「それ自身で何かをするというより、既にある様々な機能を利用して便利なことをする言語」として作られています。要するに、もともと寄生虫みたいな言語(?)として作ってあるんです。ベースになっているスクリプト言語(VBScriptやJScript)が動く環境であれば、たいていのものでWSHの機能は使えるようになっています。ですから、インターフェイスの用意できるモノの中からWSHの機能を利用してやればいいのです。

 これにはいろいろと候補があがります。例えばVisual Basicなどの開発言語でもいいですし、ExcelなどのVBScriptをマクロ言語として採用しているソフトでもWSHの機能は使えるのです。――が、こうした市販のものでなく、タダでインターフェイスを作れてWSHが利用できるものがあります。それは「HTML」です。

 Internet Explorerでは、スクリプト言語として「VBScript」と「JScript」をサポートしています。ですから、HTMLで作成したボタンなどからVBScriptのスクリプトを呼び出せばちゃんとWSHの機能が使えるのです。――では、簡単な実験をしてみましょう。

<html>
<head>
<script language=VBScript>
<!--
Sub Btn_Click
str1 = TextField.value
MsgBox "あんたは『" & str1 & "』と書いたね?"
End Sub
-->
</script>
</head>

<body>
<h3>HTML利用テスト</h3>
<input type=text size=40 name=TextField>
<input type=button value=CLICK name=Btn OnClick=Btn_Click>
</body>
</html>

 これは 、テキスト入力フィールドとボタンをもった簡単なHTMLのフォームからVBScriptのスクリプトを呼び出すサンプルです。これをメモ帳などで記述して「○○.htm」というように、htmという拡張子の名前で保存します。

 そして、ダブルクリックして起動すると、Internet Explorerが起動し、テキストフィールドとボタンを持った画面 が現れます(IEをデフォルトブラウザに設定してある場合)。テキストフィールドに何か文字を書いてボタンを押せば、そのテキストを使ったメッセージが画面 に現れます。

 いかがですか? これは、WSHうんぬんという以前のスクリプトで、単に「HTMLからVBScriptを呼び出す」ということをしているだけのサンプルなんですが、とりあえず「HTMLで書いたインターフェイスからスクリプトが呼び出され動いている」ことはわかったことでしょう。

 

■HTMLタグとプロシージャ呼び出しの仕組み

 では、HTMLからVBScriptのスクリプトを呼び出すには、どのような書き方をすればいいのでしょうか。――これは、大別 して2つの部分に分けて考えることができます。VBScriptのスクリプト部分、そしてHTMLのフォーム部分です。

 まず、スクリプトの埋め込み部分です。これは、以下のように記述して行なっています。

		<script language=VBScript>
<!--
……ここにスクリプトが書いてある……
-->
</script>

 スクリプトは、全て<script language=言語名>というタグで始まり、</script>タグで終わります。その間に、<!--と、-->というタグ(?のようなもの?)がありますが、これは一種のおまじないのようなものです。スクリプトに対応していないブラウザでこうした<script>タグを使うと、その間のスクリプトがテキストとして表示されてしまいます。それを防ぐため、<script>タグがわからない場合にはその間を全てコメントとみなすように、<!--と-->でくくってあるのです。まあ、WSHのように自分の環境でInternet Explorerで使うというように限定された使い方なら、これは別に必要ないでしょう。

 さて、肝心のスクリプトですが、これは次のような形で書かれていることがわかります。

Sub Btn_Click
……ここに命令が書いてある……
End Sub

 わかりますか? Sub 《名前》で始まり、End Subで終わるように書かれています。 このような形で書かれているものを「プロシージャ」とか「サブルーチン」と呼びます。 VBScriptではプロシージャと呼んでいるようなので、ここでもこの呼び方をしましょう。

 プロシージャというのは、そこだけ他とは独立して呼び出し実行できるようになったスクリプトの単位 のようなもの、と考えるとよいでしょう。プロシージャは、今まで作ったスクリプトのように、「ダブルクリックすると最初の命令から順番に実行する」というようなものとは少し違います。プロシージャは、そのスクリプトのあるファイルを実行しても、それだけでは動かないのです。必要に応じて、そのプロシージャが(他の命令などから)呼び出された時だけ、実行されます。

 では、今回作ったプロシージャは、どこでどのように呼び出されているのでしょう? それは、スクリプトの先にあるフォーム作成部分を見るとわかります。<body>タグで、ボタンを作成している部分を見てみましょう。


<input type=button value=CLICK name=Btn OnClick=Btn_Click>

 このように書かれていますね?  タグの中のオプションで「OnClick=Btn_Click」と書かれています。OnClickというのは、「クリックした時に実行する」という働きを持ったオプションです。つまり、これで「クリックしたらBtn_Clickを実行する」ということを指定したわけです。

 一応、HTMLのボタンでスクリプトを呼び出す時は、OnClickオプションを指定しなくても、nameをきちんと設定しておけば、自動的に《name》_Clickという名前のプロシージャを呼び出すようになっています。ですから、わざわざOnClickを指定しなくても通 常は大丈夫でしょう。

 ついでに、今回使った<input type=button>タグと<input type=text>タグについても触れておきましょう。<input>というタグは、HTMLでGUI部品を表示するのに用意されているものです。HTMLでは今回使ったようなテキスト入力フィールドやボタンの他にも、ラジオボタンやチェックボックス、プルダウンメニューなど基本的なGUI部品を一通 り揃えてあります。

 これらのタグについては、別途HTMLの解説などで勉強していただくとして、今回使った2つのタグだけ触れておきましょう。


●1行だけのテキスト入力フィールドを表示する●
<input type=text size= 横幅の文字数 name=部品名 value=表示されるテキスト>


●クリックして動かすボタン●
<input type=button name=部品名 value=ボタンに表示するテキスト OnClick=クリックで実行する命令>

 

 これらは実際に使って見ればすぐにオプションの使い方などはわかります。オプションはどれも省略してもかまいません。ただしVBScriptで利用する場合は、nameを必ず設定しておいて下さい。そうしないと、スクリプト内からこれらの部品を利用できなくなります。

 また、スクリプト内からこれらの部品のさまざまな値を利用したい場合は、部品名と利用したいオプション名を続けて記述します。例えば、先のスクリプトでは、テキスト入力フィールドに書かれているテキストを変数におさめるのに「str1 = TextField.value」と書いてありました。これで、TextFieldという部品のvalueオプションの値がstrに入る、というわけです。textの場合、そこに書かれているテキストがvalueに設定されていますから、こうすることで、ユーザーが書き込んだテキストを取り出していたのです。

 

■HTMLタグをスクリプトで書き出す

 では、今度は反対に「スクリプトからHTMLタグを操作する」ということをしてみましょう。つまり、HTMLタグに書き込まれたテキストを取り出すだけでなく、スクリプトを使ってHTMLを出力して新しい表示をさせてみます。

<html>
<head>
<script language=VBScript>
<!--
Sub Btn_Click
Set FS = CreateObject("Scripting.FileSystemObject")
FPath = TextField.value
If FS.FolderExists(FPath) = False Then
MsgBox "フォルダが見つかりません!"
Exit Sub
End If
Set FObj = FS.GetFolder(FPath)
Document.write "<table border>"
For Each Obj In FObj.Files
Document.write "<tr><td>" & Obj.Name & "</td>"
Document.write "<td>" & (Obj.size 102.4) / 10 & "K</td>"
Document.write "<td>" & Obj.DateLastModified & "</td></tr>"
Next
Document.write "</table>"
End Sub
-->
</script>
</head>

<body>
<h3>HTML利用テスト</h3>
フォルダのパス:<input type=text size=40 name=TextField>
<input type=button value=一覧表示 name=Btn OnClick=Btn_Click>
</body>
</html>

 では、これを「○○.htm」というようなファイル名で保存し、ダブルクリックしてInternet Explorerを起動し表示させてみましょう。上の図のように、テキスト入力用のフィールドとボタンが1つずつ並んだ画面 が現れますね。では、ここでフィールドに適当なフォルダのパスを記述し、「一覧表示」ボタンをクリックしてみましょう。「Active Xがどうのこうの」という警告メッセージが現れますが、そのまま「はい」を選んで下さい。

 すると、しばらくすると、入力したパスのフォルダ内にある全ファイルの名前とサイズ、最終修正日が一覧で表示されます。

 いかがですか? HTMLとVBScriptを組み合わせれば、単にボタンなどのインターフェイスを利用するだけでなく、様々な処理結果 をHTMLを利用して出力したりすることもできることがわかるでしょう?

 では、ボタンクリックで呼び出されるプロシージャ部分を見てみましょう。ここでは、今度こそ(?)WSHのオブジェクトを利用してファイルの情報を取り出しています。

Sub Btn_Click
Set FS = CreateObject("Scripting.FileSystemObject")
FPath = TextField.value
If FS.FolderExists(FPath) = False Then
MsgBox "フォルダが見つかりません!"
Exit Sub
End If
Set FObj = FS.GetFolder(FPath)
Document.write "<table border>"
For Each Obj In FObj.Files
Document.write "<tr><td>" & Obj.Name & "</td>"
Document.write "<td>" & (Obj.size 102.4) / 10 & "K</td>"
Document.write "<td>" & Obj.DateLastModified & "</td></tr>"
Next
Document.write "</table>"
End Sub

 主な命令は、前回既に使ったものばかりですから、だいたいの働きはわかることでしょう。――まず、FileSystemObjectオブジェクトを作成し、それからTextField.valueの値を変数に取り出します。

 そして、FolderExistsを使って、変数に取り出したパスのフォルダが存在するかを調べています。もし 存在しなかった場合は、MsgBoxでメッセージを表示した後、「Exit Sub」というのを実行しています。これは、「現在実行中のSub構文から抜け出す」という意味になります。つまり、実行中のプロシージャを途中で抜けて終わりにするわけですね。

 その後、GetFolderでFolderオブジェクトを作成し、それからDocument.writeというものを実行しています。――これが、画面 にタグを書き出すための命令なのです。

 Documentというのは、現在開いているHTMLドキュメントを示すオブジェクトなのです。そしてwriteは、それにテキストを書き出す働きをします。つまり、Document.writeで、現在開いているドキュメントにテキストを書き出すことができるのです。ということは、ここでタグを書き出せば、そのタグの通 りにHTMLの表示が現れるわけですね。

 ここでは<table border>というテーブルの開始タグを書き出し、それからFor Each構文へと進んでいます。その中で、Document.writeを使って、以下のような3行のタグを書き出しています。

<tr><td> …オブジェクトのNameプロパティ… </td>
<td> …オブジェクトのSizeを元に計算した値… K</td>
<td> …オブジェクトの最終修正日… </td></tr>

 これで、3つのコラムからなる1列のテーブル表示が書き出されているわけです。テーブルは、<tr></tr>というタグの間に<td></td>というコラムを指定するタグを挟んで記述します。詳細はHTMLのリファレンスなどで確認をしてみましょう。

 これで、全てのファイルの情報をテーブルのタグに書き出したら、最後に</table>というテーブルを終了するタグを書き出して終わり!というわけです。

 このように、HTMLとVBScriptとWSHオブジェクトを組み合わせて使うことができるようになると、WSHの利用範囲はぐっと広がります。様々な操作のためのボタンなどをHTMLで用意しておくこともできますし、スクリプトにより処理した結果 を整理して画面に表示することも可能になります。HTMLにより、インタラクティブなスクリプトを作ることができるようになるのです。本格的にWSHを利用したい人は、同時にHTMLのタグについても勉強して、両者を自由に使いこなせるようになりましょう。

GO NEXT


GO HOME