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")
結果
プレーンテキスト
SLCTBOX:1>項目3
4

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")
結果
プレーンテキスト
SLCTBOX:1>項目2,項目3
6

SLCT_RDO(ラジオボタン)

セレクトボックス ラジオボタン

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

UWSC
PRINT SLCTBOX(SLCT_RDO, 0, "ラジオボタン", "項目1", "項目2", "項目3")
結果
プレーンテキスト
SLCTBOX:1>項目2
2

SLCT_CMB(コンボボックス)

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

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

ボタンとは違い項目を選択したあとに[OK]を押す必要があります。

UWSC
PRINT SLCTBOX(SLCT_CMB, 0, "コンボボックス", "項目1", "項目2", "項目3")
結果
プレーンテキスト
SLCTBOX:1>項目1
1

SLCT_LST(リストボックス)

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

選択されたチェックボックスの論理和(OR)が返ります。リストボックスが表示されたとき一番上の項目が破線で囲まれていますが、選択されているわけではないのでマウスや矢印キーで選択する必要があります。

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

UWSC
PRINT SLCTBOX(SLCT_LST, 0, "リストボックス", "項目1", "項目2", "項目3")
結果
プレーンテキスト
SLCTBOX:1>項目1,項目2,項目3
7

SLCT_STR

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

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

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

戻り値はタブで区切られた文字列なので、SPLIT関数で項目を配列に格納し出力することも可能です。項目が選択されなかったときや1つしか選択されなくても動作します。

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,項目3
0<#TAB>1<#TAB>2

項目の上限

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

SLCTBOX関数の戻り値はInteger型は32ビットで1ビットは符号を表すので残りの31ビットでしか表すことができませんが、SLCT_STRSLCT_NUMを付与すると戻り値はUString(文字列型)になるので32個以上でも表すことができます。

タイムアウト時間

第二引数に数値を指定するとタイムアウト時間を秒単位で設定することができます。タイムアウト時間を指定するとダイアログの下部に緑色のバーで残り時間が表示されます。バーが左端まで来るとダイアログが閉じ0を返します。

.png

タイムアウト時間を表示

タイムアウト時間を指定したとき、カウントダウンタイマーをセレクトボックス下に吹き出しで表示します。関数の第一引数にタイムアウト時間を指定すると残り時間を秒単位とパーセンテージ表記で表示します。引数を指定しない場合はパーセンテージ表記のみです。タイマーはプログレスバーの減りに合わせて再計算されるので、タイムアウト時間が長いほど更新頻度は低くなります。

以下の関数をSLCTBOX関数の直前にスレッドで実行します。

UWSC
PROCEDURE progress(t = EMPTY)
	DIM ID = GETID("UWSC", "TUslctBox_uwsc", 10)
	WHILE ID <> -1
		DIM str = POSACC(ID, 0, STATUS(ID, ST_CLHEIGHT) - 1, ACC_ACC)
		IF POS("%", str) = 0 THEN
			str = ""
		ELSEIF t <> EMPTY THEN
			str = FORMAT(t * VAL(REPLACE(str, "%", "")) / 100, LENGTH(t)+3, 2) + "秒(" + str + ")"
		ENDIF
		FUKIDASI(str, STATUS(ID, ST_X), STATUS(ID, ST_Y) + STATUS(ID, ST_HEIGHT),,,,, $F0F0F0)
		SLEEP(0.001)
		ID = GETID("UWSC", "TUslctBox_uwsc", 0.01)
	WEND
FEND

progress関数に時間を指定しているので、秒単位とパーセンテージ表記で残り時間が表示されます。

UWSC
DIM t = 30
THREAD progress(t)

SLCTBOX(SLCT_BTN, t,,, "項目1", "項目2", "項目3")

PROCEDURE progress(t = EMPTY)
	DIM ID = GETID("UWSC", "TUslctBox_uwsc", 10)
	WHILE ID <> -1
		DIM str = POSACC(ID, 0, STATUS(ID, ST_CLHEIGHT) - 1, ACC_ACC)
		IF POS("%", str) = 0 THEN
			str = ""
		ELSEIF t <> EMPTY THEN
			str = FORMAT(t * VAL(REPLACE(str, "%", "")) / 100, LENGTH(t)+3, 2) + "秒(" + str + ")"
		ENDIF
		FUKIDASI(str, STATUS(ID, ST_X), STATUS(ID, ST_Y) + STATUS(ID, ST_HEIGHT),,,,, $F0F0F0)
		SLEEP(0.001)
		ID = GETID("UWSC", "TUslctBox_uwsc", 0.01)
	WEND
FEND

progress関数に時間を指定していないので、パーセンテージ表記でのみ残り時間が表示されます。

UWSC
THREAD progress()

SLCTBOX(SLCT_BTN, 30,,, "項目1", "項目2", "項目3")

PROCEDURE progress(t = EMPTY)
	DIM ID = GETID("UWSC", "TUslctBox_uwsc", 10)
	WHILE ID <> -1
		DIM str = POSACC(ID, 0, STATUS(ID, ST_CLHEIGHT) - 1, ACC_ACC)
		IF POS("%", str) = 0 THEN
			str = ""
		ELSEIF t <> EMPTY THEN
			str = FORMAT(t * VAL(REPLACE(str, "%", "")) / 100, LENGTH(t)+3, 2) + "秒(" + str + ")"
		ENDIF
		FUKIDASI(str, STATUS(ID, ST_X), STATUS(ID, ST_Y) + STATUS(ID, ST_HEIGHT),,,,, $F0F0F0)
		SLEEP(0.001)
		ID = GETID("UWSC", "TUslctBox_uwsc", 0.01)
	WEND
FEND

プログラム実行例

UWSC.INIのDefaultFontを変更する

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関数 (スクリプト関数)
指定したIDのウィンドウのアイテムをクリックします。アイテムに指定できるものにはボタン・チェックボックス・ラジオボタン・リストボックス・コンボボックス・タブコントロール・メニュー・ツリービュー・リストビュー・ツールバー・リンクがあります。
GETITEM関数 (スクリプト関数)
指定したIDのウィンドウのキャプション文字やリストなどを取得します。取得した情報は配列変数のALL_ITEM_LIST[ ]に格納されます。戻値は取得した数でInteger型です。
CHKBTN関数 (スクリプト関数)
指定したIDのウィンドウにあるチェックボックス・ラジオボタンがチェックされているかを返します。
GETCTLHND関数 (スクリプト関数)
ボタン等、オブジェクトのハンドルを取得します。