2024/03/01

DXL Step-by-Step:#29)イメージリソースで QR コードを書いてみよう ①

DXL 活用の調査・検証で、実現できたことや発見したことご紹介する『DXL Step-by-Step』シリーズの第 29 回です。リッチテキストにイメージリソースを表示できるようになったので、それを利用してサンプルプログラムを作成します。

材料にするのは QR コードです。

別の連載『ノーツで QR コード』で作成したライブラリです。この連載では、入力した文字列を QR コードに変換するサンプルるプログラムを紹介しており、すべて LotusScript で構築されています。ただ、連載では QR コードの表示に文字の ”■” を使用していたのですが、文字間に隙間があるためか認識率が良くありませんでした。

この問題点の改善を DXL で挑戦します。今回はその前編となります。


サンプルエージェントと QR コード生成部の組み込み

前々回の 第 27 回 のエージェントをコピペして作業を開始します。

まずは、そこに QR コード生成ライブラリを組み込みます。スクリプトライブラリ lsQRcode をコピペした上で (Options) セクションに追加します。

Option Declare

Use "lsDXL"
Use "lsQRcode"


続いて、QR コードを生成する部分を移植します。

連載終了時のメインルーチンから必要な部分をコピペします。多少修正していますが次のような感じです。なお、bc_2Dms_New 関数はライブラリ lsQRcode の外側(エージェント内)に定義していました。この関数もそのまま利用するので、今回のエージェントにコピペしています。

Sub Initialize
   Dim sSrc As String
   Dim sEnc As String
   Dim abQR() As Boolean

   'QR コード生成
   '---------------------------

   sSrc = Inputbox("QRコードに変換する文字列を入力してください。", "QRコード作成")

   If Msgbox("『" & sSrc & "』の QR コードを作成しますか?", 36, "") <> 6 Then Exit Sub

   sEnc = EncodeBarcode(sSrc, 3)    '3 = 誤り訂正レベル
   Call bc_2Dms_New(sEnc, abQR)    'abQR 配列にQRコードがセット

   Call CreateQRcodeDoc(sSrc, abQR)    'QRコードを文書として保存
    ・・・

bc_2Dms_New までの処理で、入力した文字列を QR コード に変換して、Boolean 型の 2 次元配列 abQR にセットしています。

最後の関数 CreateQRcodeDoc でその配列を文書化して保存していました。今回は、この部分を DXL で作り替えるということになります。


DXL で QR コードを作画

DXL で文書を作成するメインルーチンの構造は、これまでとほとんど同じです。先のメインルーチン Initialize の続きは次の通りです。唯一違うのは、DXL を構築する関数 xSetDXL に引数が追加されており、QR コードに変換前の文字列と変換後の配列を関数に渡すようにしています。

   Call bc_2Dms_New(sEnc, abQR)    'abQR 配列にQRコードがセット

   'DXL で QR コードを文書に保存
   '---------------------------

   Dim dprs As NotesDOMParser
   Dim ndb As NotesDatabase

   Set xns = New NotesSession
   Set ndb = xns.CurrentDatabase

   Set dprs = xns.CreateDOMParser()
   'DXL の構築
   Call xSetDXL(dprs, sSrc, abQR)

   '保存(インポート)
   If Not DXL_Import(dprs, DXLIMPORTOPTION_CREATE, False) Then
      'エラーの場合 DXL を出力
      Call Debug_SaveDXL(dprs)
   End If
End Sub


文書の生成と DXL の構造

今回作成する文書の DXL のイメージは次のようになります。

フォーム QR_DXL にフィールドが 2 つあり、入力した文字列が保存されるテキストフィールド StrSrc と QR コードがセットされるリッチテキスト Body です。

この構造に従い、各ノードをを作成し、必要な属性をセットしていきます。

Function xSetDXL(vdprs As NotesDOMParser, ByVal vsSrc As String, vabQR() As Boolean)
   Dim ddn As NotesDOMDocumentNode
   Dim den As NotesDOMElementNode
   Dim denDoc As NotesDOMElementNode
   Dim denItem As NotesDOMElementNode
   Dim denRT As NotesDOMElementNode
   Dim denPar As NotesDOMElementNode

   Set ddn = vdprs.Document

   '文書作成
   Set den = ddn.CreateElementNode("document")
   Call den.SetAttribute("form", "QR_DXL")
   Set denDoc = ddn.AppendChild(den)

   '変換前の文字列をフィールドにセット
   Call DXL_AppendField(ddn, "StrSrc", vsSrc)

   'リッチテキストフィールド作成
   Set den = ddn.CreateElementNode("item")
   Call den.SetAttribute("name", "Body")
   Set denItem = denDoc.AppendChild(den)

   'リッチテキスト作成
   Set den = ddn.CreateElementNode("richtext")
   Set denRT = denItem.AppendChild(den)

   '段落定義 id='1'
   Set den = ddn.CreateElementNode("pardef")
   Call den.SetAttribute("id", "1")
   Call denRT.AppendChild(den)

   '段落の作成
   Set den = ddn.CreateElementNode("par")
   Call den.SetAttribute("def", "1")
   Set denPar = denRT.AppendChild(den)

   'イメージリソースで QR コードを作画
   Call xSetDXL_QR(ddn, denPar, vabQR)
End Function

最終行の xSetDXL_QR が 2 次元配列から QR コードを作画している関数です。この関数の詳細は次回解説します。


なお、テキストフィールド StrSrc に値をセットする部分については連載で作成した関数を流用しています。第 10 回 で xAppendField として紹介した関数を DXL_AppendField としてライブラリ lsDXL に追加しています。

修正箇所は次の赤字の部分です。それ以外は変更がないので省略しています。ご了承ください。

Public Function DXL_AppendField( _
         vddn As NotesDOMDocumentNode, _
         ByVal vsFldName As String, _
         ByVal vvValue As Variant) As Boolean

    ・・・以下、同じなので省略・・・


前回 DXL Step-by-Step 次回


0 件のコメント:

コメントを投稿