〜 オブジェクト 〜
キャレット位置を変更

 現在のキャレット(入力位置を示すカーソル)の位置をマーキングして、
後でその位置に移動させたり、文字列検索や置換処理で選択反転させたりと、
キャレット位置を変更させるといろいろなことに使えます。
今回は、オブジェクトへメッセージを送ってキャレット位置を取得するサンプルを紹介します。
HSP2はobjsend命令、HSP3からはsendmsg命令でオブジェクトにメッセージを送信でき、
今回はメッセージコードのうち「EM_SETSEL(=0x00B1)」というものを利用します。

HSP2「objsend オブジェクトID, 0x00B1, 選択開始位置, 選択終了位置(変数), 1」 HSP3「sendmsg オブジェクトハンドル, 0x00B1, 選択開始位置, 選択終了位置

とすることで、キャレットがそれぞれ指定位置に移動してくれます。 選択開始・終了位置いずれも数値ですが、HSP2のobjsend命令のp4lparamは変数で指定する仕様なので、 変数に終了位置を代入して指定してあげましょう。尚、変数ではなく値を渡すのでp5のタイプは1です。 HSP3のsendmsg命令は変数で指定せずに数値のままでかまいません。 サンプルの「現在のキャレット位置を取得するモジュール命令のgetcaretpos」や、 メッセージコードの説明についてはコチラを参照してください。

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

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

#deffunc setcaretpos int, int, int
	mref id, 0 : mref ps, 1 : mref pe, 2
	objsend id, 0x00B1, ps, pe, 1
	return
#global

	sdim buf, 128
	buf = "These pages are \"Hot Soup Processor Beginner's Club\"."
	objsize winx / 3, 25 : objmode 2
	pos winx / 3 * 0,  0 : combox caret, , "選択開始位置\n選択終了位置"
	pos winx / 3 * 1,  0 : button "先頭へ移動する", *move
	pos winx / 3 * 2,  0 : button "末端へ移動する", *move
	pos winx / 3 * 0, 25 : mesbox buf, winx, winy - 25
	stop

*move
	btnid = stat
	getcaretpos p, 3
	strlen len, buf
	p.caret = len * (btnid = 2)
	setcaretpos 3, p, p.1
	objsel 3
	stop

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

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

#deffunc setcaretpos int id, int ps, int pe, local i
	sendmsg objinfo(id, 2), 0x00B1, ps, pe
	return
#global

	sdim buf, 128
	buf = "These pages are \"Hot Soup Processor Beginner's Club\"."
	objsize ginfo_winx / 3, 25 : objmode 2
	pos ginfo_winx / 3 * 0,  0 : combox caret, , "選択開始位置\n選択終了位置"
	pos ginfo_winx / 3 * 1,  0 : button "先頭へ移動する", *move
	pos ginfo_winx / 3 * 2,  0 : button "末端へ移動する", *move
	pos ginfo_winx / 3 * 0, 25 : mesbox buf, ginfo_winx, ginfo_winy - 25
	stop

*move
	btnid = stat
	getcaretpos p, 3
	p.caret = strlen(buf) * (btnid = 2)
	setcaretpos 3, p, p.1
	objsel 3