インターフェイスと条件判断
条件判断や分岐などのプログラム制御構造は、HSPでも多くの方法が提供されています。
スクリプト「button.hsp」は、入力枠に指定した回数だけ数字をカウントアップするというプログラムです。
input a button gosub "GO!",*go stop *go if a>0 { repeat a mes (cnt+1) loop } return
input
やbutton
といった命令は、画面上にユーザーインターフェイスのための部品を配置するもので、スクリプト上で基本的なレイアウトを作成することになります。
button
命令は、いくつかの特徴的な機能を持っています。2行目の「button gosub "GO!",*go
」は、「GO!」と書かれたボタンを画面上に配置し、ボタンが押された場合には、「*go
」というラベルのサブルーチンを呼び出す指定をしています。
ラベルとは、アスタリスク記号(*)に続けて、好きな名前(HSPの予約キーワードを除く)を付けスクリプト上の場所を示したもので、ここでは4行目に書かれた「*go
」を指します。つまり、[GO!]ボタンを押すと、4行目からサブルーチンの終わりを示すreturn
命令までが実行されることになります。button
命令には、サブルーチンだけでなく絶対分岐を行う「button goto
~」という書式もありますが、構造を把握するためにサブルーチンを呼び出すことを推奨しています。
3行目にあるstop
命令は、その場でスクリプトの実行を中断するというもので、これを書いておかないと、そのまま「*go
」以降が続けて実行されてしまいます。
5行目は、条件判断を行っています。変数a
の値が、0より大きければ中カッコ内を実行するという仕組みになっています。if
命令は、それに続く条件式が正しいかどうかを判断し、正しければ、それ以降を実行します。実行ブロックが複数行に渡る場合には、このサンプルのように中カッコで囲むことができます。実行ブロックがその行だけで済む場合には、「if a>0 : mes a
」のように記述します。
6~8行目では、繰り返し処理を行っています。HSPでは、基本的にここで使用しているrepeat~loop
という命令で繰り返しを記述します。repeat
命令に回数を指定することで、loop
命令までの間を繰り返します。repeat
命令で指定する回数が、0の場合は処理を行わず、マイナス値ならば無限ループとなります。また、繰り返しの内部では、システムが用意しているcnt
という名前の変数をカウンタとして使用することができます。変数cnt
は、0から始まり繰り返すごとに、加算されていきます。
その他、繰り返しから脱出するbreak
命令や、やり直しを行うcontinue
命令なども存在します。他の言語で慣れている人のために、while
やuntil
、for
~next
などの繰り返し記述も用意されていますが、HSPではrepeat
~loop
を使うことが推奨されています。
![実行結果 実行結果](http://cz-cdn.shoeisha.jp/static/images/article/441/s_button.gif)
HSPでは、プログラムの構造化を行うためのモジュール化や、関数定義などの機能を提供していますが、スクリプトを作成する上でそれらは必須となっていません。上級者が規模の大きいプログラムを作成したり、モジュールを公開するような場合には欠かせないものですが、小規模なプログラムの作成や初心者の学習においては、シンプルな仕様を優先するという考えに立っています。
画像の表示と保存
HSPが、もともと得意としている画像を扱ったサンプルを作成してみます。
スクリプト「picload.hsp」は、指定した画像ファイルに「@」の記号を付加した後、違うファイル名でbmp形式により画像を保存します。
; 画像加工プログラム dialog "bmp;*.jpg;*.gif",16 if stat = 0 : end fname=refstr picload fname font msgothic,160 color 0,0,255:mes "@" sname=getpath(fname,1) bmpsave sname+"_mod.bmp" end
実行すると、ファイル選択のダイアログが表示されるので、適当な画像ファイルを1つだけ選んでください。その後、選択したファイルに「_mod」を付加した名称で、同じフォルダに加工された画像ファイルを作成します。
HSPやシステム側の機能を呼び出すことで、非常に短いスクリプトになっています。
1行目の「;
」はコメントを示してします。行の中で「;
」記号以降はコメントとして扱われ、実行時には意味を持ちません(コメントには、他にもC言語形式の「/*
」~「*/
」や、C++やJava形式の「//
」を使用することが可能です)。
次のdialog
命令は、システムが持つコモンダイアログを呼び出す機能を持っています。ここでは、ファイル選択ダイアログを表示していますが、それ以外にもいろいろなダイアログ表示を行うことができます。機能の詳細は、dialog
命令のキーワードにカーソルを合わせて[F1]キーを押すと調べることができますので、確認してみてください。
実際に画像の加工を行っているのは、5~7行目にあたります。picload
命令は、指定された画像ファイルを読み込むための命令で、これにより初期化された画面上に、mes
命令で「@」の記号を描画しています。
HSPでは、描画のフォントを設定するためのfont
命令や、色を設定するcolor
命令などの画像操作の機能が用意されています。リアルタイムのアニメーションや透過コピー、半透明合成などは、よりリッチな画面を作成したいという場合に役立ちますし、DirectXによる3D描画など、見栄えのある映像を作成するための機能をフルにサポートしています。
外部アプリケーション連携
ここからは、HSPを別な側面から利用する方法について触れてみたいと思います。
HSPと、外部モジュールやアプリケーションなどを連携させることで、インターフェイスや見た目を補助するような用途に使用することができます。例えば、コマンドプロンプトで動作するコンソールアプリケーションにグラフィカルなユーザーインターフェイスを用意することで、誰にでも使えるような操作性を提供することも可能です。
スクリプト「pipe.hsp」は、コンソールアプリケーションである「ipconfig」を実行して、標準出力の内容を表示します。「ipconfig」は、システムが用意しているツールで、TCP/IPネットワークに関する情報を表示するためのものです。
スクリプトから各種コマンドをコントロールすることで、外部ツールのデータを解析したり、連続した処理(バッチジョブ)に対応させることが可能になります。
#include "hspext.as" cmd="ipconfig /all" sdim ln,4096 sdim buf,32000 mesbox buf,640,200,1:obj_edit=stat pipeexec buf,cmd,1 if stat : dialog "実行できませんでした" : end mes cmd+" を実行中..." repeat pipeget ln if stat=0 : break await 10 loop objprm obj_edit,buf mes "実行を終了しました" stop
最初の行にある、「#include "hspext.as"
」は拡張プラグイン機能を使用するための宣言です。
HSPでは、拡張プラグインという形で機能を追加していくことが可能です。これにより、HSP本体に内蔵された機能だけでは実現できない処理が可能になります。また、ユーザーが独自に作成したプラグインも多数公開されており、HSPを使いこなす上で欠かすことのできない要素となっています。
このようにHSPは、外部アプリケーションと連携して動作を行う糊付け(グルー)言語としての側面を持っています。通常の実行(exe)ファイルを始めとして、DLLによる外部API、COMオブジェクト、そしてウィンドウメッセージや、キーバッファを利用したアプリケーションの自動制御に関する機能をサポートしています。
また、外部との通信という意味では、TCP/IP通信の各種プロトコルやシリアルポート通信、ODBCを経由した各種データベースとの接続などの機能を備えているほか、HSP自身がCGIとして動作するコンソールモードなども用意されています。