前回はBHT-BASICのキー入力の INPUT 命令はいまいち使いにくいのを記事にしましたが、
それを補うために汎用的な数値用キー入力関数を作ってみました。
以下のソースがその関数なのですが GfGetNum% の名前で、 引数は入力文字列を返す変数と、入力桁数を指定する変数があります。 この関数の戻り値としては[ENT]キー、[F1]キーのどちらで戻ったかを示す整数値フラグです。
実際のプログラムの実行はラベル Main の次からです。 プログラムの中で使用されるユーザ定義関数は、 使用される位置よりも前に宣言されていなければなりません。 そのため、実行開始がユーザ定義関数より下の方に位置しています。
この件ですが、一般的なコンパイラであれば、同じソース内のローカルなユーザ定義関数の宣言を上の方で出来る様にして、 ユーザ定義関数よりも前に実行している行が在っても良いようにしてほしいものです。 共通関数的なユーザ定義関数は常にソースの最初の方に持ってこないといけないのでソースの位置制限があるのは問題だと思います。 (もっとも、共通関数は別ファイルにして関数定義のみを宣言させる方法もありますが)
このソースの実行の様子は以下の様になります。
この関数ですが、[F1]キー戻りはありますが、F2,F3,F4での戻りも必要かとは思いますので、 この関数を利用される場合は、それらの拡張をしてみてください。
転職を本気で考えている方向けのプログラミングスクール!【WebCampPRO】
■関連記事
⇒BHT-BASIC:DENSOのハンディターミナルの開発言語のBHT-BASIC4.0を使ってみた
⇒BHT-BASIC4.0:変数宣言の書き方(BHT-1300)
⇒BHT-BASIC4.0:変数宣言の書き方その2(BHT-1300)
⇒BHT-BASIC4.0:ユーザ定義関数について(BHT-1300)
⇒BHT-BASIC4.0:演算子について(BHT-1300)
⇒BHT-BASIC4.0:画面への表示について(BHT-1300)
⇒BHT-BASIC4.0:キー入力について(BHT-1300)
⇒BHT-BASIC4.0:ユーザ定義関数の値渡し・参照渡しについて(BHT-1300)
⇒BHT-BASIC4.0:文字列を扱うユーザ定義関数について
⇒BHT-BASIC4.0:文字列を扱うユーザ定義関数についてその2
⇒BHT-BASIC4.0:文字列を扱うユーザ定義関数についてその3
⇒BHT-BASIC4.0:TeraTermを使ってDENSOのハンディターミナルにファイル(プログラム)転送を行う方法
⇒BHT-BASIC4.0:I/OポートとWAIT、さらにTIMERについて(BHT-1300)
⇒BHT-BASIC4.0:データファイルの取り扱いについて(BHT-1300)
⇒BHT-BASIC4.0:データファイルの取り扱いについてその2(書込み・読込みの実用的な関数)
⇒BHT-BASIC4.0:データファイルの検索について(SEARCH関数)
⇒BHT-BASIC4.0:ユーザ関数の引数の仮変数に対する代入の注意点
⇒BHT-BASIC4.0:データファイルの削除等について(KILL、CLFILEのラッパ関数)
⇒BHT-BASIC4.0:ファイルの存在確認関数を作ってみました
⇒BHT-BASIC4.0:拡張関数のバイナリサーチ処理関数(BSEARCH.FN3)の使い方
⇒BHT-BASIC4.0:拡張関数のサーチ処理関数(SEARCH.FN3)の使い方
⇒BHT-BASIC4.0:簡単なメニュー表示・選択を行うユーザ関数について
⇒BHT-BASIC4.0:ファイル伝送におけるXFILE命令の使い方
⇒BHT-BASIC4.0:バーコードの読込み(バーコードスキャン)について
⇒BHT-BASIC4.0:Bluetoothデバイスアドレス取得等について
⇒VB.NET:ハンディターミナル(BHT-1300等)とのデータファイルの送受信について
以下のソースがその関数なのですが 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での戻りも必要かとは思いますので、 この関数を利用される場合は、それらの拡張をしてみてください。
転職を本気で考えている方向けのプログラミングスクール!【WebCampPRO】
■関連記事
⇒BHT-BASIC:DENSOのハンディターミナルの開発言語のBHT-BASIC4.0を使ってみた
⇒BHT-BASIC4.0:変数宣言の書き方(BHT-1300)
⇒BHT-BASIC4.0:変数宣言の書き方その2(BHT-1300)
⇒BHT-BASIC4.0:ユーザ定義関数について(BHT-1300)
⇒BHT-BASIC4.0:演算子について(BHT-1300)
⇒BHT-BASIC4.0:画面への表示について(BHT-1300)
⇒BHT-BASIC4.0:キー入力について(BHT-1300)
⇒BHT-BASIC4.0:ユーザ定義関数の値渡し・参照渡しについて(BHT-1300)
⇒BHT-BASIC4.0:文字列を扱うユーザ定義関数について
⇒BHT-BASIC4.0:文字列を扱うユーザ定義関数についてその2
⇒BHT-BASIC4.0:文字列を扱うユーザ定義関数についてその3
⇒BHT-BASIC4.0:TeraTermを使ってDENSOのハンディターミナルにファイル(プログラム)転送を行う方法
⇒BHT-BASIC4.0:I/OポートとWAIT、さらにTIMERについて(BHT-1300)
⇒BHT-BASIC4.0:データファイルの取り扱いについて(BHT-1300)
⇒BHT-BASIC4.0:データファイルの取り扱いについてその2(書込み・読込みの実用的な関数)
⇒BHT-BASIC4.0:データファイルの検索について(SEARCH関数)
⇒BHT-BASIC4.0:ユーザ関数の引数の仮変数に対する代入の注意点
⇒BHT-BASIC4.0:データファイルの削除等について(KILL、CLFILEのラッパ関数)
⇒BHT-BASIC4.0:ファイルの存在確認関数を作ってみました
⇒BHT-BASIC4.0:拡張関数のバイナリサーチ処理関数(BSEARCH.FN3)の使い方
⇒BHT-BASIC4.0:拡張関数のサーチ処理関数(SEARCH.FN3)の使い方
⇒BHT-BASIC4.0:簡単なメニュー表示・選択を行うユーザ関数について
⇒BHT-BASIC4.0:ファイル伝送におけるXFILE命令の使い方
⇒BHT-BASIC4.0:バーコードの読込み(バーコードスキャン)について
⇒BHT-BASIC4.0:Bluetoothデバイスアドレス取得等について
⇒VB.NET:ハンディターミナル(BHT-1300等)とのデータファイルの送受信について