POPUPMENUポップアップメニュー関数

本ページには広告が含まれています。

ポップアップメニューを表示し、引数に指定した配列の中から選択された項目の要素番号を取得します。選択された項目を取得したい場合は、POPUPMENUの戻り値を引数に指定した配列の要素番号として指定します。選択をキャンセルした場合-1が返ります。

構文
  1. Integer = POPUPMENU( メニュ項目, X, Y )
引数
メニュ項目 (String)必須
表示メニュ項目を配列変数にて渡す
(サブメニュは { } にて指定: a,b,{c, d},e の場合は c,dがbのサブメニュになる)
X、Y (Integer = マウス位置)省略可
表示位置 X、Y(デフォルトはマウス位置)
戻り値
選択された項目の配列変数位置

使い方

メニュー

ポップアップメニューに表示したい項目を格納した配列を宣言し、POPUPMENU関数の第一引数に指定します。

UWSC
DIM array[] = "項目1", "項目2", "項目3", "項目4", "項目5"
PRINT POPUPMENU(array)
結果
プレーンテキスト
POPUPMENU:2>項目1
0

POPUPMENU:2>項目2
1

POPUPMENU関数の戻り値は選択した配列にある項目の要素番号なので、戻り値を配列の引数にすると選択した項目を取得することができます。

UWSC
DIM array[] = "項目1", "項目2", "項目3", "項目4", "項目5"
PRINT array[POPUPMENU(array)]
結果
プレーンテキスト
POPUPMENU:2>項目1
項目1

POPUPMENU:2>項目3
項目3

サブメニュー

サブメニューを作成するにはサブメニュー項目の開始位置の先頭に{、終了位置の末尾に}をつけます。

中括弧内がサブメニュー、中括弧開始位置の直前の項目がサブメニューの親となります。また親メニューは選択することができません。

以下の場合、項目1のサブメニューとして項目1-1項目1-2を持つメニューとなります。

以下の場合、POPUPMENU関数の戻り値は1,2,3,4のいずれかになります。項目1は親メニューなので0(配列の1番目)は返りません。

UWSC
DIM array[] = "項目1", "{項目1-1", "項目1-2}", "項目2", "項目3"
PRINT POPUPMENU(array)
結果
プレーンテキスト
POPUPMENU:2>項目1
項目1

POPUPMENU:2>{項目1-1
{項目1-1
サブメニューの{ }を外す

POPUPMENU関数でサブメニューを表す際中括弧({ })で囲む必要がありますが、文字列として扱う際は邪魔になるので正規表現置換で外します。

文字列の先頭に{、末尾に}があれば外すという処理を行っています。

UWSC
PRINT reReplace("[POPUPMENUで取得した文字列]", "$1", "^(?:{+)?(.*?)(?:}+)?$")

//////////////////////////////////////////////////
// 【引数】
//   str1 : 置換される文字列 
//   str2 : 置換後の文字列 
//   Pattern : 置換する文字列のパターン 
//   IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse 
//   Global : 文字列全体を検索する場合はTrue、しない場合はFalse 
// 【戻り値】
//   正規表現置換後の文字列 
//////////////////////////////////////////////////
FUNCTION reReplace(str1, str2, Pattern, IgnoreCase = TRUE, Global = TRUE)
	DIM re = CREATEOLEOBJ("VBScript.RegExp")
	re.Pattern = Pattern
	re.IgnoreCase = IgnoreCase
	re.Global = Global
	RESULT = re.Replace(str1, str2)
FEND
UWSC
DIM pref[] =	"北海道地方", "{北海道}", _
				"東北地方", "{青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県}", _
				"関東地方", "{茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県}", _
				"中部地方", "{新潟県", "富山県", "石川県", "福井県", "山梨県", "長野県", "岐阜県", "静岡県", "愛知県}", _
				"関西地方", "{三重県", "滋賀県", "京都府", "大阪府", "兵庫県", "奈良県", "和歌山県}", _
				"中国地方", "{鳥取県", "島根県", "岡山県", "広島県", "山口県}", _
				"四国地方", "{徳島県", "香川県", "愛媛県", "高知県}", _
				"九州地方", "{福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県", "鹿児島県", "沖縄県}"

PRINT reReplace(pref[POPUPMENU(pref)], "$1", "^(?:{+)?(.*?)(?:}+)?$")

//////////////////////////////////////////////////
// 【引数】
//   str1 : 置換される文字列 
//   str2 : 置換後の文字列 
//   Pattern : 置換する文字列のパターン 
//   IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse 
//   Global : 文字列全体を検索する場合はTrue、しない場合はFalse 
// 【戻り値】
//   正規表現置換後の文字列 
//////////////////////////////////////////////////
FUNCTION reReplace(str1, str2, Pattern, IgnoreCase = TRUE, Global = TRUE)
	DIM re = CREATEOLEOBJ("VBScript.RegExp")
	re.Pattern = Pattern
	re.IgnoreCase = IgnoreCase
	re.Global = Global
	RESULT = re.Replace(str1, str2)
FEND
結果
プレーンテキスト
POPUPMENU:10>{北海道}
北海道

サブメニューの階層化

サブメニュー内に中括弧を入れ子にすることでサブメニューの項目にさらにサブメニューを作ることができます。

以下は第一階層に地方、第二階層に都道府県、第三階層に都県内の地域をメニュー項目としています。

地方区分は関東・甲信地方の天気 - 日本気象協会 tenki.jpを参考にしています。

POPUPMENU_メニュー階層化.png
UWSC
DIM pref[] = 	"関東地方", _
					"{東京都", "{東京23区", "多摩", "伊豆諸島北部(大島)", "伊豆諸島南部(八丈島)", "小笠原諸島(父島)}", _
					"神奈川県", "{東部(横浜)", "西部(小田原)}", _
					"埼玉県", "{南部(さいたま)", "北部(熊谷)", "秩父地方(秩父)}", _
					"千葉県", "{北西部(千葉)", "北東部(銚子)", "南部(館山)}", _
					"茨城県", "{北部(水戸)", "南部(土浦)}", _
					"栃木県", "{南部(宇都宮)", "北部(大田原)}", _
					"群馬県", "{南部(前橋)", "北部(みなかみ)}}", _
				"甲信地方", _
					"{山梨県", "{中・西部(甲府)", "東部・富士五湖(河口湖)}", _
					"長野県", "{北部(長野)", "中部(松本)", "南部(飯田)}}"

PRINT reReplace(pref[POPUPMENU(pref)], "$1", "^(?:{+)?(.*?)(?:}+)?$")

//////////////////////////////////////////////////
// 【引数】
//   str1 : 置換される文字列 
//   str2 : 置換後の文字列 
//   Pattern : 置換する文字列のパターン 
//   IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse 
//   Global : 文字列全体を検索する場合はTrue、しない場合はFalse 
// 【戻り値】
//   正規表現置換後の文字列 
//////////////////////////////////////////////////
FUNCTION reReplace(str1, str2, Pattern, IgnoreCase = TRUE, Global = TRUE)
	DIM re = CREATEOLEOBJ("VBScript.RegExp")
	re.Pattern = Pattern
	re.IgnoreCase = IgnoreCase
	re.Global = Global
	RESULT = re.Replace(str1, str2)
FEND
結果
プレーンテキスト
POPUPMENU:13>関東地方>東京都>東京23区
東京23区

プログラム実行例

ポップアップメニューで選択した項目を出力

UWSC
DIM menu[] = "項目1", "項目2", "項目3", "項目4", "項目5"
DIM res = POPUPMENU(menu)

PRINT res
PRINT menu[res]
結果
プレーンテキスト
POPUPMENU:2>項目1
0
項目1

POPUPMENU:2>項目3
2
項目3
使用関数

ポップアップメニューで選択した項目を出力(サブメニューあり)

UWSC
DIM menu[] = "項目1", "項目2", "{項目2-1", "項目2-2}", "項目3", "{項目3-1", "項目3-2", "項目3-3}", "項目4", "項目5"
DIM res = POPUPMENU(menu)

// サブメニューとして指定する際に必要な「{ }」を削除
IF COPY(menu[res], 1, 1) = "{" THEN menu[res] = COPY(menu[res], 2)
IF COPY(menu[res], LENGTH(menu[res], 1)) = "}" THEN menu[res] = COPY(menu[res], 1, LENGTH(menu[res] - 1))

PRINT menu[res]

UWSC Debuggerの右クリックメニューをカスタマイズ

UWSC Debuggerの右クリックメニューに不具合があるのでPOPUPMENU関数でカスタマイズしました。

[createLink url="/howto/#schedule-setting" title="スケジュール設定"]で「指定Windowが現れた時」のクラス名に「TFOya」を指定すると、UWSC Debuggerを起動したときにのみ実行することができます。

UWSC
DIM menu[] = "元に戻す<#TAB>Ctrl+Z", "やり直す<#TAB>Ctrl+Y", "切り取り<#TAB>Ctrl+X", _
				"コピー<#TAB>Ctrl+C", "貼り付け<#TAB>Ctrl+V", "削除", _
				"すべて選択<#TAB>Ctrl+A", "UWSC Help<#TAB>Ctrl+H", "プログラムをコピー"
PUBLIC ttl
PUBLIC cls

THREAD isUwscWindows()

WHILE TRUE
	DIM WID = GETID(GET_ACTIVE_WIN)
	ttl = STATUS(WID, ST_TITLE)
	cls = STATUS(WID, ST_CLASS)
	WHILE POS("UWSC Debugger", ttl) <> 0 AND cls = "TFOya"
		ID = GETID(, "#32768")
		CTRLWIN(ID, CLOSE2)
		IFB ID <> -1 THEN
			LOCKHARDEX(WID)
			REPEAT
				CTRLWIN(WID, ACTIVATE)
				DIM x = G_MOUSE_X
				DIM y = G_MOUSE_Y
				BTN(LEFT, CLICK, STATUS(WID, ST_X) + 10, STATUS(WID, ST_Y) + 1)
				MMV(x, y)
				SLEEP(0.001)
			UNTIL GETID(, "#32768") = -1
			LOCKHARDEX()
			DIM res = POPUPMENU(menu)
//			SLEEP(0.001)
			SELECT res
				CASE 0;		SCKEY(WID, VK_CTRL, VK_Z)		// 元に戻す
				CASE 1;		SCKEY(WID, VK_CTRL, VK_Y)		// やり直す
				CASE 2;		SCKEY(WID, VK_CTRL, VK_X)		// 切り取り
				CASE 3;		SCKEY(WID, VK_CTRL, VK_C)		// コピー
				CASE 4;		SCKEY(WID, VK_CTRL, VK_V)		// 貼り付け
				CASE 5;		SCKEY(WID, VK_DELETE)			// 削除
				CASE 6;		SCKEY(WID, VK_CTRL, VK_A)		// すべて選択
				CASE 7;		SCKEY(WID, VK_CTRL, VK_H)		// UWSC Help
				CASE 8;		GETITEM(WID, ITM_EDIT);		SENDSTR(0, ALL_ITEM_LIST[3])
			SELEND
			IF res = 2 THEN FUKIDASI("切り取りました。")
			IF res = 3 THEN FUKIDASI("コピーしました。")
			IF res = 4 THEN FUKIDASI("貼り付けました。")
			SLEEP(1.000)
			FUKIDASI()
		ENDIF
		WID = GETID(GET_ACTIVE_WIN)
		SLEEP(0.001)
	WEND
	SLEEP(0.001)
WEND

PROCEDURE isUwscWindows()
	REPEAT
		SLEEP(0.001)
	UNTIL GETID(, cls) = -1
	EXITEXIT
FEND
結果
UWSC Debugger_右クリックメニュー.png
使用関数
解説

関連記事

CALCARRAY関数 (スクリプト関数)
配列の合計値・最小値・最大値・平均値を求めます。
GETALLWIN関数 (スクリプト関数)
全ウィンドウのIDを取得します。
GETOLEITEM関数 (スクリプト関数)
JOIN関数 (スクリプト関数)
引数に指定した配列を結合し文字列を返します。
SETCLEAR関数 (スクリプト関数)
配列のすべての要素を任意の値で埋めます。
SHIFTARRAY関数 (スクリプト関数)
配列を指定した値だけシフトします。プラス値で後方、マイナス値で前方にシフトします。
連想配列
連想配列とは、自動的に割り当てられる数字をキーとして持つかわりに、自由に任意の文字列を割り振ることができる配列のことです。添え字に番号の変わりに名前をつけることでわかりやすく管理することができます。
divisors関数 (自作関数)
引数に指定した数値の約数のリストを返します。
LENGTH関数 (スクリプト関数)
RECOSTATE関数 (スクリプト関数)