〜 オブジェクト 〜
キャレット位置を取得

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

HSP2「objsend オブジェクトID, 0x00B0, 開始位置格納先変数アドレス, 終了位置格納先変数, 0」 HSP3「sendmsg オブジェクトハンドル, 0x00B0, 開始位置格納先変数アドレス, 終了位置格納先変数アドレス

と指定することで変数に位置が格納されるので、その値を元に処理すればOKでしょう。 objsend命令はp5を0にすれば、p4lparamの変数ポインタを渡すので、選択終了位置を取得できますが、 選択開始位置を格納するp3のwparamに同様の変数を指定しても変数内容を指定したことにしかならないので、 ll_getptr命令およびll_ret命令で変数ポインタを取得して、その数値を指定しなければなりません。

HSP2「objsend オブジェクトID, 0x00B0, 不使用(=0), 不使用変数(=0), 0」 HSP3「sendmsg オブジェクトハンドル, 0x00B0, 不使用(=0), 不使用(=0)

ただ、必ず格納先変数を指定せねばならないものではなく、上記のようにNULL(=0)でも正常動作します。 終了位置の変数ポインタもそうであり、両方ともに指定せずともOKなのですが、 objsend命令の仕様によりlparamには必ず変数を指定する必要があるのでダミー変数を置いてください。 HSP3のsendmsg命令はそのような仕様ではないため、いずれも指定しなくて動作します。 どちらも指定しなかったら取得できないかというとそういうわけではなく、 システム変数statの下位2バイトに開始位置、上位2バイトに終了位置にセットされるので、 「開始 = stat & 0xFFFF」「終了 = stat >> 16」として取り出しましょう。

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#module
#deffunc getcaretpos val, int
	mref pary, 48 : mref id, 1
	objsend id, 0x00B0, , nonuse
	pary = stat & 0xFFFF, stat >> 16
	return
#global

	sdim buf, 128
	dim p, 2
	buf = "These pages are \"Hot Soup Processor Beginner's Club\"."
	objsize winx, 20 : objmode 2
	button "位置を確認する", *check
	mesbox buf, , winy - 20
	stop

*check
	getcaretpos p, 1
	dialog "キャレットは" + p + "から" + p.1 + "まであります"
	stop

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#module
#deffunc getcaretpos array pary, int id
	sendmsg objinfo(id, 2), 0x00B0
	pary = stat & 0xFFFF, stat >> 16
	return
#global

	sdim buf, 128
	buf = "These pages are \"Hot Soup Processor Beginner's Club\"."
	objsize ginfo_winx, 20 : objmode 2
	button "位置を確認する", *check
	mesbox buf, , ginfo_winy - 20
	stop

*check
	getcaretpos p, 1
	dialog "キャレットは" + p + "から" + p.1 + "まであります"