2024/01/21

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

DXL 活用の調査・検証で、実現できたことや発見したことご紹介する『DXL Step-by-Step』シリーズの第 23 回です。第 14 回から前回まで、段落に関する DXL の調査結果をまとめてきました。解説ばかりだとつまらないので、この間の復習を兼ねて、サンプルプログラムを作りたいと思います。


共通関数の準備

第 17 回『段落の定義② 余白の設定』で、DXL 用のライブラリ lsDXL を新規作成しました。そろそろサンプルコードが長くなってきますので、共通で利用できる関数は、このライブラリに集約しようと思います。

lsDXL ライブラリでは、インターフェースを明確にするため、外部からアクセスさせたい関数だけを Public 宣言する前提としています。


◇ 共通変数

まずはライブラリ全般の準備として以下のコードを追加します。

Option Declare
Private xns As NotesSession

Sub Initialize
   'ライブラリのプライベート変数の初期化
   Set xns = New NotesSession
End Sub

NotesSession のオブジェクトは、さまざまなシーンで使用しますし、値が変化しないので、ライブラリ内で共通の変数としています。


◇ DXL の保存(インポート)

DXL をノーツオブジェクトとして保存する関数です。

これまで第 4 回『文書の更新』では文書として保存する関数、第 10 回『イメージリソースの新規作成』では設計要素を保存する関数として登場した xImportDXL 関数です。

汎用的な関数となるよう、作成するドミノオブジェクトが ”設計” or ”文書” なのかを引数で指定するようにしています。また、保存エラーがあった場合、エラーメッセージを表示して、False を返すようにしました。

Public Function DXL_Import(vdprs As NotesDOMParser, ByVal viOption As Integer, ByVal vbIsDesign As Boolean) As Boolean
   Dim nst As NotesStream
   Dim ndb As NotesDatabase
   Dim dimp As NotesDXLImporter

   On Error GoTo Err_Proc

   'DXL の抽出準備
   Set nst = xns.CreateStream()
   Call vdprs.SetOutput(nst)
   Call vdprs.Serialize()

   '保存(インポート)
   Set ndb = xns.CurrentDatabase
   Set dimp = xns.CreateDXLImporter()
   If vbIsDesign = True Then
      '設計の保存
      dimp.DesignImportOption = viOption
   Else
      '文書の保存
      dimp.DocumentImportOption = viOption
   End If

   'DXL の保存
   Call dimp.Import(nst.ReadText(), ndb)
   DXL_Import = True

Exit_Proc:
   Exit Function

Err_Proc:
   MsgBox Error$, 16, "DXL_Import"
   DXL_Import = False

   Resume Exit_Proc
End Function


◇ デバッグ用の関数

最後に万一 DXL の保存(インポート)でエラーが発生した場合に、保存しようとした DXL を出力できるよう、デバッグ用の関数を準備します。

元となるのは、第 6 回『エージェント(設計要素)の DXL』で登場した xSaveDXL 関数です。デバッグ用ということで、関数名は Debug_SaveDXL としています。

Public Function Debug_SaveDXL(vdprs As NotesDOMParser) As Boolean
   Dim ndb As NotesDatabase
   Dim nd As NotesDocument
   Dim nrti As NotesRichTextItem

   Set ndb = xns.CurrentDatabase
   Set nd = ndb.CreateDocument()
   nd.Form = "DXL"

   Set nrti = nd.CreateRichTextItem("Body")
   Call nrti.AppendText(xGetDXL(vdprs))

   Debug_SaveDXL = nd.Save(True, False)
End Function

Function xGetDXL(vdprs As NotesDOMParser) As String
   Dim nst As NotesStream

   Set nst = xns.CreateStream()
   Call vdprs.SetOutput(nst)
   Call vdprs.Serialize()

   xGetDXL = nst.ReadText()
End Function

なお、サブ関数の xGetDXL はそのまま変更せずに移設しました。

前回 DXL Step-by-Step 次回


0 件のコメント:

コメントを投稿