2024/09/09

リッチテキスト:#18)リッチテキスト入力チェック

LotusScript でリッチテキストを操作する方法を紹介している連載『リッチテキストの基本操作』の 18 回目です。約半年ぶりの更新です。

第 15 回 に続き、ヘルプ依頼の対応ログです。今回も日ごろから大変お世話になっている方から相談でした(もちろん同じ方)。最近は、ノーツコンソーシアムだけでなく、キャンプなど私的にもお世話になっているので、聞かないわけにはいきません(笑)。もはや、任務か指令状態です。仕事以上に気合を入れて対応させていただきました。

要件は『リッチテキストフィールドに文字か添付ファイルのいずれかが入力されているかチェックしたい』というものでした。

あれ? ちょっと待てよ?? このリッチテキストの連載、確か直近がこのネタだったのでは???

ただ、見直してみると別々の記事なので、今回の用件に端的には答えていない部分もあります。そこで、今回はこの要件に特化してまとめます。


メインプログラム

今回は入力チェックですから、Querysave イベントにスクリプトを記述します。保存の直前に実行されるイベントで、引数の Continue に False をセットすると、保存されません。

作成したスクリプトは次の通りです。

Sub Querysave(Source As Notesuidocument, Continue As Variant)
   Dim nuiw As New NotesUIWorkspace
   Dim nuid As NotesUIDocument
   Dim nd As NotesDocument

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

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

   Continue = xHasText(nd, "Body")
   Continue = Continue Or xHasFile(nd, "Body")

   If Continue = False Then
      Msgbox "文字を入力するかファイルを添付してください。", 16
   End If
End Sub

まず、#17)編集中のリッチテキスト で触れた Refresh メソッドで UI での添付ファイルをバックエンド文書 nd に反映します。その後、文字が入力されているか判定する関数 xHasText と 添付ファイルが貼り付けられているか判定する関数 xHasFile を実行しています。どちらの関数もチェック対象の入力がある場合 True を返します。

今回では ”いずれか” が要件なので論理和の or を使用しています。


文字の入力判定

まずは、文字の入力を判定する関数 xHasText です。第 16 回 のサンプルコードとほぼ同様です。引数で指定したフィールドを取得するようになっている点が少し違いますね。

リッチテキストフィールドが取得できれば、Text プロパティを使用して、文字の入力を判断するだけですね。

Function xHasText(vnd As NotesDocument, Byval vsFldName As String) As Boolean
   Dim ni As NotesItem
   Dim nrti As NotesRichTextItem

   xHasText = False

   'フィールドを取得
   Set ni = vnd.GetFirstItem(vsFldName)
   If ni.Type = RICHTEXT Then
      'リッチテキストなので文字の入力をチェック
      Set nrti = ni
      If nrti.Text <> "" Then
         xHasText = True
      End If
   End If
End Function


添付ファイルの判定

添付ファイルが貼り付けを判定する関数 xHasFile はこちらです。

構造は 第 17 回 のサンプルと同じにしています。違いは添付ファイルを発見したら、戻り値に True をセットして関数を抜けている点ですね。

Function xHasFile(vnd As NotesDocument, Byval vsFldName As String) As Boolean
   Dim ni As NotesItem
   Dim nrti As NotesRichTextItem
   Dim nemb As NotesEmbeddedObject
   Dim vTmp As Variant
   Dim i As Integer

   xHasFile = False

   'フィールドを取得
   Set ni = vnd.GetFirstItem(vsFldName)
   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
               xHasFile = True
               Exit Function
            End If
         Next
      End If
   End If
End Function


まとめ

今回の対応では、わかりやすさと汎用化を意識して対応しました。次のような点がポイントと考えています。

  • インターフェースである引数と戻り値をそろえる
  • 引数を文書とフィールド名にし、フィールド取得やリッチテキスト判定は関数内で実施

この効果でメインプログラムは見やすくシンプルになっています。

逆の効果としては、それぞれの関数内でフィールド取得やリッチテキスト判定を行っており、コード量の側面では非効率です。また、実行時も同じ処理が走りますので、レスポンスの側面でも効率は悪いと言えます(この程度であれば、気がつくレベルではないでしょうが...)。

この連載の主題とは違いますが、目的によってプログラムの書き方も変わるということですね。

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


0 件のコメント:

コメントを投稿