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 denRun = denPar.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 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", "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 ノードの関係を理解すれば、あとは、構造通りにノードを配置するだけのパズルのようなものだとわかります。
サンプルで示したコードを見直していただきたいのですが、プログラムの流れは、
- NotesDOMDocumentNode からノードを新規作成
- 作成したノードに属性を設定
- 出来上がったノードを希望する位置に AppendChild する
の繰り返しです。
掲載したサンプルでは、変数ごとに色分けして見やすくしていますが、デザイナーのエディら上では同じ色で表示されます。変数名をわかりやすくしておかないと、理解しずらくなるうえ、親を取り違えるなどバグのもとにもなります。
今回のサンプルコード作成に当たっては、新規作成したノードのように一時的に利用する変数や再利用する変数は den や dtn など型だけを表す単純な名前にして、親となりうる変数は denPar, denRun や denFont のように意味の分かる基本名をつけています(命名規則については『命名規則:LotusScript (変数)』を参照)。
また、使用する変数を減らし混乱しにくくするため、サブ関数化を進めて構造化しています。
DXL のプログラミングは、コーディング能力の”素養”が一番重要な技術のような気がしてきました。昔から上司に「もっとエレガントに書け!」と指摘を受けていたので自信はありませんが...
前回 | DXL Step-by-Step | 次回 |
0 件のコメント:
コメントを投稿