BHT-BASIC4.0:数値用キー入力関数(ユーザ定義関数)について(BHT-1300)

前回はBHT-BASICのキー入力の INPUT 命令はいまいち使いにくいのを記事にしましたが、 それを補うために汎用的な数値用キー入力関数を作ってみました。

以下のソースがその関数なのですが GfGetNum% の名前で、 引数は入力文字列を返す変数と、入力桁数を指定する変数があります。 この関数の戻り値としては[ENT]キー、[F1]キーのどちらで戻ったかを示す整数値フラグです。

実際のプログラムの実行はラベル Main の次からです。 プログラムの中で使用されるユーザ定義関数は、 使用される位置よりも前に宣言されていなければなりません。 そのため、実行開始がユーザ定義関数より下の方に位置しています。

この件ですが、一般的なコンパイラであれば、同じソース内のローカルなユーザ定義関数の宣言を上の方で出来る様にして、 ユーザ定義関数よりも前に実行している行が在っても良いようにしてほしいものです。 共通関数的なユーザ定義関数は常にソースの最初の方に持ってこないといけないのでソースの位置制限があるのは問題だと思います。 (もっとも、共通関数は別ファイルにして関数定義のみを宣言させる方法もありますが)
  1. 'File   [MODULE1.SRC]  
  2. '---------------------------------------  
  3. '定数宣言:共通⇒(これは別ファイルにすべき)  
  4. '---------------------------------------  
  5.     Global GcTrue% : GcTrue% = -1  
  6.     Global GcFalse% : GcFalse% = 0  
  7.     Global GcGetRetNormal% : GcGetRetNormal% = 0  '[ENT]キーでの終了  
  8.     Global GcGetRetF1%     : GcGetRetF1% = 1      '[F1]キーでの終了  
  9.   
  10. '---------------------------------------  
  11. '1文字キー入力関数  
  12. '---------------------------------------  
  13. 'Function GfGetKey$  
  14. '戻り値:  
  15. '   GfGetKey$   :1文字を文字列で返す  
  16. '---------------------------------------  
  17.     Function GfGetKey$  
  18.         Wait 0, &h01 'キー入力待ち  
  19.         GfGetKey$ =Input$(1) '入力されたキーを取得して戻す。  
  20.     End Function  
  21.   
  22. '---------------------------------------  
  23. '数値入力  
  24. '---------------------------------------  
  25. 'Function GfGetNum%(Byref pstrNum$, Byval intUnit%)  
  26. '引 数:  
  27. '   pstrNum$    :数値文字列(新規入力の場合は、空白文字列を指定)  
  28. '   intUnit%    :入力桁数を指定  
  29. '戻り値:  
  30. '   GfGetNum%   :どのキーで終了したかを示す以下のフラグを返す  
  31. '               :   GcGetRetNormal% = 0  '[ENT]キーでの終了  
  32. '               :   GcGetRetF1% = 1      '[F1]キーでの終了  
  33. '---------------------------------------  
  34.     Function GfGetNum%(Byref pstrNum$, Byval intUnit%)  
  35.         'エラー処理宣言  
  36.         On Error Goto GfGetNum.ErrProc  
  37.   
  38.         Private intX%, intY%, intLoop%, strInp$, intRet%, strBuf$, strSpace$  
  39.         '空白文字列・指定桁数  
  40.         strSpace$ = LEFT$("                    ", intUnit%)  
  41.         'カーソル位置退避  
  42.         intY% = CSRLIN  
  43.         intX% = POS(0)  
  44.         '結果格納領域の初期化  
  45.         strInp$ = pstrNum$  
  46.         '数字入力方式に設定  
  47.         OUT .pnKeyEnt, .pvKyNm  
  48.           
  49.         intLoop% = GcTrue%  
  50.         While intLoop% = GcTrue%  
  51.             '数値表示  
  52.             Cursor OFF  
  53.             Locate intX%, intY%  
  54.             Print strSpace$;  
  55.             Locate intX%, intY%  
  56.             Print strInp$;  
  57.             Cursor ON  
  58.               
  59.             strBuf$ = GfGetKey$ 'キーを1文字取得  
  60.             IF "0" <= strBuf$ And strBuf$ <= "9" THEN  
  61.                 '数字の場合  
  62.                 If strBuf$ = "0" Then  
  63.                     If 0 < LEN(strInp$) AND LEN(strInp$) < intUnit% Then  
  64.                         strInp$ =strInp$ + strBuf$  
  65.                     Endif  
  66.                 Else  
  67.                     If LEN(strInp$) < intUnit% Then  
  68.                         strInp$ =strInp$ + strBuf$  
  69.                     Endif  
  70.                 Endif  
  71.             ELSE  
  72.                 '数字以外の場合  
  73.                 SELECT strBuf$  
  74.                     CASE CHR$(13)  
  75.                         '[ENT]キー文字の場合  
  76.                         If strInp$ <> "" Then  
  77.                             pstrNum$ =  strInp$  
  78.                             intLoop% = GcFalse%  
  79.                             intRet% = GcGetRetNormal%  
  80.                         Endif  
  81.                     CASE CHR$(8)  
  82.                         '[BS]キーの場合  
  83.                         If  LEN(strInp$) > 0 Then  
  84.                             strInp$ = LEFT$(strInp$, LEN(strInp$) - 1)  
  85.                         Else  
  86.                         Endif  
  87.                     CASE CHR$(24)  
  88.                         '[クリア]キーの場合  
  89.                         strInp$ = ""  
  90.                     CASE "A"   
  91.                         '[F1]キー文字の場合  
  92.                         intLoop% = GcFalse%  
  93.                         intRet% = GcGetRetF1%  
  94.                 END SELECT  
  95.             ENDIF  
  96.         WEnd  
  97.         '戻り値  
  98.         GfGetNum% = intRet%  
  99.   
  100. GfGetNum.Return '関数戻り  
  101.         On Error Goto 0  
  102.         Exit Function  
  103. '-----  
  104. 'エラー処理  
  105. '-----  
  106. GfGetNum.ErrProc  
  107.         GfGetNum% = GcGetRetNormal%  
  108.         pstrNum$ = "0"  
  109.         Resume GfGetNum.Return  
  110.     End Function  
  111.   
  112. '-----  
  113. '実行はここから処理  
  114. '-----  
  115. Main  
  116.     PRIVATE Num$, nRet%, intLoop%  
  117.     SCREEN 1                '漢字モード  
  118.     LOCATE , , 2            'カーソルをブロック表示  
  119.     intLoop% = GcTrue%      'ループ実行フラグON  
  120.     WHILE (intLoop%)  
  121.         LOCATE 1, 1  
  122.         PRINT "数量=";  
  123.         nRet% = GfGetNum%(CNT$, 5)  '数字文字列入力  
  124.         If nRet% = GcGetRetF1% Then '[F1]キー戻り??  
  125.             intLoop% = GcFalse%     'ループ実行フラグOFF  
  126.         ENDIF  
  127.         LOCATE 1, 3  
  128.         PRINT "入力=" + CNT$;   
  129.     WEND  
  130.     WAIT 0, &h01            'キー入力待ち  
  131.     END  

このソースの実行の様子は以下の様になります。
81
この関数ですが、[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等)とのデータファイルの送受信について

デル株式会社
コメント(0)