2025/03/26

DXL Step-by-Step:#52)ノード操作 ⑤ - ノードを挿入する方法

前回は DXL でノードを追加する AppendChild メソッドを紹介しました。このメソッドは、最後の子ノードとして追加する機能しかありません。これでは、好きな位置にノードが配置できません。また、いくらヘルプを見ても InsertChild のような ”使える” メソッドはありません。

そこで、今回は利用できるメソッドだけを使用して、ノードを挿入する方法を紹介します。


ノードの挿入

前回紹介した事例では新規で作成したノードを AppendChild しましたが、このメソッドは DXL ツリー内に存在するノードを引数に指定することができます。この場合、元の位置から削除され、AppendChild を実行したノードの最後の子ノードとして追加されます。これの挙動を利用して ”ノードの挿入” を実現します。

下図の位置に新しいノードを追加する操作を例に説明します。

まず、前回と同様の操作で、新しいノードを一番後ろに追加します。

その後、挿入したい位置より後ろにあった 2 つのノードを順に AppendChild します。するとそれらは追加したノードの後ろに移動します。

少々回りくどいですが、これで ”ノードの挿入” が完了です。


サンプルプログラム

”ノードの挿入” を行うサンプルプログラムを紹介します。汎用的に利用できるように関数化してみました。

' 引数
' vdnInsert  挿入するノード
' vdnPos   挿入位置のノード
' vbAddBefore  True で前に追加

Function xInsertNode(vdnInsert As NotesDOMNode, _
      vdnPos As NotesDOMNode, _
      ByVal vbAddBefore As Boolean) As NotesDOMNode

   Dim iNotMove As Integer
   Dim iMove As Integer
   Dim i As Integer
   Dim j As Integer
   Dim dn As NotesDOMNode
   Dim dnParent As NotesDOMNode

   Set dnParent = vdnPos.ParentNode

   '挿入位置より前にあるノードを数える
   iNotMove = 0
   Set dn = vdnPos.PreviousSibling
   While Not (dn.IsNull)
      iNotMove = iNotMove + 1
      Set dn = dn.PreviousSibling
   Wend
   If vbAddBefore = False Then iNotMove = iNotMove + 1

   '挿入位置より後ろにあるノードを数える
   iMove = 0
   Set dn = vdnPos.NextSibling
   While Not (dn.IsNull)
      iMove = iMove + 1
      Set dn = dn.NextSibling
   Wend
   If vbAddBefore = True Then iMove = iMove + 1

   '挿入するノードを最後に追加
   Set xInsertNode = dnParent.AppendChild(vdnInsert)

   '挿入位置より後ろにあったノードを順に一番後ろに移動
   For i = 1 To iMove
      '移動すべき最初のノードを取得
      Set dn = dnParent.FirstChild
      For j = 1 To iNotMove
         Set dn = dn.NextSibling
      Next

      '一番後ろに移動
      Call dnParent.AppendChild(dn)
   Next
End Function


まとめ

DXL ではツリーと文書などノーツオブジェクトの構想は一致します。リッチテキストも同様なので、コンテンツを自由自在に操作しようとすると ”挿入” は不可欠です。ですが、DXL 関連のクラスには挿入がありません。今回のサンプルのように努力と根性で実現するしかありません。

InsertChild のようなメソッドが標準機能としてサポートしてほしいですね...。


前回 DXL Step-by-Step


0 件のコメント:

コメントを投稿