〜 スクリプト 〜
配列をメモリノートパッドデータに変換

メモリノートパッドとは、改行を区切りコードとした1行毎のテキストデータのことで、
予めnotesel命令で対象バッファ(=変数)を指定しておき、行取得・挿入・削除を簡単に行うことが出来ます。
文字列型配列変数の各要素を、このメモリノートパッド形式に変換するサンプルを載せておきます。
きっと、リストボックス等のメモリノートパッド形式に変換する必要があるときに役立つことでしょう。
サンプルのように汎用的なモジュールとして使用する場合は、取得元の配列要素数を知る必要がありますが、
HSP2は標準命令に要素数取得命令がないので、内部でコチラgetdiminfo命令を使用しています。
サンプルのように、getdiminfo命令を先に定義しなければ使用できません。
また、HSP3モジュールは関数形式を採用しています。
別命令・関数のパラメータに当関数をそのまま代入することができてスッキリまとまりますが、
システム変数refstrに代入する形となるので、4095バイトまでしか正常に代入されません。
もし、自動拡張してでも4096バイト以上を取得したい場合は、HSP2形式の命令にする必要があります。
逆の「メモリノートパッドデータを配列データに変換するサンプル」はコチラをご覧ください。
	

getdiminfo 変数, 次元
変数指定変数、指定次元のサイズがstatにセットされる。
次元1次元目を0として、取得する次元を0〜3のいずれかで指定する。

arraytonote 設定先変数, 取得元配列変数
設定先変数取得元配列変数のテキストデータをメモリノートパッド形式にしてセットする。
内部でgetdiminfo命令を使用している為、
arraytonote命令の前にgetdiminfo命令を定義すること!
取得元配列変数メモリノートパッド形式にしたい配列変数を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#module
#deffunc getdiminfo val, int
	mref pval, 1024 : mref dnum, 1
	mref stt, 64
	stt = dnum + 2
	stt = pval.stt
	if (pval & $FFFF = 2) && (dnum = 0) : stt = stt * 4
	return

#deffunc arraytonote val, val
	mref sv, 24 : mref gv, 57
	kugiri = "\n"
	strlen len.2, kugiri
	getdiminfo sv, 0 : size.0 = stat // 設定先バッファサイズ
	getdiminfo gv, 0 : size.1 = stat // 取得元配列のバッファサイズ
	getdiminfo gv, 1 : size.2 = stat // 取得元配列の要素数
	sdim tmp, size.1 + 1
	len = 0
	repeat size.2
		strlen len.1, gv.cnt
		if len.0 + len.1 >= size.0 {
			strmid tmp, gv.cnt, , len.1 - len.0
			sv += tmp
			break
		}
		sv += gv.cnt
		strlen i, sv
		len.0 += i
		if cnt - 1 < size.2 & (len.0 + len.2 < size.0) : sv += kugiri
	loop
	return sv
#global

	sdim array, 3, 4
	array = "春", "夏", "秋", "冬"
	pos 10, 10 : mes "季節"
	arraytonote note, array
	pos 60, 10 : combox index, 100, note
	stop

受取先 = arraytonote(取得元配列変数)
受取先メモリノートパッド形式に変換されたデータの受取先を指定する。
内部でgetdiminfo命令を使用している為、
arraytonote命令の前にgetdiminfo命令を定義すること!
取得元配列変数メモリノートパッド形式にしたい配列変数を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#module
#defcfunc arraytonote array gv, local sv, local kugiri
	sdim sv, 4096
	kugiri = "\n"
	repeat length(gv)
		sv += gv.cnt
		if cnt - 1 < length(gv) : sv += kugiri
	loop
	return sv
#global

	sdim ary, 3, 4
	ary = "春", "夏", "秋", "冬"
	pos 10, 10 : mes "季節"
	pos 60, 10 : combox index, 100, arraytonote(ary)