2023/08/16

ノーツで QR コード:#13)LotusScript 版ライブラリ 完成

前回、エンコード文字列から 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 BooleanAs 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 件のコメント:

コメントを投稿