〜 オブジェクト 〜
選択アイテムテキストを取得

選択アイテム項目を簡単に取得する方法を2つ挙げておきます。
1つは変数にリスト項目全体を入れておく方法で、リスト全体を変数に代入しておくことで、
選択行をメモリノートパッド形式で行取得すれば選択項目のみを取り出せます。
このやり方についてはコチラで使用しています、参考にご覧ください。
ココでは、もう1つの「オブジェクトにメッセージを送る」手法で選択項目を取得する方法を説明します。
HSP2はobjsend命令、HSP3からはsendmsg命令を使用してオブジェクトにメッセージを送信でき、
様々なメッセージのうち、リストから選択項目を取得するメッセージも送信できます。
コンボボックスの選択項目を取得するには「WM_GETTEXT(=0x000D)」メッセージを次の形で送ります。

HSP2「objsend オブジェクトID, 0x000D, 最大バイト数, 格納変数, 0」 HSP3「sendmsg オブジェクトハンドル, 0x000D, 最大バイト数, 格納変数のポインタ

この「WM_GETTEXT(=0x000D)」はコンボボックス以外でもボタンを指定すればボタンキャプションを、 ウィンドウを指定すればタイトルバーテキストを取得するのですが、リストボックスは取得できません。 リストボックスの項目を取得するには「LB_GETTEXT(=0x0189)」メッセージを次の形で送ります。

HSP2「objsend オブジェクトID, 0x0189, 取得項目番号, 格納変数, 0」 HSP3「sendmsg オブジェクトハンドル, 0x0189, 取得項目番号, 格納変数のポインタ

どちらも指定する格納変数サイズより格納文字列の方が大きくならない(バッファオーバーフローしない)よう、 変数サイズは大きめに確保するようにしてください。 リストボックスは選択項目以外も表示されるためか、どの項目を取得するか指定しなければならないんですね。 で、現在の選択項目を取得したい場合、「所得項目番号」パラメータに リストボックスのインデックス保持変数を指定すればよいのですが、モジュール命令にする場合は、 モジュール内で、モジュール外のグローバル変数を参照する形となるので、よろしくありません。 現在の選択項目番号を取得する「LB_GETCURSEL(=0x0188)」が用意されていますので、ソレを使いましょう。

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

上記メッセージを送信すると、statに結果値(選択アイテム番号)がセットされます。 使い方は下記のサンプルモジュールを参考にしてください。

gettext ID, 格納変数, サイズ
ID取得するオブジェクトIDを指定する。
格納変数表示テキストを格納する文字列型変数を指定する。
サイズ変数に代入できる最大文字列サイズを指定する。

getlist 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 gettext int, val, int
	mref id, 0 : mref rstr, 25 : mref size, 2
	objsend id, 0x000D, size, rstr  // 表示テキスト取得
	return

#deffunc getlist int, val
	mref id, 0 : mref rstr, 25
	objsend id, 0x0188, 0, nonuse  // 選択アイテム番号取得
	objsend id, 0x0189, stat, rstr // 選択テキスト取得
	return
#global

	sdim string, 8
	objsize 80, 25
	pos  10, 10 : button "取得", *get
	pos  10, 40 : listbox index.0, 100, "朝日\nいろは\n上野\n英語\n大阪"
	pos 100, 10 : button "取得", *get
	pos 100, 40 : combox index.1, 100, "桜\n新聞\nスズメ\n世界\nそろばん"
	stop

*get
	if stat = 0 {
		getlist 1, string // オブジェクトID1の選択リストテキストを取得する
		dialog "選択項目:" + string
	} else {
		gettext 3, string, 10 // オブジェクトID3の選択コンボテキストを取得する
		dialog "表示:" + string
	}
	stop

結果 = gettext(ID)
結果表示テキストの格納先を指定する。
尚、内部で取得文字列を格納している変数サイズが256バイトとしているため、
それ以上のテキストサイズを取得する可能性がある場合はこのサイズを拡大すること。
ID取得するオブジェクトIDを指定する。

結果 = getlist(ID)
結果選択リストアイテムテキストの格納先を指定する。
尚、内部で取得文字列を格納している変数サイズが256バイトとしているため、
それ以上のテキストサイズを取得する可能性がある場合はこのサイズを拡大すること。
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
#module
#defcfunc gettext int id, local rstr
	sdim rstr, 256
	sendmsg objinfo(id, 2), 0x000D, 256, varptr(rstr)  // 表示テキスト取得
	return rstr

#defcfunc getlist int id, local rstr
	sdim rstr, 256
	sendmsg objinfo(id, 2), 0x0188, 0, 0               // 選択アイテム番号取得
	sendmsg objinfo(id, 2), 0x0189, stat, varptr(rstr) // 選択テキスト取得
	return rstr
#global

	sdim string, 8
	objsize 80, 25
	pos  10, 10 : button gosub "取得", *get
	pos  10, 40 : listbox index.0, 100, "朝日\nいろは\n上野\n英語\n大阪"
	pos 100, 10 : button gosub "取得", *get
	pos 100, 40 : combox index.1, 100, "桜\n新聞\nスズメ\n世界\nそろばん"
	stop

*get
	if stat = 0 {
		dialog "選択項目:" + getlist(1) // 選択リストテキストを取得する
	} else {
		dialog "選択項目:" + gettext(3)  // 選択コンボテキストを取得する
	}
	return