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

Static控件

开发平台:

Delphi

  1. // =============================================================================
  2. //
  3. // Barcode VCL Component for Quick Report
  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: pQRBarCode.pas 44 2007-01-16 01:16:04Z hanjy $
  10. //
  11. // =============================================================================
  12. unit pQRBarCode;
  13. interface
  14. uses
  15.   Windows, Messages, SysUtils, Classes, Controls, QuickRpt, QRCtrls, Graphics,
  16.   Forms, HBarcode;
  17. {$I 'BarCode.inc'}
  18. type
  19.   TInvalidChar = procedure(Sender: TObject; var Barcode: string) of object;
  20.   TQRBarcode = class(TQRImage)
  21.   private
  22.     { Private declarations }
  23.     FBarCode        : string;           //Barcode value
  24.     FBarType        : TBarType;         //Barcode Type
  25.     FBarHeight      : Integer;          //Barcode Height
  26.     FModul          : Integer;          //Width of thin bar
  27.     FRatio          : Double;           //Ratio of thick and thin bar
  28.     FCheckSum       : TCheckSum;        //Algorithms of checksum
  29.     FColorSpc       : TColor;           //Background color
  30.     FColorBar       : TColor;           //Bar color
  31.     FOrientation    : TOrientation;     //Orientation of barcode
  32.     FTextShow       : TTextShow;        //Content of barcode text to display
  33.     FTextPosition   : TTextPosition;    //Position of barcode text to display
  34.     FTextColor      : TColor;           //Background color of text to display
  35.     FHMargin        : Integer;          //Left and right margin when auto width
  36.     FAutoWidth      : Boolean;
  37.     FFont           : TFont;
  38.     //FRotation       : Double;
  39.     FOnChange       : TNotifyEvent;
  40.     FOnInvalidChar  : TInvalidChar;
  41.     FDisplayBar     : Boolean;
  42.     function  GetAngle:Double;
  43.     procedure SetBarType(const Value: TBarType); 
  44.     procedure SetBarHeight(const Value: Integer);
  45.     procedure SetModul(const Value: Integer);
  46.     procedure SetRatio(const Value: Double);
  47.     procedure SetCheckSum(const Value: TCheckSum);
  48.     procedure SetColorSpc(const Value: TColor);
  49.     procedure SetColorBar(const Value: TColor);
  50.     procedure SetOrientation(const Value: TOrientation);
  51.     procedure SetTextShow(const Value: TTextShow);
  52.     procedure SetTextPosition(const Value: TTextPosition);
  53.     procedure SetTextColor(const Value: TColor);
  54.     procedure SetHMargin(const Value: Integer);
  55.     procedure SetAutoWidth(const Value: Boolean);
  56.     function GetBarTypeName: string;
  57.     procedure SetAbout(const Value: string);
  58.     function GetAbout: string;
  59.     //procedure SetRotation(const Value: Double);
  60.     procedure SetFont(const Value: TFont);
  61.   protected
  62.     { Protected declarations }
  63.     procedure SetBarcode(const Value:string); virtual;
  64.     procedure DoChange; virtual;
  65.   public
  66.     { Public declarations }
  67.     constructor Create(Owner : TComponent); override;
  68.     destructor  Destroy; override;
  69.     procedure Assign(Source: TPersistent);override;
  70.     procedure Paint; override;
  71.     procedure Loaded; override;
  72.     function  AutoSetWidth(H_Margin: Integer): Integer;
  73.     function  GetBarWidth: Integer;
  74.     function  GetBarHeight: Integer;
  75.     property  BarTypeName  : string  read GetBarTypeName;
  76.     property  BarWidth     : Integer read GetBarWidth;
  77.   published
  78.     { Published declarations }
  79.     property BarType: TBarType read FBarType write SetBarType default bcCode39;
  80.     property BarCode: string read FBarCode write SetBarCode;
  81.     property BarHeight: Integer read FBarHeight write SetBarHeight default 0;
  82.     property Modul: Integer read FModul write SetModul;
  83.     property Ratio: Double read FRatio write SetRatio;
  84.     property CheckSum:TCheckSum read FCheckSum write SetCheckSum default csNone;
  85.     property ColorSpc: TColor read FColorSpc write SetColorSpc default clWhite;
  86.     property ColorBar: TColor read FColorBar write SetColorBar default clBlack;
  87.     property Orientation: TOrientation read FOrientation write SetOrientation
  88.       default toLeftRight;
  89.     property TextShow: TTextShow read FTextShow write SetTextShow default tsNone;
  90.     property TextPosition: TTextPosition read FTextPosition write SetTextPosition
  91.       default tpBottomCenter;
  92.     property TextColor: TColor read FTextColor write SetTextColor default clWhite;
  93.     property AutoWidth: Boolean read FAutoWidth write SetAutoWidth default False;
  94.     property HMargin: Integer read FHMargin write SetHMargin default 0;
  95.     //property Rotation: Double read FRotation write SetRotation;
  96.     property About: string read GetAbout write SetAbout;
  97.     property Font: TFont read FFont write SetFont;
  98.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  99.     property OnInvalidChar: TInvalidChar read FOnInvalidChar write FOnInvalidChar;
  100.     property Alignment;
  101.     property AutoSize;
  102.     property Color;
  103.     property Constraints;
  104.     property Ctl3D;
  105.     property UseDockManager default True;
  106.     property DockSite;
  107.     property DragCursor;
  108.     property DragKind;
  109.     property DragMode;
  110.     property Enabled;
  111.   end;
  112. implementation
  113. constructor TQRBarcode.Create(Owner : TComponent);
  114. begin
  115.  inherited Create(Owner);
  116.   //Loaded;
  117.   FDisplayBar   := False;
  118.   FFont := TFont.Create;
  119.   FOrientation  := toLeftRight;
  120.   FModul        := 1;
  121.   FRatio        := 2.0;
  122.   FColorSpc     := clWhite;
  123.   FColorBar     := clBlack;
  124.   FBarCode      := '';
  125.   FBarType      := bcCode39;
  126.   FBarHeight    := 0;
  127.   FCheckSum     := csNone;
  128.   FTextColor    := clWhite;
  129.   FTextShow     := tsNone;
  130.   FTextPosition := tpBottomCenter;
  131.   FHMargin      := 0;
  132.   //FRotation     := 0;
  133.   FAutoWidth    := False;
  134. end;
  135. destructor TQRBarcode.Destroy;
  136. begin
  137.   FFont.Free;
  138.   inherited;
  139. end;
  140. { Assign method }
  141. procedure TQRBarcode.Assign(Source: TPersistent);
  142. var
  143.    BSource : TQRBarcode;
  144. begin
  145.   if Source is TQRBarcode then
  146.   begin
  147.     inherited;
  148.     BSource       := TQRBarcode(Source);
  149.     FOrientation  := BSource.FOrientation;
  150.     FModul        := BSource.FModul;
  151.     FRatio        := BSource.FRatio;
  152.     FColorSpc     := BSource.FColorSpc;
  153.     FColorBar     := BSource.FColorBar;
  154.     FBarType      := BSource.FBarType;
  155.     FBarCode      := BSource.FBarCode;
  156.     FBarHeight    := BSource.FBarHeight;
  157.     FCheckSum     := BSource.FCheckSum;
  158.     FTextColor    := BSource.FTextColor;
  159.     FTextShow     := BSource.FTextShow;
  160.     FTextPosition := BSource.FTextPosition;
  161.     FHMargin      := BSource.FHMargin;
  162.     //FRotation     := BSource.FRotation;
  163.     FAutoWidth    := BSource.FAutoWidth;
  164.     FOnChange     := BSource.FOnChange;
  165.   end;
  166. end;
  167. { Paint method }
  168. procedure TQRBarcode.Paint;
  169. var
  170.   B: TBitmap;
  171.   Angle: Double;
  172.   x, y, h, w: Integer;
  173. begin
  174.   //inherited;
  175.   if FAutoWidth then AutoSetWidth(FHMargin);
  176.   x := 0;
  177.   y := 0;
  178.   h := 0;
  179.   Angle := GetAngle;
  180.   Case FOrientation of
  181.     toLeftRight, toRightLeft:
  182.     begin
  183.       if FBarHeight = 0 then h := Height else h := FBarHeight;
  184.       w := GetBarWidth;
  185.       if Alignment = taLeftJustify then
  186.        x := 0
  187.       else
  188.         if Alignment = taRightJustify then
  189.           x := Width - w
  190.         else
  191.           x := (Width - w) div 2;
  192.       y := (Height - h) div 2;
  193.     end;
  194.     toTopBottom, toBottomTop:
  195.     begin
  196.       if FBarHeight = 0 then h := Width else h := FBarHeight;
  197.       w := GetBarWidth;
  198.       if Alignment = taLeftJustify then
  199.        y := 0
  200.       else
  201.         if Alignment = taRightJustify then
  202.           y := Height - w
  203.         else
  204.           y := (Height - w) div 2;
  205.       x := (Width - h) div 2;
  206.     end;
  207.   end;
  208.   //if FAutoWidth then AutoSetWidth(FHMargin);
  209.   B := TBitmap.Create;
  210.   try
  211.     B.Empty;
  212.     case FOrientation of
  213.       toLeftRight, toRightLeft:
  214.       begin
  215.         B.Width := GetBarWidth;
  216.         B.Height := Height;
  217.       end;
  218.       toTopBottom, toBottomTop:
  219.       begin
  220.         B.Width := Width;
  221.         B.Height := GetBarWidth;
  222.       end;
  223.     end;
  224.     H_DrawBar(B.Canvas, FBarType, FBarCode, FModul, FRatio, FCheckSum, 0, 0, h,
  225.       FFont, FTextShow, FTextPosition, FColorBar, FColorSpc, FTextColor, Angle);
  226.     Picture.Bitmap.Empty;
  227.     Picture.Bitmap.Width := Width;
  228.     Picture.Bitmap.Height := Height;
  229.     if Stretch then
  230.     begin
  231.       if FOrientation in [toLeftRight, toRightLeft] then
  232.       begin
  233.         h := Height;
  234.         y := 0;
  235.         case Alignment of
  236.           taRightJustify:
  237.           begin
  238.             x := FHMargin * 2;
  239.             w := Width;
  240.           end;
  241.           taCenter:
  242.           begin
  243.             x := FHMargin;
  244.             w := Width - x;
  245.           end;
  246.           taLeftJustify:
  247.           begin
  248.             x := 0;
  249.             w := Width - 2 * FHMargin;
  250.           end;
  251.         end;
  252.       end
  253.       else
  254.       begin
  255.         w := Width;
  256.         x := 0;
  257.         case Alignment of
  258.           taRightJustify:
  259.           begin
  260.             y := FHMargin * 2;
  261.             h := Height - 2 * FHMargin;
  262.           end;
  263.           taCenter:
  264.           begin
  265.             y := FHMargin;
  266.             h := Height - 2 * FHMargin;
  267.           end;
  268.           taLeftJustify:
  269.           begin
  270.             y := 0;
  271.             h := Height - 2 * FHMargin;
  272.           end;
  273.         end;
  274.       end;
  275.       StretchBlt(inherited Canvas.Handle, x, y, w, h, B.Canvas.Handle, 0, 0,
  276.         B.Width, B.Height, SRCCOPY);
  277.     end
  278.     else
  279.       BitBlt(inherited Canvas.Handle, x, y, B.Width, B.Height, B.Canvas.Handle,
  280.         0, 0, SRCCOPY);
  281.     inherited Paint;
  282.   finally
  283.     B.Free;
  284.   end;
  285.   
  286. end;
  287. { OnChange Event }
  288. procedure TQRBarcode.DoChange;
  289. begin
  290.   //Repair: Can not be previewed or printed when the component is not visible.
  291.   //RePaint;
  292.   if FDisplayBar then Paint;
  293.   if Assigned(FOnChange) then FOnChange(Self);
  294. end;
  295. { Auto adjust width method }
  296. function TQRBarcode.AutoSetWidth(H_Margin: Integer): Integer;
  297. begin
  298.   result := GetBarWidth + 2 * (H_Margin);
  299.   if FOrientation in [toLeftRight, toRightLeft] then
  300.     Width := result
  301.   else
  302.     Height := result;
  303. end;
  304. { Get barcode angle of left rotate }
  305. function TQRBarcode.GetAngle:Double;
  306. begin
  307.   Case FOrientation of
  308.     toLeftRight : result := 0;
  309.     toRightLeft : result := 180;
  310.     toTopBottom : result := 270;
  311.     toBottomTop : result := 90;
  312.     else
  313.       result := 0;
  314.   end ;
  315. end;
  316. { Set HMargin }
  317. procedure TQRBarcode.SetHMargin(const Value: Integer);
  318. begin
  319.   if Value <> FHMargin then
  320.   begin
  321.     FHMargin := Value;
  322.     if AutoWidth then DoChange;
  323.   end;
  324. end;
  325. { Get barcode width }
  326. function TQRBarcode.GetBarWidth: Integer;
  327. begin
  328.   result := H_GetBarWidth(FBarType,FBarCode,FModul,FRatio,FCheckSum);
  329. end;
  330. { Set barcode value }
  331. procedure TQRBarcode.SetBarcode(const Value: string);
  332. label
  333.   CheckAgain, TryAgain;
  334. var
  335.   tmp: string;
  336.   chk: Boolean;
  337.   i: Integer;
  338.   NewValue: string;
  339. begin
  340.   if Value <> FBarCode then
  341.   begin
  342.     NewValue := Value;
  343.     if BCdata[FBarType].num then
  344.     begin
  345.       CheckAgain:
  346.       tmp := Trim(NewValue);
  347.       chk := False;
  348.       for i := 1 to Length(tmp) do
  349.         chk := chk or ((tmp[i] > '9') or (tmp[i] < '0'));
  350.       if chk then
  351.       begin
  352.         if Assigned(FOnInvalidChar) then FOnInvalidChar(Self, NewValue);
  353.         if NewValue = Value then
  354.           raise Exception.CreateFmt('%s: %s', [Value, ErrorBarcode])
  355.         else
  356.           goto CheckAgain;
  357.       end
  358.       else
  359.         FBarCode := NewValue;
  360.       DoChange;
  361.     end
  362.     else
  363.     begin
  364.       TryAgain:
  365.       chk := False;
  366.       try
  367.         FBarCode := NewValue;
  368.         DoChange;
  369.       except
  370.         if Assigned(FOnInvalidChar) then FOnInvalidChar(Self, NewValue);
  371.         if NewValue = Value then
  372.           raise Exception.CreateFmt('%s: %s', [Value, ErrorBarcode])
  373.         else
  374.           chk := True;
  375.       end;
  376.       if chk then goto TryAgain;
  377.     end;
  378.   end;
  379. end;
  380. { Set barcode type }
  381. procedure TQRBarcode.SetBarType(const Value: TBarType);
  382. begin
  383.   if Value <> FBarType then
  384.   try
  385.     FBarType := Value;
  386.     DoChange;
  387.   except 
  388.     if Assigned(FOnInvalidChar) then FOnInvalidChar(Self, FBarcode) else raise;
  389.   end;
  390. end;
  391. { Set barcode height }
  392. procedure TQRBarcode.SetBarHeight(const Value: Integer);
  393. var
  394.   HeightLimt: Integer;
  395. begin
  396.   if FOrientation in [toTopBottom, toBottomTop] then
  397.     HeightLimt := Width
  398.   else
  399.     HeightLimt := Height;
  400.   if Value <> FBarHeight then
  401.   begin
  402.     if (Value >= 0) and (Value <= HeightLimt) then
  403.       FBarHeight := Value
  404.     else
  405.       FBarHeight := 0;
  406.     DoChange;
  407.   end;
  408. end;
  409. { Get barcode height }
  410. function  TQRBarcode.GetBarHeight: Integer;
  411. begin
  412.   if FOrientation in [toTopBottom, toBottomTop] then
  413.     Result := Width
  414.   else
  415.     Result := Height;
  416.   if (FBarHeight > 0) and (FBarHeight < Result) then
  417.     Result := FBarHeight
  418.   else
  419.     FBarHeight := 0;
  420. end;
  421. { Set barcode Algorithms of checksum }
  422. procedure TQRBarcode.SetCheckSum(const Value: TCheckSum);
  423. begin
  424.   if Value <> FCheckSum then
  425.   begin
  426.      FCheckSum := Value;
  427.      DoChange;
  428.   end;
  429. end;
  430. { Set ratio of thick and thin bar }
  431. procedure TQRBarcode.SetRatio(const Value: Double);
  432. begin
  433.   if Value <> FRatio then
  434.   begin
  435.      FRatio := Value;
  436.      DoChange;
  437.   end;
  438. end;
  439. {
  440. procedure TQRBarcode.SetRotation(const Value: Double);
  441. begin
  442.   if Value <> FRotation then
  443.   begin
  444.      FRotation := Value;
  445.      DoChange;
  446.   end;
  447. end;
  448. }
  449. { Set color of bar }
  450. procedure TQRBarcode.SetColorBar(const Value: TColor);
  451. begin
  452.   if Value <> FColorBar then
  453.   begin
  454.      FColorBar := Value;
  455.      DoChange;
  456.   end;
  457. end;
  458. { Set background color of barcode }
  459. procedure TQRBarcode.SetColorSpc(const Value: TColor);
  460. begin
  461.   if Value <> FColorSpc then
  462.   begin
  463.      FColorSpc := Value;
  464.      DoChange;
  465.   end;
  466. end;
  467. { Set width of thin bar }
  468. procedure TQRBarcode.SetModul(const Value: Integer);
  469. begin
  470.   if Value <> FModul then
  471.   begin
  472.     if (Value >= 1) and (Value < 50) then
  473.     begin
  474.       FModul := Value;
  475.       DoChange;
  476.     end;
  477.   end;
  478. end;
  479. { Set Orientation of barcode }
  480. procedure TQRBarcode.SetOrientation(const Value: TOrientation);
  481. begin
  482.   if Value <> FOrientation then
  483.   begin
  484.      FOrientation := Value;
  485.      DoChange;
  486.   end;
  487. end;
  488. { Set barcode of text }
  489. procedure TQRBarcode.SetTextColor(const Value: TColor);
  490. begin
  491.   if Value <> FTextColor then
  492.   begin
  493.      FTextColor := Value;
  494.      DoChange;
  495.   end;
  496. end;
  497. { Set position of text }
  498. procedure TQRBarcode.SetTextPosition(const Value: TTextPosition);
  499. begin
  500.   if Value <> FTextPosition then
  501.   begin
  502.      FTextPosition := Value;
  503.      DoChange;
  504.   end;
  505. end;
  506. procedure TQRBarcode.SetAutoWidth(const Value: Boolean);
  507. begin
  508.   if Value <> FAutoWidth then
  509.   begin
  510.      FAutoWidth := Value;
  511.      DoChange;
  512.   end;
  513. end;
  514. { Set content of text }
  515. procedure TQRBarcode.SetTextShow(const Value: TTextShow);
  516. begin
  517.   if Value <> FTextShow then
  518.   begin
  519.      FTextShow := Value;
  520.      DoChange;
  521.   end;
  522. end;
  523. { Get type name of current barcode }
  524. function TQRBarcode.GetBarTypeName: string;
  525. begin
  526.   result := BCdata[FBarType].Name;
  527. end;
  528. { Get About }
  529. function TQRBarcode.GetAbout: string;
  530. begin
  531.   Result := CopyrightInfo;
  532. end;
  533. { Set About }
  534. procedure TQRBarcode.SetAbout(const Value: string);
  535. begin
  536.   //
  537. end;
  538. procedure TQRBarcode.SetFont(const Value: TFont);
  539. begin
  540.   if Value <> FFont then
  541.   begin
  542.      //FFont := Value;
  543.      FFont.Assign(Value);
  544.      DoChange;
  545.   end;
  546. end;
  547. procedure TQRBarcode.Loaded;
  548. begin
  549.   inherited;
  550.   FDisplayBar := True;
  551. end;
  552. end.