〜 オブジェクト 〜
エディットコンボの文字列挿入と変更 (要USER32.DLL)

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

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

API関数SendMessageをHSP用に標準命令で使えるようにしたものがsendmsg命令なので、
sendmsg命令のパラメータ同様に「ハンドル, コード, wparam, lparam」で記述できます。
メッセージコードwparamlparam内容
CB_INSERTSTRING(=0x014A)挿入行位置テキスト格納先アドレス指定したテキストを指定位置に挿入
CB_DELETESTRING(=0x0144)削除行位置不使用(=0)アイテムを削除
アイテム挿入と変更なのに、挿入と削除メッセージを書いているのは、 アイテム変更メッセージは用意されておらず、変更対象行を削除後に挿入することで実現させている為です。

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_ins 挿入行, 挿入テキスト
挿入行操作対象エディットコンボに挿入するアイテム行位置を指定する。
挿入テキスト挿入するアイテムテキストを指定する。

comedit_chg 変更行, 変更テキスト
変更行操作対象エディットコンボの変更アイテム行位置を指定する。
変更テキスト変更後のアイテムテキストを指定する。

 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
	ll_libload user, "user32.dll"
	ll_getproc CreateWindowEx, "CreateWindowExA", user
	ll_getproc SendMessage, "SendMessageA", user

#module
#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_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_ins int, str
	mref index, 0 : mref msg, 33
	ll_getptr msg : ll_ret i
	prm = comid.comid, 0x014A, index, i
	ll_callfunc prm, 4, SendMessage@
	return

#deffunc comedit_chg int, str
	mref index, 0 : mref msg, 33
	comedit_del index
	comedit_ins index, msg
	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
	pos 10, 130 : button "変更", *chg
	comedit_add "abc\ndef\nghi\njkl\nmno"
	sdim selrow, 64
	comedit_max max
	repeat max
		if cnt : selrow += "\n"
		selrow += "" + cnt + "行目"
	loop
	comedit_sel 0
	pos 150, 10 : combox index, , selrow
	pos 150, 40 : button "選択", *sel
	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 4, index
	}
	stop

*sel
	comedit_sel index // 選択行変更
	stop

*chg
	comedit_get index, tmp // 最後に選択していた行取得
	comedit_get -1, tmp2 // 現在の表示テキスト取得
	dialog "「" + tmp + "」を「" + tmp2 + "」に変更しますか?", 2
	if stat = 6 : comedit_chg index, tmp2 // テキスト変更
	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_ins 挿入行, 挿入テキスト
挿入行操作対象エディットコンボに挿入するアイテム行位置を指定する。
挿入テキスト挿入するアイテムテキストを指定する。

comedit_chg 変更行, 変更テキスト
変更行操作対象エディットコンボの変更アイテム行位置を指定する。
変更テキスト変更後のアイテムテキストを指定する。

 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
#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

#deffunc comedit_ins int index, str msg, local s
	s = msg
	sendmsg comid.comid, 0x014A, index, varptr(s)
	return

#deffunc comedit_chg int index, str msg
	comedit_del index
	comedit_ins index, msg
	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
	pos 10, 130 : button gosub "変更", *chg
	comedit_add "abc\ndef\nghi\njkl\nmno"
	sdim selrow, 64
	repeat comedit_max()
		if cnt : selrow += "\n"
		selrow += str(cnt) + "行目"
	loop
	gosub *sel
	pos 140, 10 : combox index, , selrow
	pos 140, 40 : button gosub "選択", *sel
	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

*sel
	comedit_sel index
	return

*chg
	dialog "「" + comedit_get(index) + "」を「" + comedit_get(-1) + "」に変更しますか?", 2
	if stat = 6 : comedit_chg index, comedit_get(-1)
	return