========================================================================== QRコード表示コンポーネント TQRCode QRCode Image Component Version 0.9 Copyright(C) 2005 〜 2009 seizo ========================================================================== 【 概要 】 太田純(Junn Ohta)さんによるパブリックドメインのコード、 QRコード生成プログラムサンプルコード Ver.0.1をもとに QRコード表示コンポーネント TQRCode を作成しました。 このバージョンの TQRCode には、以下の制限事項があります。 ・QRコードモデル2にのみ対応(モデル1には、非対応) ・拡張チャネル解釈(ECI)モードには、非対応 TQRCode は、TImage を継承していますので、TImage に QRコード表示機能 を追加したものという感覚で使用できます。LoadFromFile 等で画像を読み込ん だ後、画像の任意の位置に QRコードを表示するといった事も可能です。 また、ビットマップ形式で描画する場合は、シンボルを90度単位で回転 させたり、回転と組み合わせて反転させて表示する事も可能です。 登録はコンポーネントのインストールで、QRCode.pas を選択して下さい。 【 プロパティ 】 このコンポーネント TQRCode で追加されたプロパティは、以下の通りです。 property Code: String; シンボルを生成する対象となる文字列です。 バイナリデータを含め全てのデータを表現可能です。 (数字、英数字、8ビットバイト、漢字) BinaryOperation が True の時、~ 〜 ~ という記述は、その間に 16進表記でデータが記述されているものと見なします。例えば、 'Hello~0D0A~world !!' という文字列は、改行をはさんだ 'Hello' と 'world !!' という文字列を表わします。 '~' 文字自身を表わす場合は、'~~' と記述します。 property Data[Index: Integer]: Byte; シンボルデータにバイト単位でアクセスする為のプロパティです。 シンボルデータが、通常のテキストデータの場合、Code と Data は、一対一に対応しています。 すなわち、Code[i] = Data[i - 1] (1 <= i <= Len) ここで言うシンボルデータとは、テキストデータ・バイナリデータを 問わず、シンボルを生成する対象となるソースデータの事を指します。 Data は、TQRCode のディフォルトプロパテイです。 property Memory: PChar; シンボルデータが、格納されている領域のポインタを保持するリード オンリィのプロパティ TQRCode は実際には、この領域のデータをQRコードとして表示して います。Data と Memory は常に一対一に対応しています。 すなわち、Data[i] = Memory[i] (0 <= i <= Len - 1) property Len: Integer; Memory に格納されているシンボルデータのサイズを保持するリード オンリィのプロパティ property Binary: Boolean; シンボルデータが、バイナリデータを含む場合に True にセットされる リードオンリィのプロパティ ここで言うバイナリデータとは、00H 〜 1FH 間の 0DH, 0AH, 09H 以外の データの事を指します。 property BinaryOperation: Boolean; Code プロパティ内の ~ 〜 ~ という記述をその間に16進表記でデータ が記述されていると見なすかどうかを決定する為のプロパティ False - Code の内容をそのまま通常のテキストと見なす。(ディフォルト) True - ~ 〜 ~ 表記は、16進表記でデータが記述されていると見なす。 BinaryOperation が True の時に ~ 〜 ~ 内を16進表記としてデータに 変換できない時(エラー)、BinaryOperation は False にセットし直され Code の内容は、そのまま通常のテキストデータと見なされます。 Binary が True にセットされた時、BinaryOperation も自動的に True にセットされます。 BinaryOperation が True の時、'~~' という記述は、'~' 文字自身を 表わします。 ~ 〜 ~ 間に16進表記でデータが記述されている文字列を以後、 「バイナリ表記文字列」と呼ぶ事とします。 property Mode: TQRMode; シンボルデータをいくつかのシンボルに分割して表示する場合の表示モード を指定します。Mode の値によって Count は、以下の様に変化しますので 注意が必要です。 qrSingle - 1 qrConnect - 2..16 qrPlus - 2..1024 TQRMode は、次の様に定義されています。 type TQRMode = (qrSingle, qrConnect, qrPlus); qrSingle - シングルモード(シンボルを1個だけ表示) qrConnect - 連結モード(最大16個までのシンボルを連結構造で表示) qrPlus - プラスモード(最大1024個までの独立したシンボルとして分割表示) property Count: Integer; シンボルデータをいくつかのシンボルに分割して表示する場合の表示個数 を指定します。Count の値によって Mode は、以下の様に変化しますので 注意が必要です。 1 - qrSingle(常にシングルモード) 2..16 - qrConnect or qrPlus(連結モードあるいはプラスモード) 17..1024 - qrPlus(常にプラスモード) 各モードでのシンボルの最大表示個数は、次の様に定義されています。 const QR_CNN_MAX = 16; // 連結モードでのシンボルの最大表示個数 QR_PLS_MAX = 1024; // プラスモードでのシンボルの最大表示個数 property Column: Integer; シンボルデータをいくつかのシンボルに分割して表示する場合に 1行当たりに表示するシンボルの最大個数を指定します。 Column の指定範囲は、1..QR_PLS_MAX (1..1024) です。 property Offset[Index: Integer]: Integer; シンボルデータをいくつかのシンボルに分割して表示する場合の各データ の Memory 内でのオフセット値を保持するリードオンリィのプロパティです。 0 <= Index <= Count で常に Offset[0] = 0, Offset[Count] = Lenです。 例えば、n 番目のデータは、 Memory[Offset[n - 1]] 〜 Memory[Offset[n] - 1] で (Data[Offset[n - 1]] 〜 Data[Offset[n] - 1] と同じ) そのサイズは、Offset[n] - Offset[n - 1] バイトとなります。 (ただし、Len = 0 の場合は、上記の様なデータエリア自体存在しません。) property Parity: Integer; 連結モードの場合に使用するシンボルデータのパリティ値を保持する リードオンリィのプロパティです。連結モード以外の場合、この値は 意味を持ちません。 property Numbering: TNumbering; シンボルデータをいくつかのシンボルに分割して表示する場合に コメント部分に付加して表示する順番号の表示方法を指定します。 TNumbering は、次の様に定義されています。 type TNumbering = (nbrNone, nbrHead, nbrTail, nbrIfVoid); nbrNone - 順番号を付加しない。 nbrHead - コメントの前の部分に順番号を付加する。 nbrTail - コメントの後の部分に順番号を付加する。 nbrIfVoid - コメントが空文字('')の場合のみ順番号を付加する。 property CommentUp: String; 個々のシンボルの上部に表示するコメント文字列 コメント文字列は余白の範囲内に表示されます。 property CommentUpLoc: TLocation; 個々のシンボル上部に表示するコメント文字列の表示方法を指定します。 TLocation は、次の様に定義されています。 type TLocation = (locLeft, locCenter, locRight); locLeft - 左詰で表示する locCenter - 中央に表示する locRight - 右詰で表示する property CommentDown: String; 個々のシンボルの下部に表示するコメント文字列 コメント文字列は余白の範囲内に表示されます。 property CommentDownLoc: TLocation; 個々のシンボル下部に表示するコメント文字列の表示方法を指定します。 TLocation は、次の様に定義されています。 type TLocation = (locLeft, locCenter, locRight); locLeft - 左詰で表示する locCenter - 中央に表示する locRight - 右詰で表示する property SymbolWidth: Integer; クワイエットゾーンも含めた個々のシンボルの幅を保持するリードオンリイ のプロパティ property SymbolWidthS: Integer; 余白までも含めた個々のシンボルの幅を保持するリードオンリイのプロパティ property SymbolWidthA: Integer; シンボル領域全体の幅を保持するリードオンリイのプロパティです。 この大きさは、そのときの Count と Column の値によって決定されます。 property SymbolHeight: Integer; クワイエットゾーンも含めた個々のシンボルの高さを保持するリードオンリイ のプロパティ property SymbolHeightS: Integer; 余白までも含めた個々のシンボルの高さを保持するリードオンリイのプロパティ property SymbolHeightrA: Integer; シンボル領域全体の高さを保持するリードオンリイのプロパティです。 この大きさは、そのときの Count と Column の値によって決定されます。 property QuietZone: Integer; 個々のシンボルのクワイエットゾーンの大きさを保持するリードオンリイ のプロパティ property SymbolLeft: Integer; 描画するシンボル全体の Canvas 上の 左上の X 座標を指定します。 property SymbolTop: Integer; 描画するシンボル全体の Canvas 上の 左上の Y 座標を指定します。 property SymbolSpaceUp: Integer; 描画する個々のシンボルの上方向の余白のサイズを指定します。 余白は、クワイエットゾーンの外側に設定されます。 property SymbolSpaceDown: Integer; 描画する個々のシンボルの下方向の余白のサイズを指定します。 余白は、クワイエットゾーンの外側に設定されます。 property SymbolSpaceLeft: Integer; 描画する個々のシンボルの左方向の余白のサイズを指定します。 余白は、クワイエットゾーンの外側に設定されます。 property SymbolSpaceRight: Integer; 描画する個々のシンボルの右方向の余白のサイズを指定します。 余白は、クワイエットゾーンの外側に設定されます。 property Version: Integer; 描画するシンボルの型番を指定します。(1 〜 40) { サイズ定数 } QR_VER_MAX = 40; // 型番の最大値 property Emode: Integer; 描画するシンボルの符号化モードを指定します。(-1 〜 3) -1 の場合は自動判定します。- ディフォルト { 符号化モード } QR_EM_NUMERIC = 0; // 数字 QR_EM_ALNUM = 1; // 英数字: 0-9 A-Z SP $%*+-./: QR_EM_8BIT = 2; // 8ビットバイト QR_EM_KANJI = 3; // 漢字 QR_EM_MAX = 4; // モード総数 property EmodeR: Integer; Emode が -1(自動判定)の場合に最後に適用された実際の符号化モード の値を保持するリードオンリイのプロパティ property Eclevel: Integer; 描画するシンボルの誤り訂正レベルを指定します。(0 〜 3) { 誤り訂正レベル } QR_ECL_L = 0; // レベルL QR_ECL_M = 1; // レベルM QR_ECL_Q = 2; // レベルQ QR_ECL_H = 3; // レベルH QR_ECL_MAX = 4; // レベル総数 property Masktype: Integer; 描画するシンボルのマスクパターン種別を指定します。(-1 〜 7) -1 の場合は自動設定します。- ディフォルト { サイズ定数 } QR_MPT_MAX = 8; // マスクパターン種別総数 property MasktypeR: Integer; Masktype が -1(自動設定)の場合、実際に適用されたマスクパターン 種別の値を保持するリードオンリイのプロパティ property Capacity: Integer; 現在の設定で表示可能な最大文字数を返します。この値は、現在の Version(型番)、Eclevel(誤り訂正レベル)、Emode(符号化モード)及び Count(シンボルの表示個数)の各値に依存します。ただし、Emode が -1(自動判定)の場合は、おおよその目安として 最後に適用された実際 の符号化モード EmodeR の値を適用します。さらに EmodeR の値も -1 の場合は、英数字モード(QR_EM_ALNUM = 1)の場合の値を返します。 Emode の値が明確に指定されていない限りこのプロパティの値は、 おおよその目安として下さい。各モードでの表示可能な最大文字数は、 以下の通りです。 シングルモード - QR_SRC_MAX = 7089 文字(約7KB) 連結モード - QR_SRC_MAX * QR_CNN_MAX = 7089 * 16 = 113424 文字(約110KB) プラスモード - QR_SRC_MAX * QR_PLS_MAX = 7089 * 1024 = 7259136 文字(約7MB) property Pxmag: Integer; 描画するシンボルの表示画素倍率を指定します。(1 〜 10) property Angle: Integer; SymbolPicture = picBMP の時、すなわちビットマップ形式で描画する 場合は、シンボルを90度単位で回転させて表示する事が出来ます。 Angle は、0, 90, 180, 270 いずれかの値を取ります。 property Reverse: Boolean; SymbolPicture = picBMP の時、すなわちビットマップ形式で描画する 場合は、シンボルを反転させて表示する事が出来ます。この反転は、 回転と組み合わせての反転が可能です。すなわち90度回転させた状態 のものをさらに反転もさせるという様な事が可能です。 property PBM: TStringList; ポータブルビットマップ(PBM)形式のシンボルを返すリードオンリイ のプロパティ property Match: Boolean; シンボル描画時にコントロールのサイズをシンボル全体のサイズに 合わせるかどうかを指定します。コントロール上にシンボルのみ を表示する場合は、このプロパティを True にして下さい。 property ComFont: TFont; 上下に表示するコメント文字列のフォントを指定します。 property Transparent: Boolean; シンボルの背景色を透過色にするかどうかのスイッチ True=透過色にする、False=背景色で描く property SymbolColor: TColor; 描画するシンボルの色 property BackColor: TColor; 描画するシンボルの背景色 property SymbolPicture: TPictures; シンボルの描画方法及びクリップボードへのコピー方法を指定します。 TPictures は、次の様に定義されています。 type TPictures = (picBMP, picEMF, picWMF); picBMP - ビットマップ形式で描画 (コピーは、ビットマップ形式で) picEMF - EMF形式で描画 (コピーは、EMF形式で) picWMF - EMF形式で描画 (コピーは、WMF形式で) property SymbolEnabled: Boolean; シンボル表示を可能にするかどうかのスイッチ True=シンボル表示をする、False=シンボル表示を禁止する property SymbolDebug: Boolean; Code 等、与えられたプロパティで表示可能かどうかチェックする場合に使う スイッチです。このプロパティを True にすると、実際のシンボル表示は行な わず、与えられたプロパティで表示可能かどうかチェックして SymbolDisped プロパティの値のみをセットします。 True=デバッグモードにする、False=デバッグモードを解除する property SymbolDisped: Boolean; シンボルの描画に成功した時に True セットされるリードオンリイの プロパティです。 property ClearOption: Boolean; シンボルの描画に失敗した時、すなわち SymbolDisped プロパティが False に なった時、Canvas をクリアーするかどうかを指定するスイッチです。 SymbolDebug プロパティが True の場合、このスイッチは無効となります。 (ディフォルトは、False) property ClipWatch: Boolean; クリップボードにテキストデータがコピーされた時に Code プロパティを 自動的に更新するかどうかを指定する為のスイッチです。 (クリップボード監視機能、ディフォルトは、False) ※Match プロパティとTransparent プロパティを同時に True にする事 は出来ません。 両プロパティは、互いに排他的関係にあります。(ソース参照) ※SymbolPictureプロパティは、Match プロパティが True の場合のみ picEMF 及び picWMF に設定する事が可能です。(ソース参照) ※SymbolPictureプロパティが、picEMF, picWMF いずれの場合でもコントロール への表示は、EMF形式で行なわれます。コピー方法の違いを指定するために これらの定数が設けられています。(ソース参照) 【 メソッド 】 このコンポーネント TQRCode で追加されたメソッドは、以下の通りです。 procedure Clear; 現在 Picture が、保持しているグラフイックデータを破棄して Canvas を クリアーするメソッドです。 Clear メソッドを呼ぶと SymbolDisped プロパティは False に設定されます。 procedure CopyToClipboard; 現在、Picture プロパティが保持しているグラフィックイメージを クリップボードへコピーします。(すなわち現在、コントロールに 表示されているグラフィックイメージ)実際には、以下の様にコピーします。 ・ビットマップ形式でコピー (SymbolDisped = True) で (SymbolPicture = picBMP) のとき ・EMF(Win32 エンハンスドメタファイル)形式でコピー (SymbolDisped = True) で (SymbolPicture = picEMF) のとき ・WMF(Win16 形式メタファイル)形式でコピー (SymbolDisped = True) で (SymbolPicture = picWMF) のとき ・その他の形式でコピー (SymbolDisped = False) のとき まだ一度もシンボルを表示していないか、表示に失敗した場合は、 SymbolDisped = False となります。この場合、Bitmap や Metafile あるいはそれ以外の形式で画像が表示されている可能性もあるので 可能な限りコピーを試みます。 procedure PasteFromClipboard; 現在クリップボードにあるテキストデータでシンボルを描画する メソッドです。 procedure RepaintSymbol; 現在のプロパティの値でシンボルを再描画するメソッドです。 シンボルの上に何か図形を描いた後でシンボルを再描画する 場合等に使用します。 procedure LoadFromFile(const FileName: String); ファイルをロードしてその内容をQRコードとして描画するメソッドです。 ファイルのロードに成功しても常にファイルの内容をQRコードとして描画 出来るとは限りませんので注意が必要です。} procedure SaveToFile(const FileName: String); シンボルデータの内容をファイルとして保存するメソッドです。必ずしも シンボルデータの内容をQRコードとして表示している場合とは限りません。 procedure LoadFromMemory(const Ptr: Pointer; Count: Integer); メモリの内容を Count バイト分シンボルデータ領域へコピーしてQRコード として描画するメソッドです。メモリの内容を常にQRコードとして描画出来る とは限りませんので注意が必要です。 【 イベント 】 このコンポーネント TQRCode で追加されたイベントは、以下の通りです。 property OnChangeCode: TNotifyWatchEvent; Code プロパティが変更される直前に発生するイベントです。 property OnPaintSymbol: TNotifyWatchEvent; シンボルを描画する直前に発生するイベントです。 property OnPaintedSymbol: TNotifyWatchEvent; シンボルを描画した直後に発生するイベントです。 property OnChangedCode: TNotifyWatchEvent; Code プロパティが変更された直後に発生するイベントです。 ※TNotifyWatchEvent は、以下の様に定義されています。引数 Watch は、 ClipWatch プロパティが True の時、クリップボードにテキストデータが コピーされ、Code プロパティが自動的に更新された時のみ True に なります。引数 Watch を調べる事によりクリップボード監視機能で Code プロパティが自動的に更新された結果発生したイベントであるか どうかをチェックする事が出来ます。 type TNotifyWatchEvent = procedure(Sender: TObject; Watch: Boolean) of object; ※Code プロパティを変更しようとすると、 OnChangeCode // この間で、Code プロパティが変更されます。 OnPaintSymbol // この間で、シンボルが描画されます。 OnPaintedSymbol OnChangedCode の順で各イベントが発生します。 【 使用方法 】 複数のプロパティを設定する場合、一つ設定する度にシンボルを再表示して 画面がちらつきます。この様な事を避ける為には SymbolEnabled プロパティを 先頭で False に設定し、他の全てのプロパティを設定し終えたところで 最後に SymbolEnabled プロパティを True にして下さい。 【 具体例1 】Transparent, Match 両プロパティともに False の場合 (既存の画像の上にシンボルを上描きします。) ・ ・ QRCode1.SymbolEnabled := False; // シンボル表示を一時的に禁止します。 QRCode1.Picture.LoadFromFile(FileName); // 画像をロード QRCode1.Pxmag := 2; // 倍率を2に指定 QRCode1.Transparent := False; QRCode1.Match := False; QRCode1.SymbolColor := clBlack; // シンボルの色を黒色に指定 QRCode1.BackColor := clWhite; // シンボルの背景色を白色に指定 QRCode1.SymbolLeft := 0; // シンボルの表示位置を指定(X座標) QRCode1.SymbolTop := 0; // シンボルの表示位置を指定(Y座標) QRCode1.Code := '4940125'; // Code プロパティに文字列をセット QRCode1.SymbolEnabled := True; // この時点でシンボルを表示します。 // 描画に成功した場合は、SymbolDisped プロパティが True にセットされます。 ・ ・ ※この具体例1の様にすると既存の画像の上にシンボルを上描きします。 ※この例が最も一般的な使用方法と考えられます。 【 具体例2 】Transparent = True の場合 (シンボルの背景色を透過色にする場合) ・ ・ QRCode1.SymbolEnabled := False; // シンボル表示を一時的に禁止します。 QRCode1.Picture.LoadFromFile(FileName); // 画像をロード QRCode1.Pxmag := 2; // 倍率を2に指定 QRCode1.Transparent := True; // 背景色を透過色にする。 QRCode1.SymbolColor := clBlack; // シンボルの色を黒色に指定 QRCode1.SymbolLeft := 0; // シンボルの表示位置を指定(X座標) QRCode1.SymbolTop := 0; // シンボルの表示位置を指定(Y座標) QRCode1.Code := '4940125'; // Code プロパティに文字列をセット QRCode1.SymbolEnabled := True; // この時点でシンボルを表示します。 // 描画に成功した場合は、SymbolDisped プロパティが True にセットされます。 ・ ・ ※この具体例2の様にすると既存の画像の上にシンボルを描きます。 (シンボルの背景色は、透過色になります。) ※Transparent プロパティを True にすると同時に Match プロパティは、 False になりますので Match プロパティをセットする必要はありません。 両プロパティは、互いに排他的関係にあります。(ソース参照) 【 具体例3 】Match = True の場合 (シンボルのみ表示して、コントロールのサイズを シンボルのサイズに合わせる場合) ・ ・ QRCode1.SymbolEnabled := False; // シンボル表示を一時的に禁止します。 QRCode1.Pxmag := 2; // 倍率を2に指定 QRCode1.Match := True; // シンボルのサイズに合わせて表示する。 QRCode1.SymbolPicture := picEMF; // メタファイル(EMF)表示を選択 QRCode1.SymbolColor := clBlack; // シンボルの色を黒色に指定 QRCode1.BackColor := clWhite; // シンボルの背景色を白色に指定 QRCode1.SymbolLeft := 0; // シンボルの表示位置を指定(X座標) QRCode1.SymbolTop := 0; // シンボルの表示位置を指定(Y座標) QRCode1.Code := '4940125'; // Code プロパティに文字列をセット QRCode1.SymbolEnabled := True; // この時点でシンボルを表示します。 // 描画に成功した場合は、SymbolDisped プロパティが True にセットされます。 ・ ・ ※この具体例3の様にするとシンボル描画時にコントロールのサイズを シンボルのサイズに合わせます。コントロール上にシンボルのみを 表示する場合は、この様にして下さい。 ※Match プロパティを True にすると同時に Transparent プロパティは、 False になりますので Transparent プロパティをセットする必要は ありません。両プロパティは、互いに排他的関係にあります。(ソース参照) ※Match プロパティが True の場合のみメタファィル形式での描画を選択 出来ます。(picEMF 及び picWMF) これ以外の場合は、ビットマップ 形式のみの描画となります。 【 具体例4 】プロパティの変更 一度シンボルを表示した後は、何かプロパティを一つでも変更すると 直ちに再描画を行ないます。例えば、具体例3のコードの後に ・ ・ QRCode1.Pxmag := 3; // 倍率を3に指定 ・ ・ と記述すると、今度は、3倍の倍率でシンボルを表示します。 ※これは、プロパティというものの性格上当然の事ではありますが、 【 具体例5 】クリップボードへのコピー CopyToClipboard メソッドを呼び出すと、現在 Picture が保持している 画像データをクリップボードへコピーします。例えば、具体例3のコード の後に ・ ・ if QRCode1.SymbolDisped = True then // シンボルが表示されている事を確認 QRCode1.CopyToClipboard; // クリップボードへコピー ・ ・ と記述すると、EMF(Win32 エンハンスドメタファイル)形式でクリップボードへ コピーします。 ※WMF(Win16 形式メタファイル)形式でコピーする場合は、具体例3の中で ・ QRCode1.SymbolPicture := picWMF; ・ として下さい。 ※SymbolPicture が picBMP の場合は、ビットマップ形式でシンボルが 表示されます。 【 具体例6 】クイックレポートでの使用 TQRCode そのものはクイックレポート対応していませんが、以下の様な方法を 用いればクイックレポートでの使用は可能です。 TQRCode で目的のシンポルを表示した後、TQRCode の Picture プロパティ の値を TQRImage の Picture にコピーするだけです。 例えば、フォーム上に QuickRep1: TQuickRep; QRImage1: TQRImage; QRCode1: TQRCode; Edit1: TEdit; // シンボル変換文字列入力用 Button1: TButton; // プレビューするためのボタン を配置して、Button1 の OnClick イベントで ・ ・ procedure TForm1.Button1Click(Sender: TObject); begin QRCode1.Code := Edit1.Text; // シンボルを表示 QRImage1.Picture.Assign(QRCode1.Picture); // シンボルイメージをコピー QuickRep1.Preview; end; ・ ・ 【 テクニカル情報 】 ここでは、TQRCode 使用上の技術的な面を解説します。 1)メタファイル形式でシンボルが表示されている時に TQRCode の Canvas にアクセスすると、 「ビットマップが有効でないとイメージの変更は出来ません。」 というメッセージが出てエラーとなります。 これは、TQRCode で Picture.Metafile が有効な場合は、Picture.Bitmap が無効となり、逆に Picture.Bitmap が有効な場合は、Picture.Metafile が無効となる為です。TImage の場合もそうですが、Canvas にアクセス出来る のは Picture.Bitmap が有効な場合だけです。 Picture.Bitmap を有効にして再び Canvas にアクセス出来る様にする為に は何らかの方法で Picture.Bitmap にアクセスするだけです。 これで Picture.Bitmap が有効になり再び TQRCode の Canvas にアクセス 出来る様になります。(但し、当然の事ながらこの時点で Picture.Metafile のデータは、破棄されてしまいますが) 例えば、メタファイル形式でシンボルが表示されている時に、 QRCode1.Picture.Bitmap.Width := QRCode1.Width; ・ ・ あるいは、 if QRCode1.Picture.Bitmap.Empty = True then begin ・ ・ end; の様にすれば、以後 TQRCode の Canvas にアクセス出来る様になります。 2)OnPaintedSymbol イベント これは、シンボルを表示した直後に発生するイベントです。 そのイベントハンドラ内で SymbolDisped プロパティが、True であれば シンボルの描画に成功したという事です。また、イベントハンドラの 引数 Watch が、True であればクリップボードからテキストデータが ペーストされた結果発生したイベントであるという事になります。 TQRCode には、この他に OnPaintSymbol, OnChangeCode, OnChangedCode の各イベントがあります。必要に応じてこれらのイベントを使って 下さい。 3)SymbolDebug プロパティ このプロパティを使うと与えられた各プロパティ値で表示可能かどうか 実際の表示前にチェックする事が可能です。 4)Angle プロパティ このプロパティを使うとシンボルを90度単位で回転させて表示する事が 出来ますが、回転の前後で SymbolLeft, SymbolTop, SymbolWidth, SymbolWidthS, SymbolWidthA, SymbolHeight, SymbolHeightS, SymbolHeightA これらのプロパティ値は、変化しませんのでご注意下さい。 たとえ回転させてもこれらのプロパティは、回転前の値を保持し続ける 様な仕様にしてあります。 【 新しくなった点 】 // Version 0.2 // ・上下左右の余白のサイズを指定出来る様になりました。 余白は、クワイエットゾーンの外側に設定されます。 ・シンボルの上下にコメントを表示することが出来る様になりました。 このコメント文字列は余白の範囲内に表示されます。 CommentUp, CommentUpLoc プロパティで、シンボル上部のコメント文字列 と表示方法を、CommentDown, CommentDownLoc プロパティで、シンボル 下部のコメント文字列と表示方法を指定します。 またこのコメント文字列のフォントを指定する事も出来ます。 ・Capacity プロパティを追加しました。 現在の設定で表示可能な最大文字数を返します。この値は、現在の Version(型番)、Eclevel(誤り訂正レベル)、Emode(符号化モード) の値に依存します。ただし、Emode が -1(自動判定)の場合は、おお よその目安として 最後に適用された実際の符号化モード EmodeR の 値を適用します。さらに EmodeR の値も -1 の場合は、英数字モード (QR_EM_ALNUM = 1)の場合の値を返します。Emode の値が明確に指定 されていない限りこのプロパティの値は、おおよその目安として下さい。 ・ClipWatch プロパティを追加しました。 クリップボードにテキストデータがコピーされた時に Code プロパティを 自動的に更新するかどうかを指定する為のスイッチです。 (クリップボード監視機能、ディフォルトは、False) // Version 0.3 // ・このバージョンでは、特にバイナリデータに対するインターフェイスを 強化しました。以下のプロパティやメソッドを使用すればバイナリデータ を簡単に扱う事が出来ます。以後、テキストデータ・バイナリデータを 問わず、シンボルを生成する対象となるソースデータの事をシンボル データと記します。 property Code: String; シンボルを生成する対象となる文字列です。バイナリデータを含め 全てのデータを表現可能です。BinaryOperation が True の時、 ~ 〜 ~ という記述は、その間に16進表記でデータが記述されている ものと見なします。 property Data[Index: Integer]: Byte; シンボルデータにバイト単位でアクセスする為のプロパティです。 Data は、TQRCode のディフォルトプロパテイです。 property Memory: PChar; シンボルデータが、格納されている領域のポインタを保持するリード オンリィのプロパティです。 property Len: Integer; Memory に格納されているシンボルデータのサイズを保持するリード オンリィのプロパティです。 property Binary: Boolean; シンボルデータが、バイナリデータを含む場合に True にセットされる リードオンリィのプロパティです。 property BinaryOperation: Boolean; Code プロパティ内の ~ 〜 ~ という記述をその間に16進表記でデータ が記述されていると見なすかどうかを決定する為のプロパティです。 ~ 〜 ~ 間に16進表記でデータが記述されている文字列を以後、 「バイナリ表記文字列」と記します。 procedure LoadFromFile(const FileName: String); ファイルをロードしてその内容をQRコードとして描画するメソッドです。 procedure SaveToFile(const FileName: String); 実際にQRコードとして表示しているシンボルデータの内容をファイル として保存するメソッドです。 procedure LoadFromMemory(const Ptr: Pointer; Count: Integer); メモリの内容を Count バイト分QRコードとして描画するメソッドです。 ・OnPaintSymbol イベントと OnPaintedSymbol イベントを従来の TNotifyEvent から TNotifyWatchEvent に変更しました。 ・OnChangeCode イベントと OnChangedCode イベント(TNotifyWatchEvent) を新しく追加しました。TNotifyWatchEvent は、 type TNotifyWatchEvent = procedure(Sender: TObject; Watch: Boolean) of object; の様に定義されています。引数 Watch は、ClipWatch プロパティが True の時、クリップボードにテキストデータがコピーされ、Code プロパティが自動的に更新された時のみ True になります。 ・property SymbolPicture を TSymbolPictures から TPictures に変更 しました。TPictures は、次の様に定義されています。 type TPictures = (picBMP, picEMF, picWMF); ・property CommentUpLoc と property CommentDownLoc を TLocations から TLOcation に変更しました。TLOcation は、次の様に定義されています。 type TLocation = (locLeft, locCenter, locRight); // Version 0.4 // ・このバージョンでは、バグ修正の爛でも詳しく説明していますが、符号化 モード Emode が正しく機能していなかった点を修正しています。 // Version 0.5 // ・シンボルの連結モードに対応しました。最大16個までのQRコードシンボルを 連結構造で連結する事が出来ます。 ・シンボルのプラスモードを新たに設けました。任意のデータを最大1024個まで の各々独立したQRコードシンボルとして分割して表示する事が出来ます。 これにより、一度に大容量のデータをQRコード化する事が可能となりました。 (最大約 7 MBytes) 連結モードでもプラスモードでもないモード、すなわち従来からのQRコード シンボルを1個だけ表示するモードを、以後シングルモードと表記します。 このバージョンでは、シンボルの連結モードとプラスモードを実現する為に 以下のプロパティを新たに設けました。 property Mode: TQRMode; 一つのデータをいくつかのシンボルに分割して表示する場合の表示モード を指定します。Mode の値によって Count は、以下の様に変化しますので 注意が必要です。 qrSingle - 1 qrConnect - 2..16 qrPlus - 2..1024 TQRMode は、次の様に定義されています。 type TQRMode = (qrSingle, qrConnect, qrPlus); qrSingle - シングルモード(シンボルを1個だけ表示) qrConnect - 連結モード(最大16個までのシンボルを連結構造で表示) qrPlus - プラスモード(最大1024個までの独立したシンボルとして分割表示) property Count: Integer; 一つのデータをいくつかのシンボルに分割して表示する場合の表示個数 を指定します。Count の値によって Mode は、以下の様に変化しますので 注意が必要です。 1 - qrSingle(常にシングルモード) 2..16 - qrConnect or qrPlus(連結モードあるいはプラスモード) 17..1024 - qrPlus(常にプラスモード) 各モードでのシンボルの最大表示個数は、次の様に定義されています。 const QR_CNN_MAX = 16; // 連結モードでのシンボルの最大表示個数 QR_PLS_MAX = 1024; // プラスモードでのシンボルの最大表示個数 property Column: Integer; 一つのデータをいくつかのシンボルに分割して表示する場合に 1行当たりに表示するシンボルの最大個数を指定します。 Column の指定範囲は、1..QR_PLS_MAX (1..1024) です。 property Offset[Index: Integer]: Integer; シンボルデータをいくつかのシンボルに分割して表示する場合の各データ の Memory 内でのオフセット値を保持するリードオンリィのプロパティです。 0 <= Index <= Count で常に Offset[0] = 0, Offset[Count] = Lenです。 例えば、n 番目のデータは、 Memory[Offset[n - 1]] 〜 Memory[Offset[n] - 1] で (Data[Offset[n - 1]] 〜 Data[Offset[n] - 1] と同じ) そのサイズは、Offset[n] - Offset[n - 1] バイトとなります。 (ただし、Len = 0 の場合は、上記の様なデータエリア自体存在しません。) property Parity: Integer; 連結モードの場合に使用するシンボルデータのパリティ値を保持する リードオンリィのプロパティです。連結モード以外の場合、この値は 意味を持ちません。 property SymbolWidthS: Integer; 余白までも含めた個々のシンボルの幅を保持するリードオンリイのプロパティ property SymbolWidthA: Integer; シンボルの描画に関係する領域全体の幅を保持するリードオンリイの プロパティです。この大きさは、そのときの Count と Column の値に よって決定されます。Match が True のときコントロールはこの大きさ に設定されます。 property SymbolHeightS: Integer; 余白までも含めた個々のシンボルの高さを保持するリードオンリイのプロパティ property SymbolHeightrA: Integer; シンボルの描画に関係する領域全体の高さを保持するリードオンリイの プロパティです。この大きさは、そのときの Count と Column の値に よって決定されます。Match が True のときコントロールはこの大きさ に設定されます。 // Version 0.6 // ・このバージョンでは、バグ修正のみを行なっています。 Len = 0 のとき Capacity の値を得ようとするとハングする点を修正しました。 // Version 0.7 // ・Numbering プロパティを追加しました。 シンボルデータをいくつかのシンボルに分割して表示する場合に コメント部分に付加して表示する順番号の表示方法を指定します。 ・Angle プロパティを追加しました。 SymbolPicture = picBMP の時、すなわちビットマップ形式で描画する 場合は、シンボルを90度単位で回転させて表示する事が出来ます。 Angle は、0, 90, 180, 270 いずれかの値を取ります。 ・SymbolWidthA プロパティと SymbolHeightrA プロパティをシンボル領域全体の 大きさを返す様に変更しました。従って Match が True の時、コントロールの サイズは、(SymbolLeft + SymbolWidthA)×(SymbolTop + SymbolHeightA) と なります。 // Version 0.8 // ・Reverse プロパティを追加しました。 SymbolPicture = picBMP の時、すなわちビットマップ形式で描画する 場合は、シンボルを反転させて表示する事が出来ます。この反転は、 回転と組み合わせての反転が可能です。すなわち90度回転させた状態 のものをさらに反転もさせるという様な事が可能です。 【 バグ修正 】 // Version 0.2 // ・PasteFromClipboard メソッドが機能しなかった点を修正 // Version 0.4 // ・符号化モード Emode が指定されている(自動判定でない)場合に符号化可能 なサイズをチェックしていなかった点を修正 ・符号化モード Emode が -1 (自動判定)の場合、どの符号化モードで何バイト 符号化すべきかを判定する際に2バイトコードの2バイト目をチェックして いなかった点を修正 // Version 0.6 // ・Len = 0 のとき Capacity の値を得ようとするとハングする点を修正 // Version 0.8 // ・IDE 上で Code プロパティに値を設定してから、プロジェクトの保存をしよう とするとIDE がハングする点を修正しました。ただしこの修正は、暫定的な もので、IDE がハングしない様にしたという点に留まっています。このとき コントロール上には暫定的に Code プロパティに何もデータがない状態での QR コードを表示する様にしています。もちろんアプリケーション上で動作中 には、本来の QR コードを表示します。メモリマネージャー関係のバグと思 われますが、現在原因を解析中です。 // Version 0.9 // ・画面の色数が 16 bit Color で、ビットマップ形式でシンボルを描画している 時にシンボルの回転や反転をしようとするとハングする点を修正 【 謝辞 】 このプログラムの主要部分は、太田純(Junn Ohta)さんの QRコード生成プログラムサンプルコード Ver.0.1 に依存しています。 メタファイル関係では、M&Iさんのコードを使用させて頂き、また多大の ご協力を頂いています。 クリップボード監視機能では、ぜえたさんの TClipboardWatcher のコード を参考にして、ClipWatch プロパティを追加しました。 太田純(Junn Ohta)さん、M&Iさん、ぜえたさん、有難うございました。 【 著作権 】 このプログラムは、太田純(Junn Ohta)さんによるパブリックドメイン のコード、QRコード生成プログラムサンプルコード Ver.0.1をもとに 作成されています。 このプログラムのコンポーネント部分ならびに太田純(Junn Ohta)さん のコードの C から Pascal への翻訳作業に関する部分につきましては、 seizo が著作権を有します。 【 ソフトウェア種別 】 このプログラムはフリーソフトウェアです。以下の事項を御承諾頂ければ、 自由にコピー、使用、配布を行なって頂いて構いません。 ◎このプログラムを使用した上でのいかなる損害、損失にも当方は一切 責任を負いません。このプログラムの使用は、使用者の責任において 行なって下さい。 ◎このプログラムを配布される場合は、このドキュメントファイルも含め 全てのファイルをオリジナルの状態で配布して下さい。 【 その他 】 まだまだ、改良の余地はたくさんあると思います。バグや感想、「ここは、 こうした方が良いのではないか?」等のご意見がありましたらメールで 御連絡下さい。 ※太田純(Junn Ohta)さんにメールを送られる場合は、必ず同時に seizo にもメールを御送り下さいます様お願い致します。 ◎太田純(Junn Ohta)さんの連絡先 e-mail : ohta@sdg.mdd.ricoh.co.jp 紹介ページ : http://www.vector.co.jp/vpack/browse/person/an000022.html ◎seizoの連絡先 e-mail : seizo@mars.dti.ne.jp 紹介ページ : http://www.vector.co.jp/vpack/browse/person/an003597.html seizo NIFTY : SGQ02732 e-mail : seizo@mars.dti.ne.jp