2024/01/25

DXL Step-by-Step:#25)サンプルコード(段落と文字の装飾③)

DXL 活用の調査・検証で、実現できたことや発見したことご紹介する『DXL Step-by-Step』シリーズの第 25 回です。「段落と文字の装飾」のサンプルプログラム紹介の最終回です。


文字サイズの指定

前回は文字の色を指定する例を示しました。今回は、色に加えてサイズも指定するパターンです。また、色の設定は定義済みの文字列を使わず、色番号で指定します。

フォントサイズは 18、13、8 と 5 刻みで小さくし、色はサイズに 8 をかけ 16 進数に変換し RGB に指定しています。8 では '#404040'、13 では '#686868' とフォントが大きいほど薄いグレーになるようにしてみました。

色とサイズの設定は、属性を 2 つセットするだけなので、難しいことはありませんね。

Function xSetDXL_par2_Size(vddn As NotesDOMDocumentNode, vdenRT As NotesDOMElementNode)
   Dim denPar As NotesDOMElementNode
   Dim denRun As NotesDOMElementNode
   Dim den As NotesDOMElementNode
   Dim dtn As NotesDOMTextNode

   Dim sTmp As String
   Dim i As Integer

   '段落の作成
   Set den = vddn.CreateElementNode("par")
   Call den.SetAttribute("def", "2")
   Set denPar = vdenRT.AppendChild(den)

   For i = 18 To 8 Step -5
      Set den = vddn.CreateElementNode("run")
      Set denRundenPar.AppendChild(den)

      '文字装飾の準備
      Set den = vddn.CreateElementNode("font")

      '色の指定
      sTmp = Hex$(i*8) & Hex$(i*8) & Hex$(i*8)
      Call den.SetAttribute("color", "#" & sTmp)
      'サイズの指定
      sTmp = CStr(i) & "pt"
      Call den.SetAttribute("size", sTmp)

      '文字装飾の追加
      Call denRun.AppendChild(den)

      'プレーンテキスト(テキストノード)追加
      Set dtn = vddn.CreateTextNode("文字サイズ " & sTmp)
      Call denRun.AppendChild(dtn)

      '段落内改行の追加
      Set den = vddn.CreateElementNode("break")
      Call denPar.AppendChild(den)
   Next
End Function

この関数で作成される DXL は次の部分となります。


パーマネントペンの指定

最後のサブ関数は、パーマネントペンの設定です。

パーマネントペンは font ノードではなく、run ノードの属性でした。サンプルコード上で青字で表示している run ノードに対して属性 highlight を設定している点に注意が必要です。

Function xSetDXL_par2_ParPen(vddn As NotesDOMDocumentNode, vdenRT As NotesDOMElementNode)
   Dim denPar As NotesDOMElementNode
   Dim denRun As NotesDOMElementNode
   Dim denFont As NotesDOMElementNode
   Dim den As NotesDOMElementNode
   Dim dtn As NotesDOMTextNode

   Set den = vddn.CreateElementNode("par")
   Call den.SetAttribute("def", "2")
   Set denPar = vdenRT.AppendChild(den)

   'フォントの準備
   Set denFont = vddn.CreateElementNode("font")
   Call denFont.SetAttribute("size", "18pt")

   'パーマネントペン なし
   Set den = vddn.CreateElementNode("run")
   Set denRundenPar.AppendChild(den)
   Call denRun.AppendChild(denFont.Clone(True))
   Set dtn = vddn.CreateTextNode("パーマネントペン:")
   Call denRun.AppendChild(dtn)

   'パーマネントペン 黄色
   Set den = vddn.CreateElementNode("run")
   Call den.SetAttribute("highlight", "yellow")
   Set denRun denPar.AppendChild(den)
   Call denRun.AppendChild(denFont.Clone(True))
   Set dtn = vddn.CreateTextNode("黄色")
   Call denRun.AppendChild(dtn)

   'パーマネントペン なし
   Set den = vddn.CreateElementNode("run")
   Set denRun denPar.AppendChild(den)
   Call denRun.AppendChild(denFont.Clone(True))
   Set dtn = vddn.CreateTextNode("、")
   Call denRun.AppendChild(dtn)

   'パーマネントペン ピンク
   Set den = vddn.CreateElementNode("run")
   Call den.SetAttribute("highlight", "pink")
   Set denRun denPar.AppendChild(den)
   Call denRun.AppendChild(denFont.Clone(True))
   Set dtn = vddn.CreateTextNode("ピンク")
   Call denRun.AppendChild(dtn)
End Function

この関数ではすべての文字を 18 pt で表示する前提としています。font ノード毎回生成するのは面倒なので、事前に作成して denFont 変数に保持させています。それを各 run ノードで適用しています。この時、Clone メソッドを使用している点がポイントです。これを実行しないと denFont の設定は最後の”ピンク”の部分にしか適用されません。

AppendChild メソッドは指定したノードをどこに配置するのかを操作しているだけで、ノードそのものを追加しているのではないようです。

この関数で作成される DXL は次の部分となります。


まとめ

「段落と文字の装飾」を例にリッチテキストフィールドを新規作成してみました。

作成するプログラムは、ノードを作成して追加する作業の繰り返しです。段落定義の pardef と 段落の par ノードの関係を理解すれば、あとは、構造通りにノードを配置するだけのパズルのようなものだとわかります。

サンプルで示したコードを見直していただきたいのですが、プログラムの流れは、

  1. NotesDOMDocumentNode からノードを新規作成
  2. 作成したノードに属性を設定
  3. 出来上がったノードを希望する位置に AppendChild する

の繰り返しです。

掲載したサンプルでは、変数ごとに色分けして見やすくしていますが、デザイナーのエディら上では同じ色で表示されます。変数名をわかりやすくしておかないと、理解しずらくなるうえ、親を取り違えるなどバグのもとにもなります。

今回のサンプルコード作成に当たっては、新規作成したノードのように一時的に利用する変数や再利用する変数は den や dtn など型だけを表す単純な名前にして、親となりうる変数は denPar, denRun や denFont のように意味の分かる基本名をつけています(命名規則については『命名規則:LotusScript (変数)』を参照)。

また、使用する変数を減らし混乱しにくくするため、サブ関数化を進めて構造化しています。

DXL のプログラミングは、コーディング能力の”素養”が一番重要な技術のような気がしてきました。昔から上司に「もっとエレガントに書け!」と指摘を受けていたので自信はありませんが...

前回 DXL Step-by-Step 次回


0 件のコメント:

コメントを投稿