2025/05/27

DXL Step-by-Step:#57)ノード操作 ⑩ - ノードの複製

今回はノードを複製する方法についてまとめます。同じフォーマットの表を複数個所に配置するなど応用方法はさまざまですね。


ノードの複製

ノードを複製するには、 Clone メソッドを使用します。

Clone (NotesDOMNode - LotusScript®)

前回紹介した RemoveChild メソッドと同様で、このメソッドも NotesDOMNode クラスのメソッドとなります。ですので、それを継承している NotesDOMEmenetNode でも使用できます。

構文は次の通りです。

Set notesDOMNode = notesDOMNode .Clone( deepClone )

引数 deepClone で True を指定するとサブノードを含めて複製します。False だとそのノードだけとなるのですが、DXL ツリーの階層構造を考えると、通常は True での利用となりますね。


複製したノードの状態

CreateElementNode メソッドで新規作成したノードは、DXL ツリーには属さず宙に浮いたような状態であると #51)ノード操作 ④ - ノードの新規作成 で紹介しました。複製したノードも同様の状態となり、ParentNode が存在しない状態となります。

DXL ツリーに配置するためには、AppendChild メソッドや #52)ノード操作 ⑤ - ノードを挿入する方法 で紹介した方法を追加って、希望する位置に配置する必要があります。


複製時の注意

例えば、リッチテキストフィールド直下にある 2 つ目の表を複製して一番後ろに挿入したいとします。そのサンプルは次の通りです( #55)ノード操作 ⑧ - ノードの検索 で紹介した関数を使用)。

      ・・・
   'リッチテキスト直下の2つ目のテーブルを取得
   Dim denTbl As NotesDOMElementNode
   Set denTbl = xGetNthChildByName(denRT, "table", 2)

   'テーブルの後ろの段落を得取得
   Dim denPar As NotesDOMElementNode
   Set denPar = xGetNextSiblingByName(denTbl, "par")

   'テーブルを複製して追加
   Dim denNew As NotesDOMElementNode
   Set denNew = denTbl.Clone(True)
   Call denTbl.ParentNode.AppendChild(denNew)

   'テーブルの後ろに段落を追加
   Set denNew = denPar.Clone(True)
   Call denTbl.ParentNode.AppendChild(denNew)
      ・・・

xGetNthChildByName(denRT, "table", 2) で 2 つ目の表を取得して、denTbl.Clone(True) で複製しています。ただ、ポイントはココではありません。表を配置後、その後ろに段落(par ノード)を配置しています。table ノードは前後に par ノードが必要となるための対応なのですが、ノードをコピーして配置するだけではなく、前後関係に配慮して DXL ツリーとして破綻しないよう注意することが重要です。


前回 DXL Step-by-Step 次回


0 件のコメント:

コメントを投稿