たとえば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と同じコードで動いた。