〜 オブジェクト 〜
擬似オブジェクトを配置2

HSP2以下ではオブジェクトを1つのウィンドウに最大64個しか配置できません。
厳密には配置はできますが、データ保持数は64個までしか出来ないので、使い物になりません。
HSP3以降だと最大16,384個まで配置できるようになっていますが、
配置できる場合でも多量のオブジェクトを配置してしまうと、
負荷が掛かり過ぎて思うように操作できない等の問題が生じてしまうため、
お世辞にも良いといえるプログラムではなく、再考する必要があると言えます。
尚、HSP3以降で1,025個以上のオブジェクトを配置するにはコチラを参照してください。

さて、多量のオブジェクトを配置するのが問題だとはいえ、
エクセルのようなアプリケーションを作成する場合、大量のコントロールが必要になりますね。
このような場合に使えるのが、擬似オブジェクトの配置。
ボタンやチェックボックス、ラジオボタンはAPI関数DrawFrameControlで配置(描画)できますが、
入力ボックスやリストボックス等はこの関数で配置(描画)できませんので、
自力でそれっぽく描画していきましょう。
API関数DrawFrameControlで配置(描画)するやり方についてはコチラをご覧ください。
	
 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
	title "クリックすると、クリック位置のオブジェクトに入力。エンターキーで確定。"
	size = 64, 24 // 横幅, 高さ
	num = winx / size.0, winy / size.1 // 列数, 行数
	sdim buf, 8, num.0 * num.1
	// 枠線
	color 245, 245, 245 : boxf : color
	repeat num.0 : line cnt * size.0, winy, cnt * size.0, 0 : loop
	repeat num.1 : line winx, cnt * size.1, 0, cnt * size.1 : loop
	// データ
	font "", 14 : objmode 2
	repeat num.0 * num.1
		buf.cnt = "ID:" + cnt
		pos cnt \ num.0 * size.0 + 3, cnt / num.0 * size.1 + 3 : mes buf.cnt
	loop
	onclick *click
	onkey *push
	no = -1
	stop

*click
	if no = -1 {
		no = mousey / size.1 * num.0 + (mousex / size.0)
		pos mousex / size.0 * size.0, mousey / size.1 * size.1
		input buf.no, size.0, size.1
	}
	stop

*push
	if wparam = 13 & (no ! -1) {
		position = no \ num.0 * size.0, no / num.0 * size.1
		color 245, 245, 245
		boxf position.0 + 1, position.1 + 1, position.0 + size.0 - 1, position.1 + size.1 - 1
		color
		pos position.0 + 3, position.1 + 3 : mes buf.no
		clrobj
		no = -1
	}
	stop
 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
	title "クリックすると、クリック位置のオブジェクトに入力。エンターキーで確定。"
	size = 64, 24 // 横幅, 高さ
	num = ginfo_winx / size.0, ginfo_winy / size.1 // 列数, 行数
	sdim buf, 8, num.0 * num.1
	// 枠線
	color 245, 245, 245 : boxf : color
	repeat num.0 : line cnt * size.0, ginfo_winy, cnt * size.0, 0 : loop
	repeat num.1 : line ginfo_winx, cnt * size.1, 0, cnt * size.1 : loop
	// データ
	font msmincho, 14 : objmode 2
	repeat num.0 * num.1
		buf.cnt = "ID:" + cnt
		pos cnt \ num.0 * size.0 + 3, cnt / num.0 * size.1 + 3 : mes buf.cnt
	loop
	onclick gosub *click
	onkey gosub *push
	no = -1
	stop

*click
	if no = -1 {
		no = mousey / size.1 * num.0 + (mousex / size.0)
		pos mousex / size.0 * size.0, mousey / size.1 * size.1
		input buf.no, size.0 + 1, size.1 + 1
	}
	return

*push
	if wparam = 13 & no ! -1 {
		position = no \ num.0 * size.0, no / num.0 * size.1
		color 245, 245, 245
		boxf position.0 + 1, position.1 + 1, position.0 + size.0 - 1, position.1 + size.1 - 1
		color
		pos position.0 + 3, position.1 + 3 : mes buf.no
		clrobj
		no = -1
	}
	return