Contents
セレクトボックスを表示します。第一引数に選択肢の種別、第二引数にタイムアウト時間、第三引数が数値なら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")
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")
SLCT_RDO(ラジオボタン)
選択された項目の値が返ります。戻り値はボタンと同じです。

PRINT SLCTBOX(SLCT_RDO, 0, "ラジオボタン", "項目1", "項目2", "項目3")
SLCT_CMB(コンボボックス)

選択された項目の値が返ります。戻り値はボタンと同じです。
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キーを押しながらだと連続する項目を選択できます。
PRINT SLCTBOX(SLCT_LST, 0, "リストボックス", "項目1", "項目2", "項目3")
SLCT_STR
戻り値は選択した項目名となります。複数選択された場合、タブで結合されます。項目を選択せず戻り値がない場合空文字列("")が返ります。
PRINT SLCTBOX(SLCT_LST OR SLCT_STR, 0, "リストボックス", "項目1", "項目2", "項目3")
- 結果
SLCTBOX:1>項目1 項目1 SLCTBOX:1>項目1,項目2 項目1<#TAB>項目2
戻り値はタブで区切られた文字列なので、SPLIT関数で項目を配列に格納することも可能です。
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 0<#TAB>1
項目
セレクトボックスに標準できる項目の数は31個までです。32個以上の項目を設定したい場合は、種別にSLCT_STR、またはSLCT_NUMを付加します。
SLCTBOX関数の戻り値はInteger型は32ビットで1ビットは符号を表すので、残りの31ビットでしか表すことができないことになります。
SLCT_STR、SLCT_NUMを付与すると戻り値はUString(文字列型)になるので32個以上でも表すことができます。
Integer型については変数を参照してください。
プログラム実行例
フラッシュ暗算
UWSC.INIのDefaultFontを変更する
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
じゃんけん
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関数 (スクリプト関数)
- ボタン等、オブジェクトのハンドルを取得します。