忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

BHT-BASIC4.0:簡単なメニュー表示・選択を行うユーザ関数について
簡単なメニュー表示・選択を行うユーザ関数を作ってみました。
この関数はメニュー表示データを文字列の配列で渡して、 ハンディの「△」「▽」キーで選択行を移動させて、 「ENT」キーの押下でメニュー選択を行います。
実際の表示は以下の様な感じです。

各数字キーを押下することで、メニューの選択が直接その行に移動します。 但し、この関数なのですが問題が在りまして、 各数字キーで直接移動するのはいいのですが、 1~9までにしか対応していません。 そのため、9個までのメニューは良いのですが、それ以上のメニューの場合は問題が在ります。
この辺りは、参考にされた場合は改造等をして下さい。
では以下にこの関数のソースを示します。
'---------------------------------------
'メニュー表示・選択
'---------------------------------------
'Function MfGetMenu$(Byval pnY%, Byval pColorBack&, Byref parrMenu$(), Byval pnMenuMax%, Byval pnMenu%)
'引 数:
'	pnY%		:画面行位置
'	pColorBack&	:背景色:指定色
'	parrMenu$()	:メニュー文字列配列
'	pnMenuMax%	:メニュー行のMAX値
'	pnMenu%		:最初のメニューの位置
'戻り値:
'	MfGetMenu$	:選択されたメニューの番号文字列
'---------------------------------------
	Function MfGetMenu$(Byval pnY%, Byval pColorBack&, Byref parrMenu$(), Byval pnMenuMax%, Byval pnMenu%)
		Private nMenu% : nMenu% = pnMenu%
		Private strMenu$: strMenu$ = ""
		Private strBuf$: strBuf$ =""
		Private strMenuMax$: strMenuMax$ = MID$(STR$(pnMenuMax%), 2)
		private color&            ' 文字色の変数を定義
		private bkcolor&          ' 背景色の変数を定義
		
		'エラー処理宣言
		On Error Goto MfGetMenu.ErrProc
		While strMenu$ = ""
			Locate 1, (pnY% - 1) * 2 + 1, 0
			Private i%
			For i% = 1 to pnMenuMax%
				If i% = nMenu% Then
					color& = .grColor.Black		' 文字色:黒色
					bkcolor& = pColorBack&		' 背景色:指定色
				Else
					color& = .grColor.Black		' 文字色:黒色
					bkcolor& = .grColor.White	' 背景色:白色
				Endif
				Call GsSetTextColor(color&, bkcolor&)
				Call GsPrintFull(MID$(STR$(i%), 2) + ":" + parrMenu$(i%))
			Next
			strBuf$ = GfGetKey$ 'キーを1文字取得
			IF "1" <= strBuf$ And strBuf$ <= strMenuMax$ THEN
				'メニューの番号文字の場合
				nMenu% = VAL(strBuf$)
			ELSE
				'メニューの番号文字以外の場合
				SELECT strBuf$
					CASE CHR$(13)
						'[ENT]キー文字の場合
						strMenu$ = MID$(STR$(nMenu%), 2)
					CASE "E"
						'[↑]キーの場合
						If nMenu% > 1 Then
							nMenu% = nMenu% - 1
						Else
							'先頭の場合、最下行へ移動
							nMenu% = pnMenuMax%
						Endif
					CASE "M"
						'SHIFT+[↑]キーの場合
						If nMenu% > 1 Then
							nMenu% = nMenu% - 1
						Else
							'先頭の場合、最下行へ移動
							nMenu% = pnMenuMax%
						Endif
					CASE "F"
						'[↓]キーの場合
						If nMenu% < pnMenuMax% Then
							nMenu% = nMenu% + 1
						Else
							'最下行の場合、先頭へ移動
							nMenu% = 1
						Endif
					CASE "N"
						'SHIFT+[↓]キーの場合
						If nMenu% < pnMenuMax% Then
							nMenu% = nMenu% + 1
						Else
							'最下行の場合、先頭へ移動
							nMenu% = 1
						Endif
				END SELECT
			ENDIF
		WEND
		'メニュー番号を返す
		MfGetMenu$ = strMenu$
MfGetMenu.Return	'関数戻り
		On Error Goto 0
		Exit Function
'-----
'エラー処理
'-----
MfGetMenu.ErrProc
		Resume MfGetMenu.Return
	End Function

尚、この関数を実行する例のメインのソースは以下になります。
	SCREEN 1				'漢字モード
	LOCATE , , 2			'カーソルをブロック表示
	'メニュー
	Const MENU.CNT% = 9
	PRIVATE strArrTxMenu$(MENU.CNT%), strRet$, intLoop%, intMenu%
	strArrTxMenu$(1) = "メニュー1    "
	strArrTxMenu$(2) = "メニュー2    "
	strArrTxMenu$(3) = "メニュー3    "
	strArrTxMenu$(4) = "メニュー4    "
	strArrTxMenu$(5) = "メニュー5    "
	strArrTxMenu$(6) = "メニュー6    "
	strArrTxMenu$(7) = "メニュー7    "
	strArrTxMenu$(8) = "メニュー8    "
	strArrTxMenu$(9) = "終了       "
	intMenu% = 1	'最初の選択メニュー番号
	intLoop% = GcTrue%
	WHILE intLoop%
		strRet$ = MfGetMenu$(1, .grColor.Yellow, strArrTxMenu$, MENU.CNT%, intMenu%)
		If strRet$ = "9" Then
			intLoop% = GcFalse%
		Else
			LOCATE 1, 21
			PRINT "SEL=" + strRet$;
			intMenu% = VAL(strRet$)	'前回の選択番号
		Endif
	WEND
	END



=====
2016/04/02:の時の情報











PR

コメント

コメントを書く