Mega Code Archive

 
Categories / Delphi / Printing
 

A Class to Print Labels

Title: A Class to Print Labels Question: A very simple class to print labels Answer: A very simple class to print labels. What do we need to print labels ? 1. The size (height and width) of every label. 2. The number of labels per row. 3. The top and left margin. 4. The kind of measure: pixels or inches. 5. The font to use. 6. And of course data to fill the labels. With the next class we can do it very simply, Im going to use a pseudo-code to explain the use of the class TAlLabels: var xLabels: TAlLabels; begin xLabels:=TAlLabels.Create; xLabels.Inches:=True; // im going to use inches instead of pixels xLabels.Font:=FontDialog1.Font; // I get the font from a Font Dialog xLabels.LabelsPerRow:=4; // 4 Label per row xLabels.LabelWidthInch:=3; // only an example xLabels.LabelHeightInch:=1.5; // only an example xLabels.LeftMarginInch:=0; // only an example xLabels.TopMarginInch:=0; // only an example xLabels.Open; // open the printer Table.First // Im going to read a customer table while not Table.Eof do begin xLabels.Fill(["Name","Street","City"]); // I fill the content of every label Table.Next; end; xLabels.Close; // close the printer and print any label pending on the buffer xLabels.Free; end; We need only 3 methods: Open, Fill and Close. The properties that we need are: Inches: True if the measure is on Inches, False if the measure is on Pixels. Font LabelsPerRow LabelWidthInch LabelHeightInch LeftMarginInch TopMarginInch If we need to specify pixels instead of Inches we are going to use the next properties. LabelWidth LabelHeight LeftMargin TopMargin Inches:=False Thus, the same example with pixels will be var xLabels: TAlLabels; begin xLabels:=TAlLabels.Create; xLabels.Inches:=False; // im going to use pixels instead of inches xLabels.Font:=FontDialog1.Font; // I get the font from a Font Dialog xLabels.LabelsPerRow:=4; // 4 Label per row xLabels.LabelWidth:=300; // only an example xLabels.LabelHeight:=200; // only an example xLabels.LeftMargin:=0; // only an example xLabels.TopMargin:=0; // only an example xLabels.Open; // open the printer Table.First // Im going to read a customer table while not Table.Eof do begin xLabels.Fill(["Name","Street","City"]); // I fill the content of every label Table.Next; end; xLabels.Close; // close the printer and print any label pending on the buffer xLabels.Free; end; The class : ///////////////////////////////////////////////////////////////////////////// unit ULabels; { Class to print labels Author: Alejandro Castro Date 1/Abr/2002 } interface uses SysUtils, Windows, Graphics, Printers; type TAlLabels = class(TObject) private xWhichLabel: Integer; xBuffer: Boolean; xLabelsPerRow: Integer; xRowsPerLabel: Integer; function ReadLabxRow: Integer; procedure WriteLabxRow(const Value : Integer); function ReadRowxLab: Integer; procedure WriteRowxLab(const Value : Integer); function ReadFont: TFont; procedure WriteFont(const Value : TFont); public LabelWidth: Integer; // width on pixels of every label LabelWidthInch: Real; // width on inches of every label LabelHeight: Integer; // height on pixels of every label LabelHeightInch: Real; // height on inches of every label TopMargin: Integer; // margin on pixels on top of every page TopMarginInch: Real; // margin on inches on top of every page LeftMargin: Integer; // margin on inches on top of every page LeftMarginInch: Real; // margin on inches on top of every page Inches: Boolean; // true=size on inches, false=size on pixels TabsStop: array of integer; // horizontal position on pixels of every label Content: Array of Array of String; // content of every label property Font: TFont read ReadFont write WriteFont; // font for all rows property LabelsPerRow: Integer read ReadLabxRow write WriteLabxRow; property RowsPerLabel: Integer read ReadRowxLab write WriteRowxLab; constructor Create; procedure Fill(xCont: Array of String); // fill a label procedure PrintRow; // print a row of labels procedure Clean; // clean the array CONTENT of labels procedure Close; // close the printer and print pending labels procedure Open; // open the printer end; implementation constructor TAlLabels.Create; begin RowsPerLabel:= 1; LabelsPerRow:= 1; LabelWidth:= 0; LabelWidthInch:=0; LabelHeight:= 0; LabelHeightInch:= 0; TopMargin:= 0; TopMarginInch:= 0; LeftMargin:= 0; LeftMarginInch:= 0; Inches:=True; xWhichLabel:=0; xBuffer:=False; end; procedure TAlLabels.Open; var PixPerInX,PixPerInY,i: Integer; begin Printer.BeginDoc; PixPerInX:=getDeviceCaps(Printer.Handle,LOGPIXELSX); PixPerInY:=getDeviceCaps(Printer.Handle,LOGPIXELSY); if Inches then begin LabelWidth:=Trunc(LabelWidthInch*PixPerInX); LabelHeight:=Trunc(LabelHeightInch*PixPerInY); LeftMargin:=Trunc(LeftMarginInch*PixPerInX); TopMargin:=Trunc(TopMarginInch*PixPerInY); end; for i:=0 to LabelsPerRow-1 do TabsStop[i]:=LeftMargin+LabelWidth*(i); Clean; end; procedure TAlLabels.Close; begin PrintRow; Printer.EndDoc; end; function TAlLabels.ReadLabxRow: Integer; begin Result:=xLabelsPerRow; end; procedure TAlLabels.WriteLabxRow(const Value : Integer); var i: Integer; begin xLabelsPerRow:=Value; SetLength(TabsStop,Value); for i:=0 to high(Content) do SetLength(Content[i],Value); Clean; end; function TAlLabels.ReadRowxLab: Integer; begin Result:=xRowsPerLabel; end; procedure TAlLabels.WriteRowxLab(const Value : Integer); begin SetLength(Content,Value); xRowsPerLabel:=Value; LabelsPerRow:=LabelsPerRow; // to call the WriteLabxRow function Clean; end; function TAlLabels.ReadFont: TFont; begin Result:=Printer.Canvas.Font; end; procedure TAlLabels.WriteFont(const Value : TFont); begin Printer.Canvas.Font.Assign(Value); end; procedure TAlLabels.Clean; var i,j: Integer; begin for i:=0 to high(Content) do For j:=0 to high(Content[i]) do Content[i,j]:=''; xBuffer:=False; xWhichLabel:=0; end; procedure TAlLabels.Fill(xCont: Array of String); var i: Integer; begin xBuffer:=True; if High(xCont)+1RowsPerLabel then RowsPerLabel:=High(xCont)+1; for i:=0 to High(xCont) do Content[i,xWhichLabel]:=xCont[i]; inc(xWhichLabel); if xWhichLabel=LabelsPerRow then begin PrintRow(); end; end; procedure TAlLabels.PrintRow; var i,j,k,y,y1: Integer; begin if xBuffer then begin if Printer.Canvas.PenPos.y=0 then Printer.Canvas.MoveTo(0,TopMargin); y:=Printer.Canvas.PenPos.y; y1:=y; for i:=0 to RowsPerLabel-1 do begin for j:=0 to xWhichLabel-1 do begin Printer.Canvas.TextOut(TabsStop[j],y,Content[i,j]); end; inc(y,Printer.Canvas.Textheight('X')); end; k:=LabelHeight+y1; if k+LabelHeight Printer.PageHeight then Printer.NewPage else Printer.Canvas.MoveTo(0,LabelHeight+y1); end; Clean; end; end.