4D リストボックスのマルチスタイル – これで何行でも表示できる

例えば次の図のような、リストボックスの行を2行表示にしたい場合がある。

図 会計ジロウの修正・削除履歴のダイアログ

これは次のように実装した。リストボックスのプロパティ、リストボックスの列のプロパティ、スタイルタグを理解、の3点セットが必要。

リストボックスのプロパティ

まずリストボックスのプロパティを変更する。

行の高さ2行にする

3行でも4行でも可能だ。

列のプロパティ

マルチスタイルにしたい列にすべてチェックする。

マルチスタイルチェック

配列型リストボックスの文字列型の列、でしか試していない。

マルチスタイルタグで囲む

4Dのマルチスタイルテキストエリアで有効なスタイルタグを使って、テキストを装飾する。タグで囲むところをモジュール化してzz_TeiseiMultiなどとしてみた。上段と下段の文字列をそれぞれ引数でもらって、スタイルタグで囲って返す、メソッド。

//zz_TeiseiMulti
//20220617 wat
//訂正の文字列、2行で上段が赤色、下段が黒のストライク

C_TEXT($1; $joudan)
$joudan:=$1
C_TEXT($2; $gedan)
$gedan:=$2
C_TEXT($0; $multi)
$multi:=""

//上下の文字列が異なる場合は修正スタイルを適用
If ($joudan#$gedan)
	//上段
	$multi:="<SPAN STYLE=\"color:#D81E05\">"
	$multi:=$multi+$joudan
	$multi:=$multi+"</SPAN>"

	//下段
	$multi:=$multi+Char(13)
	$multi:=$multi+"<SPAN STYLE=\"text-decoration: line-through\">"
	$multi:=$multi+$gedan
	$multi:=$multi+"</SPAN>"

Else 
	//変更がないので1行だけ返す
	$multi:=$joudan  //20221102

End if 

$0:=$multi

配列要素に代入

でき上がったマルチスタイルテキストは、配列要素に代入する。以下のコード。内容を取得するところは割愛した。

...
For ($i; 1; $cnt)
	//サーバ上でゲットした内容をリストボックスに代入、ここで転送が起こる
	vLJ01_lstLJ_ID{$i}:=$aryObj{$i}.LJ_ID
	//vLJ01_lstLJ_TYPE{$i}:=$aryObj{$i}.LJ_TYPE+Char(13)+""
	vLJ01_lstLJ_TYPE{$i}:=$aryObj{$i}.LJ_TYPE
	vLJ01_lstLJ_PE_ID{$i}:=$aryObj{$i}.LJ_PE_ID
	vLJ01_lstLJ_JO_ID{$i}:=$aryObj{$i}.LJ_JO_ID
	vLJ01_lstLJ_SL_ID{$i}:=$aryObj{$i}.LJ_SL_ID
	vLJ01_lstLJ_INPUT_DATEstr{$i}:=String($aryObj{$i}.LJ_INPUT_DATE; System date short)

	vLJ01_lstLJ_DATEstr{$i}:=zz_TeiseiMultiDate($aryObj{$i}.LJ_DATE; $aryObj{$i}.LJ_BEF_DATE)
	vLJ01_lstLJ_D_CODE{$i}:=zz_TeiseiMulti($aryObj{$i}.LJ_D_CODE; $aryObj{$i}.LJ_BEF_D_CODE)
	vLJ01_lstLJ_D_NAME{$i}:=zz_TeiseiMulti($aryObj{$i}.LJ_D_NAME; $aryObj{$i}.LJ_BEF_D_NAME)
	vLJ01_lstLJ_DEBITstr{$i}:=zz_TeiseiMultiReal($aryObj{$i}.LJ_DEBIT; $aryObj{$i}.LJ_BEF_DEBIT)
	vLJ01_lstLJ_D_TM_ID{$i}:=$aryObj{$i}.LJ_D_TM_ID
	vLJ01_lstLJ_D_TAXstr{$i}:=zz_TeiseiMultiReal($aryObj{$i}.LJ_D_TAX; $aryObj{$i}.LJ_BEF_D_TAX)
	vLJ01_lstLJ_D_TM_NAME{$i}:=zz_TeiseiMulti($aryObj{$i}.LJ_D_TM_NAME; $aryObj{$i}.LJ_BEF_D_TM_NAME)
	vLJ01_lstLJ_C_CODE{$i}:=zz_TeiseiMulti($aryObj{$i}.LJ_C_CODE; $aryObj{$i}.LJ_BEF_C_CODE)
	vLJ01_lstLJ_C_NAME{$i}:=zz_TeiseiMulti($aryObj{$i}.LJ_C_NAME; $aryObj{$i}.LJ_BEF_C_NAME)
	vLJ01_lstLJ_CREDITstr{$i}:=zz_TeiseiMultiReal($aryObj{$i}.LJ_CREDIT; $aryObj{$i}.LJ_BEF_CREDIT)
	vLJ01_lstLJ_C_TM_ID{$i}:=$aryObj{$i}.LJ_C_TM_ID
	vLJ01_lstLJ_C_TAXstr{$i}:=zz_TeiseiMultiReal($aryObj{$i}.LJ_C_TAX; $aryObj{$i}.LJ_BEF_C_TAX)
	vLJ01_lstLJ_C_TM_NAME{$i}:=zz_TeiseiMulti($aryObj{$i}.LJ_C_TM_NAME; $aryObj{$i}.LJ_BEF_C_TM_NAME)
	vLJ01_lstLJ_NOTE{$i}:=zz_TeiseiMulti($aryObj{$i}.LJ_NOTE; $aryObj{$i}.LJ_BEF_NOTE)

	vLJ01_lstLJ_CREATE_DATEMARK{$i}:=$aryObj{$i}.LJ_CREATE_DATEMARK

End for 
...

参考までに日付型対応のzz_TeiseiMultiDateと実数(数値)に対応したzz_TeiseiMultiRealも紹介しておく。

//zz_TeiseiMultiDate
//20220618 wat
//訂正の文字列、日付型対応。2行で上段が赤色、下段が黒のストライク
//20220624 wat ゼロ日は空白とする

C_DATE($1; $joudan_date)
$joudan_date:=$1
C_DATE($2; $gedan_date)
$gedan_date:=$2
C_TEXT($0; $multi)
$multi:=""
C_TEXT($joudan; $gedan)

If ($joudan_date#!00-00-00!)
	$joudan:=String($joudan_date; System date short)
	
Else 
	$joudan:=""
	
End if 

If ($gedan_date#!00-00-00!)
	$gedan:=String($gedan_date; System date short)
	
Else 
	$gedan:=""
	
End if 

//上下の文字列が異なる場合は修正スタイルを適用
If ($joudan#$gedan)
	//上段
	$multi:="<SPAN STYLE=\"color:#D81E05\">"
	$multi:=$multi+$joudan
	$multi:=$multi+"</SPAN>"
	
	//下段
	$multi:=$multi+Char(13)
	$multi:=$multi+"<SPAN STYLE=\"text-decoration: line-through\">"
	$multi:=$multi+$gedan
	$multi:=$multi+"</SPAN>"
	
Else 
	//変更がないので1行だけ返す
	$multi:=$joudan  //20221102
	
End if 

$0:=$multi
//zz_TeiseiMultiReal
//20220618 wat
//訂正の文字列、金額型対応。2行で上段が赤色、下段が黒のストライク
//20220624 wat ゼロ円は空白とする

C_REAL($1; $joudan_real)
$joudan_real:=$1
C_REAL($2; $gedan_real)
$gedan_real:=$2
C_TEXT($0; $multi)
$multi:=""
C_TEXT($joudan; $gedan)

$joudan:=String($joudan_real; "#,###,###,###")
$gedan:=String($gedan_real; "#,###,###,###")

//上下の文字列が異なる場合は修正スタイルを適用
If ($joudan#$gedan)
	//上段
	$multi:="<SPAN STYLE=\"color:#D81E05\">"
	$multi:=$multi+$joudan
	$multi:=$multi+"</SPAN>"
	
	//下段
	$multi:=$multi+Char(13)
	$multi:=$multi+"<SPAN STYLE=\"text-decoration: line-through\">"
	$multi:=$multi+$gedan
	$multi:=$multi+"</SPAN>"
	
Else 
	//変更がないので1行だけ返す
	$multi:=$joudan  //20221102
	
End if 

$0:=$multi

リンク:
4Dのマニュアル:サポートされているタグ

ダイナミックタグというのを使って、テキストがクリックされたときに4Dのメソッドを呼び出したりできるらしい。