〜 オブジェクト 〜
インデクスから行番号を割り出す

エディットボックス内の任意の文字インデクスから行番号を求めるサンプルです。
インデクスから行番号への変換は、エディットボックスへメッセージを送ることだけで知ることができるので、
HSP2はobjsend命令、HSP3からはsendmsg命令で取得してみます。
使用するメッセージコードは「EM_LINEFROMCHAR(=0x00C9)」というもので、

HSP2「objsend オブジェクトID, 0x00C9, インデクス, 不使用変数(=0), 0」 HSP3「sendmsg オブジェクトハンドル, 0x00C9, インデクス, 不使用(=0)」と指定します。

インデクスは先頭を0として指定し、−1を指定すると現在のキャレットのあるインデクスを使用します。 下記のサンプルでは、選択開始・終了の両インデクスを取得する必要があるので、 −1は使用せずにコチラで紹介しているgetcaretpos命令の値を使用しています。

getcaretpos 格納配列, オブジェクトID
格納配列キャレット位置の格納配列(0:開始位置 1:終了位置)を指定する。
オブジェクトIDキャレット位置取得対象オブジェクトID指定する。

getlineno 格納変数, オブジェクトID, インデクス
格納変数取得した行番号の受取先変数を指定する。
オブジェクトID行取得対象オブジェクトID指定する。
インデクス対象文字インデクスを指定する。

 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
#module
#deffunc getcaretpos val, int
	mref pary, 48 : mref id, 1
	objsend id, 0x00B0, , nonuse
	pary = stat & 0xFFFF, stat >> 16
	return

#deffunc getlineno val, int, int
	mref rint, 16 : mref id, 1 : mref index, 2
	objsend id, 0x00C9, index, nonuse
	rint = stat
	return
#global

	sdim buf, 256
	dim p, 2
	buf  = "サンプルでは現在の選択インデクスを知るために\n"
	buf += "getcaretposモジュール命令を併用していますが、\n"
	buf += "選択開始・終了の両方が必要ではなく、選択開始位置だけでよい場合は、\n"
	buf += "getlinenoモジュール命令のp2(対象インデクス)に-1を指定すればOKです。"
	objmode 2
	mesbox buf, winx, winy
	repeat
		wait 5
		stick key, 256
		if key & 256 : gosub *click
	loop

*click
	getcaretpos p
	getlineno p.0, 0, p.0
	getlineno p.1, 0, p.1
	title "行" + p + "から行" + p.1 + "を選択してます。"
	return

getcaretpos 格納配列, オブジェクトID
格納配列キャレット位置の格納配列(0:開始位置 1:終了位置)を指定する。
オブジェクトIDキャレット位置取得対象オブジェクトID指定する。

行番号 = getlineno(オブジェクトID, インデクス)
行番号行番号の受取先を指定する。
オブジェクトID行取得対象オブジェクトID指定する。
インデクス対象文字インデクスを指定する。

 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
#module
#deffunc getcaretpos array pary, int id
	sendmsg objinfo(id, 2), 0x00B0
	pary = stat & 0xFFFF, stat >> 16
	return

#defcfunc getlineno int id, int index, local i
	sendmsg objinfo(id, 2), 0x00C9, index
	return stat
#global

	sdim buf, 256
	dim p, 2
	buf  = "サンプルでは現在の選択インデクスを知るために\n"
	buf += "getcaretposモジュール命令を併用していますが、\n"
	buf += "選択開始・終了の両方が必要ではなく、選択開始位置だけでよい場合は、\n"
	buf += "getlinenoモジュール命令のp2(対象インデクス)に-1を指定すればOKです。"
	objmode 2
	mesbox buf, ginfo_winx, ginfo_winy
	repeat
		wait 5
		stick key, 256
		if key & 256 : gosub *click
	loop

*click
	getcaretpos p
	title "行" + getlineno(0, p) + "から行" + getlineno(0, p.1) + "を選択してます。"
	return