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コードがセット |
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 件のコメント:
コメントを投稿