HBarcode.pas
上传用户:xdwang_66
上传日期:2016-04-26
资源大小:1726k
文件大小:23k
源码类别:

Static控件

开发平台:

Delphi

  1. // =============================================================================
  2. //
  3. // Barcode VCL Component
  4. //
  5. // For Delphi 4/5/6/7, C++ Builder 4/5/6, BDS 2005/2005, Turbo Delphi 2006
  6. //
  7. // Copyright (c) 2001, 2007  Han-soft Software, all rights reserved.
  8. //
  9. // $Rev: 44 $   $Id: HBarCode_src.pas 44 2007-01-16 01:16:04Z hanjy $
  10. //
  11. // =============================================================================
  12. unit HBarCode;
  13. interface
  14. uses
  15.   SysUtils, Classes, Graphics, Math, Printers, Windows;
  16. {$I 'BarCode.inc'}
  17. type
  18.   TBCdata = record
  19.     Name:string;
  20.     num :Boolean;
  21.   end;
  22.   { Barcode Type }
  23.   TBarType =
  24.   (
  25.     bcCode_2_5_interleaved,
  26.     bcCode_2_5_industrial,
  27.     bcCode_2_5_matrix,
  28.     bcCode39,
  29.     bcCode39Extended,
  30.     bcCode128A,
  31.     bcCode128B,
  32.     bcCode128C,
  33.     bcCode93,
  34.     bcCode93Extended,
  35.     bcCodeMSI,
  36.     bcCodePostNet,
  37.     bcCodeCodabar,
  38.     bcCodeEAN8,
  39.     bcCodeEAN13,
  40.     bcCodeUPC_A,
  41.     bcCodeUPC_E0,
  42.     bcCodeUPC_E1,
  43.     bcCodeUPC_Supp2,
  44.     bcCodeUPC_Supp5,
  45.     bcCodeEAN128A,
  46.     bcCodeEAN128B,
  47.     bcCodeEAN128C
  48.   );
  49.   TOrientation  = (toLeftRight, toRightLeft, toTopBottom, toBottomTop);
  50.   TCheckSum     = (csNone, csModulo10);
  51.   TTextShow     = (tsNone, tsBarCode, tsBarType, tsBoth);
  52.   TTextPosition = (tpTopLeft, tpTopRight, tpTopCenter, tpBottomLeft,
  53.     tpBottomRight, tpBottomCenter);
  54.   TUnits        = (utMillimeter,utInch);
  55.   TBarLineType  = (white, black, black_half);
  56. const
  57.   mmPerInch = 25.4;
  58.   { Barcode name }
  59.   BCData:array[bcCode_2_5_interleaved..bcCodeEAN128C] of TBCdata =
  60.   (
  61.     (Name:'Code25 interleaved'; num:True),
  62.     (Name:'Code25 industrial';  num:True),
  63.     (Name:'Code25 matrix';      num:True),
  64.     (Name:'Code39';             num:False),
  65.     (Name:'Code39 Extended';    num:False),
  66.     (Name:'Code128A';           num:False),
  67.     (Name:'Code128B';           num:False),
  68.     (Name:'Code128C';           num:False),
  69.     (Name:'Code93';             num:False),
  70.     (Name:'Code93 Extended';    num:False),
  71.     (Name:'MSI';                num:True),
  72.     (Name:'PostNet';            num:True),
  73.     (Name:'Codebar';            num:False),
  74.     (Name:'EAN8';               num:True),
  75.     (Name:'EAN13';              num:True),
  76.     (Name:'UPC_A';              num:True),
  77.     (Name:'UPC_E0';             num:True),
  78.     (Name:'UPC_E1';             num:True),
  79.     (Name:'UPC Supp2';          num:True),
  80.     (Name:'UPC Supp5';          num:True),
  81.     (Name:'EAN128A';            num:False),
  82.     (Name:'EAN128B';            num:False),
  83.     (Name:'EAN128C';            num:False)
  84.   );
  85.   { Draw barcode on canvas }
  86.   procedure H_DrawBar(
  87.           H_Canvas       : TCanvas;       //Canvas
  88.     const H_BarType      : TBarType;      //Barcode type
  89.     const H_BarCode      : string;        //Barcode value
  90.     const H_Modul        : Integer;       //Width of thin bar
  91.     const H_Ratio        : Double;        //Ratio of thin and thick bar
  92.     const H_CheckSum     : TCheckSum;     //Algorithms of checksum
  93.     const H_Left         : Integer;       //Left margin with form
  94.     const H_Top          : Integer;       //Top margin with form
  95.     const H_Height       : Integer;       //Barcode height
  96.     const H_TextFont     : TFont;         //Font of brcode text to display
  97.     const H_TextShow     : TTextShow;     //Content of barcode text to display
  98.     const H_TextPosition : TTextPosition; //Position of barcode text
  99.     const H_BarColor     : TColor;        //Color of bar
  100.     const H_SpcColor     : TColor;        //Background Color of barcode
  101.     const H_BackColor    : TColor;        //background Color of barcode text
  102.     const H_Angle        : Double         //Angle of left rotate (degree)
  103.     );
  104.   { Get barcode width to display (pixels) }
  105.   function  H_GetBarWidth(
  106.     const BW_Type     : TBarType;         //Barcode type
  107.     const BW_Code     : string;           //Barcode value
  108.     const BW_Modul    : Integer;          //Width of thin bar (pixels)
  109.     const BW_Ratio    : Double;           //Ratio of thick and thin bar
  110.     const BW_CheckSum : TCheckSum         //Algorithms of checksum
  111.     ) : Integer;
  112.   { Get canvas width to display (pixels) }
  113.   function H_GetCanvasWidth(
  114.     const CW_Type      : TBarType;        //Barcode type
  115.     const CW_Code      : string;          //Barcode value
  116.     const CW_Modul     : Integer;         //Width of thin bar (pixels)
  117.     const CW_Ratio     : Double;          //Ratio of thick and thin bar
  118.     const CW_CheckSum  : TCheckSum;       //Algorithms of checksum
  119.     const CW_Height    : Integer;         //Barcode height (pixels)
  120.     const CW_Angle     : Double           //Angle of left rotate (degree)
  121.     ): Integer;
  122.   { Get Canvas height to display (pixels) }
  123.   function H_GetCanvasHeight(
  124.     const CH_Type      : TBarType;        //Barcode type
  125.     const CH_Code      : string;          //Barcode value
  126.     const CH_Modul     : Integer;         //Width of thin bar (pixels)
  127.     const CH_Ratio     : Double;          //Ratio of thick and thin bar
  128.     const CH_CheckSum  : TCheckSum;       //Algorithms of checksum
  129.     const CH_Height    : Integer;         //Barcode height (pixels)
  130.     const CH_Angle     : Double           //Angle of left rotate (degree)
  131.     ):Integer;
  132.   { Get barcode typename }
  133.   function H_GetBarTypeName(
  134.     const BN_BarType   : TBarType         //Barcode type
  135.     ): string;
  136.   { Print barcode }
  137.   procedure H_PrintBar(
  138.     const H_Unit           : TUnits;      //Unit of width and length (mm/inch)
  139.     const H_BarType      : TBarType;      //Barcode type
  140.     const H_BarCode      : string;        //Barcode value
  141.     const H_Modul        : Double;        //Width of thin bar (mm/inch)
  142.     const H_Ratio        : Double;        //Ratio of thick and thin bar
  143.     const H_CheckSum     : TCheckSum;     //Algorithms of checksum
  144.     const H_Left         : Double;        //Left margin from paper (mm/inch)
  145.     const H_Top          : Double;        //Top margin from paper (mm/inch)
  146.     const H_Height       : Double;        //Barcode height (mm/inch)
  147.     const H_TextFont     : TFont;         //Font of brcode text to print
  148.     const H_TextShow     : TTextShow;     //Content of barcode text to print
  149.     const H_TextPosition : TTextPosition; //Position of barcode text
  150.     const H_BarColor     : TColor;        //Color of bar
  151.     const H_SpcColor     : TColor;        //Background color of barcode
  152.     const H_BackColor    : TColor;        //Background color of barcode text
  153.     const H_Angle        : Double         //Angle of left rotate (degree)
  154.    );
  155.   { Get basrcode width to print (mm/inch) }
  156.   function H_GetPrnBarWidth(
  157.     const BW_Unit      : TUnits;          //Unit of width and length (mm/inch)
  158.     const BW_Type      : TBarType;        //Barcode type
  159.     const BW_Code      : string;          //Barcode value
  160.     const BW_Modul     : Double;          //Width of thin bar (mm/inch)
  161.     const BW_Ratio     : Double;          //Ratio of thick and thin bar
  162.     const BW_CheckSum  : TCheckSum        //Algorithms of checksum
  163.    ):Double;
  164.   { Get canvas width to print (mm/inch }
  165.   function H_PrnCanvasWidth(
  166.     const CW_Unit      : TUnits;          //Unit of width and length (mm/inch)
  167.     const CW_Type      : TBarType;        //Barcode type
  168.     const CW_Code      : string;          //Barcode value
  169.     const CW_Modul     : Double;          //Width of thin bar (mm/inch)
  170.     const CW_Ratio     : Double;          //Ratio of thick and thin bar
  171.     const CW_CheckSum  : TCheckSum;       //Algorithms of checksum
  172.     const CW_Height    : Double;          //Barcode height (mm/inch)
  173.     const CW_Angle     : Double           //Angle of left rotate (degree)
  174.     ):Double;
  175.   
  176.   { Get canvas height to print (mm/inch) }
  177.   function H_PrnCanvasHeight(
  178.     const CH_Unit      : TUnits;          //Unit of width and length (mm/inch)
  179.     const CH_Type      : TBarType;        //Barcode type
  180.     const CH_Code      : string;          //Barcode value
  181.     const CH_Modul     : Double;          //Width of thin bar (mm/inch)
  182.     const CH_Ratio     : Double;          //Ratio of thick and thin bar
  183.     const CH_CheckSum  : TCheckSum;       //Algorithms of checksum
  184.     const CH_Height    : Double;          //Barcode height (mm/inch)
  185.     const CH_Angle     : Double           //Angle of left rotate (degree)
  186.     ):Double;
  187. implementation
  188. var
  189.   Modules : array[0..3] of shortint;
  190. {*******************}
  191. {   Internal Use    }
  192. {*******************}
  193. {$I BarFun.inc}
  194. {$I BarDef.inc}
  195. { Make barcode data for display or print }
  196. function MakeData(const MD_Type:TBarType; const MD_Code:string;
  197.   const MD_Modul:Integer; var MD_Ratio:Double; const MD_CheckSum:TCheckSum;
  198.   var MD_CheckNum:string) : string;
  199. var
  200.   i:   integer;
  201.   bar: string;
  202. begin
  203.   { Modify ratio }
  204.   case MD_Type of
  205.     bcCode_2_5_interleaved,
  206.     bcCode_2_5_industrial,
  207.     bcCode39,
  208.     bcCodeEAN8,
  209.     bcCodeEAN13,
  210.     bcCode39Extended,
  211.     bcCodeCodabar,
  212.     bcCodeUPC_A,
  213.     bcCodeUPC_E0,
  214.     bcCodeUPC_E1,
  215.     bcCodeUPC_Supp2,
  216.     bcCodeUPC_Supp5:
  217.     begin
  218.       if MD_Ratio < 2.0 then MD_Ratio := 2.0;
  219.       if MD_Ratio > 3.0 then MD_Ratio := 3.0;
  220.     end;
  221.     bcCode_2_5_matrix:
  222.     begin
  223.       if MD_Ratio < 2.25 then MD_Ratio := 2.25;
  224.       if MD_Ratio > 3.0 then MD_Ratio := 3.0;
  225.     end;
  226.     bcCode128A,
  227.     bcCode128B,
  228.     bcCode128C,
  229.     bcCode93,
  230.     bcCode93Extended,
  231.     bcCodeMSI,
  232.     bcCodePostNet: ;
  233.   end;
  234.   { Make modules }
  235.   modules[0] := MD_Modul;
  236.   modules[1] := Round(MD_Modul*MD_Ratio);
  237.   modules[2] := modules[1] * 3 div 2;
  238.   modules[3] := modules[1] * 2;
  239.   { Check barcode }
  240.   //bar := Trim(MD_Code);
  241.   bar := MD_Code;
  242.   if BCData[MD_Type].num then
  243.   begin
  244.     for i := 1 to Length(bar) do
  245.       if (bar[i] > '9') or (bar[i] < '0') then
  246.         raise Exception.CreateFmt('%s : %s', [bar,ErrorBarcode]);
  247.   end;
  248.   { Get barcode data }
  249.   case MD_Type of
  250.     bcCode_2_5_interleaved: Result := Code_2_5_interleaved(bar);
  251.     bcCode_2_5_industrial:  Result := Code_2_5_industrial(bar);
  252.     bcCode_2_5_matrix:      Result := Code_2_5_matrix(bar);
  253.     bcCode39:               Result := Code_39(bar,MD_CheckSum);
  254.     bcCode39Extended:       Result := Code_39Extended(bar,MD_CheckSum);
  255.     bcCode128A,
  256.     bcCode128B,
  257.     bcCode128C,
  258.     bcCodeEAN128A,
  259.     bcCodeEAN128B,
  260.     bcCodeEAN128C:          Result := Code_128(MD_Type,bar,MD_CheckSum,
  261.       MD_CheckNum);
  262.     bcCode93:               Result := Code_93(bar);
  263.     bcCode93Extended:       Result := Code_93Extended(bar);
  264.     bcCodeMSI:              Result := Code_MSI(bar);
  265.     bcCodePostNet:          Result := Code_PostNet(bar);
  266.     bcCodeCodabar:          Result := Code_Codabar(bar);
  267.     bcCodeEAN8:             Result := Code_EAN8(bar,MD_CheckSum);
  268.     bcCodeEAN13:            Result := Code_EAN13(bar,MD_CheckSum);
  269.     bcCodeUPC_A:            Result := Code_UPC_A(bar,MD_CheckSum,MD_CheckNum);
  270.     bcCodeUPC_E0:           Result := Code_UPC_E0(bar,MD_CheckSum,MD_CheckNum);
  271.     bcCodeUPC_E1:           Result := Code_UPC_E1(bar,MD_CheckSum,MD_CheckNum);
  272.     bcCodeUPC_Supp2:        Result := Code_Supp2(bar,MD_CheckSum,MD_CheckNum);
  273.     bcCodeUPC_Supp5:        Result := Code_Supp5(bar,MD_CheckSum,MD_CheckNum);
  274.   else
  275.     raise Exception.CreateFmt('%s',[ErrorBarType]);
  276.   end;
  277. end;
  278. { Get barcode line data }
  279. procedure OneBarProps(const code:char; var Width:integer; var lt:TBarLineType);
  280. begin
  281.   case code of
  282.     '0': begin width := modules[0]; lt := white; end;
  283.     '1': begin width := modules[1]; lt := white; end;
  284.     '2': begin width := modules[2]; lt := white; end;
  285.     '3': begin width := modules[3]; lt := white; end;
  286.     '5': begin width := modules[0]; lt := black; end;
  287.     '6': begin width := modules[1]; lt := black; end;
  288.     '7': begin width := modules[2]; lt := black; end;
  289.     '8': begin width := modules[3]; lt := black; end;
  290.     'A': begin width := modules[0]; lt := black_half; end;
  291.     'B': begin width := modules[1]; lt := black_half; end;
  292.     'C': begin width := modules[2]; lt := black_half; end;
  293.     'D': begin width := modules[3]; lt := black_half; end;
  294.   else
  295.     begin
  296.       raise Exception.CreateFmt('%s', [ErrorInternal]);
  297.     end;
  298.   end;
  299. end;
  300. { Display barcode }
  301. procedure DoLines(const DL_Data:string; const DL_Canvas:TCanvas;
  302.   const DL_BColor:TColor;  const DL_SColor:TColor; const DL_Left:Integer;
  303.   const DL_Top:Integer;    const DL_Width:Integer;  const DL_Height:Integer;
  304.   const DL_Angle:Double);
  305. var
  306.   i:integer;
  307.   lt : TBarLineType;
  308.   xadd:integer;
  309.   width, height:integer;
  310.   ystart:integer;  //2004-02-20
  311.   a,b,c,d,
  312.   orgin : TPoint;
  313.   alpha:double;
  314.  begin
  315.   xadd := 0;
  316.   orgin.x := DL_Left;
  317.   orgin.y := DL_Top;
  318.   alpha := DL_Angle/180.0*pi;
  319.   orgin := TranslateQuad2D(alpha,orgin,Point(DL_Width,DL_Height));
  320.   with DL_Canvas do begin
  321.     Pen.Width := 1;
  322.    for i:=1 to Length(DL_Data) do
  323.     begin
  324.       OneBarProps(DL_Data[i], width, lt);
  325.       if (lt = black) or (lt = black_half) then
  326.       begin
  327.         Pen.Color := DL_BColor;
  328.       end
  329.       else
  330.       begin
  331.         Pen.Color := DL_SColor;
  332.       end;
  333.       Brush.Color := Pen.Color;
  334.       {
  335.       if lt = black_half then
  336.         height := DL_Height * 2 div 5
  337.       else
  338.         height := DL_Height;
  339.       a.x := xadd;
  340.       a.y := 0;
  341.       b.x := xadd;
  342.       b.y := height;
  343.       c.x := xadd+Width-1;
  344.       c.y := height;
  345.       d.x := xadd+Width-1;
  346.       d.y := 0;
  347.       }
  348.       {New For PostNet}
  349.       height := DL_Height;
  350.       if lt = black_half then
  351.         ystart := DL_Height * 3 div 5
  352.       else
  353.         ystart := 0;
  354.       a.x := xadd;
  355.       a.y := ystart;
  356.       b.x := xadd;
  357.       b.y := height;
  358.       c.x := xadd+Width-1;
  359.       c.y := height;
  360.       d.x := xadd+Width-1;
  361.       d.y := ystart;
  362.       a := Translate2D(Rotate2D(a, alpha), orgin);
  363.       b := Translate2D(Rotate2D(b, alpha), orgin);
  364.       c := Translate2D(Rotate2D(c, alpha), orgin);
  365.       d := Translate2D(Rotate2D(d, alpha), orgin);
  366.       Polygon([a,b,c,d]);
  367.       xadd := xadd + width;
  368.     end;
  369.   end;
  370. end;
  371. { Display text }
  372. procedure DoText(const DT_Text:string; const DT_Canvas:TCanvas;
  373.   const DT_Color:TColor; const DT_Font:TFont; const DT_Left:Integer;
  374.   const DT_Top:Integer; const DT_Width:Integer; const DT_Height:Integer;
  375.   const DT_Angle:Double; const DT_TextPosition:TTextPosition);
  376. var
  377.   m_LF:LOGFONT;
  378.   NewFont: HGDIOBJ;
  379.   OrgFont: HGDIOBJ;
  380.   orgin, P:   TPoint;
  381.   Alpha:      Double;
  382.   A : Integer;
  383. begin
  384.   DT_Canvas.Font.Assign(DT_Font);
  385.   orgin.x := DT_Left;
  386.   orgin.y := DT_Top;
  387.   Alpha := DT_Angle/180.0*pi;
  388.   orgin := TranslateQuad2D(Alpha,orgin,Point(DT_Width, DT_Height));
  389.   p := Point(0,0);
  390.   if DT_TextPosition in [tpTopLeft, tpBottomLeft] then
  391.     p.X := 0
  392.   else
  393.     if DT_TextPosition in [tpTopRight, tpBottomRight] then
  394.       p.X := DT_Width - DT_Canvas.TextWidth(DT_Text) - 1
  395.     else
  396.       p.X := Trunc((DT_Width - DT_Canvas.TextWidth(DT_Text))/2);
  397.   if DT_TextPosition in [tpTopLeft, tpTopCenter, tpTopRight] then
  398.     p.Y := 0
  399.   else
  400.     p.Y := DT_Height - DT_Canvas.TextHeight(DT_Text) ;
  401.   p := Translate2D(Rotate2D(p, alpha), orgin);
  402.   {Adjust text position}
  403.   A := Round(DT_Angle) mod 360;
  404.   if ((A<=45) or (A>315)) and
  405.     (DT_TextPosition in [tpBottomLeft, tpBottomCenter, tpBottomRight]) then
  406.     Inc(p.Y);
  407.   if ((A<=45) or (A>315)) and
  408.     (DT_TextPosition in [tpBottomRight, tpTopRight]) then
  409.     Inc(p.X);
  410.   if (A>135) and (A<=225) and
  411.     (DT_TextPosition in [tpTopLeft, tpTopCenter, tpTopRight]) then
  412.     Inc(p.Y);
  413.   if (A>225) and (A<=315) then
  414.     Inc(p.X);
  415.   GetObject(DT_Canvas.Font.Handle,SizeOf(m_LF),Addr(m_LF));
  416.   m_LF.lfEscapement:= Round(DT_Angle*10);
  417.   m_LF.lfOrientation:= Round(DT_Angle*10);
  418.   m_LF.lfOutPrecision := 0;
  419.   NewFont := CreateFontIndirect(m_LF);
  420.   OrgFont := SelectObject(DT_Canvas.Handle,NewFont);
  421.   try
  422.     DT_Canvas.Brush.Style := bsClear;
  423.     DT_Canvas.Brush.Color := DT_Color;
  424.     DT_Canvas.TextOut(p.X,p.Y,DT_Text);
  425.   finally
  426.     NewFont := SelectObject(DT_Canvas.Handle,OrgFont);
  427.     DeleteObject(NewFont);
  428.   end;
  429. end;
  430. {*******************}
  431. {    For Display    }
  432. {*******************}
  433. { Draw barcode and text }
  434. procedure H_DrawBar(H_Canvas:TCanvas; const H_BarType:TBarType;
  435.   const H_BarCode:string;const H_Modul:Integer;const H_Ratio:Double;
  436.   const H_CheckSum:TCheckSum;const H_Left:Integer;const H_Top:Integer;
  437.   const H_Height:Integer;const H_TextFont:TFont;const H_TextShow:TTextShow;
  438.   const H_TextPosition:TTextPosition;const H_BarColor:TColor;
  439.   const H_SpcColor:TColor;const H_BackColor:TColor;const H_Angle:Double);
  440. var
  441.   data, text : string;
  442.   SaveFont: TFont;
  443.   SavePen: TPen;
  444.   SaveBrush: TBrush;
  445.   CheckNum: string;
  446.   rRatio: Double;
  447.   bWdt  : Integer;
  448. begin
  449.   Savefont  := TFont.Create;
  450.   SavePen   := TPen.Create;
  451.   SaveBrush := TBrush.Create;
  452.   CheckNum  := H_BarCode;
  453.   rRatio    := H_Ratio;
  454.   data := MakeData(H_BarType, H_BarCode, H_Modul, rRatio, H_CheckSum, CheckNum);
  455.   bWdt := H_GetBarWidth(H_BarType, H_BarCode, H_Modul, rRatio, H_CheckSum);
  456.   try
  457.     Savefont.Assign(H_Canvas.Font);
  458.     SavePen.Assign(H_Canvas.Pen);
  459.     SaveBrush.Assign(H_Canvas.Brush);
  460.     DoLines(data, H_Canvas, H_BarColor, H_SpcColor, H_Left, H_Top, bWdt,
  461.       H_Height, H_Angle);
  462.     if H_TextShow <> tsNone then
  463.     begin
  464.       case H_TextShow of
  465.         tsBarCode: text := CheckNum;
  466.         tsBarType: text := H_GetBarTypeName(H_BarType);
  467.         tsBoth:    text := H_GetBarTypeName(H_BarType) + ' ' + CheckNum;
  468.       end;
  469.       DoText(text, H_Canvas, H_BackColor, H_TextFont, H_Left, H_Top, bWdt,
  470.         H_Height, H_Angle, H_TextPosition);
  471.     end;
  472.     H_Canvas.Font.Assign(savefont);
  473.     H_Canvas.Pen.Assign(SavePen);
  474.     H_Canvas.Brush.Assign(SaveBrush);
  475.   finally
  476.     Savefont.Free;
  477.     SavePen.Free;
  478.     SaveBrush.Free;
  479.   end;
  480. end;
  481. { Get barcode display width in pixels }
  482. function  H_GetBarWidth(const BW_Type:TBarType; const BW_Code:string;
  483.   const BW_Modul:Integer; const BW_Ratio:Double;
  484.   const BW_CheckSum:TCheckSum) : Integer;
  485. var
  486.   data,tmp : string;
  487.   i,w  : integer;
  488.   lt : TBarLineType;
  489.   r  : Double;
  490. begin
  491.   r := BW_Ratio;
  492.   Result := 0;
  493.   data := MakeData(BW_Type,BW_Code,BW_Modul,r,BW_CheckSum,tmp);
  494.   for i:=1 to Length(data) do
  495.   begin
  496.     OneBarProps(data[i], w, lt);
  497.     Inc(Result, w);
  498.   end;
  499. end;
  500. { Get name of barcode type }
  501. function H_GetBarTypeName(const BN_BarType:TBarType): string;
  502. begin
  503.   result := BCData[BN_BarType].Name;
  504. end;
  505. { Get canvas height in pixels for display }
  506. function H_GetCanvasHeight(const CH_Type:TBarType; const CH_Code:string;
  507.   const CH_Modul:Integer; const CH_Ratio:Double; const CH_CheckSum:TCheckSum;
  508.   const CH_Height:Integer; const CH_Angle:Double): Integer;
  509. var
  510.   alpha :Extended;
  511. begin
  512.   alpha := CH_Angle/180.0*pi;
  513.   Result := Round(abs(cos(alpha))*H_GetBarWidth(CH_Type, CH_Code, CH_Modul,
  514.     CH_Ratio,CH_CheckSum) + abs(sin(alpha))*CH_Height + 0.5);
  515. end;
  516. { Get canvas width in pixels for display }
  517. function H_GetCanvasWidth(const CW_Type:TBarType; const CW_Code:string;
  518.   const CW_Modul:Integer; const CW_Ratio:Double; const CW_CheckSum:TCheckSum;
  519.   const CW_Height:Integer; const CW_Angle:Double): Integer;
  520. var
  521.   alpha :Extended;
  522. begin
  523.   alpha := CW_Angle/180.0*pi;
  524.   Result := Round(abs(sin(alpha))*H_GetBarWidth(CW_Type, CW_Code, CW_Modul,
  525.     CW_Ratio, CW_CheckSum) + abs(cos(alpha))*CW_Height + 0.5);
  526. end;
  527. {*******************}
  528. {     For Print     }
  529. {*******************}
  530. { Print barcode to default printer }
  531. procedure H_PrintBar(const H_Unit:TUnits; const H_BarType:TBarType;
  532.   const H_BarCode:string; const H_Modul:Double; const H_Ratio:Double;
  533.   const H_CheckSum:TCheckSum; const H_Left:Double; const H_Top:Double;
  534.   const H_Height:Double; const H_TextFont:TFont; const H_TextShow:TTextShow;
  535.   const H_TextPosition:TTextPosition; const H_BarColor:TColor;
  536.   const H_SpcColor:TColor; const H_BackColor:TColor; const H_Angle:Double);
  537. var
  538.   l,t,h,m: Integer;
  539. begin
  540.   //printer.BeginDoc;
  541.   case H_Unit of
  542.     utMillimeter:
  543.       begin
  544.         l := ConvertMMtoPixelsX(H_Left);
  545.         t := ConvertMMtoPixelsY(H_Top);
  546.         h := ConvertMMtoPixelsY(H_Height);
  547.         m := ConvertMMtoPixelsX(H_Modul);
  548.       end;
  549.     utInch:
  550.       begin
  551.         l := ConvertInchtoPixelsX(H_Left);
  552.         t := ConvertInchtoPixelsY(H_Top);
  553.         h := ConvertInchtoPixelsY(H_Height);
  554.         m := ConvertInchtoPixelsX(H_Modul);
  555.       end;
  556.   else
  557.     l := Round(H_Left);
  558.     t := Round(H_Top);
  559.     h := Round(H_Height);
  560.     m := Round(H_Modul);
  561.   end;
  562.   H_DrawBar(Printer.Canvas, H_BarType, H_BarCode, m, H_Ratio, H_CheckSum,
  563.     l, t, h, H_TextFont, H_TextShow, H_TextPosition, H_BarColor, H_SpcColor,
  564.     H_BackColor, H_Angle);
  565.   //printer.EndDoc;
  566. end;
  567. { Get barcode width in millimeter or inch for print }
  568. function  H_GetPrnBarWidth(const BW_Unit:TUnits; const BW_Type:TBarType;
  569.   const BW_Code:string; const BW_Modul:Double; const BW_Ratio:Double;
  570.   const BW_CheckSum:TCheckSum) : Double;
  571. var
  572.   m: Integer;
  573. begin
  574.   case BW_Unit of
  575.     utMillimeter:
  576.     begin
  577.       m := ConvertMMtoPixelsX(BW_Modul);
  578.       result := ConvertPixelstoMMX(H_GetBarWidth(BW_Type, BW_Code, m,
  579.         BW_Ratio, BW_CheckSum));
  580.     end;
  581.     utInch:
  582.     begin
  583.       m := ConvertInchtoPixelsX(BW_Modul);
  584.       result := ConvertPixelstoInchX(H_GetBarWidth(BW_Type, BW_Code, m,
  585.         BW_Ratio, BW_CheckSum));
  586.     end;
  587.     else
  588.       result := -1;
  589.   end;
  590. end;
  591. { Get canvas width in millimeter or inch for print }
  592. function H_PrnCanvasWidth(const CW_Unit:TUnits; const CW_Type:TBarType;
  593.   const CW_Code:string; const CW_Modul:Double; const CW_Ratio:Double;
  594.   const CW_CheckSum:TCheckSum; const CW_Height:Double;
  595.   const CW_Angle:Double):  Double;
  596. var
  597.   m, h: Integer;
  598. begin
  599.   case CW_Unit of
  600.     utMillimeter:
  601.     begin
  602.       m := ConvertMMtoPixelsX(CW_Modul);
  603.       h := ConvertMMtoPixelsX(CW_Height);
  604.       result := ConvertPixelstoMMX(H_GetCanvasWidth(CW_Type, CW_Code, m,
  605.         CW_Ratio, CW_CheckSum, h, CW_Angle));
  606.     end;
  607.     utInch:
  608.     begin
  609.       m := ConvertInchtoPixelsX(CW_Modul);
  610.       h := ConvertInchtoPixelsX(CW_Height);
  611.       result := ConvertPixelstoInchX(H_GetCanvasWidth(CW_Type, CW_Code, m,
  612.         CW_Ratio, CW_CheckSum, h, CW_Angle));
  613.     end;
  614.     else
  615.       result := -1;
  616.   end;
  617. end;
  618. { Get canvas height in millimeter or inch for print }
  619. function H_PrnCanvasHeight(const CH_Unit:TUnits; const CH_Type:TBarType;
  620.   const CH_Code:string; const CH_Modul:Double; const CH_Ratio:Double;
  621.   const CH_CheckSum:TCheckSum; const CH_Height:Double;
  622.   const CH_Angle:Double): Double;
  623. var
  624.   m, h: Integer;
  625. begin
  626.   case CH_Unit of
  627.     utMillimeter:
  628.     begin
  629.       m := ConvertMMtoPixelsX(CH_Modul);
  630.       h := ConvertMMtoPixelsX(CH_Height);
  631.       result := ConvertPixelstoMMY(H_GetCanvasHeight(CH_Type, CH_Code, m,
  632.         CH_Ratio, CH_CheckSum, h, CH_Angle));
  633.     end;
  634.     utInch:
  635.     begin
  636.       m := ConvertInchtoPixelsX(CH_Modul);
  637.       h := ConvertInchtoPixelsX(CH_Height);
  638.       result := ConvertPixelstoInchY(H_GetCanvasHeight(CH_Type, CH_Code, m,
  639.         CH_Ratio, CH_CheckSum, h, CH_Angle));
  640.     end;
  641.     else
  642.       result := -1;
  643.   end;
  644. end;
  645. end.