Last Update : 2006/08/xx
HSP3.0 (HSP3) から導入された「関数」(かんすう)。HSP2 (HSP 2.x) の命令形式に慣れた人は、とまどうかもしれません。しかし、これはとても便利なものです。ひとまず、IT用語辞典e-Wordsより用語を引いてみーる、・・・って文章だといまいち意味がわからん。(^^;
HSP付属の『プログラミングマニュアル1・基本仕様ガイド (hspprog.htm)』→「2. スクリプト記述の基本」→「関数」で、簡易的な説明は用意されてますが、ここでは実際のサンプルソースをいくつかあげてみることにします。
下の表は、HSP2で「命令」だったものがHSP3で「関数」形式に変更された主なものです。新規導入関数も含まれてます。太字リンクはこのページで違いを触れているものです。(解説の項目は通常の命令・関数のHSP講座ページへのリンク)
関数 | 処理内容 | 解説 |
int | 文字列を整数値に変換 | >>> |
str | 文字列を整数値に変換 | >>> |
gettime | 年月日、曜日、時刻の取得 | >>> |
getpath | ファイルパス文字列の分解 | >>> |
rnd | 乱数の発生 | >>> |
sysinfo | 各種システム情報の取得 | >>> |
dirinfo | 各種フォルダのパス文字列の取得 | >>> |
ginfo | 各種ウィンドウ情報の取得 | >>> |
peek wpeek lpeek |
バッファから 1/2/4バイトの読み出し |
- |
strlen | 文字列の長さをバイト単位で取得 | >>> |
strmid | 文字列の一部の切り出し | >>> |
instr | 文字列の検索 | - |
日付や時間を取得するHSP2の命令に「gettime」というものがあります。まず、HSP2の場合です。
; [ HSP2 のコード ] ; 変数 a に 月 が代入されます gettime a, 1 ; 変数 b に 日 が代入されます gettime b, 3 mes "今日は、"+a+"月"+b+"日です。" stop
上のコードをそのままHSP3のスクリプトエディタに貼り付けてコンパイルしてもエラーがでます。エラー番号18「代入できない変数名を指定しています」です。
そこで、HSP3用に書き換えると、下のようになります。月なり日なりの取得タイプというのが、カッコで括られて指定できていますが、その取得した数値を入れておくための変数というのがなくなってしまいました。関数そのものが結果を返してくれます。
; [ HSP3 のコード (その1) ] ; 変数 a に 月 が代入されます a = gettime(1) ; 変数 b に 日 が代入されます b = gettime(3) mes "今日は、"+a+"月"+b+"日です。" stop
さて、上のソースを見る限り、別に便利になっていないような気がするかもしれません。ところが、このソースは少々無駄な処理をしています。全く同じ結果を得るのに、もーっと簡略した書き方が下になります。命令の中に引数の一部として関数が利用できるようになった結果、変数aだの変数bだの用意しなくてもよくなったわけです。
; [ HSP3 のコード (その2) ] mes "今日は、"+gettime(1)+"月"+gettime(3)+"日です。" stop
ファイルのパスの一部分を取得するHSP2の命令に「getpath」があります。
; [ HSP2 のコード ] ; たとえば、以下のようなファイルパス filepath = "C:\\Program Files\\HSP\\hogehoge.hsp" ; それぞれ情報を取り出す getpath fileext, filepath, 2 getpath filename, filepath, 8 getpath directry, filepath, 32 mes "拡張子: "+fileext+"" mes "ファイル名: "+filename+" mes "ディレクトリ: "+directry+"" stop
次はHSP3の場合です。結果を格納する変数というのがなくなり、関数そのものが結果を返します。
; [ HSP3 のコード (その1) ] ; (注) エディタの[HSP]メニュー→[HSP拡張マクロを使用する]を要有効。 filepath = "C:\\Program Files\\HSP\\hogehoge.hsp" fileext = getpath(filepath, 2) filename = getpath(filepath, 8) directry = getpath(filepath, 32) mes "拡張子: "+fileext+"" mes "ファイル名: "+filename+" mes "ディレクトリ: "+directry+"" stop
結果を返す変数を用意せず、そのままmes命令に渡すと本当にシンプルです。
; [ HSP3 のコード (その2) ] ; (注) エディタの[HSP]メニュー→[HSP拡張マクロを使用する]を要有効。 filepath = "C:\\Program Files\\HSP\\hogehoge.hsp" mes "拡張子: "+getpath(filepath, 2)+"" mes "ファイル名: "+getpath(filepath, 8)+" mes "ディレクトリ: "+getpath(filepath, 32)+"" stop
乱数を発生させるrnd命令は、HSP3から関数になりました。ボタンを押すことで0〜9の乱数を発生させ、それを100倍にした結果(0、100、200、・・・900)を表示するサンプルソースです。
; [ HSP2 のコード ]
; 乱数発生をバラバラな値にするrandomize命令
randomize
button "乱数", *ransu
stop
*ransu
; 変数aに乱数値が代入
rnd a, 10
; 100倍にして、これを変数bに代入
b = a * 100
; 結果を表示します。
mes ""+b
stop
HSP3の場合です。
; [ HSP3 のコード (その1) ]
; (注) エディタの[HSP]メニュー→[HSP拡張マクロを使用する]を要有効。
; randomize命令はHSP2と変わらず。
randomize
button "乱数", *ransu
stop
*ransu
; 関数自体が結果を返します。
a = rnd(10)
; 100倍に。
b = a * 100
mes ""+b
stop
値を代入するために用意していた変数aは不要になります。
; [ HSP3 のコード (その2) ]
; (注) エディタの[HSP]メニュー→[HSP拡張マクロを使用する]を要有効。
randomize
button "乱数", *ransu
stop
*ransu
b = rnd(10) * 100
mes ""+b
stop
また、関数ネタではありませんが、HSP3では計算式自体も1つの変数になりえます。こうすると、100倍にした数値を入れておくための変数bも不要に。(計算式をカッコでくくる必要がある場合あり)
; [ HSP3 のコード (その3) ]
; (注) エディタの[HSP]メニュー→[HSP拡張マクロを使用する]を要有効。
randomize
button "乱数", *ransu
stop
*ransu
; 乱数発生、100倍、そして表示、が一気に行えます。
mes ""+rnd(10) * 100
stop
マウスやウィンドウの特殊な情報を取得するHSP2の命令に「ginfo」というものがあります。ここではマウスのカーソル座標をタイトルバー上にリアルタイムで表示します。
; [ HSP2 のコード ]
repeat
wait 1
; スクリーン全体から見たマウスカーソル座標を取得
; 座標の値がHSPのシステム変数prmx、prmyに代入される
ginfo 0
title "X座標: "+prmx+" / Y座標: "+prmy+""
loop
次はHSP3の場合です。ginfoの第1パラメータ「取得する情報のタイプ」は、HSP2のものとは変更されています。また、関数自体が結果を返してくれるので、座標の値が返るシステム変数prmx、prmyというのはもう存在しません。
; [ HSP3 のコード ] ; (注) エディタの[HSP]メニュー→[HSP拡張マクロを使用する]を要有効。 repeat wait 1 ; スクリーン全体から見たマウスカーソル座標を取得 title "X座標: "+ginfo(0)+" / Y座標: "+ginfo(1)+"" loop
文字列の長さを取得するstrlenと、文字列の取り出しを行うstrmid。どちらもHSP2では命令形式だったものです。ここでは文字列の右から3番目の文字を取り出してみるHSP3のサンプルソースです。
; [ HSP3 のコード (その1) ] ; (注) エディタの[HSP]メニュー→[HSP拡張マクロを使用する]を要有効。 ; 元の文字列 a = "ABCDEFG" ; 右から3番目を取り出す n = 3 ; 文字列の長さを取得 len = strlen(a) ; 「len - n」番目、つまり右方向からの文字列取得 moji = strmid(a, len - n, 1) mes "文字列 ["+a+"]\n右から"+n+"番目 ["+moji+"]"
上のコードを究極的に削ると、以下のようになります。
; [ HSP3 のコード (その2) ]
; (注) エディタの[HSP]メニュー→[HSP拡張マクロを使用する]を要有効。
; 元の文字列
a = "ABCDEFG"
; 右から3番目を取り出す
n = 3
mes "文字列 ["+a+"]\n右から"+n+"番目 ["+strmid(a, strlen(a) - n, 1)+"]"