HSP3 あれこれ <関数の解説>

Last Update : 2006/08/xx

XREA.COMのs206サーバー内のサイトは、Yahoo!検索からペナルティを受け、検索結果で常に下位にランク付けされてしまうので、Yahoo!経由向けに用意したHSPミニ講座内のページです。このページは「http://lhsp.s206.xrea.com/hsp_function.html」の昔のものです。

HSP3.0 から導入された『関数』講座

HSP3.0 (HSP3) から導入された「関数」(かんすう)。HSP2 (HSP 2.x) の命令形式に慣れた人は、とまどうかもしれません。しかし、これはとても便利なものです。

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 文字列の検索 >>>

^

gettime命令 / gettime関数

日付や時間を取得する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

^

getpath命令 / getpath関数

ファイルのパスの一部分を取得する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命令に渡すと本当にシンプルです。

;	[ HSP 3 のコード (その2) ]
;	(注) エディタの[HSP]メニュー→[HSP拡張マクロを使用する]を要有効。

	filepath = "C:\\Program Files\\HSP\\hogehoge.hsp"

	mes "拡張子: "+getpath(filepath, 2)+""
	mes "ファイル名: "+getpath(filepath, 8)+"
	mes "ディレクトリ: "+getpath(filepath, 32)+""
	stop

^

rnd命令 / rnd関数

乱数を発生させる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は不要になります。

;	[ HSP 3 のコード (その2) ]
;	(注) エディタの[HSP]メニュー→[HSP拡張マクロを使用する]を要有効。

	randomize

	button "乱数", *ransu
	stop

*ransu
	b = rnd(10) * 100

	mes ""+b
	stop

また、関数ネタではありませんが、HSP3では計算式自体も1つの変数になりえます。こうすると、100倍にした数値を入れておくための変数bも不要に。(計算式をカッコでくくる必要がある場合あり)

;	[ HSP 3 のコード (その3) ]
;	(注) エディタの[HSP]メニュー→[HSP拡張マクロを使用する]を要有効。

	randomize

	button "乱数", *ransu
	stop

*ransu
;	乱数発生、100倍、そして表示、が一気に行えます。
	mes ""+rnd(10) * 100
	stop

^

ginfo命令 / ginfo関数

マウスやウィンドウの特殊な情報を取得するHSP2の命令に「ginfo」というものがあります。ここではマウスのカーソル座標をタイトルバー上にリアルタイムで表示します。

;	[ HSP 2 のコード ]

	repeat
		wait 1

;		スクリーン全体から見たマウスカーソル座標を取得
;		座標の値がHSPのシステム変数prmx、prmyに代入される
		ginfo 0

		title "X座標: "+prmx+" / Y座標: "+prmy+""
	loop

次はHSP3の場合です。ginfoの第1パラメータ「取得する情報のタイプ」は、HSP2のものとは変更されています。また、関数自体が結果を返してくれるので、座標の値が返るシステム変数prmx、prmyというのはもう存在しません。

;	[ HSP 3 のコード ]
;	(注) エディタの[HSP]メニュー→[HSP拡張マクロを使用する]を要有効。

	repeat
		wait 1

;		スクリーン全体から見たマウスカーソル座標を取得
		title "X座標: "+ginfo(0)+" / Y座標: "+ginfo(1)+""
	loop

^

strlen関数 / strmid関数

文字列の長さを取得する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+"]"

上のコードを究極的に削ると、以下のようになります。

;	[ HSP 3 のコード (その2) ]
;	(注) エディタの[HSP]メニュー→[HSP拡張マクロを使用する]を要有効。

;	元の文字列
	a = "ABCDEFG"

;	右から3番目を取り出す
	n = 3

	mes "文字列 ["+a+"]\n右から"+n+"番目 ["+strmid(a, strlen(a) - n, 1)+"]"

^

Copyright © Kpan. All rights reserved.