前回、エンコード文字列から QR コードを作成する方法がわかりました。今回は、これを LotusScript に移植します。
QR コードのデータ構造
移植にあたり LotusScript 内で QR コードをどのように表現するか仕様を決定します。
ノーツで QR コードを表示する処理を考えた場合、フォームに表示する方法、HTML に変換して WEB ブラウザで表示する方法、Java や JavaScript などのライブラリに渡す方法などが考えられます。また、本末転倒ですが、Excel に連携して作画することも考えられます。
さまざまな、手段が考えられるからこそ、データ構造はシンプルが良いと考えました。そこで、Boolean 型の2次元配列に True で黒(塗りつぶし)、False で白とします。
QR コードのサイズ
まずは、Boolean 型の2次元配列のサイズの決定です。
エンコード文字列の1文字が、 2 × 2 マスを表していました。そして、改行区切りので構成されていました。この条件で、2次元配列のサイズを決定すると次の通りとなります。
'QR コードのサイズ Dim abBC() As Boolean Dim vTmp As Variant vTmp = Split(p, Chr(13) & Chr(10)) x = Len(vTmp(0))*2 - 1 y = UBound(vTmp)*2 - 1 ReDim abBC(x, y) |
横幅 x は、エンコード文字列1行分の文字数 x 2 となるのですが、配列の要素番号が 0 始まりなので -1 しています。
縦の行数 y は、改行区切りの行数で算出します。Split で行を分離して配列に格納します。行数のカウントに Ubound を使用しています。分離した配列の要素が 0 始まりのため、1行少なくなりますが、エンコード文字列の最後にも改行があり、1行多く判定されます。差し引き 0 なので、結果的に横幅と同等の計算式となっています。
bc_2Dms サブルーチン の作成
続いて、前回 Excel 上で掃除した bc_2Dms 関数をノーツに移植します。
移植にあたり、次の作業を行います。
- サブルーチンはパブリックとして宣言
- 引数 xNam は未使用なので削除
- Boolean 型の2次元配列を返すための引数を追加
- 先の「QR コードのサイズ」のプログラムを挿入(配列は引数を利用)
- 変数 m を削除し 1 に変更、変数 dm を削除し 2 に変更(基準を 2.5 → 1 )
作業が終わると bc_2Dms 関数は、次のようになります。
Public sub bc_2Dms(xBC As String, rabBC() as Boolean) As Variant Dim x, y As Double Dim b%, n%, w%, p$ p = Trim(xBC) b = Len(p) 'QR コードのサイズ Dim vTmp As Variant ・・・ ReDim rabBC(x, y) 'QR コード生成 x = 0# y = 0# For n = 1 To b w = AscL(Mid(p, n, 1)) Mod 256 If w = 10 Then y = y + 2 x = 0# ElseIf (w >= 97 And w <= 112) Then w = w - 97 Select Case w Case 1: Call drw(x, y, 1, 1, rabBC) Case 2: Call drw(x + 1, y, 1, 1, rabBC) Case 3: Call drw(x, y, 2, 1, rabBC) ・・・ Case 14: Call drw(x + 1, y, 1, 1, rabBC) Call drw(x, y + 1, 2, 1, rabBC) Case 15: Call drw(x, y, 2, 2, rabBC) End Select x = x + 2 End If Next n End Sub |
drw サブルーチンの作成
最後に drw サブルーチンを作成します。移植にあたり、次の点を調整します。
- Boolean 型の2次元配列を返すための引数を追加
- Excel の行/列と違い配列は 0 始まり
- 基準を 2.5 → 1 に変更
- 上記により座標の演算が不要になるので、引数をそのまま使用
- Sheet に 1 をセットする代わりに配列に True をセット
調整終了後の drw 関数は、次のようになります。
Sub drw(ByVal xc As Integer, ByVal yr As Integer, ByVal w As Integer, ByVal h As Integer, rabBC() As Boolean) rabBC(xc, yr) = True If w > 1 Then rabBC(xc + 1, yr) = True End If If h > 1 Then rabBC(xc, yr + 1) = True End If If w > 1 And h > 1 Then rabBC(xc + 1, yr + 1) = True End If End Sub |
これで、ライブラリは完成です。
次回は、いよいよ、ノーツで、LotusScript だけで、QR コードを表示します。
前回 | ノーツで QR コード | 次回 |
0 件のコメント:
コメントを投稿