配列方リストボックスの一覧をテキストファイルに書き出す。プログレスバーを表示するため、別途JCL_DLG.4dbaseコンポーネントが必要。
使い方
$success:=JCL_lst_Export_pgs3 (->vSH04_lstSH;->$name;1)
引数
$1: リストボックスのポインタ
$2: 出力ファイルのプリフィックス(接頭辞)。実際のファイル名はプリフィックスに+デイトマーク(YYYYMMDDHHMMSSMMMの17桁)JCL_str_Datemarkを参照。
$3: インターバルカウント。プログレスバーを表示するタイミングをインターバルに1回だけにする。たとえば「100」を与えると100回に1度だけプログレスバーの経過が再表示される。これを1回ごとに再表示しているとプログレスバーの表示に処理時間が取られてしまって全体の処理時間が遅くなってしまう。
//JCL_lst_Export_pgs3
//20220223 wat
// 汎用のリストボックス 書き出し //JCL_lst_Exportの集大成版のJCL_lst_Export_pgs2
//JCL_lst_Export_pgs2は勝手にデスクトップにファイルを作成するためセキュリティに引っかかることがある
//ファイル保存ダイアログを表示するタイプを新たに実装
//コンテンツ内の改行をストリップ 戻り値にファイル名を返す 改行はCRLF、
//プログレスバー表示、失敗したりキャンセルされたら戻り値は0、成功したら1、ファイル名はポインタで返す
C_POINTER($1;$lstbxPtr)
$lstbxPtr:=$1
C_POINTER($2;$namePtr)
$namePtr:=$2
C_LONGINT($3;$pgs_interval)
$pgs_interval:=$3
C_LONGINT($0;$success) //20200328 wat
$success:=0
C_TEXT($buf;$str)
C_TEXT($tabChar;$crlf;$cr;$lf)
$buf:=" " // 20140923 「ID」という文字がファイルの先頭にあるとエクセルがSYLKファイルと勘違いするため先頭に空白を出力
$tabChar:=Char(Tab)
$crlf:=Char(Carriage return)+Char(Line feed)
$cr:=Char(Carriage return)
$lf:=Char(Line feed)
C_TEXT($folderPath;$filePath)
C_LONGINT($numOfCols;$numOfRows;$col;$row)
C_BOOLEAN($done)
$done:=False
C_TEXT($msg)
C_TIME($time)
$namePtr->:=$namePtr->+JCL_str_Datemark (Current date;Current time)+".txt"
$dlg_ok:=JCL_dlg_InputOne ("出力先のファイル名:";"フィル名を入力してください。";"OK";"Cancel";$namePtr)
If ($dlg_ok=1)
$success:=1
//ファイルに書き出す
$folderPath:=Select folder("")
$filePath:=JCL_file_MakeFilePath ($folderPath;$namePtr->)
$time:=Create document($filePath)
//プログレスバー
JCL_pgs_DefInit
$msg:="「"+$namePtr->+"」に書き出しています..."
JCL_pgs_Show ($msg)
// 列数を求める
$numOfCols:=LISTBOX Get number of columns($lstbxPtr->)
$numOfRows:=LISTBOX Get number of rows($lstbxPtr->)
ARRAY TEXT($aryColNames;0)
ARRAY TEXT($aryHeaderNames;0)
ARRAY POINTER($aryColVars;0)
ARRAY POINTER($aryHeaderVers;0)
ARRAY BOOLEAN($aryColsVisible;0)
ARRAY POINTER($aryStyles;0)
LISTBOX GET ARRAYS($lstbxPtr->;$aryColNames;$aryHeaderNames;$aryColVars;$aryHeaderVers;$aryColsVisible;$aryStyles)
$msg:="タイトル行を書き出しています..."
JCL_pgs_SetValue (1;$msg;1;1)
// ヘッダを出力
For ($col;1;$numOfCols)
If ($col<$numOfCols)
$str:=OBJECT Get title(*;$aryHeaderNames{$col})
$buf:=$buf+$str+$tabChar
Else
$str:=OBJECT Get title(*;$aryHeaderNames{$col})
$buf:=$buf+$str+$tabChar+$crlf
End if
End for
SEND PACKET($time;$buf) //逐次ファイルに書き出して、バッファクリア、サイズを一定に保つことで高速化
$buf:=""
// ボディを出力
For ($row;1;$numOfRows)
//プログレスバー
If (Mod($row;$pgs_interval)=0)
$msg:="行を書き出しています..."
JCL_pgs_SetValue (($row/$numOfRows)*100;$msg+String($row);$row;$numOfRows)
DELAY PROCESS(Current process;1)
End if
For ($col;1;$numOfCols)
//途中はタブ区切り、最後の列のあとに改行
If ($col<$numOfCols)
$str:=String($aryColVars{$col}->{$row}) // データ型によってはエラーになる可能性がある、pictとか?
//改行をストリップ
$str:=Replace string($str;$crlf;" ")
$str:=Replace string($str;$cr;" ")
$str:=Replace string($str;$lf;" ")
$buf:=$buf+$str+$tabChar
Else
$str:=String($aryColVars{$col}->{$row}) // データ型によってはエラーになる可能性がある
$buf:=$buf+$str+$crlf
End if
End for
SEND PACKET($time;$buf) //逐次ファイルに書き出して、バッファクリア、サイズを一定に保つことで高速化
$buf:=""
$done:=JCL_pgs_IsCancel
If ($done=True)
$row:=$numOfRows
$success:=0
End if
End for
JCL_pgs_Cancel
//ファイルを閉じる
CLOSE DOCUMENT($time)
If (OK#1)
$success:=0
Else
C_TEXT($title;$msg;$okStr)
$title:="書き出し完了"
$msg:=$folderPath+"に「"+$namePtr->+"」をご覧ください。"
$okStr:="OK"
JCL_dlg_Inform_ShowOnDisk ($title;$msg;$okStr;$filePath)
End if
End if
$0:=$success
説明
書き出すファイル名のプリフィックスをもらって、中でデイトマークと連結してファイル名を作成。ファイルの保存場所をフォルダー選択ダイアログを表示してユーザに決めてもらう。プログレスバーを表示しながらリストボックスの内容をテキストファイルに書き出す。