自力プログレスバー

たとえばDBの内容をテキストファイルに書き出す、または読み込む場合など、時間がかかる処理にはプログレスバーを表示したくなる。

4Dにはプログレスバーが用意されているが、フォームを自由に編集したい、と思って、自力で作って使っている。歴代のバージョンでうまく動いているので紹介する。v15, v17, v18, v19で使える。

次の6つのメソッドとフォームで構成されている。

JCL_pgs_DefInit
JCL_pgs_Show
JCL_pgs_SetValue
JCL_pgs_IsCancel
JCL_pgs_Cancel
JCL_pgs_Open

使い方は次の通り。

//BM01_btnImport
//20220418 hisa wat
//ボムデータ読み込み、フォルダ選択

C_LONGINT($dlgOk)
C_TEXT($folderPath; $filePath)
C_TEXT($fileText)
ARRAY TEXT($aryFileNames; 0)
C_LONGINT($i; $sizeOfAry)
C_LONGINT($koCnt; $shCnt; $blCnt)
C_BOOLEAN($isValid)
C_TEXT($path)

//アラートで確認
C_TEXT($title; $msg; $okStr; $cancelStr)
$title:="BOMデータ読み込み"
$msg:="BOMデータ読み込み"
$folderPath:=Select folder($msg)
If (OK=1)
	//プログレスバー
	C_BOOLEAN($done)
	JCL_pgs_DefInit
	JCL_pgs_Show("BOMデータを読み込んでいます...")
	
	//フォルダ選択された
	DOCUMENT LIST($folderPath; $aryFileNames; Ignore invisible+Recursive parsing)
	$sizeOfAry:=Size of array($aryFileNames)
	For ($i; 1; $sizeOfAry)
		If (Mod($i; 1000)=0)
			JCL_pgs_SetValue(($i/$sizeOfAry)*100; String($i)+":"+$aryFileNames{$i}; $i; $sizeOfAry)
			DELAY PROCESS(Current process; 1)
		End if 
		
		//ファイルを読み込んで、内容をエンコード
		$fileName:=$aryFileNames{$i}
		$filePath:=JCL_file_MakeFilePath($folderPath; $fileName)
		$fileText:=Document to text($filePath; 1258)
		
		//フォルダパスからフォルダ名を取得
		BM_SaveOne($fileText; $fileName)
		
		$done:=JCL_pgs_IsCancel
		If ($done=True)
			//キャンセルされたらループから抜ける
			$i:=$sizeOfAry+1
		End if 
	End for 
	JCL_pgs_Cancel
	
	//一覧 表示
	BM01_lstBM_Make
	
	BM01_SetControlsValues
	
End if 

JCL_pgsはJCL4Dに同梱されている。JCL_Dlgコンポーネントで提供。

追伸:今回、v2004に移植したら動いた。面倒なのでComponents化はしないで、プロジェクトにメソッドをコピペして、フォームをダミーテーブルに作った。そう、4D v2004にはプロジェクトフォームがなかった。フォームは必ずテーブルに帰属させなくてはならないため、値を格納しないテーブルをUI用に用意しておき、そこにフォームを作るのだった。それ以外はv19と同じコードで動いた。