123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- {
- This file is part of the Free Component Library.
- Copyright (c) 2017 Michael Van Canneyt, member of the Free Pascal development team
- Barcode report element.
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- unit fpreportbarcode;
- {$mode objfpc}
- {$H+}
- interface
- uses
- Classes, fpimage, fpexprpars, fpimgbarcode, fpbarcode, fpreport, fpreportstreamer;
- Type
- { TFPReportBarcode }
- TFPReportBarcode = Class(TFPReportElement)
- private
- FEncoding: TBarcodeEncoding;
- FExpression: String;
- FPadLength: Integer;
- FUnitWidth: Integer;
- FValue: String;
- FExprValue : String;
- FWeight: Double;
- Protected
- procedure BeforePrint; override;
- procedure RecalcLayout; override;
- Procedure DoWriteLocalProperties(AWriter: TFPReportStreamer; AOriginal: TFPReportElement=nil); override;
- Public
- procedure Assign(Source: TPersistent); override;
- Constructor Create(AOwner: TComponent); override;
- Class Function ElementType : String; override;
- // Will calculate the value to display. Either Value or evaluated expression.
- Function BarcodeValue : String;
- Procedure ReadElement(AReader: TFPReportStreamer); override;
- Published
- Property Encoding : TBarcodeEncoding Read FEncoding Write FEncoding;
- Property UnitWidth : Integer Read FUnitWidth Write FUnitWidth;
- Property Weight : Double Read FWeight Write FWeight;
- Property PadLength : Integer Read FPadLength Write FPadLength;
- // Expression takes precedence
- Property Value : String Read FValue Write FValue;
- Property Expression : String Read FExpression Write FExpression;
- end;
- Procedure RegisterReportBarcode;
- Procedure UnRegisterReportBarcode;
-
- implementation
- uses typinfo, strutils;
- { TFPReportBarcode }
- procedure TFPReportBarcode.RecalcLayout;
- begin
- // Do nothing for the moment.
- // We may consider adding a Boolean property FitWidth and calculating width based on value/expression when it is set to true
- end;
- procedure TFPReportBarcode.DoWriteLocalProperties(AWriter: TFPReportStreamer; AOriginal: TFPReportElement);
- begin
- inherited DoWriteLocalProperties(AWriter, AOriginal);
- AWriter.WriteString('Encoding',GetEnumName(TypeInfo(TBarcodeEncoding),Ord(FEncoding)));
- AWriter.WriteInteger('UnitWidth',UnitWidth);
- AWriter.WriteInteger('PadLength',PadLength);
- AWriter.WriteFloat('Weight',Weight);
- AWriter.WriteString('Value',Value);
- AWriter.WriteString('Expression',Expression);
- end;
- procedure TFPReportBarcode.Assign(Source: TPersistent);
- Var
- BC : TFPReportBarcode;
- begin
- if (Source is TFPReportBarcode) then
- begin
- BC:=TFPReportBarcode(Source);
- FValue:=BC.Value;
- FPadlength:=BC.PadLength;
- FExpression:=BC.Expression;
- FWeight:=BC.Weight;
- FUnitWidth:=BC.UnitWidth;
- FEncoding:=BC.Encoding;
- end;
- inherited Assign(Source);
- end;
- constructor TFPReportBarcode.Create(AOwner: TComponent);
- begin
- inherited Create(AOwner);
- FEncoding:=be128A;
- FUnitWidth:=1;
- FWeight:=2.0;
- end;
- class function TFPReportBarcode.ElementType: String;
- begin
- Result:='BarCode';
- end;
- procedure TFPReportBarcode.BeforePrint;
- begin
- Inherited;
- if (FExpression<>'') then
- FExprValue:=EvaluateExpressionAsText(FExpression)
- end;
- function TFPReportBarcode.BarcodeValue: String;
- begin
- if (FExpression<>'') then
- Result:=FExprValue // Calculated in beforeprint
- else
- Result:=FValue;
- Result:=AddChar('0',Result,PadLength);
- end;
- procedure TFPReportBarcode.ReadElement(AReader: TFPReportStreamer);
- Var
- S : String;
- I : Integer;
- begin
- inherited ReadElement(AReader);
- S:=AReader.ReadString('Encoding','beEan8');
- I:=GetEnumValue(TypeInfo(TBarcodeEncoding),S);
- if I<>-1 then
- FEncoding:=TBarcodeEncoding(I);
- UnitWidth:=AReader.ReadInteger('UnitWidth',UnitWidth);
- PadLength:=AReader.ReadInteger('UnitWidth',PadLength);
- Weight:=AReader.ReadFloat('Weight',Weight);
- Value:=AReader.ReadString('Value',Value);
- Expression:=AReader.ReadString('Expression',Expression);
- end;
- procedure RenderBarcode(aElement: TFPReportElement; aImage: TFPCustomImage);
- Var
- D : TFPDrawBarcode;
- B : TFPReportBarcode;
- begin
- B:=TFPReportBarcode(aElement);
- D:=TFPDrawBarcode.Create;
- try
- D.Image:=aImage;
- D.Weight:=B.Weight;
- D.UnitWidth:=B.UnitWidth;
- D.Rect:=Rect(0,0,aImage.Width-1,aImage.Height-1);
- D.Text:=B.BarcodeValue;
- // Writeln('Weight: ',D.Weight,' unitwidth:',D.UnitWidth,' ',aImage.Width-1,'x',aImage.Height-1,' Text: ',D.Text);
- D.Encoding:=B.Encoding;
- D.Clipping:=True;
- D.Draw;
- finally
- D.Free;
- end;
- end;
- Procedure RegisterReportBarcode;
- Const
- icon : Array[0..687] of byte = (
- 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0,
- 0, 0, 16, 0, 0, 0, 16, 8, 6, 0, 0, 0, 31,243,255, 97, 0,
- 0, 2,119, 73, 68, 65, 84,120,156,141,147,189, 74, 92, 81, 20,133,
- 191,243,115,255,207,140,137,131, 78, 52, 97, 16, 11, 13, 72, 82, 72,
- 8, 24, 27, 11,155,188,131,149,181,146,202,135, 8, 41,132,188,129,
- 32,216, 8,118,226, 3,164, 21,196, 46, 54,153, 66, 13, 99, 38,113,
- 254,238,157,153,123,199,123, 82, 56,115, 73, 37, 89,176,224,176, 89,
- 103,237,195,222,103, 9,198, 56, 56, 56, 88, 95, 92, 92,124, 45,165,
- 20, 60, 1,107,173,173,215,235,223,183,182,182,190, 21,197,163,163,
- 163,207, 73,146,228, 73,146,216,255,100,126,120,120,248, 5, 64,108,
- 111,111,191, 92, 93, 93,173,135, 97,168,141, 49, 52, 26, 13,142,143,
- 143, 57, 61, 61,101,125,125,157, 82,169,196,206,206, 14,215,215,215,
- 156,156,156,176,187,187,203,205,205, 13,211,211,211, 15,151,151,151,
- 11,186, 82,169, 84,227, 56,214,214, 90,164,148,116,187, 93,126,253,
- 106, 2,112,119,119,199,112, 56, 36, 73, 18,226, 56,166,217,108,210,
- 235,245,136,227, 24,223,247, 85,181, 90,125, 33,133, 16, 76, 40,165,
- 68,107,141,235,186, 40,165,240, 60, 15,207,243, 80, 74,161,181,198,
- 113,156, 66, 7, 32,165, 20, 18, 40,138, 82,170,177,129, 83, 24,185,
- 174,139,214,186, 48,208, 90, 35,165, 66, 74,137,181, 22, 41, 30,157,
- 198, 93, 84,209, 77, 8, 81, 92, 82,106, 82,159,156,229,248, 21, 22,
- 141, 16,204,164, 41,230,247,111, 76,154,162, 90, 45,222,102, 25,226,
- 231, 79,222,141, 70,148, 71, 35,102, 91, 45,242, 78,135, 55, 89, 74,
- 165,217,100,116,127,143,137, 34,218, 8,180, 16,130, 56,138, 40, 55,
- 155, 68, 74, 97, 7, 3, 94,229, 57,162,223,103,193, 90, 76,158, 83,
- 74, 83,134, 89,198,124,158, 19,245,251,136, 52, 37, 14, 67, 72,146,
- 71, 3,171, 53,237, 90,141, 40,203,200,178,140,196,243,160, 82,161,
- 231,121, 8,207, 99, 84, 46,147,117,187,244, 93,151,254,212, 51,254,
- 184, 46,211, 74, 33,192, 74, 38, 51,240,125,226,106,149, 81,185, 76,
- 26,134, 48, 53,197, 32, 8, 24,134, 33,185, 49, 60, 24, 67, 28, 69,
- 244,102,103,208,227, 45, 33, 4, 18, 40,134,164, 28,135,158, 49, 12,
- 130, 0,164,100, 16, 4,164, 97,200,131,235, 50,116, 93, 26,229, 50,
- 74,235, 66,111,173, 69,118, 58,157,252,113,133,143,204,181,166, 21,
- 69, 0,164, 65, 64, 26, 4,228,142, 67,223,247, 17,142,195,191,218,
- 118,187,253,160, 47, 46, 46,126,172,172,172, 52,150,151,151,171, 65,
- 16, 96,140,225,253,135, 15, 0,172,110,108, 96, 74, 37,158,207,207,
- 99,125,159,181,181, 53,230,230,230,240, 60,143,219,219,219,198,249,
- 249,249, 15, 1,176,185,185,249,113,111,111,239,235,210,210,210,252,
- 83, 73,156,224,234,234,234,118,127,127,255,211,217,217,217,105, 17,
- 221, 90,173, 22,229,121,254,124,242, 77,159,136, 51, 74,169,251,122,
- 189, 30, 3,252, 5,131, 89, 18, 55,201,190,160,207, 0, 0, 0, 0,
- 73, 69, 78, 68,174, 66, 96,130);
- begin
- TFPReportBarcode.RegisterElement.SetIconFromBytes(Icon);
- // Fallback renderer
- gElementFactory.RegisterImageRenderer(TFPReportBarcode,@RenderBarcode);
- end;
- Procedure UnRegisterReportBarcode;
- begin
- TFPReportBarcode.UnRegisterElement;
- end;
- initialization
- RegisterReportBarcode;
- end.
|