2024/04/25

DXL Step-by-Step:#32)表の作成と行・列の間隔

DXL 活用の調査・検証で、実現できたことや発見したことご紹介する『DXL Step-by-Step』シリーズの第 32 回です。前回から ”表” の構造について整理しています。

今回は、実際に LotusScript で表を作成してみます。そして、LotusScript の NotesRichText*** クラスでは操作できない行の間隔と列の間隔を設定します。


メインルーチン

#27)イメージリソースの表示』で作成したエージェントをコピペして修正する前提で記載します。記載していない部分のプログラムについては変更はありません。

まずは、DXL を作成するメインルーチン xSetDXL です。表を作成する関数をコールしています。また、表の前後には段落が必要となりますので、同じ処理となりますので、関数化しています(関数については後述)。

Function xSetDXL(vdprs As NotesDOMParser)
         ・・・
   Dim denTbl As NotesDOMElementNode
         ・・・
   'リッチテキスト作成
   Set den = ddn.CreateElementNode("richtext")
   Set denRT = denItem.AppendChild(den)

   '段落定義
   Call xSetDXL_pardef(ddn, denRT)


   '表前の段落追加
    Call xSetDXL_par(ddn, denRT)

   '表の追加
    Set denTbl = xSetDXL_table(ddn, denRT, 3, 2)

   '表後の段落追加
    Call xSetDXL_par(ddn, denRT)
 End Function


表の作成

xSetDXL_table 関数では、新しい表を作成しリッチテキストに追加します。引数で作成する表の行数と列数を指定できるようにしています。前回確認した通り、表のノードは複数の階層で構造化されていました。以下のリストでは階層がわかるよう変数の文字色を変えています。

Function xSetDXL_table(_
            vddn As NotesDOMDocumentNode, _
            vdenRT As NotesDOMElementNode, _
            ByVal viRows As Integer, ByVal viCols As Integer _
            ) As NotesDOMElementNode
   Dim denTbl As NotesDOMElementNode
   Dim denRow As NotesDOMElementNode
   Dim den As NotesDOMElementNode
   Dim iCol As Integer
   Dim iRow As Integer

   '表の作成
   Set den = vddn.CreateElementNode("table")
   Set denTbl = vdenRT.AppendChild(den)

   '列定義の作成
   For iCol = 1 To viCols
      Set den = vddn.CreateElementNode("tablecolumn")
      Call denTbl.AppendChild(den)
   Next

   '行の作成
   For iRow = 1 To viRows
      Set den = vddn.CreateElementNode("tablerow")
      Set denRow = denTbl.AppendChild(den)

      'セルの作成
      For iCol = 1 To viCols
         Set den = vddn.CreateElementNode("tablecell")
         Call denRow.AppendChild(den)
      Next
   Next

   Set xSetDXL_table = denTbl
End Function


段落の作成

xSetDXL_par 関数は表の前後に配置する空の段落を作成します。par ノードを作成し、リッチテキストに追加するだけのシンプルなプログラムとなっています。

Function xSetDXL_par(_
            vddn As NotesDOMDocumentNode, _
            vdenRT As NotesDOMElementNode _
            ) As NotesDOMElementNode
   Dim den As NotesDOMElementNode

   '段落の作成
   Set den = vddn.CreateElementNode("par")
   Call den.SetAttribute("def", "1")
   Set xSetDXL_par = vdenRT.AppendChild(den)
End Function


ここまでのエージェントを実行すると、3 行 2 列の素気のない表が作成されます。


行・列の間隔

それではこの表に行の間隔と列の間隔をセットしてみましょう。プロパティの以下の設定です。


この設定は table ノードの次の属性で設定します。

属性 設定値 補足
columnspacing '0.0591in' など 列の間隔(セル内側の左右余白)
rowspacing '0.0591in' など 行の間隔(セル内側の上下余白)


間隔を設定する関数を新規に作成します。

引数で渡された table ノードに対して SetAttribute メソッドで属性をセットしています。

Function xSetDXL_table_spcing( _
            vdenTbl As NotesDOMElementNode, _
            ByVal vdRowSpan As Double, ByVal vdColSpan As Double)
   Dim s As String

   '行の間隔
   s = DXL_CMToInch(vdRowSpan)
   Call vdenTbl.SetAttribute("rowspacing", s)

   '列の間隔
   s = DXL_CMToInch(vdColSpan)
   Call vdenTbl.SetAttribute("columnspacing", s)
End Function

ポイントは、設定の単位がインチであることです。引数で指定されたセンチメートルの値を #17)段落の定義② 余白の設定 で作成した関数 DXL_CMToInch でインチの文字列に変換しています。


メインルーチンには以下の行を追加し、行の間隔を 0.2 cm、列の間隔を 0.5 cm に設定します。

         ・・・

   '表の追加
   Set denTbl = xSetDXL_table(ddn, denRT, 3, 2)

   '間隔の設定
   Call xSetDXL_table_spcing(denTbl, 0.2, 0.5)

   '表後の段落追加
   Call xSetDXL_par(ddn, denRT)
End Function


実行結果

できあがったプログラムを実行すると行列の間隔を設定した表が作成されます。

ちなみに、この処理で作成される DXL は次の通りとなります。


前回 DXL Step-by-Step 前回


0 件のコメント:

コメントを投稿