前回は 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 件のコメント:
コメントを投稿