〜 オブジェクト 〜
エディットコンボのアイテムと値の関連付け (要USER32.DLL)

「テキストを入力できるインプットボックスのようなエディット機能」と、
「過去に打ち込んだものを入力せずに呼び出すことの出来るドロップダウン式の選択機能」を併せ持った
エディットコンボのアイテムに値を持たせる機能をコチラで紹介したモジュールに追加する形なので、
ココでは値の関連付け以外のエディットコンボの配置やアイテム追加・削除・取得等は説明しません。
詳しくは紹介しているコチラを参照してください。

今回紹介する機能も追加や削除・取得等の処理と同様にメッセージ送受信によって実現させます。
HSP3からは標準命令のsendmsg命令が使えるものの、
HSP2は標準オブジェクトではなくobjsend命令が使えないのでAPI関数SendMessageでやり取りします。

API関数SendMessageをHSP用に標準命令で使えるようにしたものがsendmsg命令なので、
sendmsg命令のパラメータ同様に「ハンドル, コード, wparam, lparam」で記述できます。
メッセージコードwparamlparam内容
CB_GETITEMDATA(=0x0150)インデクス不使用(=0)関連付けられた32ビット値の取得
CB_SETITEMDATA(=0x0151)インデクステキスト格納先アドレス関連付ける32ビット値
データは値だけで文字列等は持たせることが出来ません。 文字列を関連データとしたい場合は、文字列型配列変数を別途用意しておき、 その配列変数の要素番号を関連付けする値としてコンボボックスのアイテムに設定しておきましょう。 例えば、都道府県名をコンボボックスのアイテムとして、地方を関連付けデータとしたい場合、 予め「地方 = "北海道", "東北", "関東", "北陸", "中部", "関西", "中国", "四国", "九州"」と設定し、 コンボボックスアイテムの青森は1、茨城は2、愛知は4、奈良は5、熊本は8…等を関連付けます。 そして、地方名を表示するときは「mes 地方.都道府県データ番号」のようにすればOKでしょう。

comedit 最大文字数, 拡張Yサイズ
最大文字数入力できる最大文字数を指定する。
拡張Yサイズコンボボックスを開いた時に表示されるリストの高さを指定する。

comedit_cnt コンボID
コンボID操作対象エディットコンボIDを指定する。
オブジェクトIDとは別物で、1つ目のエディットコンボがID0となる。

comedit_destroy コンボID
コンボID削除するエディットコンボのコンボIDを指定する。

comedit_limit 最大文字数
最大文字数操作対象エディットコンボに入力できる最大文字数を指定する。

comedit_max 受取先変数
受取先変数操作対象エディットコンボのアイテム数の受取先変数を指定する。

comedit_index 受取先変数
受取先変数操作対象エディットコンボの現在選択中の行位置を受け取る変数を指定する。
入力変更されている場合は−1が入る。

comedit_sel 選択行
選択行操作対象エディットコンボの変更先選択アイテム行を指定する。

comedit_add 追加テキスト
追加テキスト操作対象エディットコンボに追加するテキストを指定する。
改行を区切りとして複数アイテムを一括追加することも可能。

comedit_get 取得行, 受取先変数, 取得サイズ
取得行取得するアイテム行を指定する。−1を指定すると表示テキストとなる。
受取先変数取得したアイテムテキストの受取先変数を指定する。
取得サイズ受取先変数に代入できる最大サイズを指定する。

comedit_del 削除行
削除行操作対象エディットコンボの削除アイテム行位置を指定する。

comedit_dataget 対象行, 受取先変数
対象行関連付けを行うアイテム行を指定する。
受取先変数操作対象エディットコンボのアイテムに関連付けられた値の受取先変数を指定する。

comedit_dataset 対象行, 関連値
対象行操作対象エディットコンボの関連付けを行うアイテム行を指定する。
関連値アイテムに関連付ける32ビット値を指定する。

 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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
	ll_libload user, "user32.dll"
	ll_getproc CreateWindowEx, "CreateWindowExA", user
	ll_getproc SendMessage, "SendMessageA", user

#module ultimate_combo
#deffunc comedit_limit int
	mref max, 0
	prm = comid.comid, 0x0141, (max = 0) * 64 + max, 0
	ll_callfunc prm, 4, SendMessage@
	return

#deffunc comedit int, int
	mref max, 0 : mref height, 1
	mref bmscr, 67
	prm = 0, 0, 0, 0x50000202, bmscr.27, bmscr.28, bmscr.29, height = 0 * 100 + height, bmscr.13, 0xFF00, bmscr.14, 0
	s = "combobox" : ll_getptr s : ll_ret prm.1
	ll_callfunc prm, 12, CreateWindowEx@ : ll_ret prm
	comid = 0
	repeat 15, 1
		if comid.cnt = 0 : comid = cnt : break
	loop
	if comid = 0 : return
	comid.comid = prm
	comedit_limit max
	prm = comid.comid, 0x0030, bmscr.38, 1
	ll_callfunc prm, 4, SendMessage@
	return

#deffunc comedit_destroy int
	mref id, 0
	id++
	if id > 0 | (id < 16) {
		prm = comid.id, 0x0010, 0, 0
		ll_callfunc prm, 4, SendMessage@
		comid.id = 0
	}
	return

#deffunc comedit_cnt int
	mref id, 0
	mref stt, 64
	if id < 0 | (id + 1 >= 16) : stt = comid.comid : else : comid = id + 1
	return

#deffunc comedit_open int
	mref flg, 0
	prm = comid.comid, 0x014F, flg, 0
	ll_callfunc prm, 4, SendMessage@
	return

#deffunc comedit_max val
	mref max, 16
	prm = comid.comid, 0x0146, 0, 0
	ll_callfunc prm, 4, SendMessage@
	ll_ret max
	return

#deffunc comedit_index val
	mref index, 16
	prm = comid.comid, 0x0147, 0, 0
	ll_callfunc prm, 4, SendMessage@
	ll_ret index
	return

#deffunc comedit_sel int
	mref index, 0
	comedit_max max
	if index >= 0 & (index < max) : i = index : else : i = max - 1
	prm = comid.comid, 0x014E, i, 0
	ll_callfunc prm, 4, SendMessage@
	return

#deffunc comedit_add str
	mref msg, 32
	ll_getptr s : ll_ret i
	prm = comid.comid, 0x0143, 0, i
	repeat
		getstr s, msg
		if strsize = 0 : break
		strlen i, msg
		memcpy msg, msg, i - strsize, , strsize
		poke msg, i - strsize
		ll_callfunc prm, 4, SendMessage@
		if i - strsize <= 0 : break
	loop
	comedit_sel -1
	return

#deffunc comedit_get int, val, int
	mref index, 0 : mref msg, 25 : mref size, 2
	ll_getptr msg : ll_ret i
	if index = -1 {
		prm = comid.comid, 0x000D, size = 0 * 64 + size, i
	} else {
		prm = comid.comid, 0x0148, index, i
	}
	ll_callfunc prm, 4, SendMessage@
	return

#deffunc comedit_del int
	mref index, 0
	prm = comid.comid, index = -1 * 7 + 0x0144, index ! -1 * index, 0
	ll_callfunc prm, 4, SendMessage@
	return

#deffunc comedit_dataget int, val
	mref index, 0 : mref value, 17
	prm = comid.comid, 0x0150, index
	ll_callfunc prm, 4, SendMessage@
	ll_ret value
	return

#deffunc comedit_dataset int, int
	mref index, 0 : mref value, 1
	prm = comid.comid, 0x0151, index, value
	ll_callfunc prm, 4, SendMessage@
	return
#global

	font msmincho, 12 : objmode 2 : objsize 120, 20
	pos 10,  10 : comedit 10
	pos 10,  40 : button "追加", *add
	pos 10,  70 : button "取得", *get
	pos 10, 100 : button "削除", *del
	comedit_add "abc\ndef\nghi\njkl\nmno"
	comedit_sel 0
	pos 140, 10 : input value
	pos 140, 40 : button "値の関連付け", *setv
	pos 140, 70 : button "関連付け値取得", *getv
	stop

*add
	comedit_get -1, tmp
	comedit_add tmp
	stop

*get
	comedit_index index
	comedit_max max
	if index ! -1 {
		comedit_get index, tmp
		objprm 4, index
		dialog "行数:" + max + "\n選択:" + index + "\n内容:" + tmp
	} else {
		comedit_get -1, tmp
		dialog "行数:" + max + "\n表示:\n" + tmp
	}
	stop

*del
	comedit_index index
	comedit_max max
	comedit_get index, tmp
	if index = -1 {
		dialog "削除行が選択されていません"
	} else {
		dialog "" + index + "行目「" + tmp + "」を削除しますか?", 2
		if stat = 6 {
			comedit_del index
			if index >= max : index = max - 1
			comedit_sel index
		}
		objprm 5, index
	}
	stop

*getv
	comedit_index index
	comedit_get index, tmp
	comedit_dataget index, value
	dialog "「" + tmp + "」に関連付けられた値は「" + value + "」です"
	stop

*setv
	comedit_index index
	comedit_get index, tmp
	comedit_dataset index, value
	dialog "「" + tmp + "」に「" + value + "」を関連付けました"
	stop

comedit 最大文字数, 拡張Yサイズ
最大文字数入力できる最大文字数を指定する。
拡張Yサイズコンボボックスを開いた時に表示されるリストの高さを指定する。

comedit_cnt コンボID
コンボID操作対象エディットコンボIDを指定する。
オブジェクトIDとは別物で、1つ目のエディットコンボがID0となる。

comedit_destroy コンボID
コンボID削除するエディットコンボのコンボIDを指定する。

comedit_limit 最大文字数
最大文字数操作対象エディットコンボに入力できる最大文字数を指定する。

アイテム数 = comedit_max( )
アイテム数取得したアイテム数の受取先を指定する。
[パラメータなし]操作対象エディットコンボのアイテム数を取得するだけなのでパラメータは必要ない。

選択行 = comedit_index( )
選択行取得した現在選択中の行位置の受取先を指定する。入力変更した場合は−1が入る。
[パラメータなし]操作対象エディットコンボの選択アイテム行を取得するだけなのでパラメータは必要ない。

comedit_sel 選択行
選択行操作対象エディットコンボの変更先選択アイテム行を指定する。

comedit_add 追加テキスト
追加テキスト操作対象エディットコンボに追加するテキストを指定する。
改行を区切りとして複数アイテムを一括追加することも可能。

テキスト = comedit_get(取得行)
テキスト取得した操作対象エディットコンボのテキスト受取先を指定する。
取得行取得するアイテム行を指定する。−1を指定すると表示テキストとなる。

comedit_del 削除行
削除行操作対象エディットコンボの削除アイテム行位置を指定する。

関連値 = comedit_dataget(対象行)
関連値操作対象エディットコンボのアイテムに関連付けられた値の受取先を指定する。
対象行関連付けを行うアイテム行を指定する。

comedit_dataset 対象行, 関連値
対象行操作対象エディットコンボの関連付けを行うアイテム行を指定する。
関連値アイテムに関連付ける32ビット値を指定する。

 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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#module
#deffunc comedit_limit int max
	sendmsg comid.comid, 0x0141, (max = 0) * 64 + max
	return

#deffunc comedit int max, int height, local i, local h
	mref bmscr, 67
	winobj "combobox", "", 0, 0x50000202, , (height = 0) * 100 + height
	if stat = -1 : return 0
	objskip stat, 1
	comid = 0
	repeat length(comid) - 1, 1
		if comid.cnt = 0 : comid = cnt : break
	loop
	if comid = 0 : comid = length(comid)
	comid.comid = objinfo(stat, 2)
	comedit_limit max
	sendmsg comid.comid, 0x0030, bmscr.38, 1
	return comid - 1

#deffunc comedit_destroy int id
	mref bmscr, 67
	if bmscr.72 = 0 : return
	dupptr hspobjinfo, bmscr.71, bmscr.72 * 48
	repeat bmscr.72
		if comid.comid = hspobjinfo(cnt * 12 + 2) {
			clrobj cnt, cnt
			comid.comid = 0
			break
		}
	loop
	return

#deffunc comedit_cnt int id
	if id = -1 : return comid(comid)
	if id >= 0 && id + 1 < length(comid) : comid = id + 1
	return

#defcfunc comedit_max
	sendmsg comid.comid, 0x0146
	return stat

#defcfunc comedit_index
	sendmsg comid.comid, 0x0147
	return stat

#deffunc comedit_sel int index, local i
	if index >= 0 & index < comedit_max() : i = index : else : i = comedit_max() - 1
	sendmsg comid.comid, 0x014E, i
	return

#deffunc comedit_add str msg, local s
	s = msg
	repeat
		getstr s.1, s
		if s.1 = "" | strsize = 0 : break
		memcpy s, s, strlen(s) - strsize, , strsize
		poke s, strlen(s) - strsize
		sendmsg comid.comid, 0x0143, , varptr(s.1)
	loop
	comedit_sel -1
	return

#defcfunc comedit_get int index, local s
	sdim s, 4000
	if index = -1 {
		sendmsg comid.comid, 0x000D, 4000, varptr(s)
	} else {
		sendmsg comid.comid, 0x0148, index, varptr(s)
	}
	return s

#deffunc comedit_del int index
	if index = -1 {
		sendmsg comid.comid, 0x014B
	} else {
		sendmsg comid.comid, 0x0144, index
	}
	return

#defcfunc comedit_dataget int index
	sendmsg comid.comid, 0x0150, index
	return stat

#deffunc comedit_dataset int index, int data
	sendmsg comid.comid, 0x0151, index, data
	return
#global

	font msmincho, 12 : objmode 2 : objsize 120, 20
	pos 10,  10 : comedit 10
	pos 10,  40 : button gosub "追加", *add
	pos 10,  70 : button gosub "取得", *get
	pos 10, 100 : button gosub "削除", *del
	comedit_add "abc\ndef\nghi\njkl\nmno"
	comedit_sel 0
	dim value, 1
	pos 140,  10 : input value
	pos 140,  40 : button gosub "値の関連付け", *setv
	pos 140,  70 : button gosub "関連付け値取得", *getv
	stop

*add
	comedit_add comedit_get(-1) 
	return

*get
	if comedit_index() ! -1 {
		index = comedit_index()
		objprm 5, index
		dialog "行数:" + comedit_max() + "\n選択:" + index + "\n内容:" + comedit_get(index)
	} else {
		dialog "行数:" + comedit_max() + "\n表示:\n" + comedit_get(-1)
	}
	return

*del
	if comedit_index() = -1 {
		dialog "削除行が選択されていません"
		return
	}
	index = comedit_index()
	dialog str(index) + "行目「" + comedit_get(index) + "」を削除しますか?", 2
	if stat = 6 {
		comedit_del index
		if index >= comedit_max() : index = comedit_max() - 1
		comedit_sel index
	}
	objprm 5, index
	return

*getv
	index = comedit_index()
	dialog "「" + comedit_get(index) + "」に関連付けられた値は「" + comedit_dataget(index) + "」です"
	return

*setv
	index = comedit_index()
	comedit_dataset index, value
	dialog "「" + comedit_get(index) + "」に「" + value + "」を関連付けました"
	return