リストボックスの列に色を付けるときの注意

配列型リストボックスで、色の列を用意。LISTBOX SET ROW COLORで色を付ける。最初に書いたメソッドはこれ。

C_TEXT($table_name)
ARRAY TEXT($aryTblNames; 0)
C_LONGINT($sizeOfAry; $i)
C_LONGINT($color)

//すべてのテーブル
JCL_tbl_Names_fromStructure(->$aryTblNames)
COPY ARRAY($aryTblNames; vD01_lstTB_NAME)

$sizeOfAry:=Size of array(vD01_lstTB_NAME)
ARRAY LONGINT(vD01_lstTB_Nr; $sizeOfAry)
ARRAY LONGINT(vD01_lstTB_COLOR; $sizeOfAry)
For ($i; 1; $sizeOfAry)
	//配列を追加
	vD01_lstTB_Nr{$i}:=$i
	$table_name:=vD01_lstTB_NAME{$i}

	//生成したテーブルフォームの色を取得、タイトルのバックにあるレクトから
	$color:=JCL_tbl_GetFormColor($table_name)

	//リストボックスに適用
	If ($color#0)
		//ゼロは白なのでスキップ、実行すると黒になるため
		LISTBOX SET ROW COLOR(*; "vD01_lstTB_COLOR"; $i; $color; lk background color)
	End if 

	vD01_lstTB_COLOR{$i}:=$color
End for 

結果は次のようになる。

これを応用して次のメソッドを記述したらNG。

//テーブル一覧 リストボックス

C_POINTER($tblPtr)
C_TEXT($table_name;$label;$tbl_prefix)
C_LONGINT($numOfRecs)
C_LONGINT($numOfTables; $i)
C_LONGINT($color)

//配列初期化
DELETE FROM ARRAY(vA01_lstT; 1; Size of array(vA01_lstT))
DELETE FROM ARRAY(vA01_lstT_nr; 1; Size of array(vA01_lstT_nr))
DELETE FROM ARRAY(vA01_lstT_name; 1; Size of array(vA01_lstT_name))
DELETE FROM ARRAY(vA01_lstT_label; 1; Size of array(vA01_lstT_label))
DELETE FROM ARRAY(vA01_lstT_prefix; 1; Size of array(vA01_lstT_prefix))
DELETE FROM ARRAY(vA01_lstT_numOfRecs; 1; Size of array(vA01_lstT_numOfRecs))
DELETE FROM ARRAY(vA01_lstT_Color; 1; Size of array(vA01_lstT_Color))

$numOfTables:=Get last table number
For ($i; 1; $numOfTables)
	If (Is table number valid($i)=True)
		APPEND TO ARRAY(vA01_lstT_nr; $i)  //番号
		
		$table_name:=Table name($i)
		APPEND TO ARRAY(vA01_lstT_name; $table_name)  //テーブル名
		
		$label:=JCL_fields_cache_TableLabel($table_name)
		APPEND TO ARRAY(vA01_lstT_label; $label)  //テーブルラベル
		
		$tbl_prefix:=JCL_tbl_GetPrefix_fromStructure($table_name)
		APPEND TO ARRAY(vA01_lstT_prefix; $tbl_prefix)  //プレフィックス
		
		$tblPtr:=Table($i)
		ALL RECORDS($tblPtr->)
		$numOfRecs:=Records in selection($tblPtr->)
		APPEND TO ARRAY(vA01_lstT_numOfRecs; $numOfRecs)  //レコード数
		
		$color:=JCL_tbl_GetFormColor($table_name)
		APPEND TO ARRAY(vA01_lstT_Color; $color)  //色
		//リストボックスに適用
		If ($color#0)
			//ゼロは白なのでスキップ、実行すると黒になるため
			LISTBOX SET ROW COLOR(*; "vA01_lstT_Color"; $i; $color; lk background color)
		End if 
	End if 
End for 

成功している方は配列要素を最初に確保している。NGの方はループの中で要素をAPPENDしている。配列要素がまだできていないのに色をセットしようとしたかもしれない。もう一つ心配なのは、validでないテーブルが存在した場合だ。次のコードで成功。

//テーブル一覧 リストボックス

C_POINTER($tblPtr)
C_TEXT($table_name;$label;$tbl_prefix)
C_LONGINT($numOfRecs)
C_LONGINT($numOfTables; $i; $sizeOfAry)
C_LONGINT($color)

//配列初期化
DELETE FROM ARRAY(vA01_lstT; 1; Size of array(vA01_lstT))
DELETE FROM ARRAY(vA01_lstT_nr; 1; Size of array(vA01_lstT_nr))
DELETE FROM ARRAY(vA01_lstT_name; 1; Size of array(vA01_lstT_name))
DELETE FROM ARRAY(vA01_lstT_label; 1; Size of array(vA01_lstT_label))
DELETE FROM ARRAY(vA01_lstT_prefix; 1; Size of array(vA01_lstT_prefix))
DELETE FROM ARRAY(vA01_lstT_numOfRecs; 1; Size of array(vA01_lstT_numOfRecs))
DELETE FROM ARRAY(vA01_lstT_Color; 1; Size of array(vA01_lstT_Color))

$numOfTables:=Get last table number
For ($i; 1; $numOfTables)
	If (Is table number valid($i)=True)
		APPEND TO ARRAY(vA01_lstT_nr; $i)  //番号

		$table_name:=Table name($i)
		APPEND TO ARRAY(vA01_lstT_name; $table_name)  //テーブル名

		$label:=JCL_fields_cache_TableLabel($table_name)
		APPEND TO ARRAY(vA01_lstT_label; $label)  //テーブルラベル

		$tbl_prefix:=JCL_tbl_GetPrefix_fromStructure($table_name)
		APPEND TO ARRAY(vA01_lstT_prefix; $tbl_prefix)  //プレフィックス

		$tblPtr:=Table($i)
		ALL RECORDS($tblPtr->)
		$numOfRecs:=Records in selection($tblPtr->)
		APPEND TO ARRAY(vA01_lstT_numOfRecs; $numOfRecs)  //レコード数

		$color:=JCL_tbl_GetFormColor($table_name)
		APPEND TO ARRAY(vA01_lstT_Color; $color)  //色
	End if 
End for 

$sizeOfAry:=Size of array(vA01_lstT_Color)
For ($i; 1; $sizeOfAry)
	//リストボックスに適用
	$color:=vA01_lstT_Color{$i}
	If ($color#0)
		//ゼロは白なのでスキップ、実行すると黒になるため
		LISTBOX SET ROW COLOR(*; "vA01_lstT_Color"; $i; $color; lk background color)
		LISTBOX SET ROW COLOR(*; "vA01_lstT_prefix"; $i; $color; lk font color)
	End if 
End for 

最初のAPPENDしているループを抜けたあと、色セットだけのためにループさせる。これでうまくいった。