〜 オブジェクト 〜
mesbox内の一行を選択

mesboxによる複数行エディットボックス内の任意の1行を取得するには、
メモリノートパッド形式にして1行取得する他、オブジェクトにメッセージを送信することでも可能です。
メッセージ送信するにはHSP2はobjsend命令、HSP3からはsendmsg命令を、
メッセージコードのうち「EM_GETLINE(=0x00C4)」というものを使用してください。

HSP2「objsend オブジェクトID, 0x00C4, 取得行, 格納先変数」 HSP3「sendmsg オブジェクトハンドル, 0x00C4, 取得行, 格納先変数

と指定することで格納先変数に取得行で指定した行内容をコピーします。 モジュール内の話なので、そのまま参考にされる場合は関係ないのですが、 基にして新しく組む場合の注意すべき点があるので細くしておきます。 HSP3側のsendmsg命令に指定するlparamには格納先の変数アドレスを指定しなければなりませんが、 EM_GETLINEメッセージの場合、取得するバッファサイズをlparamの変数に代入しておかなければなりません。 代入先変数は文字列型で、設定するのは数値文字列ではなくコードです(例えば65バイトなら「A」を指定)。 で、コードを代入した変数をsendmsglparamに指定すると、 sendmsg命令の仕様、変数値が0以外によりlparamは変数アドレスではなく、変数内容が渡される形となり、 エラーが出ないものの正常に取得することができません。 サンプルのようにvarptr関数を併用し、sendmsg命令のlparamには変数ポインタを渡すようにしてください。 尚、lparamに指定した変数の先頭2バイトのみを取得サイズとしているので、 取得できる最大サイズは65535バイトまでとなります。 下記のモジュールではrefstrを利用しているので4096バイト(NULL含む)までの対応となります。 それ以上を取得する必要がある場合は、文字列型変数に返すようにしましょう。

geteditrowtxt オブジェクトID, 行番号
オブジェクトID対象となるオブジェクトIDを指定する。
尚、取得はrefstrに代入されるため、4095バイトまでしか対応していない。
行番号取得対象行を指定する。

 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 geteditrowtxt int, int
	mref id, 0 : mref row 1
	mref result, 65
	sdim s, 4096 : wpoke s, , 0x0FFF // 最大4095バイト取得可能
	objsend id, 0x00C4, row, s
	result = s
	return
#global

	sdim buf, 320
	buf  = "アメリカ   ブラジル   チャイナ\n"
	buf += "デンマーク  イングランド フランス\n"
	buf += "ジャーマニー ホンコン   アイス\n"
	buf += "ジャパン   神戸     ロンドン\n"
	buf += "メキシコ   ニューヨーク 大阪\n"
	buf += "北京     ケベック   ローム\n"
	buf += "上海     東京     ユニオン\n"
	buf += "ワシントン  エクスレイ  横浜\n"
	buf += "ゼブラ"
	font "MS 明朝", 20 : objmode 2 : objsize 100, 30
	pos 10, 10 : mesbox buf , 400, 130
	combox index, 100, "0行目\n1行目\n2行目\n3行目\n4行目\n5行目\n6行目\n7行目\n8行目"
	button "を選択", *scroll
	stop

*scroll
	geteditrowtxt , index
	dialog refstr, , "" + inddex + "行目の内容"
	stop

受取先 = geteditrowtxt(オブジェクト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
#defcfunc geteditrowtxt int id, int row, local s
	sdim s, 4096 : wpoke s, , 0x0FFF // 最大4095バイト取得可能
	sendmsg objinfo(id, 2), 0x00C4, row, varptr(s)
	return s
#global

	sdim buf, 320
	buf  = "アメリカ   ブラジル   チャイナ\n"
	buf += "デンマーク  イングランド フランス\n"
	buf += "ジャーマニー ホンコン   アイス\n"
	buf += "ジャパン   神戸     ロンドン\n"
	buf += "メキシコ   ニューヨーク 大阪\n"
	buf += "北京     ケベック   ローム\n"
	buf += "上海     東京     ユニオン\n"
	buf += "ワシントン  エクスレイ  横浜\n"
	buf += "ゼブラ"
	font "MS 明朝", 20 : objmode 2 : objsize 100, 30
	pos 10, 10 : mesbox buf , 400, 130
	combox index, 100, "0行目\n1行目\n2行目\n3行目\n4行目\n5行目\n6行目\n7行目\n8行目"
	button gosub "を選択", *scroll
	stop

*scroll
	dialog geteditrowtxt( , index), , strf("%d行目の内容", inddex)
	return