2024/02/18

リッチテキスト:#17)編集中のリッチテキスト

ノーツの特徴的な機能であるリッチテキストを LotusScript で操作する方法を紹介している連載『リッチテキストの基本操作』の 17 回目です。

今回は編集中のリッチテキストのアクセスについてまとめます。記事を書くにあたり検証した結果、私自身も新発見がありました。ですので、今回は解説というよりは、実験レポートのような位置づけとなります。ご了承ください。


入力チェック

編集中のリッチテキストに対してアクセスするシーンで最初に思い浮かぶのが入力チェックです。今回は事例として、添付用のフィールドに添付ファイルが存在するかを確認してみます。

機能的には、指定したリッチテキストフィールドに添付ファイルがあればそのサイズを返す関数を作成します。添付が複数ある場合、その合計サイズを返すものとし、0 を返した場合は添付ファイルが存在しないと判定できる関数です。

作成した関数は次の通りです。

Function xGetSize(Byval sFldName As String) As Long
   Dim nuiw As New NotesUIWorkspace
   Dim nuid As NotesUIDocument
   Dim nd As NotesDocument
   Dim ni As NotesItem
   Dim nrti As NotesRichTextItem
   Dim nemb As NotesEmbeddedObject

   Dim lSize As Long
   Dim vTmp As Variant
   Dim i As Integer

   Set nuid = nuiw.CurrentDocument
   Set nd = nuid.Document

   lSize = 0

   '添付ファイルを認識させる
   Call nuid.Refresh(True)

   'フィールドを取得
   Set ni = nd.GetFirstItem(sFldName)
   If ni.Type = RICHTEXT Then
      'リッチテキストなので添付ファイルをチェック
      Set nrti = ni
      vTmp = nrti.EmbeddedObjects
      If Not (IsEmpty(vTmp)) Then
         For i = 0 To UBound(vTmp)
            '埋め込みオブジェクトを順に取得
            Set nemb = vTmp(i)
            If nemb.Type = EMBED_ATTACHMENT Then
               lSize = lSize + nemb.FileSize
            End If
         Next
      End If
   End If

    xGetSize = lSize
End Function

続いてフォームにアクションボタンを作成して、上記関数とメインルーチンを記述します。

Sub Click(Source As Button)
   Msgbox xGetSize("Body"), 64, "RichText #17"
End Sub

実行すると次の通りフィールド内の添付ファイルのサイズの合計が返されます。8409 バイトのファイルを 2 つ貼り付けたので正しく取得できています。

Refresh メソッド

この関数でポイントとなるのが、リッチテキスト内部に Resresh メソッドをコールしている部分です。

   '添付ファイルを認識させる
   Call nuid.Refresh(True)

デザイナーヘルプによると Refresh メソッドには引数があります。

Refresh (NotesUIDocument - LotusScript®)

LotusScript では、UI に表示中のオブジェクトをフロントエンドと呼びます。Notes Object Class では、NotesUI????? クラスとして定義されています。そうでない場合はバックエンドと呼び、Notes????? クラス(UI が付かない)として定義されています。

NotesDocument クラスや NotesRichTextItem クラスなど一般の処理に利用するクラスばバックエンドです。入力チェックの作成などにおいては、NotesUIDocument から NotesDocument を取得することになります。

   Set nd = nuid.Document

リッチテキストフィールドでは、通常、バックエンドに渡されるのは文書として保存されている状態のものが渡されます。よって、編集前の状態であったり、入力しているのに空となったりします。

前置きが長くなりましたが、Refresh メソッドの引数で True を指定すると、リッチテキストのフロントエンドがバックエンドに反映されるというわけです。


エージェントでは使用できない?

ところでこのプログラムをエージェントに移設して、アクションボタンのシンプルアクションでエージェントを実行するようにしてみました。文書を編集してからボタンをクリックすると次のようなエラーが発生しました。

プログラムは全く同じなので、エージェント化した場合の制約だと思われます。

前回 発生したエラーもエージェント化が原因だったということですね...


まとめ

今回の実験で編集中のリッチテキストを扱うには、

  • Refresh(True) の実行が必要
  • エージェント化するとエラーが発生する

という点がポイントであることがわかりました。


ところで、私はつい先日まで『リッチテキストの編集はいったん保存しないとフロントエンドでは扱えない』と思い込んでいました。Refresh メソッドに引数が増えたことは、気が付いていたのですが、全く調べず放置していました。引数が増えたのは、リリース 5 か 6 のようなので、20 年以上も放置していたことになります。

気づいた時点で調べる!技術者にとって大切ですね。今後はこのようなことがないよう気を付けようと思います...

前回 リッチテキストの基本操作


0 件のコメント:

コメントを投稿