2023/08/15

ノーツで QR コード:#9)移植したライブラリの掃除

まず、ライブラリで最初にコールされる EncodeBarcode 関数を確認します。

関数の先頭には使い方らしき、コメントがあります。

まず、コメントの最初の2行です。MS は Microsoft でしょうが、Pouziti とは何でしょうか?

コメントに CELL や SHEET と記述があるので、Excel 相当とソフトウェアだと推測できるので、目星をつけて Google 先生に尋ねたら、すぐ答えが出てきました。チェコ語版(?)の OpenOffice でした。どうやら、その他コメントもチェコ語のようです...

Používají OpenOffice | LibreOffice

ということは、このライブラリのベースとなるコードは、Excel と OpenOffice で動くようになっているのでしょう。


続いて、コメントの引数の後ろから3個目のコメントを確認すると次の通り記載されています。

0-Code128,1-EAN,2-2of5I,3-Code39,50-Datamatrix,51-QR

Code128、EAN など、これらはすべて、バーコード(2次元に限らず)の種類です。こんな、多種多様なバーコードに対応しているのですね。なかなか高性能なライブラリです。


削除するコードの選定

今回は、話を単純化するために、QR コードだけを対象とします。また、移植の参考とするのは Excel 用のコードだけで十分です。よって、それ以外のコードは削除する方向で進めたいと思います。

QR コードは 51 でした。メインルーチンでそれに関連する部分は次の通りです。

この中で IsMs という変数が出てきます。初期化時に次のコードで値をセットしています。

Sub Init()
   If VarType(Asc("A")) = 2 Then IsMs = True Else IsMs = False
End Sub

OpenOffice の VBA は知らないのですが、Excel では、このコートで IsMs が Ture となるのでしょう。

この結果より、次の関数とその関連機能以外は削除してよいということになります。

  • qr_gen
  • bc_2Dms

これに従いメインルーチンを掃除すると、次のようになります。

' QRCode params: ECLevel 0=M 1=L 2=Q 3=H
s = "mode=" & Mid("MLQH", (params Mod 4) + 1, 1)
s = qr_gen(code, s)

If graficky <> 0 Then
   Call bc_2Dms(s, "QR")
   EncodeBarcode = ""
Else
   EncodeBarcode = s
End If

こうなるとメインルーチンの仕組みが良く見えてきます。

qr_gen 関数は、変数 code の文字列を QR コードの変換を行うメインルーチンで、変換結果を何らかの文字列で返すようです。そして、bc_2Dms 関数がが変換した文字列を QR コードとして作画する関数という役割分担がされていると想定できます。

変数 graficky は、作画するのか、変換した文字列を返すのかを決定するスイッチ的な役割ということですね。


これで、処理に必要な引数や変数も明確になりました。ノーツに移植するにあたり、作画ルーチンも必要ありません。さらに掃除すると、メインルーチンは次の通りとなります。

Public Function EncodeBarcode(code As String, params As Integer) As String
   Dim s As String
   ' QRCode params: ECLevel 0=M 1=L 2=Q 3=H
   s = "mode=" & Mid("MLQH", (params Mod 4) + 1, 1)
   EncodeBarcode = qr_gen(code, s)
End Function


このメインルーチンの掃除で IsMs 変数も無用となりそうです。変数宣言をコメントアウトすると使用箇所がわかります。使用箇所は、先に示した Init 関数と以前修正した AscL 関数だけだったので削除できます。

まず、変数宣言と Init 関数を削除します。次に、AscL 関数の赤字の部分を消去します。

Function AscL(s As String) As Long
   If IsMs Then
      AscL = Uni(s)
   Else
      AscL = Asc(s)
   End If

End Function


他の関数の掃除の仕方

メインルーチンがすっきりしたので、他の関数も掃除しましょう。私が良くやる方法は、関数名を変更し、エラーが出るか確認します。

ただし、関数の戻り値をセットしている場合、そこも修正する必要があります。また、削除する関数からのコールしている場合も修正して、うまくチェックが進むよう注意して作業ください。

結果、次のように削除してよい関数が明確になりました。スクリプトライブラリから削除しましょう。


ちなみに、同様の方で、次の定数も利用されていないことが確認できたので、削除します。


これで、ライブラリがすっきりしました。次回からは、いよいよ動作確認を始めます。

前回 ノーツで QR コード 次回

0 件のコメント:

コメントを投稿