忍者ブログ

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

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

BHT-BASIC4.0:データファイルの削除等について(KILL、CLFILEのラッパ関数)
データファイルのファイル削除やレコード削除を行う場合、 その都度 KILL命令  CLFILE命令 を実行するよりも ラッパ関数を作って、それをコールする方がソース的にすっきりすると思います。

■KILL命令のラッパ関数について
KILL命令の定義は以下の様です。
KILL <ファイル名> 

 <ファイル名>:"[ドライブ名:]ファイル名[<S>]"の書式の文字列式
     ("ファイル名"は"ファイル名称"+"."+"拡張子")
KILL命令のラッパ関数は以下の様になります。
'---------------------------------------
'ファイル削除(KILL命令のラップ)
'---------------------------------------
'Function GfKill%(Byval pstrFileName$)
'引 数:
'	pstrFileName$ :ファイル名
'---------------------------------------
	Function GfKill%(Byval pstrFileName$)
		'エラー処理宣言
		On Error Goto GfKill.ErrProc
		'戻り値の初期化
		GfKill% = GcFalse%
		'指定ファイル名の削除
		KILL pstrFileName$
		GfKill% = GcTrue%
GfKill.Return	'関数戻り
		On Error Goto 0
		Exit Function
'-----
'エラー処理
'-----
GfKill.ErrProc
		Resume GfKill.Return
	End Function
エラー処理は何もしていませんが、ここでエラー内容などを表示するといいと思います。


■CLFILE命令のラッパ関数について
データファイルに書き込む関数を以下の様に定義します。
CLFILE命令の定義は以下の様です。
CLFILE [#]<ファイル番号>

 <ファイル番号>:1~16の値を返す数値式
      (OPEN命令で指定したファイル番号を指定)
CLFILE命令のラッパ関数は以下の様になります。
'---------------------------------------
'ファイルレコード削除(CLFILE命令のラップ)
'---------------------------------------
'Function GfClFile%()
'---------------------------------------
	Function GfClFile%
		'エラー処理宣言
		On Error Goto GfClFile.ErrProc
		'フィールドサイズ
'		Const COL.CD% = 10	'上の関数[MfPutData%]で定義済み
'		Const COL.NUM% = 26
		'戻り値の初期化
		GfClFile% = GcFalse%
		PRIVATE FILENO%, REC.CD$, REC.NUM$
		'TEST.DATファイルを、ファイル番号#1としてオープンします
		FILENO% = 1
		OPEN GcTEST.DAT$ AS FILENO% RECORD 2147483647
		FIELD #FILENO%, COL.CD% AS REC.CD$, COL.NUM% AS REC.NUM$
		'レコード削除
		CLFILE #FILENO%
		GfClFile% = GcTrue%
GfClFile.Return	'関数戻り
		If FILENO% > 0 Then
			Close FILENO%
		Endif
		On Error Goto 0
		Exit Function
'-----
'エラー処理
'-----
GfClFile.ErrProc
		Resume GfClFile.Return
	End Function

この関数は、"TEST.DAT"ファイルのレコード削除しかできない関数をラップしたものです。
FIELD命令はフィールド変数を固定でしか宣言できないのでこの様な感じになりました。 この部分を汎用性を持たせるのは少し大変なので、固定でもいいかなと思います。 方法が無いことは無いのですが、やはりFIELD命令がネックになります。

以下の関数は無理やり汎用性を持たせたCLFILE命令のラッパ関数です。
'---------------------------------------
'ファイルレコード削除(CLFILE命令のラップ)
'---------------------------------------
'Function GfClFile2%(Byval pstrFileName$)
'引 数:
'	pstrFileName$ :ファイル名
'---------------------------------------
	Function GfClFile2%(Byval pstrFile$)
		'エラー処理宣言
		On Error Goto GfClFile2.ErrProc
		'戻り値の初期化
		GfClFile2% = GcFalse%
		'ファイル情報提供関数(FILE.FN3)の利用
		PRIVATE INF$, FieldNum%, I%, FSZ%(16)
		'40 文字分の領域を確保
		INF$ = "                                        "
		CALL "FILE.FN3" .fcInfGetF pstrFile$,INF$
		FieldNum% = ASC(MID$(INF$, 22, 1)) ' フィールド数の獲得
		FOR I% = 1 TO 16	'各フィールド幅の取得
			FSZ%(I%) = ASC(MID$(INF$, 22 + I%, 1))
		NEXT
		
		PRIVATE FILENO%, W$
		'指定ファイルを、ファイル番号#1としてオープンします
		FILENO% = 1
		OPEN pstrFile$ AS FILENO% RECORD 2147483647
		'フィールド定義をフィールド数毎に分けて処理
		SELECT FieldNum%
			CASE 1
				FIELD #FILENO%, FSZ%(1) AS W$
			CASE 2
				FIELD #FILENO%, FSZ%(1) AS W$, FSZ%(2) AS W$
			CASE 3
				FIELD #FILENO%, FSZ%(1) AS W$, FSZ%(2) AS W$, FSZ%(3) AS W$
			CASE 4
				FIELD #FILENO%, FSZ%(1) AS W$, FSZ%(2) AS W$, FSZ%(3) AS W$, FSZ%(4) AS W$
			CASE 5
				FIELD #FILENO%, FSZ%(1) AS W$, FSZ%(2) AS W$, FSZ%(3) AS W$, 
FSZ%(4) AS W$, FSZ%(5) AS W$
			CASE 6
				FIELD #FILENO%, FSZ%(1) AS W$, FSZ%(2) AS W$, FSZ%(3) AS W$, 
FSZ%(4) AS W$, FSZ%(5) AS W$, FSZ%(6) AS W$
			'....(この後必要な分作成???)
		END SELECT
		'レコード削除
		CLFILE #FILENO%
		GfClFile2% = GcTrue%
GfClFile2.Return	'関数戻り
		If FILENO% > 0 Then
			Close FILENO%
		Endif
		On Error Goto 0
		Exit Function
'-----
'エラー処理
'-----
GfClFile2.ErrProc
		Resume GfClFile2.Return
	End Function

ファイルのフィールド数、各フィールド幅の取得を行う為に、 拡張関数の "FILE.FN3" を使用しています。
CALL "FILE.FN3" .fcInfGetF FILENAME$, INF$

 FILENAME$:ファイル名

 INF$:ファイル情報が返される(40 文字、または、ヌル文字)
    (必ず40 バイト以上の領域を確保しておく)

INF$の内容は以下の通りです。
位置文字数データ内容
1 12 ファイル名 文字列
13 2 (システムリザーブ) -
15 2 最大レコード数 1~32767
17 2 レコード数 1~32767
19 2 1クラスタあたりのレコード数 0
21 1 レコード長 1~255
22 1 フィールド数 1~16
23 16 各フィールドのフィールド幅 1~254
39 2 (システムリザーブ) -



=====
2016/04/02:の時の情報











PR

コメント

コメントを書く