忍者ブログ

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

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

BHT-BASIC4.0:数値用キー入力関数(ユーザ定義関数)について(BHT-1300)
前回はBHT-BASICのキー入力の INPUT 命令はいまいち使いにくいのを記事にしましたが、 それを補うために汎用的な数値用キー入力関数を作ってみました。

以下のソースがその関数なのですが 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

コメント

コメントを書く