========================================================================== バーコード表示コンポーネント TBarImage Barcode Image Component Version 2.0 Copyright(C) 2001 〜 2011 DEKO M&I seizo ========================================================================== 【 概要 】 DEKOさんのバーコード生成ユニット ver0.70 (BCODE_07.LZH) (ITF部分についてはM&Iさん)をもとにバーコード表示コンポーネント TBarImage を作成しました。 TBarImage で表示可能なバーコードの種類は以下の12種類です。 ・JAN(EAN)/短縮 ・UPC-A/UPC-E ・CODE-39 ・NW-7(CODABAR) ・ITF(Interleav 2of5) ・CTF(Code 2of5 | Industrial 2of5) ・IATA(IATA 2of5) ・MATRIX(Matrix 2of5) ・NEC(NEC 2of5 | COOP 2of5) ・カスタマーバーコード ・CODE-128 ・CODE-93 TBarImage は、TImage を継承していますので、TImage にバーコード表示機能 を追加したものという感覚で使用できます。LoadFromFile 等で画像を読み込ん だ後、画像の任意の位置にバーコードを表示するといった事も可能です。また、 ビットマップ形式で描画する場合は、バーコードを90度単位で回転させたり、 回転と組み合わせて反転させて表示する事も可能です。 登録はコンポーネントのインストールで、BarImage.pas を選択して下さい。 【 プロパティ 】 このコンポーネント TBarImage で追加されたプロパティは、以下の通りです。 property BarType: TBarTypes; バーコードの種類を指定します。 TBarTypes は、次の様に定義されています。 type TBarTypes = (cbarJAN, cbarUPC, cbarCODE39, cbarNW7, cbarITF, cbarCTF, cbarIATA, cbarMATRIX, cbarNEC, cbarCUSTOMER, cbarCODE128, cbarCODE93); property Code: String; バーコードを生成するための文字列です。チェックデジットは入力する必要は ありません。自動生成します。ただし UPC-E の場合、先頭の文字は、0 に 固定されています。 JAN - 数値のみ(0〜9)。文字列長で通常/短縮を判別。(12桁/7桁) UPC - 数値のみ(0〜9)。文字列長でA/Eを判別。(11桁/7桁) CODE-39 - 0〜9、A〜Z、幾つかの記号(ソース参照) NW-7 - 0〜9、幾つかの記号(ソース参照) ITF - 数値のみ(0〜9) CTF - 数値のみ(0〜9) IATA - 数値のみ(0〜9) MATRIX - 数値のみ(0〜9) NEC - 数値のみ(0〜9) CUSTOMER - 0〜9、A〜Z及び- (郵便番号7桁 + 住所表示番号13桁) CODE-128 - 英数字及び記号 CODE-93 - 0〜9、A〜Z、幾つかの記号(ソース参照) 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 StartChar: Char; スタートキャラクタに使用するキャラクタ JAN - 使用しない UPC - 使用しない CODE-39 - '*'固定 NW-7 - 'A'〜'D' ITF - 使用しない CTF - 使用しない IATA - 使用しない MATRIX - 使用しない NEC - 使用しない CUSTOMER - 使用しない CODE-128 - 'A'〜'C'(キャラクタセット) CODE-93 - '('固定 property StopChar: Char; ストップキャラクタに使用するキャラクタ JAN - 使用しない UPC - 使用しない CODE-39 - '*'固定 NW-7 - 'A'〜'D' ITF - 使用しない CTF - 使用しない IATA - 使用しない MATRIX - 使用しない NEC - 使用しない CUSTOMER - 使用しない CODE-128 - 使用しない CODE-93 - ')'固定 property CD: Boolean; チェックデジットの有無 JAN - 必ず使用する UPC - 必ず使用する CODE-39 - True=使用、False=使用しない NW-7 - True=使用、False=使用しない ITF - True=使用、False=使用しない CTF - True=使用、False=使用しない IATA - 必ず使用する MATRIX - True=使用、False=使用しない NEC - True=使用、False=使用しない CUSTOMER - 必ず使用する CODE-128 - 必ず使用する CODE-93 - 必ず使用する(常に2個付加) property CDC: String; キャラクタペースのチェックデジットの値を保持するリード オンリイのプロパティ。チェックデジットが存在しない場合の値は、 ''(ナル文字)です。 property CDN: Integer; 数値ペースのチェックデジットの値を保持するリードオンリイの プロパティ。チェックデジットが存在しない場合の値は、-1 です。 CODE-93 の場合は、2個のチェックデジットを4桁の10進数で表現 します。1番目のチェックデジットは、(CDN mod 100) で、2番目の チェックデジットは、(CDN div 100) で得られます。 property Scale: TScale; 表示するバーコードの倍率を指定します。 TScale は、次の様に定義されています。 type TSCale = 1..10; property Angle: Integer; BarPicture が、picBMP か picJPEG の場合は、バーコードを90度単位で 回転させて表示する事が出来ます。Angle は、0, 90, 180, 270 いずれか の値を取ります。 property Reverse: Boolean; BarPicture が、picBMP か picJPEG の場合は、バーコードを反転させて 表示する事が出来ます。この反転は、回転と組み合わせての反転が可能です。 すなわち90度回転させた状態のものをさらに反転もさせるという様な事が 可能です。 property Symbol: String; バーコード文字列にチェックデジットやスタート・ストップキャラクタ等 を加えた最終的なバーコード文字列 property SymbolDisp: Boolean; バーコード下部にバーコード文字列を表示するかどうかのスイッチ True=表示、False=表示しない property BarFont: TFont; バーコード文字列やコメントのフォントを指定します。 property Transparent: Boolean; バーコードの背景色を透過色にするかどうかのスイッチ True=透過色にする、False=背景色で描く property BarColor: TColor; 描画するバーコードの色 property BackColor: TColor; 描画するバーコードの背景色 property BarWidth: Integer; 描画されたバーコードの幅を保持するリードオンリイのプロパティ 描画前にバーコードの幅を指定する事は出来ません。バーコードの幅 に影響を与えるのはバーコードの倍率 Scale です。 property BarHeight: Integer; 描画するバーコードの高さを指定します。Customerバーコードの 場合は、リードオンリイのプロパティとして機能しますので、 描画前にバーコードの高さを指定する事は出来ません。 property BarLeft: Integer; 描画するバーコードの Canvas 上の 左上の X 座標を指定します。 property BarTop: Integer; 描画するバーコードの Canvas 上の 左上の Y 座標を指定します。 property BarSpaceUp: Integer; 描画するバーコードの上方向の余白のサイズを指定します。 property BarSpaceDown: Integer; 描画するバーコードの下方向の余白のサイズを指定します。 property BarSpaceLeft: Integer; 描画するバーコードの左方向の余白のサイズを指定します。 property BarSpaceRight: Integer; 描画するバーコードの右方向の余白のサイズを指定します。 property Match: Boolean; バーコード描画時にコントロールのサイズをバーコードのサイズに 合わせるかどうかを指定します。コントロール上にバーコードのみ を表示する場合は、このプロパティを True にして下さい。 property BarPicture: TPictures; バーコードの描画方法及びクリップボードへのコピー方法を指定します。 TPictures は、次の様に定義されています。 type TPictures = (picBMP, picJPEG, picEMF, picWMF); picBMP - ビットマップ形式で描画 (コピーは、ビットマップ形式で) picJPEG - JPEG 形式で描画 (コピーは、JPEG形式で) picEMF - EMF形式で描画 (コピーは、EMF形式で) picWMF - EMF形式で描画 (コピーは、WMF形式で) property ElementRatio: TElementRatio; CODE39, NW7, ITF, CTF, IATA, MATRIX, NEC の場合にワイドバーとナローバー 及びワイドスペースとナロースペースの比率を 10 : 20 〜 10 : 30 すなわち、 1 対 2 から 1 対 3 の間で変化させます。ただし CTF, IATA は、ワイドスペース がありませんので、ワイドバーとナローバーの比率のみが対象となります。 TElementRatio は、次の様に定義されています。 type TElementRatio = 20..30; property BarEnabled: Boolean; バーコード表示を可能にするかどうかのスイッチ True=バーコード表示をする、False=バーコード表示を禁止する property BarDebug: Boolean; 与えられた Code プロパティが表示可能なものかどうかチェックする場合に使う スイッチです。このプロパティを True にすると、実際のバーコード表示は行な わず、Code が表示可能なものかどうかチェックして BarDisped プロパティの値 のみをセットします。 True=デバッグモードにする、False=デバッグモードを解除する property BarDisped: Boolean; バーコードの描画に成功した時に True セットされるリードオンリイの プロパティです。False にセットされるのは、主にバーコード生成文字列 (Code プロパティ)が正しく入力されていない場合です。 property ClearOption: Boolean; バーコードの描画に失敗した時、すなわち BarDisped プロパティが False に なった時、Canvas をクリアーするかどうかを指定するスイッチです。 BarDebug プロパティが True の場合、このスイッチは無効となります。 (ディフォルトは、False) property BarFrame: TFrameSize; バーコードの周囲に描くフレーム(外枠)のサイズを指定します。 TFrameSize は、次の様に定義されています。 type TFrameSize = 0..100; property ClipWatch: Boolean; クリップボードにテキストデータがコピーされた時に Code プロパティを 自動的に更新するかどうかを指定する為のスイッチです。 (クリップボード監視機能、ディフォルトは、False) ※Match プロパティとTransparent プロパティを同時に True にする事 は出来ません。 両プロパティは、互いに排他的関係にあります。(ソース参照) ※BarPictureプロパティは、Match プロパティが True の場合のみ picEMF 及び picWMF に設定する事が可能です。(ソース参照) ※BarPictureプロパティが、picEMF, picWMF いずれの場合でもコントロール への表示は、EMF形式で行なわれます。コピー方法の違いを指定するために これらの定数が設けられています。(ソース参照) 【 メソッド 】 このコンポーネント TBarImage で追加されたメソッドは、以下の通りです。 procedure Clear; 現在 Picture が、保持しているグラフイックデータを破棄して Canvas を クリアーするメソッドです。 Clear メソッドを呼ぶと BarDisped プロパティ は False に設定されます。 procedure CopyToClipboard; 現在、Picture プロパティが保持しているグラフィックイメージを クリップボードへコピーします。(すなわち現在、コントロールに 表示されているグラフィックイメージ) procedure PasteFromClipboard; 現在クリップボードにあるテキストデータでバーコードを描画する メソッドです。先頭行の256文字までを有効なデータと見なします。 有効なデータがあれば、それを Code プロバティにセットします。 procedure RepaintBarcode; 現在のプロパティの値でバーコードを再描画するメソッドです。 バーコードの上に何か図形を描いた後でバーコードを再描画する 場合等に使用します。 procedure RepaintUPCA2E; UPC-A 形式でバーコードが描画されている場合に、それをUPC-E 形式で 再描画するメソッド procedure RepaintUPCE2A; UPC-E 形式でバーコードが描画されている場合に、それをUPC-A 形式で 再描画するメソッド 【 イベント 】 このコンポーネント TBarImage で追加されたイベントは、以下の通りです。 property OnChangeCode: TNotifyWatchEvent; Code プロパティが変更される直前に発生するイベントです。 property OnPaintBar: TNotifyWatchEvent; バーコードを描画する直前に発生するイベントです。 property OnPaintedBar: 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 プロパティが変更されます。 OnPaintBar // この間で、バーコードが描画されます。 OnPaintedBar OnChangedCode の順で各イベントが発生します。 【 使用方法 】 複数のプロパティを設定する場合、一つ設定する度にバーコードを再表示して 画面がちらつきます。この様な事を避ける為には BarEnabled プロパティを 先頭で False に設定し、他の全てのプロパティを設定し終えたところで 最後に BarEnabled プロパティを True にして下さい。 Version 0.8 までは、先頭で Code プロパティを空にする方法を推奨して いました。Version 0.8 以降では、描画こそ行ないませんが、たとえ Code プロパティが空であっても内部で、Code や BarDisped のチェックを行なう ルーチンが入っていますので、上記の BarEnabled プロパティを使用する方法 をお勧めします。 【 具体例1 】Transparent, Match 両プロパティともに False の場合 (既存の画像の上にバーコードを上描きします。) ・ ・ BarImage1.BarEnabled := False; // バーコード表示を一時的に禁止します。 BarImage1.Picture.LoadFromFile(FileName); // 画像をロード BarImage1.BarType := cbarJAN; // JAN コードを選択 BarImage1.Scale := 2; // 倍率を2に指定 BarImage1.SymbolDisp := True; // バーコード文字列を下部に表示する。 BarImage1.Transparent := False; BarImage1.Match := False; BarImage1.BarColor := clBlack; // バーコードの色を黒色に指定 BarImage1.BackColor := clWhite; // バーコードの背景色を白色に指定 BarImage1.BarHeight := 105; // バーコードの高さを指定 BarImage1.BarLeft := 0; // バーコードの表示位置を指定(X座標) BarImage1.BarTop := 0; // バーコードの表示位置を指定(Y座標) BarImage1.BarSpaceUp := 10; // バーコードの上方向の余白のサイズを指定 BarImage1.BarSpaceDown := 0; // バーコードの下方向の余白のサイズを指定 BarImage1.BarSpaceLeft := 10; // バーコードの左方向の余白のサイズを指定 BarImage1.BarSpaceRight := 10; // バーコードの右方向の余白のサイズを指定 BarImage1.Code := '4940125'; // Code プロパティに文字列をセット BarImage1.BarEnabled := True; // この時点でバーコードを表示します。 // 描画に成功した場合は、BarDisped プロパティが True にセットされます。 // そして BarWidth に実際に描画されたバーコードの幅がセットされます。 ・ ・ ※この具体例1の様にすると既存の画像の上にバーコードを上描きします。 ※この例が最も一般的な使用方法と考えられます。 【 具体例2 】Transparent = True の場合 (バーコードの背景色を透過色にする場合) ・ ・ BarImage1.BarEnabled := False; // バーコード表示を一時的に禁止します。 BarImage1.Picture.LoadFromFile(FileName); // 画像をロード BarImage1.BarType := cbarJAN; // JAN コードを選択 BarImage1.Scale := 2; // 倍率を2に指定 BarImage1.SymbolDisp := True; // バーコード文字列を下部に表示する。 BarImage1.Transparent := True; // 背景色を透過色にする。 BarImage1.BarColor := clBlack; // バーコードの色を黒色に指定 BarImage1.BarHeight := 105; // バーコードの高さを指定 BarImage1.BarLeft := 0; // バーコードの表示位置を指定(X座標) BarImage1.BarTop := 0; // バーコードの表示位置を指定(Y座標) BarImage1.BarSpaceUp := 10; // バーコードの上方向の余白のサイズを指定 BarImage1.BarSpaceDown := 0; // バーコードの下方向の余白のサイズを指定 BarImage1.BarSpaceLeft := 10; // バーコードの左方向の余白のサイズを指定 BarImage1.BarSpaceRight := 10; // バーコードの右方向の余白のサイズを指定 BarImage1.Code := '4940125'; // Code プロパティに文字列をセット BarImage1.BarEnabled := True; // この時点でバーコードを表示します。 // 描画に成功した場合は、BarDisped プロパティが True にセットされます。 // そして BarWidth に実際に描画されたバーコードの幅がセットされます。 ・ ・ ※この具体例2の様にすると既存の画像の上にバーコードを描きます。 (バーコードの背景色は、透過色になります。) ※Transparent プロパティを True にすると同時に Match プロパティは、 False になりますので Match プロパティをセットする必要はありません。 両プロパティは、互いに排他的関係にあります。(ソース参照) 【 具体例3 】Match = True の場合 (バーコードのみ表示して、コントロールのサイズを バーコードのサイズに合わせる場合) ・ ・ BarImage1.BarEnabled := False; // バーコード表示を一時的に禁止します。 BarImage1.BarType := cbarJAN; // JAN コードを選択 BarImage1.Scale := 2; // 倍率を2に指定 BarImage1.SymbolDisp := True; // バーコード文字列を下部に表示する。 BarImage1.Match := True; // バーコードのサイズに合わせて表示する。 BarImage1.BarPicture := picEMF; // メタファイル(EMF)表示を選択 BarImage1.BarColor := clBlack; // バーコードの色を黒色に指定 BarImage1.BackColor := clWhite; // バーコードの背景色を白色に指定 BarImage1.BarHeight := 105; // バーコードの高さを指定 BarImage1.BarLeft := 0; // バーコードの表示位置を指定(X座標) BarImage1.BarTop := 0; // バーコードの表示位置を指定(Y座標) BarImage1.BarSpaceUp := 10; // バーコードの上方向の余白のサイズを指定 BarImage1.BarSpaceDown := 0; // バーコードの下方向の余白のサイズを指定 BarImage1.BarSpaceLeft := 10; // バーコードの左方向の余白のサイズを指定 BarImage1.BarSpaceRight := 10; // バーコードの右方向の余白のサイズを指定 BarImage1.Code := '4940125'; // Code プロパティに文字列をセット BarImage1.BarEnabled := True; // この時点でバーコードを表示します。 // 描画に成功した場合は、BarDisped プロパティが True にセットされます。 // そして BarWidth に実際に描画されたバーコードの幅がセットされます。 ・ ・ ※この具体例3の様にするとバーコード描画時にコントロールのサイズを バーコードのサイズに合わせます。コントロール上にバーコードのみを 表示する場合は、この様にして下さい。 ※Match プロパティを True にすると同時に Transparent プロパティは、 False になりますので Transparent プロパティをセットする必要は ありません。両プロパティは、互いに排他的関係にあります。(ソース参照) ※Match プロパティが True の場合のみメタファィル形式での描画を選択 出来ます。(picEMF 及び picWMF) これ以外の場合は、ビットマップ 形式のみの描画となります。 【 具体例4 】プロパティの変更 一度バーコードを表示した後は、何かプロパティを一つでも変更すると 直ちに再描画を行ないます。例えば、具体例3のコードの後に ・ ・ BarImage1.BarType := cbarNW7; // NW-7 形式を選択 ・ ・ と記述すると、今度は、NW-7 形式でバーコードを表示します。 ※これは、プロパティというものの性格上当然の事ではありますが、 【 具体例5 】クリップボードへのコピー CopyToClipboard メソッドを呼び出すと、現在 Picture が保持している 画像データをクリップボードへコピーします。例えば、具体例3のコード の後に ・ ・ if BarImage1.BarDisped = True then // バーコードが表示されている事を確認 BarImage1.CopyToClipboard; // クリップボードへコピー ・ ・ と記述すると、EMF(Win32 エンハンスドメタファイル)形式でクリップボードへ コピーします。 ※WMF(Win16 形式メタファイル)形式でコピーする場合は、具体例3の中で ・ BarImage1.BarPicture := picWMF; ・ として下さい。 ※BarPicture が picBMP の場合は、ビットマップ形式でバーコードが 表示されます。 【 具体例6 】UPC-A から UPC-E への変換をおこなう RepaintUPCA2E メソッドを使うと一度 UPC-A 形式でバーコードを表示した 後、それを UPC-E 形式に変換して再表示する事が出来ます。 ・ ・ BarImage1.BarEnabled := False; // バーコード表示を一時的に禁止します。 BarImage1.BarType := cbarUPC; // UPC コードを選択 BarImage1.Scale := 2; // 倍率を2に指定 BarImage1.SymbolDisp := True; // バーコード文字列を下部に表示する。 BarImage1.Match := True; // バーコードのサイズに合わせて表示する。 BarImage1.BarPicture := picEMF; // メタファイル(EMF)表示を選択 BarImage1.BarColor := clBlack; // バーコードの色を黒色に指定 BarImage1.BackColor := clWhite; // バーコードの背景色を白色に指定 BarImage1.BarHeight := 105; // バーコードの高さを指定 BarImage1.BarLeft := 0; // バーコードの表示位置を指定(X座標) BarImage1.BarTop := 0; // バーコードの表示位置を指定(Y座標) BarImage1.BarSpaceUp := 10; // バーコードの上方向の余白のサイズを指定 BarImage1.BarSpaceDown := 0; // バーコードの下方向の余白のサイズを指定 BarImage1.BarSpaceLeft := 10; // バーコードの左方向の余白のサイズを指定 BarImage1.BarSpaceRight := 10; // バーコードの右方向の余白のサイズを指定 BarImage1.Code := '01234500006'; // Code プロパティに文字列をセット BarImage1.BarEnabled := True; // この時点で UPC-A でコードを表示します。 BarImage1.RepaintUPCA2E; // UPC-E 形式に変換して再表示(0123456です。) // 正常に再表示出来た場合は、BarDisped プロパティが True にセットされます。 ・ ・ ※ただしすべての UPC-A コードを UPC-E 形式に変換出来るとは、限りません。 変換出来るコードには多少の条件があります。(ソース参照) 【 具体例7 】クイックレポートでの使用 TBarImage をクイックレポート対応してほしいという御意見を多数頂いています。 TBarImage そのものはクイックレポート対応していませんが、以下の様な方法を 用いればクイックレポートでの使用は可能です。 TBarImage で目的のバーコードを表示した後、TBarImage の Picture プロパティ の値を TQRImage の Picture にコピーするだけです。 例えば、フォーム上に QuickRep1: TQuickRep; QRImage1: TQRImage; BarImage1: TBarImage; Edit1: TEdit; // バーコード文字列入力用 Button1: TButton; // プレビューするためのボタン を配置して、Button1 の OnClick イベントで ・ ・ procedure TForm1.Button1Click(Sender: TObject); begin BarImage1.Code := Edit1.Text; // バーコードを表示 QRImage1.Picture.Assign(BarImage1.Picture); // バーコードイメージをコピー QuickRep1.Preview; end; ・ ・ 【 資料(CODE-128キャラクタ表) 】 以下は、バーコード生成ユニット ver0.70(BCODE_07.LZH) の README.TXT よりの抜粋です。 CODE-128 では、バーコード文字列(Code プロパティ)の入力に3通りの表記 を選べるようになっています。スタートキャラクタ(StartChar プロパティ) の値('A', 'B', 'C' の何れか)を指定して以下の何れかのキャラクタセット を選択して下さい。 ------------------------------------------------------------------ A B C ------------------------- SP SP <00> ! ! <01> " " <02> # # <03> $ $ <04> % % <05> & & <06> ' ' <07> ( ( <08> ) ) <09> * * <10> + + <11> , , <12> - - <13> . . <14> / / <15> 0 0 <16> 1 1 <17> 2 2 <18> 3 3 <19> 4 4 <20> 5 5 <21> 6 6 <22> 7 7 <23> 8 8 <24> 9 9 <25> : : <26> ; ; <27> < < <28> = = <29> > > <30> ? ? <31> @ @ <32> A A <33> B B <34> C C <35> D D <36> E E <37> F F <38> G G <39> H H <40> I I <41> J J <42> K K <43> L L <44> M M <45> N N <46> O O <47> P P <48> Q Q <49> R R <50> S S <51> T T <52> U U <53> V V <54> W W <55> X X <56> Y Y <57> Z Z <58> [ [ <59> \ \ <60> ] ] <61> ^ ^ <62> _ _ <63> ' <64> a <65> b <66> c <67> d <68> e <69> f <70> g <71> h <72> i <73> j <74> k <75> l <76> m <77> n <78> o <79> p <80> q <81> r <82> s <83> t <84> u <85> v <86> w <87> x <88> y <89> z <90> { <91> | <92> } <93> ~ <94> <95> <96> <97> <98> <99> ※「SP」は半角スペースです。。 ※「<」及び「>」はそれぞれ「<<」、「>>」と表記します。 ※特殊キャラクタは「<キャラクタ>」と表記します。 Ex.1 コードセットAで「FNC1 BEL ABC>DEFG LF」の場合、 「ABC>>DEFG」となります。 Ex.2 コードセットCで「1234567890」の場合、 「<12><34><56><78><90>」となります。 ※CODE-128で「UCC/EAN-128」を表す事もできます。 【 資料(CODE-39アスキーコード組合せ表) 】 CODE-39では、 使用文字種 = 「0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%」 の43文字ですが、このうち「$/+%」の4文字は制御キャラクタで、この 4文字と他の文字を組み合わせて以下の様にフルアスキーを表わす事が 出来ます。 ASCII CODE-39 ASCII CODE-39 ASCII CODE-39 ASCII CODE-39 ---------------- ---------------- ---------------- ---------------- %U SP SP @ %V ` %W $A ! /A A A a +A $B " /B B B b +B $C # /C C C c +C $D $ /D D D d +D $E % /E E E e +E $F & /F F F f +F $G ' /G G G g +G $H ( /H H H h +H $I ) /I I I i +I $J * /J J J j +J $K + /K K K k +K $L , /L L L l +L $M - - M M m +M $N . . N N n +N $O / /O O O o +O $P 0 0 P P p +P $Q 1 1 Q Q q +Q $R 2 2 R R r +R $S 3 3 S S s +S $T 4 4 T T t +T $U 5 5 U U u +U $V 6 6 V V v +V $W 7 7 W W w +W $X 8 8 X X x +X $Y 9 9 Y Y y +Y $Z : /Z Z Z z +Z %A ; %F [ %K { %P %B < %G \ %L | %Q %C = %H ] %M } %R %D > %I ^ %N ~ %S %E ? %J _ %O %T ※「SP」は半角スペースです。 ※ 特殊キャラクタは「<キャラクタ>」と表記します。 ※ %X, %Y, %Z も を表わします。 Ex.1 CODE-39で「Delphi」を表わす場合「D+E+L+P+H+I」と入力します。 【 資料(CODE-93アスキーコード組合せ表) 】 CODE-93では、 使用文字種 = 「0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%<$><%><+>」 の47個ですが、このうち「<$><%><+>」の4個は制御キャラクタで、 このこの4個の制御キャラクタと他の文字キャラクタを組み合わせて 以下の様にフルアスキーを表わす事が出来ます。 ASCII CODE-93 ASCII CODE-93 ASCII CODE-93 ASCII CODE-93 ---------------- ---------------- ---------------- ---------------- <%>U SP SP @ <%>V ' <%>W <$>A ! A A A a <+>A <$>B " B B B b <+>B <$>C # C C C c <+>C <$>D $ $ D D d <+>D <$>E % % E E e <+>E <$>F & F F F f <+>F <$>G ' G G G g <+>G <$>H ( H H H h <+>H <$>I ) I I I i <+>I <$>J * J J J j <+>J <$>K + + K K k <+>K <$>L , L L L l <+>L <$>M - - M M m <+>M <$>N . . N N n <+>N <$>O / / O O o <+>O <$>P 0 0 P P p <+>P <$>Q 1 1 Q Q q <+>Q <$>R 2 2 R R r <+>R <$>S 3 3 S S s <+>S <$>T 4 4 T T t <+>T <$>U 5 5 U U u <+>U <$>V 6 6 V V v <+>V <$>W 7 7 W W w <+>W <$>X 8 8 X X x <+>X <$>Y 9 9 Y Y y <+>Y <$>Z : Z Z Z z <+>Z <%>A ; <%>F [ <%>K { <%>P <%>B < <%>G \ <%>L | <%>Q <%>C = <%>H ] <%>M } <%>R <%>D > <%>I ^ <%>N ~ <%>S <%>E ? <%>J _ <%>O <%>T ※「SP」は半角スペースです。 ※ 特殊キャラクタは「<キャラクタ>」と表記します。 ※ <%>X, <%>Y, <%>Z も を表わします。 Ex.1 CODE-93で「Delphi」を表わす場合「D<+>E<+>L<+>P<+>H<+>I」と入力します。 【 テクニカル情報 】 ここでは、TBarImage 使用上の技術的な面を解説します。 1)メタファイル形式でバーコードが表示されている時に TBarImage の Canvas にアクセスすると、 「ビットマップが有効でないとイメージの変更は出来ません。」 というメッセージが出てエラーとなります。 これは、TBarImage で Picture.Metafile が有効な場合は、Picture.Bitmap が無効となり、逆に Picture.Bitmap が有効な場合は、Picture.Metafile が無効となる為です。TImage の場合もそうですが、Canvas にアクセス出来る のは Picture.Bitmap が有効な場合だけです。 Picture.Bitmap を有効にして再び Canvas にアクセス出来る様にする為に は何らかの方法で Picture.Bitmap にアクセスするだけです。 これで Picture.Bitmap が有効になり再び TBarImage の Canvas にアクセス 出来る様になります。(但し、当然の事ながらこの時点で Picture.Metafile のデータは、破棄されてしまいますが) 例えば、メタファイル形式でバーコードが表示されている時に、 BarImage1.Picture.Bitmap.Width := BarImage1.Width; ・ ・ あるいは、 if BarImage1.Picture.Bitmap.Empty = True then begin ・ ・ end; の様にすれば、以後 TBarImage の Canvas にアクセス出来る様になります。 2)Version 0.7 から ITF だけでなく全てのバーコードでフレーム(外枠)を 描くことが出来る様になりました。これにともなって従来の ITFFrame プロパティは廃止し、代わって BarFrame プロパティを新設しました。 これは賛否両論、色々とあると思いますが、バーコードを描いてからその上 にフレームを描くというアプローチをあえて取っています。その為に上下左右 の余白のサイズ(BarSpaceUp, BarSpaceDown, BarSpaceLeft, BarSpaceRight) を十分に取らないとバーコードの端がフレームに隠れてしまう場合があります。 3)Version 0.8 からバーコードの上下にコメントを描くことが出来る様になり ました。フレームの場合と同様、上下左右の余白のサイズを十分に取らないと バーコードの上下がコメントに隠れたり、コメントが一部しか表示されない といった場合があります。 4)Version 0.9 からBarDebug プロパティを追加しました。このプロパティを使うと 与えられた Code プロパティが表示可能なものかどうか実際の表示前にチェック する事が可能です。 5)OnPaintedBar イベント これは、バーコードを表示した直後に発生するイベントです。 そのイベントハンドラ内で BarDisped プロパティが、True であれば バーコードの描画に成功したという事です。また、イベントハンドラの 引数 Watch が、True であればクリップボードからテキストデータが ペーストされた結果発生したイベントであるという事になります。 TBarImage には、この他に OnPaintBar, OnChangeCode, OnChangedCode の各イベントがあります。必要に応じてこれらのイベントを使って 下さい。 6)Angle プロパティ このプロパティを使うとバーコードを90度単位で回転させて表示する事が 出来ますが、回転の前後で BarlLeft, BarTop, BarWidth, BarHeight の 各プロパティ値は、変化しませんのでご注意下さい。たとえ回転させても これらのプロパティは、回転前の値を保持し続ける様な仕様にしてあります。 【 新しくなった点 】 // Version 0.2 // ・上下左右の余白のサイズを指定出来る様になりました。 ・バーコード下部のバーコード文字列のフォントサイズを指定できる様 になりました。 ・CODE-39, NW-7, ITF で、細線と太線の比率を 10 : 20 〜 10 : 30 すなわち、1 対 2 から 1 対 3 の間で変えられる様になりました。 ・メタファィル形式でもバーコードを描画出来る様になりました。 ・BarEnabled プロパティにより、複数のプロパティをセットした後の バーコード表示が可能になりました。 ・バーコードの描画に成功した時は、BarDisped プロパティをセットして、 正常に表示した事を確認出来る様にしました。 ・現在、Picture プロパティが保持しているグラフィックイメージを クリップボードへコピーするメソッドを追加しました。 // Version 0.3 // ・従来の LineRatio プロパティ名を ElementRatio に変更しました。 ・UPC-A コードに対応しました。 ・CTF(Code 2of5 | Industrial 2of5) コードに対応しました。 ・IATA(IATA 2of5) コードに対応しました。 ・MATRIX(Matrix 2of5) コードに対応しました。 ・NEC(NEC 2of5 | COOP 2of5) コードに対応しました。 // Version 0.4 // ・UPC-E コードに対応しました。 // Version 0.5 // ・UPC-E の場合もチェックデジットを自動計算する様にしました。 従って、UPC-E のバーコード文字列は、7桁で入力する様になりました。 ・現在のプロパティの値でバーコードを再描画するメソッド RepaintBarcode を追加しました。 ・UPC-A 形式でバーコードが描画されている場合に、それをUPC-E 形式で 再描画するメソッド RepaintUPCA2E を追加しました。 ・UPC-E 形式でバーコードが描画されている場合に、それをUPC-A 形式で 再描画するメソッド RepaintUPCE2A を追加しました。 ・CODE-93 に対応しました。 // Version 0.6 // ・ITF の場合に描くフレーム(外枠)のサイズを指定するプロパティ ITFFrame を追加しました。 ・バーコードを描画する直前に発生するイベント OnPaintBar を追加しました。 ・バーコードを描画した直後に発生するイベント OnPaintedBar を追加しました。 // Version 0.7 // ・ITF だけでなく全てのバーコードでフレーム(外枠)を描くことが出来る様 になりました。これにともなって従来の ITFFrameプロパティは廃止し、 代わって BarFrame プロパティを新設しました。 // Version 0.8 // ・バーコードの上下にコメントを描くことが出来る様になりました。 CommentUp, CommentUpLoc プロパティで、バーコード上部のコメント文字列 と表示方法を、CommentDown, CommentDownLoc プロパティで、バーコード 下部のコメント文字列と表示方法を指定します。 ・バーコード文字列やコメント文字列のフォントを指定する事が出来る様になり ました。これにともなって従来の BarFontSize プロパティは廃止し、代わって BarFont プロパティを新設しました。 // Version 0.9 // ・Clear メソッドを追加しました。 現在 Picture が、保持しているグラフイックデータを破棄して Canvas を クリアーするメソッドです。Clear メソッドを呼ぶと BarDisped プロパティ は False に設定されます。 ・PasteFromClipboard メソッドを追加しました。 現在クリップボードにあるテキストデータでバーコードを描画します。 先頭行の256文字までを有効なデータと見なします。有効なデータがあれば、 それを Code プロバティにセットします。 ・BarDebug プロパティを追加しました。 与えられた Code プロパティが表示可能なものかどうかチェックする場合に使い ます。このプロパティを True にすると、実際のバーコード表示は行なわず、 Code が表示可能なものかどうかチェックして BarDisped プロパティの値を セットします。 ・ClearOption プロパティを追加しました。 バーコードの描画に失敗した時、すなわち BarDisped プロパティが False に なった時、Canvas をクリアーするかどうかを指定するスイッチです。 BarDebug プロパティが True の場合、このスイッチは無効となります。 (ディフォルトは、False) // Version 1.1 // ・ClipWatch プロパティを追加しました。 クリップボードにテキストデータがコピーされた時に Code プロパティを 自動的に更新するかどうかを指定する為のスイッチです。 (クリップボード監視機能、ディフォルトは、False) // Version 1.2 // ・Symbol プロパティを追加しました。 バーコード文字列にチェックデジットやスタート・ストップキャラクタ等 を加えた最終的なバーコード文字列です。 ・CDC プロパティを追加しました。 キャラクタペースのチェックデジットの値を保持するリード オンリイのプロパティ。チェックデジットが存在しない場合の値は、 ''(ナル文字)です。 ・CDN プロパティを追加しました。 数値ペースのチェックデジットの値を保持するリードオンリイの プロパティ。チェックデジットが存在しない場合の値は、-1 です。 CODE-93 の場合は、2個のチェックデジットを4桁の10進数で表現 します。1番目のチェックデジットは、(CDN mod 100) で、2番目の チェックデジットは、(CDN div 100) で得られます。 // Version 1.3 // ・OnPaintBar イベントと OnPaintedBar イベントを従来の TNotifyEvent から TNotifyWatchEvent に変更しました。 ・OnChangeCode イベントと OnChangedCode イベント(TNotifyWatchEvent) を新しく追加しました。TNotifyWatchEvent は、 type TNotifyWatchEvent = procedure(Sender: TObject; Watch: Boolean) of object; の様に定義されています。引数 Watch は、ClipWatch プロパティが True の時、クリップボードにテキストデータがコピーされ、Code プロパティが自動的に更新された時のみ True になります。 // Version 1.4 // ・property BarPicture を TBarPictures から TPictures に変更 しました。TPictures は、次の様に定義されています。 type TPictures = (picBMP, picEMF, picWMF); // Version 1.5 // ・Angle プロパティを追加しました。 BarPicture = picBMP の時、すなわちビットマップ形式で描画する 場合は、バーコードを90度単位で回転させて表示する事が出来ます。 Angle は、0, 90, 180, 270 いずれかの値を取ります。 // Version 1.7 // ・Reverse プロパティを追加しました。 SymbolPicture = picBMP の時、すなわちビットマップ形式で描画する 場合は、バーコードを反転させて表示する事が出来ます。この反転は、 回転と組み合わせての反転が可能です。すなわち90度回転させた状態 のものをさらに反転もさせるという様な事が可能です。 // Version 2.0 // ・JPEG 形式でバーコードを描画出来る様になりました。 この場合、クリップボードへのコピーもJPEG 形式で行ないます。 これにともなって BarPicture プロパティは、以下の様になりました。 property BarPicture: TPictures; バーコードの描画方法及びクリップボードへのコピー方法を指定します。 TPictures は、次の様に定義されています。 type TPictures = (picBMP, picJPEG, picEMF, picWMF); picBMP - ビットマップ形式で描画 (コピーは、ビットマップ形式で) picJPEG - JPEG 形式で描画 (コピーは、JPEG形式で) picEMF - EMF形式で描画 (コピーは、EMF形式で) picWMF - EMF形式で描画 (コピーは、WMF形式で) 【 バグ修正 】 // Version 0.2 // ・バーコード下部のバーコード文字列が正しく表示出来ない場合があった点 を修正 ・Customer バーコードの幅の計算が正しくなかった点を修正 ・Transparent, Match ともに False の場合に BarLeft, BarTop の値に かかわらず、(0, 0) の位置から背景をぬりつぶしていた点を修正 // Version 0.3 // ・エレメント比をワイドバーとナローバー間でだけ設定していた点を ワイドスペースとナロースペース間でも設定する様に修正 ・Customer バーコードの幅の計算が正しくなかった点を再度修正 ・NW-7(CODABAR) でチェックデジットの計算が正しくなかった点を修正 ・ITF(Interleaved 2of5) でバーコード文字列が奇数桁の場合に先頭に'0'を 付加して偶数桁にする様に修正 // Version 0.4 // ・UPC-A の表示方法が正しくなかった点を修正 // Version 0.5 // ・CODE-39 でバーコード文字列に'*'を使用できる様になっていた点を修正 ('*'は、スタート・ストップキャラクタのみに使用) // Version 1.0 // ・指定された BarFrame のサイズでフレームを描けない場合は、BarFrame の サイズをそのときに可能な最大値に設定する様に修正しました。 // Version 1.6 // ・Match が True で BarLeft や BarTop が、0 でない時に回転すると、 コントロールのサイズがおかしくなる点を修正 // Version 1.8 // ・UPC-E のバーコードを正しく表示出来ていなかった点を修正 ・画面の色数が 16 bit Color で、ビットマップ形式でバーコードを描画している 時にバーコードの回転や反転をしようとするとハングする点を修正 // Version 1.9 // ・CopyToClipboard メソッドを全ての場合に対応出来る様に修正 ・手元にある UPC-E のバーコードのサンプルには、そのとおり表示出来るもの と出来ないものがあるので、UPC-E を表示するアルゴリズムをもとに戻し ました。(Version 1.7 のアルゴリズム) これは、本来 UPC-E の仕様として 公開されていたものに基づくアルゴリズムですが、あくまでも暫定的な措置です。 【 謝辞 】 このプログラムの主要部分は、DEKOさんのバーコード生成ユニット ver0.70(BCODE_07.LZH) (ITF部分についてはM&Iさん)に依存しています。 メタファイル関係では、M&Iさんのコードを使用させて頂き、また多大の ご協力を頂いています。 クリップボード監視機能では、ぜえたさんの TClipboardWatcher のコード を参考にして、ClipWatch プロパティを追加しました。 コンポーネント化は、seizo が行ないました。 DEKOさん、M&Iさん、ぜえたさん、有難うございました。 【 著作権 】 このプログラムの著作権は、DEKOさん、M&Iさん、そして seizo の三者が 有します。 【 ソフトウェア種別 】 このプログラムはフリーソフトウェアです。以下の事項を御承諾頂ければ、 自由にコピー、使用、配布を行なって頂いて構いません。 ◎このプログラムを使用した上でのいかなる損害、損失にも当方は一切 責任を負いません。このプログラムの使用は、使用者の責任において 行なって下さい。 ◎このプログラムを配布される場合は、このドキュメントファイルも含め 全てのファイルをオリジナルの状態で配布して下さい。 【 その他 】 まだまだ、改良の余地はたくさんあると思います。バグや感想、「ここは、 こうした方が良いのではないか?」等のご意見がありましたらメールで 御連絡下さい。特に、このプログラムの主要部分は、DEKOさんのユニット に依存していますので、DEKOさんのホームページを御覧頂ければ大変参考 になると思います。 ◎DEKOさんの連絡先 e-mail : ht_deko@nifty.com Home Page : http://homepage1.nifty.com/ht_deko/ ◎M&Iさんの連絡先 e-mail : masahiro.inoue@nifty.ne.jp Home Page : http://member.nifty.ne.jp/m-and-i/ ◎seizoの連絡先 e-mail : seizo@mars.dti.ne.jp TBarImage を使用したサンプルアプリ等をここで紹介しています。 http://www.vector.co.jp/vpack/browse/person/an003597.html seizo NIFTY : SGQ02732 e-mail : seizo@mars.dti.ne.jp