目次
セレクトボックスを表示します。第一引数に選択肢の種別、第二引数にタイムアウト時間、第三引数が数値ならx座標、第四引数にy座標、第三引数が数値でなければメッセージ、メッセージの次の引数に項目を指定します。
- 構文
- Integer = SLCTBOX( 種別, タイムアウト秒, メッセージ, 項目, 項目, 項目, … )
もしくは
Integer = SLCTBOX( 種別, タイムアウト秒, x, y, メッセージ, 項目, 項目, 項目, … )
- Integer = SLCTBOX( 種別, タイムアウト秒, メッセージ, 項目, 項目, 項目, … )
- 引数
- 種別 (#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_STR、SLCT_NUMの場合は制限なし)
種別
SLCT_BTN(ボタン)
押されたボタンの値が返ります。1番目のボタンが押されたならSLCT_1(1)、2番目のボタンが押されたならSLCT_2(2)、3番目のボタンが押されたならSLCT_3(4)。\(n\)番目のボタンの値は\(2^{n-1}\)となります。
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)。
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}\)となります。
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]を押す必要があります。
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キーを押しながらだと連続する項目を選択できます。
PRINT SLCTBOX(SLCT_LST, 0, "リストボックス", "項目1", "項目2", "項目3")
- 結果
SLCTBOX:1>項目1,項目2,項目3 7
SLCT_STR
戻り値は選択した項目名となります。複数選択された場合、タブで結合されます。項目を選択せず戻り値がない場合空文字列("")が返ります。
PRINT SLCTBOX(SLCT_LST OR SLCT_STR, 0, "リストボックス", "項目1", "項目2", "項目3")
- 結果
SLCTBOX:1>項目1 項目1 SLCTBOX:1>項目1,項目2,項目3 項目1<#TAB>項目2<#TAB>項目3
戻り値はタブで区切られた文字列なので、SPLIT関数で項目を配列に格納し出力することも可能です。項目が選択されなかったときや1つしか選択されなくても動作します。
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\)となります。こちらも戻り値がない場合、空文字列が返ります。
PRINT SLCTBOX(SLCT_LST OR SLCT_NUM, 0, "リストボックス", "項目1", "項目2", "項目3")
- 結果
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_STR、SLCT_NUMを付与すると戻り値はUString(文字列型)になるので32個以上でも表すことができます。
タイムアウト時間
第二引数に数値を指定するとタイムアウト時間を秒単位で設定することができます。タイムアウト時間を指定するとダイアログの下部に緑色のバーで残り時間が表示されます。バーが左端まで来るとダイアログが閉じ0を返します。
タイムアウト時間を表示
タイムアウト時間を指定したとき、カウントダウンタイマーをセレクトボックス下に吹き出しで表示します。関数の第一引数にタイムアウト時間を指定すると残り時間を秒単位とパーセンテージ表記で表示します。引数を指定しない場合はパーセンテージ表記のみです。タイマーはプログレスバーの減りに合わせて再計算されるので、タイムアウト時間が長いほど更新頻度は低くなります。
以下の関数をSLCTBOX関数の直前にスレッドで実行します。
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関数に時間を指定しているので、秒単位とパーセンテージ表記で残り時間が表示されます。
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関数に時間を指定していないので、パーセンテージ表記でのみ残り時間が表示されます。
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を変更する
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関数 (スクリプト関数)
- ボタン等、オブジェクトのハンドルを取得します。