前回はBHT-BASICのキー入力の INPUT 命令はいまいち使いにくいのを記事にしましたが、 それを補うために汎用的な数値用キー入力関数を作ってみました。
以下のソースがその関数なのですが GfGetNum% の名前で、 引数は入力文字列を返す変数と、入力桁数を指定する変数があります。 この関数の戻り値としては[ENT]キー、[F1]キーのどちらで戻ったかを示す整数値フラグです。
実際のプログラムの実行はラベル Main の次からです。 プログラムの中で使用されるユーザ定義関数は、 使用される位置よりも前に宣言されていなければなりません。 そのため、実行開始がユーザ定義関数より下の方に位置しています。
この件ですが、一般的なコンパイラであれば、同じソース内のローカルなユーザ定義関数の 宣言を上の方で出来る様にして、ユーザ定義関数よりも前に実行している行が在っても 良いようにしてほしいものです。 共通関数的なユーザ定義関数は常にソースの最初の方に持ってこないといけないので ソースの位置制限があるのは問題だと思います。 (もっとも、共通関数は別ファイルにして関数定義のみを宣言させる方法もありますが)
このソースの実行の様子は以下の様になります。
この関数ですが、[F1]キー戻りはありますが、F2,F3,F4での戻りも必要かとは思いますので、 この関数を利用される場合は、それらの拡張をしてみてください。
=====
2016/04/02:の時の情報
以下のソースがその関数なのですが GfGetNum% の名前で、 引数は入力文字列を返す変数と、入力桁数を指定する変数があります。 この関数の戻り値としては[ENT]キー、[F1]キーのどちらで戻ったかを示す整数値フラグです。
実際のプログラムの実行はラベル Main の次からです。 プログラムの中で使用されるユーザ定義関数は、 使用される位置よりも前に宣言されていなければなりません。 そのため、実行開始がユーザ定義関数より下の方に位置しています。
この件ですが、一般的なコンパイラであれば、同じソース内のローカルなユーザ定義関数の 宣言を上の方で出来る様にして、ユーザ定義関数よりも前に実行している行が在っても 良いようにしてほしいものです。 共通関数的なユーザ定義関数は常にソースの最初の方に持ってこないといけないので ソースの位置制限があるのは問題だと思います。 (もっとも、共通関数は別ファイルにして関数定義のみを宣言させる方法もありますが)
'File [MODULE1.SRC]
'---------------------------------------
'定数宣言:共通⇒(これは別ファイルにすべき)
'---------------------------------------
Global GcTrue% : GcTrue% = -1
Global GcFalse% : GcFalse% = 0
Global GcGetRetNormal% : GcGetRetNormal% = 0 '[ENT]キーでの終了
Global GcGetRetF1% : GcGetRetF1% = 1 '[F1]キーでの終了
'---------------------------------------
'1文字キー入力関数
'---------------------------------------
'Function GfGetKey$
'戻り値:
' GfGetKey$ :1文字を文字列で返す
'---------------------------------------
Function GfGetKey$
Wait 0, &h01 'キー入力待ち
GfGetKey$ =Input$(1) '入力されたキーを取得して戻す。
End Function
'---------------------------------------
'数値入力
'---------------------------------------
'Function GfGetNum%(Byref pstrNum$, Byval intUnit%)
'引 数:
' pstrNum$ :数値文字列(新規入力の場合は、空白文字列を指定)
' intUnit% :入力桁数を指定
'戻り値:
' GfGetNum% :どのキーで終了したかを示す以下のフラグを返す
' : GcGetRetNormal% = 0 '[ENT]キーでの終了
' : GcGetRetF1% = 1 '[F1]キーでの終了
'---------------------------------------
Function GfGetNum%(Byref pstrNum$, Byval intUnit%)
'エラー処理宣言
On Error Goto GfGetNum.ErrProc
Private intX%, intY%, intLoop%, strInp$, intRet%, strBuf$, strSpace$
'空白文字列・指定桁数
strSpace$ = LEFT$(" ", intUnit%)
'カーソル位置退避
intY% = CSRLIN
intX% = POS(0)
'結果格納領域の初期化
strInp$ = pstrNum$
'数字入力方式に設定
OUT .pnKeyEnt, .pvKyNm
intLoop% = GcTrue%
While intLoop% = GcTrue%
'数値表示
Cursor OFF
Locate intX%, intY%
Print strSpace$;
Locate intX%, intY%
Print strInp$;
Cursor ON
strBuf$ = GfGetKey$ 'キーを1文字取得
IF "0" <= strBuf$ And strBuf$ <= "9" THEN
'数字の場合
If strBuf$ = "0" Then
If 0 < LEN(strInp$) AND LEN(strInp$) < intUnit% Then
strInp$ =strInp$ + strBuf$
Endif
Else
If LEN(strInp$) < intUnit% Then
strInp$ =strInp$ + strBuf$
Endif
Endif
ELSE
'数字以外の場合
SELECT strBuf$
CASE CHR$(13)
'[ENT]キー文字の場合
If strInp$ <> "" Then
pstrNum$ = strInp$
intLoop% = GcFalse%
intRet% = GcGetRetNormal%
Endif
CASE CHR$(8)
'[BS]キーの場合
If LEN(strInp$) > 0 Then
strInp$ = LEFT$(strInp$, LEN(strInp$) - 1)
Else
Endif
CASE CHR$(24)
'[クリア]キーの場合
strInp$ = ""
CASE "A"
'[F1]キー文字の場合
intLoop% = GcFalse%
intRet% = GcGetRetF1%
END SELECT
ENDIF
WEnd
'戻り値
GfGetNum% = intRet%
GfGetNum.Return '関数戻り
On Error Goto 0
Exit Function
'-----
'エラー処理
'-----
GfGetNum.ErrProc
GfGetNum% = GcGetRetNormal%
pstrNum$ = "0"
Resume GfGetNum.Return
End Function
'-----
'実行はここから処理
'-----
Main
PRIVATE Num$, nRet%, intLoop%
SCREEN 1 '漢字モード
LOCATE , , 2 'カーソルをブロック表示
intLoop% = GcTrue% 'ループ実行フラグON
WHILE (intLoop%)
LOCATE 1, 1
PRINT "数量=";
nRet% = GfGetNum%(CNT$, 5) '数字文字列入力
If nRet% = GcGetRetF1% Then '[F1]キー戻り??
intLoop% = GcFalse% 'ループ実行フラグOFF
ENDIF
LOCATE 1, 3
PRINT "入力=" + CNT$;
WEND
WAIT 0, &h01 'キー入力待ち
END
このソースの実行の様子は以下の様になります。
この関数ですが、[F1]キー戻りはありますが、F2,F3,F4での戻りも必要かとは思いますので、 この関数を利用される場合は、それらの拡張をしてみてください。
=====
2016/04/02:の時の情報
PR
コメント