4Dリストボックスにマルチスタイルテキスト

配列型リストボックスの一つのセルにマルチスタイルテキストを表示する方法を紹介する。

たとえば訂正・削除履歴を上下2段の文字列で表示するような事例がある。下段に修正前の文字列、上段に修正後の文字列を表示するという仕様だ。

リストボックスの列のプロパティで次のように設定

・型: テキスト
・マルチスタイル: チェック

表示する配列型リストボックスの代入文に次のようなコードを代入。

...
	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)
...

型別に、文字列、金額、日付の3種類を実装した。その内容は次の通り。

文字列

  //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 
	  //2行にする
	$multi:=$joudan+Char(13)+$gedan
	
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 
	  //2行にする
	$multi:=$joudan+Char(13)+$gedan
	
End if 

$0:=$multi

日付

  //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 
	  //2行にする
	$multi:=$joudan+Char(13)+$gedan
	
End if 

$0:=$multi

上の図の1行をダブルクリックすると詳細が表示される。

こちらの赤字はマルチスタイルの必要がない。コードは次のようになる。

...
C_LONGINT($red)
$red:=JCL_num_GetRGB (255;0;0)

If (vLJ02_varLJ_BEF_NOTE#vLJ02_varLJ_NOTE)
	OBJECT SET RGB COLORS(*;"vLJ02_varLJ_NOTE";$red)
End if 
...