在图书管理系统中,碰到许多重复条码、没有条码的情形,所以为了自己快速制作打印出二维条码(CODE39),所以编写了这个自定义条码制作打印工具。。。
工程文件
program pCodeMaker; uses Forms, uCodeMaker in 'uCodeMaker.pas' {frmCode39}, BuildCode in 'BuildCode.pas'; {$R *.res} begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TfrmCode39, frmCode39); Application.Run; end.
主单元文件
View Code
unit uCodeMaker; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls, frxClass; type TfrmCode39 = class(TForm) edtBegin: TEdit; btnMake: TButton; edtEnd: TEdit; UpDown2: TUpDown; Label1: TLabel; Label2: TLabel; btnPrint: TButton; Image1: TImage; Label3: TLabel; Memo1: TMemo; procedure btnMakeClick(Sender: TObject); procedure btnPrintClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; var frmCode39: TfrmCode39; Imgs: array of TImage; //Img: TImage; implementation {$R *.dfm} uses BuildCode, Printers; procedure TfrmCode39.btnMakeClick(Sender: TObject); var strCode, strHead, strTmp: string; xBegin, yBegin, k, j, step, ImgCounts: Integer; I, Len, Max: Cardinal; begin Memo1.Hide; //初始化 //Img.Hide; CodeEvaluate;//初始化二进制编码 step := 0; xBegin := 10; yBegin := 10; Max := StrtoIntDef(edtEnd.Text,1); ImgCounts := Max div 36; if (Max mod 36) > 0 then ImgCounts := ImgCounts + 1; SetLength(Imgs, ImgCounts); for I := 0 to Length(Imgs)-1 do begin if not assigned(Imgs[i]) then Imgs[i] := TImage.Create(nil); end; Len := Length(Trim(edtBegin.Text)); if Len > 9 then begin strTmp := Copy(Trim(edtBegin.Text),Len-8,9); strHead := Copy(Trim(edtBegin.Text),1,Len-9); end else begin strTmp := Trim(edtBegin.Text); strHead := ''; end; for I := 0 to Length(Imgs)-1 do begin Imgs[i].Width := 800; Imgs[i].Height := 1200; end; j := 1; for I := 1 to Max do begin k := (I- 1) div 36; strTmp := Inttostr(StrtoInt(strTmp)+step); while Length(strTmp) < 9 do begin strTmp := '0'+strTmp; end; strCode := Trim(strHead + strTmp); if I <= 3 then BuildCodes(strCode, 0, 0,xBegin,yBegin, 60, 2, 1, 12, Image1); BuildCodes(strCode, 0, 0,xBegin,yBegin, 60, 2, 1, 12, Imgs[k]); step := 1; yBegin := yBegin + 90; if ((I mod 12)=0) and (I<>0) then begin xBegin := xBegin + 250; yBegin := 10; inc(j); end; //如果超过3 列,则重新产生 if j>3 then begin j := 1; xBegin := 10; yBegin := 10; end; end; //for end; procedure TfrmCode39.btnPrintClick(Sender: TObject); var r: TRect; bit: TBitmap; xPrinter, yPrinter, x, y, rX,rY, i: integer; begin bit := TBitmap.Create; try for I := 0 to Length(Imgs)-1 do begin Imgs[I].Picture.Graphic.SaveToFile(ExtractFilePath(Application.ExeName)+'tmp.bmp'); bit.LoadFromFile(ExtractFilePath(Application.ExeName)+'tmp.bmp'); //计算显示器分辨率与打印机分辨率的比率 xPrinter := GetDeviceCaps(printer.Handle, LOGPIXELSX); yPrinter := GetDeviceCaps(printer.Handle, LOGPIXELSY); x := GetDeviceCaps(GetDC(Self.Handle), LOGPIXELSX); y := GetDeviceCaps(GetDC(Self.Handle), LOGPIXELSY); rX := xPrinter div x; rY := yPrinter div y; r := Rect(0,0,rX*Bit.Width,rY*Bit.Height); // 开始打印 with Printer do begin begindoc; Canvas.CopyMode := cmSrcCopy; Canvas.CopyRect(r,bit.Canvas,Rect(0,0,Bit.Width,Bit.Height)); enddoc; end; end;// for i finally if FileExists(ExtractFilePath(Application.ExeName)+'tmp.bmp') then DeleteFile(ExtractFilePath(Application.ExeName)+'tmp.bmp'); bit.Free; end; end; procedure TfrmCode39.FormCreate(Sender: TObject); begin //Img := TImage.Create(nil); end; procedure TfrmCode39.FormDestroy(Sender: TObject); var i: integer; begin // Img.Free; for I := 0 to Length(Imgs)-1 do begin Imgs[i].Free; end; end; end.
主单元窗体文件
View Code
object frmCode39: TfrmCode39 Left = 0 Top = 0 BorderIcons = [biSystemMenu, biMinimize] Caption = #26465#24418#30721#21046#20316#25171#21360 ClientHeight = 286 ClientWidth = 440 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False Position = poDesktopCenter OnCreate = FormCreate OnDestroy = FormDestroy PixelsPerInch = 96 TextHeight = 13 object Label1: TLabel Left = 8 Top = 62 Width = 60 Height = 13 Caption = #36215#22987#32534#30721#65306 Color = clGreen ParentColor = False end object Label2: TLabel Left = 8 Top = 109 Width = 72 Height = 13 Caption = #36830#32493#29983#25104#25968#37327 Color = clGreen ParentColor = False end object Image1: TImage Left = 208 Top = 8 Width = 225 Height = 270 end object Label3: TLabel Left = 16 Top = 16 Width = 172 Height = 13 Caption = #26412#31243#24207#20165#36866#29992#20110#21046#20316'CODE39'#26465#30721 Color = clMoneyGreen ParentColor = False end object edtBegin: TEdit Left = 65 Top = 59 Width = 121 Height = 21 ImeName = #20013#25991' ('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861 NumbersOnly = True TabOrder = 0 Text = '9787000000001' end object btnMake: TButton Left = 8 Top = 160 Width = 75 Height = 25 Caption = #29983#25104#26465#24418#30721 TabOrder = 1 OnClick = btnMakeClick end object edtEnd: TEdit Left = 86 Top = 106 Width = 60 Height = 21 ImeName = #20013#25991' ('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861 NumbersOnly = True TabOrder = 2 Text = '1' end object UpDown2: TUpDown Left = 146 Top = 106 Width = 16 Height = 21 Associate = edtEnd Min = 1 Position = 1 TabOrder = 3 end object btnPrint: TButton Left = 111 Top = 160 Width = 75 Height = 25 Caption = #25171#21360 TabOrder = 4 OnClick = btnPrintClick end object Memo1: TMemo Left = 208 Top = 8 Width = 224 Height = 265 Font.Charset = DEFAULT_CHARSET Font.Color = clMedGray Font.Height = -27 Font.Name = 'Tahoma' Font.Style = [] ImeName = #20013#25991' ('#31616#20307') - '#19975#33021#20116#31508#20869#32622#36755#20837#27861 Lines.Strings = ( '' ' '#25928 ' ' ' '#26524 '' ' '#22270) ParentFont = False TabOrder = 5 end end
二维码制作单元文件
View Code
{****************************************************************** ** 文件名: BuildCode.pas ** 版 本: 1.0 ** 创建人: zhjun ** 日 期: 2004.12.29 ** 描 述: Code 39 条码输出模块 **----------------------------------------------------------------- ** 修改人: boltwolf ** 日 期: 2012.01.05 ** 描 述: 添加了code39码的头识别,否则扫描仪无法识别 **----------------------------------------------------------------- ******************************************************************} unit BuildCode; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; function BuildCodes(CodeStr:string;CodeType:integer;Corner:integer;xPos,yPos: integer; CHeight:integer;CWidth:integer;CWidthShort:integer; CTextOutSize:integer; var CodeCanvas:Timage):integer; procedure CodeEvaluate; function CheckParameter(CodeStr:string;CodeType:integer;Corner:integer;xPos,yPos: integer; CHeight:integer;CWidth:integer;CWidthShort:integer;CTextOutSize:integer; var CodeCanvas:Timage):boolean; function ClearCanvas(var CodeCanvas:Timage):boolean; function TypeCode39(CodeStr:string;Corner:integer;xPos,yPos: integer;CHeight,CWidth,CWidthShort:integer; CTextOutSize:integer; var CodeCanvas:Timage):integer; implementation var CodeValue :array[0..43] of string; CodeValueA:array[0..43] of string; CodeOrder:string='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%'; place_X1,place_X2,place_Y1,place_Y2:integer; //条码输出位置 TextPlace_X,TextPlace_Y:integer;//字符输出位置 CordWord_Place:integer; //编码位置编号 CordWord:string; //单个字符 i,j:integer; //循环参数 Code,CodeA:string; CodeStr:string; function BuildCodes(CodeStr:string;CodeType:integer;Corner:integer;xPos,yPos: integer; CHeight,CWidth,CWidthShort:integer;CTextOutSize:integer;var CodeCanvas:Timage):integer; begin if not CheckParameter(CodeStr,CodeType,Corner,xPos,yPos,CHeight,CWidth,CWidthShort,CTextOutSize,CodeCanvas) then exit; // CodeEvaluate;//初始化二进制编码 // ClearCanvas(CodeCanvas); //清除画布 Case CodeType of 0: TypeCode39(CodeStr,Corner,xPos,yPos,CHeight,CWidth,CWidthShort,CTextOutSize,CodeCanvas); end; end; function ClearCanvas(var CodeCanvas:Timage):boolean; var ClientRect:TRect; begin ClientRect.Left:=0; ClientRect.Top:=0; ClientRect.Right:=CodeCanvas.Width; ClientRect.Bottom:=CodeCanvas.Height; with CodeCanvas.Canvas do begin Brush.Style:=bssolid; Brush.Color:=ClWhite; FillRect(ClientRect); end; result:=true; end; //创建 function TypeCode39(CodeStr:string;Corner:integer;xPos,yPos: integer;CHeight,CWidth,CWidthShort:integer; CTextOutSize:integer;var CodeCanvas:Timage):integer; begin place_X1:=xPos; place_Y1:=yPos; TextPlace_X:=Place_X1+Cwidth; TextPlace_Y:=CHeight+yPos; Codecanvas.Canvas.Pen.Color:=clblack; //画起始码* for j := 1 to 5 do begin //画黑线 Codecanvas.Canvas.Pen.Mode:=pmBlack; Codecanvas.Canvas.Pen.Width := 1; Code:=copy(CodeValue[39],j,1); CodeA:=copy(CodeValueA[39],j,1); if Code='1' then begin Codecanvas.Canvas.Pen.Color:=clblack; Place_X2:=Place_X1+CWidth; Codecanvas.Canvas.Rectangle(Place_X1,Place_Y1,Place_X2,CHeight+Place_Y1); Place_X1:=Place_X1+CWidth; end; if Code='0' then begin Codecanvas.Canvas.Pen.Color:=clblack; Place_X2:=Place_X1+CWidthShort; Codecanvas.Canvas.Rectangle(Place_X1,Place_Y1,Place_X2,CHeight+Place_Y1); Place_X1:=Place_X1+CWidthShort; end; //画白线 Codecanvas.Canvas.Pen.Mode:=pmWhite; Codecanvas.Canvas.Pen.Width := 1; if CodeA='1' then begin Codecanvas.Canvas.Pen.Color:=clwhite; Place_X2:=Place_X1+CWidth; Codecanvas.Canvas.Rectangle(Place_X1,Place_Y1,Place_X2,CHeight+Place_Y1); Place_X1:=Place_X1+CWidth; end; if CodeA='0' then begin Codecanvas.Canvas.Pen.Color:=clwhite; Place_X2:=Place_X1+CWidthShort; Codecanvas.Canvas.Rectangle(Place_X1,Place_Y1,Place_X2,CHeight+Place_Y1); Place_X1:=Place_X1+CWidthShort; end; end;//for j //开始循环 for i := 1 to length(CodeStr) do begin Place_X1:=Place_X1+CWidthShort; //按顺序取单个字符 CordWord:=copy(CodeStr,i,1); //获取字符的位置编号 CordWord_Place:=Pos(CordWord,CodeOrder)-1; //按二进制编码顺序输出条码 for j:= 1 to 5 do begin //画黑线 Codecanvas.Canvas.Pen.Mode:=pmBlack; Codecanvas.Canvas.Pen.Width := 1; Code:=copy(CodeValue[CordWord_Place],j,1); CodeA:=copy(CodeValueA[CordWord_Place],j,1); if Code='1' then begin Codecanvas.Canvas.Pen.Color:=clblack; Place_X2:=Place_X1+CWidth; Codecanvas.Canvas.Rectangle(Place_X1,Place_Y1,Place_X2,CHeight+Place_Y1); Place_X1:=Place_X1+CWidth; end; if Code='0' then begin Codecanvas.Canvas.Pen.Color:=clblack; Place_X2:=Place_X1+CWidthShort; Codecanvas.Canvas.Rectangle(Place_X1,Place_Y1,Place_X2,CHeight+Place_Y1); Place_X1:=Place_X1+CWidthShort; end; //画白线 Codecanvas.Canvas.Pen.Mode:=pmWhite; Codecanvas.Canvas.Pen.Width := 1; if CodeA='1' then begin Codecanvas.Canvas.Pen.Color:=clwhite; Place_X2:=Place_X1+CWidth; Codecanvas.Canvas.Rectangle(Place_X1,Place_Y1,Place_X2,CHeight+Place_Y1); Place_X1:=Place_X1+CWidth; end; if CodeA='0' then begin Codecanvas.Canvas.Pen.Color:=clwhite; Place_X2:=Place_X1+CWidthShort; Codecanvas.Canvas.Rectangle(Place_X1,Place_Y1,Place_X2,CHeight+Place_Y1); Place_X1:=Place_X1+CWidthShort; end; end; //for j end; //for i //画终止* Place_X1:=Place_X1+CWidthShort; for j := 1 to 5 do begin //画黑线 Codecanvas.Canvas.Pen.Mode:=pmBlack; Codecanvas.Canvas.Pen.Width := 1; Code:=copy(CodeValue[39],j,1); CodeA:=copy(CodeValueA[39],j,1); if Code='1' then begin Codecanvas.Canvas.Pen.Color:=clblack; Place_X2:=Place_X1+CWidth; Codecanvas.Canvas.Rectangle(Place_X1,Place_Y1,Place_X2,CHeight+Place_Y1); Place_X1:=Place_X1+CWidth; end; if Code='0' then begin Codecanvas.Canvas.Pen.Color:=clblack; Place_X2:=Place_X1+CWidthShort; Codecanvas.Canvas.Rectangle(Place_X1,Place_Y1,Place_X2,CHeight+Place_Y1); Place_X1:=Place_X1+CWidthShort; end; //画白线 Codecanvas.Canvas.Pen.Mode:=pmWhite; Codecanvas.Canvas.Pen.Width := 1; if CodeA='1' then begin Codecanvas.Canvas.Pen.Color:=clwhite; Place_X2:=Place_X1+CWidth; Codecanvas.Canvas.Rectangle(Place_X1,Place_Y1,Place_X2,CHeight+Place_Y1); Place_X1:=Place_X1+CWidth; end; if CodeA='0' then begin Codecanvas.Canvas.Pen.Color:=clwhite; Place_X2:=Place_X1+CWidthShort; Codecanvas.Canvas.Rectangle(Place_X1,Place_Y1,Place_X2,CHeight+Place_Y1); Place_X1:=Place_X1+CWidthShort; end; end;//for j Codecanvas.Canvas.TextWidth('ddddd'); Codecanvas.Canvas.Font.Name:='宋体'; Codecanvas.Canvas.Font.Size:=CTextOutSize; Codecanvas.Canvas.TextOut(TextPlace_X,TextPlace_Y,Codestr); end; function CheckParameter(CodeStr:string;CodeType:integer;Corner:integer;xPos,yPos: integer; CHeight:integer;CWidth:integer;CWidthShort:integer; CTextOutSize:integer; var CodeCanvas:Timage):boolean; begin result:=True; if COdeType<0 then begin Application.MessageBox('缺少参数!'+#13+'请求传递条码类型!', '系统提示',mb_OK or MB_ICONINFORMATION); result:=False; Exit; end; if CodeStr='' then begin Application.MessageBox('缺少参数!'+#13+'请求传递条码字符!', '系统提示',mb_OK or MB_ICONINFORMATION); result:=False; Exit; end; if Corner<0 then Corner:=0; if xPos<0 then xPos := 20; if yPos < 0 then yPos := 20; if CHeight<0 then CHeight:=100; if CWidth<0 then CWidth:=6; if CWidthShort<0 then CWidthShort:=2; if CTextOutSize<0 then CTextOutSize:=9; end; procedure CodeEvaluate; begin CodeValue[0] :='00110'; // 0 CodeValue[1] :='10001'; // 1 CodeValue[2] :='01001'; // 2 CodeValue[3] :='11000'; // 3 CodeValue[4] :='00101'; // 4 CodeValue[5] :='10100'; // 5 CodeValue[6] :='01100'; // 6 CodeValue[7] :='00011'; // 7 CodeValue[8] :='10010'; // 8 CodeValue[9] :='01010'; // 9 CodeValue[10]:='10001'; // A CodeValue[11]:='01001'; // B CodeValue[12]:='11000'; // C CodeValue[13]:='00101'; // D CodeValue[14]:='10100'; // E CodeValue[15]:='01100'; // F CodeValue[16]:='00011'; // G CodeValue[17]:='10010'; // H CodeValue[18]:='01010'; // I CodeValue[19]:='00110'; // J CodeValue[20]:='10001'; // K CodeValue[21]:='01001'; // L CodeValue[22]:='11000'; // M CodeValue[23]:='00101'; // N CodeValue[24]:='10100'; // O CodeValue[25]:='01100'; // P CodeValue[26]:='00011'; // Q CodeValue[27]:='10010'; // R CodeValue[28]:='01010'; // S CodeValue[29]:='00110'; // T CodeValue[30]:='10001'; // U CodeValue[31]:='01001'; // V CodeValue[32]:='11000'; // W CodeValue[33]:='00101'; // X CodeValue[34]:='10100'; // Y CodeValue[35]:='01100'; // Z CodeValue[36]:='00011'; // - CodeValue[37]:='10010'; // . CodeValue[38]:='01010'; // 空格 CodeValue[39]:='00110'; // * CodeValue[40]:='00000'; // $ CodeValue[41]:='00000'; // / CodeValue[42]:='00000'; // + CodeValue[43]:='00000'; // % CodeValueA[0] :='0100'; // 0 CodeValueA[1] :='0100'; // 1 CodeValueA[2] :='0100'; // 2 CodeValueA[3] :='0100'; // 3 CodeValueA[4] :='0100'; // 4 CodeValueA[5] :='0100'; // 5 CodeValueA[6] :='0100'; // 6 CodeValueA[7] :='0100'; // 7 CodeValueA[8] :='0100'; // 8 CodeValueA[9] :='0100'; // 9 CodeValueA[10]:='0010'; // A CodeValueA[11]:='0010'; // B CodeValueA[12]:='0010'; // C CodeValueA[13]:='0010'; // D CodeValueA[14]:='0010'; // E CodeValueA[15]:='0010'; // F CodeValueA[16]:='0010'; // G CodeValueA[17]:='0010'; // H CodeValueA[18]:='0010'; // I CodeValueA[19]:='0010'; // J CodeValueA[20]:='0001'; // K CodeValueA[21]:='0001'; // L CodeValueA[22]:='0001'; // M CodeValueA[23]:='0001'; // N CodeValueA[24]:='0001'; // O CodeValueA[25]:='0001'; // P CodeValueA[26]:='0001'; // Q CodeValueA[27]:='0001'; // R CodeValueA[28]:='0001'; // S CodeValueA[29]:='0001'; // T CodeValueA[30]:='1000'; // U CodeValueA[31]:='1000'; // V CodeValueA[32]:='1000'; // W CodeValueA[33]:='1000'; // X CodeValueA[34]:='1000'; // Y CodeValueA[35]:='1000'; // Z CodeValueA[36]:='1000'; // - CodeValueA[37]:='1000'; // . CodeValueA[38]:='1000'; // 空格 CodeValueA[39]:='1000'; // * CodeValueA[40]:='1110'; // $ CodeValueA[41]:='1101'; // / CodeValueA[42]:='1011'; // + CodeValueA[43]:='0111'; // % end; end.