簡単なメニュー表示・選択を行うユーザ関数を作ってみました。
この関数はメニュー表示データを文字列の配列で渡して、 ハンディの「△」「▽」キーで選択行を移動させて、 「ENT」キーの押下でメニュー選択を行います。
実際の表示は以下の様な感じです。
各数字キーを押下することで、メニューの選択が直接その行に移動します。 但し、この関数なのですが問題が在りまして、 各数字キーで直接移動するのはいいのですが、 1~9までにしか対応していません。 そのため、9個までのメニューは良いのですが、それ以上のメニューの場合は問題が在ります。
この辺りは、参考にされた場合は改造等をして下さい。
では以下にこの関数のソースを示します。
尚、この関数を実行する例のメインのソースは以下になります。
=====
2016/04/02:の時の情報
この関数はメニュー表示データを文字列の配列で渡して、 ハンディの「△」「▽」キーで選択行を移動させて、 「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
コメント