UWSCのSLCTBOXを複数行にしてみる

公式掲示板にSLCTBOXを複数行にする方法はないか、というのがあったので、考えてみた。


考えた結果としては、、、

スクリプト

「CONST COL_NUM = 3」として3列固定にしています。
素数とかから算出しなおしたいなら、COL_NUM参照しているあたりの修正が必要。
「CONST IE_WIDTH = 300」として、幅の最小値を300pxにしています。


SelectBox.uws

OPTION EXPLICIT

IFB GET_UWSC_NAME = "SelectBox.uws" THEN
	// サンプルデータ
	HASHTBL sample
	DIM i
	FOR i = 0 TO 25
		sample[i] = "項目" + i
	NEXT
	PRINT SelectBox(SLCT_RDO OR SLCT_NUM, 0, "Radio NUM 0", sample)
	PRINT SelectBox(SLCT_RDO OR SLCT_STR, 0, "Radio STR 0", sample)
	PRINT SelectBox(SLCT_RDO OR SLCT_NUM, 1, "Radio NUM 1", sample)
	PRINT SelectBox(SLCT_RDO, 0, "Radio - 0", sample)
	PRINT SelectBox(SLCT_CHK, 0, "Check - 0", sample)
	PRINT SelectBox(SLCT_CMB, 0, "Combo - 0", sample)
	PRINT SelectBox(SLCT_LST, 0, "ListB - 0", sample)
ENDIF


FUNCTION SelectBox(type, to, msg, list[], x=ERR_VALUE, y=ERR_VALUE)
	CONST COL_NUM = 3
	CONST MAX_SCROLL = 9999
	CONST IE_WIDTH = 300

	// html組立
	DIM i, html = "<html><head><title>UWSC - " + GET_UWSC_NAME + "</title></head><body>" + msg + "<br><table id=htmltable><tr>", rec = "<td><input type=###TYPE### name=htmlselect id=###ID###><label for=###ID###>###STR###</label></td>", sep = "</tr><tr>"
	SELECT TRUE
		CASE (type AND SLCT_RDO) > 0
			rec = REPLACE(rec, "###TYPE###", "radio")
		CASE (type AND SLCT_CHK) > 0
			rec = REPLACE(rec, "###TYPE###", "checkbox")
		DEFAULT
			// 未実装はオリジナルに投げて終了
			RESULT = SLCTBOX(type, to, msg, list)
			EXIT
	SELEND
	FOR i = 0 TO LENGTH(list) - 1
		IF i MOD COL_NUM = 0 THEN html = html + sep
		html = html + REPLACE(REPLACE(rec, "###STR###", list[i]), "###ID###", "htmlsel" + i)
	NEXT
	html = html + "</tr><tr><td align=center colspan=" + COL_NUM + "><input type=checkbox id=htmlok><label for=htmlok>OK</label></td></tr></table></body></html>"

	// html生成
	DIM path = GET_CUR_DIR + "\" + GET_UWSC_NAME + ".html"
	DIM f = FOPEN(path, F_WRITE)
	FPUT(f, html, F_ALLTEXT)
	FCLOSE(f)

	// 表示
	DIM ie = CREATEOLEOBJ("InternetExplorer.Application")
	ie.StatusBar = FALSE
	ie.AddressBar = FALSE
	ie.ToolBar = FALSE
	ie.Navigate("file://" + path)
	WHILE ie.Busy AND ie.readyState <> 4
		SLEEP(0.2)
	WEND
	ie.Visible = TRUE
	IF x <> ERR_VALUE THEN ie.Left = x
	IF y <> ERR_VALUE THEN ie.Top = y
	ie.Width = IE_WIDTH
	ie.Height = 0
	ie.document.body.scrollTop = MAX_SCROLL
	ie.document.body.scrollLeft = MAX_SCROLL
	WHILE ie.document.body.scrollTop > 0
		ie.Height = ie.Height + ie.document.body.scrollTop
	WEND
	WHILE ie.document.body.scrollLeft > 0
		ie.Width = ie.Width + ie.document.body.scrollLeft
	WEND

	// 選択チェック
	DIM ret = "", rads, end = GETTIME() + to, res = 0
	rads = ie.document.getElementById("htmlok")
	WHILE res <= 0 AND (to <= 0 OR end >= GETTIME())
		TRY
			IF rads.checked THEN res = 1
		EXCEPT
			res = -1
			BREAK
		ENDTRY
		SLEEP(0.1)
	WEND
	IFB res > 0 THEN
		rads = ie.document.getElementsByName("htmlselect")
		FOR i = 0 TO rads.length - 1
			IFB rads.item[i].checked THEN
				IFB (type AND SLCT_NUM) > 0 THEN
					IF LENGTH(ret) > 0 THEN ret = ret + "<#TAB>"
					ret = ret + i
				ELSEIF (type AND SLCT_STR) > 0 THEN
					IF LENGTH(ret) > 0 THEN ret = ret + "<#TAB>"
					ret = ret + list[i]
				ELSE
					IF LENGTH(ret) = 0 THEN ret = 0
					res = 1
					end = i
					WHILE end > 0
						res = res * 2
						end = end - 1
					WEND
					ret = ret + res
				ENDIF
			ENDIF
		NEXT
	ELSEIF res = -1 OR ((type AND (SLCT_NUM OR SLCT_STR)) = 0) THEN
		ret = res
	ENDIF

	// 終了
	COM_ERR_IGN
		ie.Quit()
	COM_ERR_RET
	DIM fso = CREATEOLEOBJ("Scripting.FileSystemObject")
	fso.DeleteFile(path)

	RESULT = ret
FEND

ま、とりあえずはこんなところです。