SLCTBOXセレクトボックス関数

セレクトボックスを表示します。第一引数に選択肢の種別、第二引数にタイムアウト時間、第三引数が数値ならx座標、第四引数にy座標、第三引数が数値でなければメッセージ、メッセージの次の引数に項目を指定します。

構文
  1. Integer = SLCTBOX( 種別, タイムアウト秒, メッセージ, 項目, 項目, 項目, … )
    もしくは
    Integer = SLCTBOX( 種別, タイムアウト秒, x, y, メッセージ, 項目, 項目, 項目, … )
引数
種別 (#slctbox必須
SLCT_BTN
ボタン
SLCT_CHK
チェックボックス
SLCT_RDO
ラジオボタン
SLCT_CMB
コンボボックス
SLCT_LST
リストボックス
SLCT_STR
戻り値を項目名で返す(他の種別に付加して使用)
SLCT_NUM
戻り値を位置数で返す(他の種別に付加して使用)
タイムアウト (Integer)必須
指定時間(秒)を過ぎるとゼロを返す
x, y (Integer = 中央)省略可
第3引数と第4引数が数値であれば X位置,Y位置指定と判断 (デフォルトは中央、 -1,-1にて前回位置)
メッセージ (String = "")省略可
表示メッセージ
項目 (String = "",Array = "")省略可
選択項目名(配列変数で渡す事も可)
戻り値
1つ目が選択されたならばSLCT_1が返される
2つ目が選択されたならばSLCT_2が返される

SLCT_CHK(チェックボックス)選択時はビット演算して返される
SLCT_STR付加時は項目名で返される (複数選択時はタブにて結合される)
SLCT_NUM付加時は位置数で返される (複数選択時はタブにて結合される)
閉じボタンによる終了時は-1を返してくる(SLCT_CHKにてビットチェックする場合は注意)
項目数は最大31まで (SLCT_STRSLCT_NUMの場合は制限なし)

種別

SLCT_BTN(ボタン)

セレクトボックス ボタン

押されたボタンの値が返ります。1番目のボタンが押されたならSLCT_1(1)、2番目のボタンが押されたならSLCT_2(2)、3番目のボタンが押されたならSLCT_3(4)。\(n\)番目のボタンの値は\(2^{n-1}\)となります。

UWSC
PRINT SLCTBOX(SLCT_BTN, 0, "ボタン", "項目1", "項目2", "項目3")

SLCT_CHK(チェックボックス)

セレクトボックス チェックボックス

選択されたチェックボックスの論理和(OR)が返ります。1つも選択されなかった場合0、1番目が選択されたならSLCT_1、2番目と3番目が選択されたならSLCT_2 OR SLCT_3(2+4=6)。

UWSC
PRINT SLCTBOX(SLCT_CHK, 0, "チェックボックス", "項目1", "項目2", "項目3")

SLCT_RDO(ラジオボタン)

選択された項目の値が返ります。戻り値はボタンと同じです。

セレクトボックス ラジオボタン
UWSC
PRINT SLCTBOX(SLCT_RDO, 0, "ラジオボタン", "項目1", "項目2", "項目3")

SLCT_CMB(コンボボックス)

セレクトボックス コンボボックス

選択された項目の値が返ります。戻り値はボタンと同じです。

UWSC
PRINT SLCTBOX(SLCT_CMB, 0, "コンボボックス", "項目1", "項目2", "項目3")

SLCT_LST(リストボックス)

セレクトボックス リストボックス

選択されたチェックボックスの論理和(OR)が返ります。1つも選択されなかった場合0、1番目が選択されたならSLCT_1、2番目と3番目が選択されたならSLCT_2 OR SLCT_3(2+4=6)。Ctrlキーを押しながら項目を選択すると複数選択でき、Shiftキーを押しながらだと連続する項目を選択できます。

UWSC
PRINT SLCTBOX(SLCT_LST, 0, "リストボックス", "項目1", "項目2", "項目3")

SLCT_STR

戻り値は選択した項目名となります。複数選択された場合、タブで結合されます。項目を選択せず戻り値がない場合空文字列("")が返ります。

UWSC
PRINT SLCTBOX(SLCT_LST OR SLCT_STR, 0, "リストボックス", "項目1", "項目2", "項目3")
結果
UWSC
SLCTBOX:1>項目1
項目1

SLCTBOX:1>項目1,項目2
項目1<#TAB>項目2

戻り値はタブで区切られた文字列なので、SPLIT関数で項目を配列に格納することも可能です。

UWSC
DIM array[] = "項目1", "項目2", "項目3"
DIM items = SPLIT(SLCTBOX(SLCT_LST OR SLCT_STR, 0, "ボタン", array), "<#TAB>")

FOR item IN items
	PRINT item
NEXT
結果
プレーンテキスト
SLCTBOX:2>項目2,項目3
項目2
項目3

SLCT_NUM

戻り値は選択した項目名となります。複数選択された場合、タブで結合されます。\(n\)番目の項目は\(n-1\)となります。こちらも戻り値がない場合、空文字列が返ります。

UWSC
PRINT SLCTBOX(SLCT_LST OR SLCT_NUM, 0, "リストボックス", "項目1", "項目2", "項目3")
結果
UWSC
SLCTBOX:1>項目1
0

SLCTBOX:1>項目1,項目2
0<#TAB>1

項目

セレクトボックスに標準できる項目の数は31個までです。32個以上の項目を設定したい場合は、種別にSLCT_STR、またはSLCT_NUMを付加します。

SLCTBOX関数の戻り値はInteger型は32ビットで1ビットは符号を表すので、残りの31ビットでしか表すことができないことになります。

SLCT_STR、SLCT_NUMを付与すると戻り値はUString(文字列型)になるので32個以上でも表すことができます。

Integer型については変数を参照してください。

プログラム実行例

フラッシュ暗算

UWSC
使用関数
解説

UWSC.INIのDefaultFontを変更する

UWSC
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")

DIM grades[] = "20級(初級)", "19級(初級)", "18級(初級)", "17級(初級)", "16級(初級)", "15級(初級)", "14級(初級)", "13級(初級)", "12級(初級)", "11級(初級)", _
				"10級(中級)", "9級(中級)", "8級(中級)", "7級(中級)", "6級(中級)", "5級(中級)", "4級(中級)", "3級(中級)", "2級(中級)", "1級(中級)", _
				"初段(上級)", "2段(上級)", "3段(上級)", "4段(上級)", "5段(上級)", "6段(上級)", "7段(上級)", "8段(上級)", "9段(上級)", "10段(上級)", _
				"11段(超上級)", "12段(超上級)", "13段(超上級)", "14段(超上級)", "15段(超上級)", "16段(超上級)", "17段(超上級)", "18段(超上級)", "19段(超上級)", "20段(超上級)"
DIM keta[] = 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, _
				2, 2, 2, 2, 2, 2, 2, 2, 2, 2, _ 
				2, 3, 3, 3, 3, 3, 3, 3, 3, 3, _ 
				3, 3, 3, 3, 3, 3, 3, 3, 3, 3
DIM num[] = 3, 3, 5, 8, 10, 12, 15, 20, 10, 15, _
				2, 3, 4, 5, 6, 7, 8, 10, 12, 15, _
				15, 4, 6, 8, 10, 12, 15, 15, 15, 15, _
				15, 15, 15, 15, 15, 15, 15, 15, 15, 15
DIM time[] = 5, 5, 7, 10, 12, 15, 15, 15, 10, 15, _
				4, 6, 7, 8, 9, 10, 11, 12, 12, 13, _
				10, 4, 5, 6, 7, 8, 8, 6, 4.5, 3, _
				2.8, 2.6, 2.4, 2.2, 2.0, 1.9, 1.8, 1.7, 1.6, 1.5
DIM grade = SLCTBOX(SLCT_CMB OR SLCT_NUM, 60, "レベルを選択", grades)
DIM sum = 0
DIM fontsize = 80
DIM fontname = "abacus2"
DIM fontcolor = $00aa00
DIM bgcolor = 1

FOR i = 1 TO num[grade]
	DIM n = POWER(10, keta[grade] - 1) + RANDOM(POWER(10, keta[grade]) - POWER(10, keta[grade] - 1))
	sum = sum + n
	DIM msg = " " + n + " "
	FUKIDASI(msg, G_SCREEN_W, G_SCREEN_H,, fontsize, fontname, fontcolor, bgcolor)
	DIM ID = GETID(GET_FUKIDASI_WIN)
	FUKIDASI(msg, (STATUS(ID, ST_X) - STATUS(ID, ST_WIDTH))/2, (STATUS(ID, ST_Y) - STATUS(ID, ST_HEIGHT))/2,, fontsize, fontname, fontcolor, bgcolor)
	SOUND("BEEP")
	SLEEP(time[grade])
	FUKIDASI()
NEXT

DIM ans = INPUT("答えは?")

IFB ans = sum THEN
	MSGBOX("正解です!(ans." + sum + ")")
ELSE
	MSGBOX("残念でした、正解は " + sum + " です。")
ENDIF

PROCEDURE forceQuit()
	EXITEXIT
FEND
使用関数

じゃんけん

UWSC
CONST ssfFONTS = 20

DIM Shell = CREATEOLEOBJ("Shell.Application")
DIM Folder = Shell.NameSpace(ssfFONTS)
DIM FolderItems = Folder.Items
DIM array[-1]

FOR FolderItem IN FolderItems
	arrayPush(array, FolderItem.Name)
NEXT

QSORT(array, QSRT_UNICODEA)
SHIFTARRAY(array, 1)
array[0] = "(なし)"

DIM filename = "C:\Users\" + BETWEENSTR(DOSCMD("SET"), "USERNAME=", "<#CR>") + "\AppData\Roaming\UWSC\UWSC.INI"
DIM str = SPLIT(READINI("SET", "DefaultFont", filename), ",")[0]
DIM font = SLCTBOX(SLCT_CMB OR SLCT_STR, 0, "フォントを選択してください。(現在:" + str + ")", array)

IF font = "(なし)" THEN font = ""
IF font <> -1 THEN WRITEINI("SET", "DefaultFont", font + ",", filename)

//////////////////////////////////////////////////
// 【引数】
//   array : 要素を追加する配列(参照引数) 
//   values : 追加する要素をvalue1から指定 
// 【戻り値】
//   処理後の配列の要素の数 
//////////////////////////////////////////////////
FUNCTION arrayPush(var array[], value1 = EMPTY, value2 = EMPTY, value3 = EMPTY, value4 = EMPTY, value5 = EMPTY, value6 = EMPTY, value7 = EMPTY, value8 = EMPTY, value9 = EMPTY, value10 = EMPTY, value11 = EMPTY, value12 = EMPTY, value13 = EMPTY, value14 = EMPTY, value15 = EMPTY, value16 = EMPTY)
    DIM i = 1
    WHILE EVAL("value" + i) <> EMPTY
	  DIM res = RESIZE(array, UBound(array) + 1)
	  array[res] = EVAL("value" + i)
	  i = i + 1
	WEND
	RESULT = LENGTH(array)
FEND

//////////////////////////////////////////////////
// 【引数】
//   section : セクション 
//   key : キー(Delete関数は省略可) 
//   value : 値 
//   path : INIファイルのパス 
//   default : セクションとキーが存在しなかった場合に返す値 
// 【戻り値】
//   
//////////////////////////////////////////////////
MODULE INI
	DEF_DLL GetPrivateProfileStringW(wstring,wstring,wstring,var pwchar,dword,wstring):dword:kernel32
	DEF_DLL WritePrivateProfileStringW(wstring,wstring,wstring,wstring):bool:kernel32
	FUNCTION Read(section = NULL, key = NULL, path = NULL, default = EMPTY)
		DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
		IFB path = NULL THEN
			path = FSO.GetAbsolutePathName(FSO.GetBaseName(GET_UWSC_NAME) + ".INI")
		ELSE
			path = FSO.GetAbsolutePathName(path)
		ENDIF
		DIM n = 1024
		DIM buffer = FORMAT(CHR(0), n)
		IFB GetPrivateProfileStringW(section, key, default, buffer, n, path) = 0 THEN
			RESULT = default
		ELSE
			RESULT = SLICE(SPLIT(buffer, CHR(0), TRUE))
			IF section <> NULL AND key <> NULL THEN RESULT = RESULT[0]
		ENDIF
	FEND
	FUNCTION Write(section, key, value, path = NULL)
		DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
		IFB path = NULL THEN
			path = FSO.GetAbsolutePathName(FSO.GetBaseName(GET_UWSC_NAME) + ".INI")
		ELSE
			path = FSO.GetAbsolutePathName(path)
		ENDIF
		RESULT = WritePrivateProfileStringW(section, key, value, path)
	FEND
	PROCEDURE Delete(section, key = NULL, path = NULL)
		DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
		IFB path = NULL THEN
			path = FSO.GetAbsolutePathName(FSO.GetBaseName(GET_UWSC_NAME) + ".INI")
		ELSE
			path = FSO.GetAbsolutePathName(path)
		ENDIF
		PRINT WritePrivateProfileStringW(section, key, NULL, path)
	FEND
	FUNCTION escape(value)
		DIM esc = ";#=:"
		FOR i = 1 TO LENGTH(esc)
			DIM s = COPY(esc, i, 1)
			value = REPLACE(value, s, "\" + s)
		NEXT
		RESULT = value
	FEND
	FUNCTION unescape(value)
		DIM esc = ";#=:"
		FOR i = 1 TO LENGTH(esc)
			DIM s = COPY(esc, i, 1)
			value = REPLACE(value, "\" + s, s)
		NEXT
		RESULT = value
	FEND
ENDMODULE

//////////////////////////////////////////////////
// 【引数】
//   inputs : 繰り返す文字列 
//   multiplier : inputsを繰り返す回数 
// 【戻り値】
//   inputsをmultiplier回を繰り返した文字列を返します 
//////////////////////////////////////////////////
FUNCTION strRepeat(inputs, multiplier)
	DIM res = ""
	FOR n = 1 TO multiplier
		res = res + inputs
	NEXT
	RESULT = res
FEND

//////////////////////////////////////////////////
// 【引数】
//   arrayname : 上限値を求める配列の名前 
//   dimension : 返す次元を示す整数 
// 【戻り値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(arrayname[], dimension = 1)
	RESULT = EVAL("RESIZE(arrayname" + strRepeat("[0]", dimension - 1) + ")")
FEND
結果
プレーンテキスト
プレイヤー	グー
コンピュータ	グー
結果		あいこ
----------
プレイヤー	チョキ
コンピュータ	パー
結果		勝ち
----------
使用関数

この記事は役に立ちましたか?

はい
いいえ
ご協力ありがとうございます。

関連記事

CLKITEM関数 (スクリプト関数)
アイテムをクリックします。
GETITEM関数 (スクリプト関数)
キャプション文字やリスト等をすべて取得します。
CHKBTN関数 (スクリプト関数)
ボタン類の状態を返します。
GETCTLHND関数 (スクリプト関数)
ボタン等、オブジェクトのハンドルを取得します。