📄 frxbarcod.pas
字号:
end;
result := result + tabelle_cb[Find_Codabar('B')].data;
end;
{---------------}
{Assist function}
function TfrxBarcode.SetLen(pI:byte):AnsiString;
begin
Result := StringOfChar(AnsiChar('0'), pI - Length(FText)) + FText;
end;
function TfrxBarcode.Code_UPC_A:AnsiString;
var
i : integer;
tmp : AnsiString;
begin
FText := SetLen(12);
if FCheckSum then tmp:=DoCheckSumming(copy(FText,1,11));
if FCheckSum then FText:=tmp else tmp:=FText;
result := '505'; {Startcode}
for i:=1 to 6 do
result := result + tabelle_EAN_A[tmp[i]];
result := result + '05050'; {Trennzeichen}
for i:=7 to 12 do
result := result + tabelle_EAN_C[tmp[i]];
result := result + '505'; {Stopcode}
end;
{UPC E Parity Pattern Table , Number System 0}
const tabelle_UPC_E0:array['0'..'9', 1..6] of AnsiChar =
(
('E', 'E', 'E', 'o', 'o', 'o' ), { 0 }
('E', 'E', 'o', 'E', 'o', 'o' ), { 1 }
('E', 'E', 'o', 'o', 'E', 'o' ), { 2 }
('E', 'E', 'o', 'o', 'o', 'E' ), { 3 }
('E', 'o', 'E', 'E', 'o', 'o' ), { 4 }
('E', 'o', 'o', 'E', 'E', 'o' ), { 5 }
('E', 'o', 'o', 'o', 'E', 'E' ), { 6 }
('E', 'o', 'E', 'o', 'E', 'o' ), { 7 }
('E', 'o', 'E', 'o', 'o', 'E' ), { 8 }
('E', 'o', 'o', 'E', 'o', 'E' ) { 9 }
);
function TfrxBarcode.Code_UPC_E0:AnsiString;
var i,j : integer;
tmp : AnsiString;
c : AnsiChar;
begin
FText := SetLen(7);
tmp:=DoCheckSumming(copy(FText,1,6));
c:=tmp[7];
if FCheckSum then FText:=tmp else tmp := FText;
result := '505'; {Startcode}
for i:=1 to 6 do
begin
if tabelle_UPC_E0[c,i]='E' then
begin
for j:= 1 to 4 do result := result + tabelle_EAN_C[tmp[i],5-j];
end
else
begin
result := result + tabelle_EAN_A[tmp[i]];
end;
end;
result := result + '050505'; {Stopcode}
end;
function TfrxBarcode.Code_UPC_E1:AnsiString;
var i,j : integer;
tmp : AnsiString;
c : AnsiChar;
begin
FText := SetLen(7);
tmp:=DoCheckSumming(copy(FText,1,6));
c:=tmp[7];
if FCheckSum then FText:=tmp else tmp := FText;
result := '505'; {Startcode}
for i:=1 to 6 do
begin
if tabelle_UPC_E0[c,i]='E' then
begin
result := result + tabelle_EAN_A[tmp[i]];
end
else
begin
for j:= 1 to 4 do result := result + tabelle_EAN_C[tmp[i],5-j];
end;
end;
result := result + '050505'; {Stopcode}
end;
{assist function}
function getSupp(Nr : AnsiString) : AnsiString;
var i,fak,sum : Integer;
tmp : AnsiString;
begin
sum := 0;
tmp := copy(nr,1,Length(Nr)-1);
fak := Length(tmp);
for i:=1 to length(tmp) do
begin
if (fak mod 2) = 0 then
sum := sum + (StrToInt(String(tmp[i]))*9)
else
sum := sum + (StrToInt(String(tmp[i]))*3);
dec(fak);
end;
sum:=((sum mod 10) mod 10) mod 10;
result := tmp + AnsiString(IntToStr(sum));
end;
function TfrxBarcode.Code_Supp5:AnsiString;
var i,j : integer;
tmp : AnsiString;
c : AnsiChar;
begin
FText := SetLen(5);
tmp:=getSupp(copy(FText,1,5)+'0');
c:=tmp[6];
if FCheckSum then FText:=tmp else tmp := FText;
result := '506'; {Startcode}
for i:=1 to 5 do
begin
if tabelle_UPC_E0[c,(6-5)+i]='E' then
begin
for j:= 1 to 4 do result := result + tabelle_EAN_C[tmp[i],5-j];
end
else
begin
result := result + tabelle_EAN_A[tmp[i]];
end;
if i<5 then result:=result+'05'; { character delineator }
end;
end;
function TfrxBarcode.Code_Supp2:AnsiString;
var i,j : integer;
tmp,mS : AnsiString;
begin
FText := SetLen(2);
i := StrToInt(String(Ftext));
case i mod 4 of
3: mS:='EE';
2: mS:='Eo';
1: mS:='oE';
0: mS:='oo';
end;
tmp:=getSupp(copy(FText,1,5)+'0');
if FCheckSum then FText:=tmp else tmp := FText;
result := '506'; {Startcode}
for i:=1 to 2 do
begin
if mS[i]='E' then
begin
for j:= 1 to 4 do result := result + tabelle_EAN_C[tmp[i],5-j];
end
else
begin
result := result + tabelle_EAN_A[tmp[i]];
end;
if i<2 then result:=result+'05'; { character delineator }
end;
end;
{---------------}
procedure TfrxBarcode.MakeModules;
begin
case Typ of
bcCode_2_5_interleaved,
bcCode_2_5_industrial,
bcCode39,
bcCodeEAN8,
bcCodeEAN13,
bcCode39Extended,
bcCodeCodabar,
bcCodeUPC_A,
bcCodeUPC_E0,
bcCodeUPC_E1,
bcCodeUPC_Supp2,
bcCodeUPC_Supp5:
begin
if Ratio < 2.0 then Ratio := 2.0;
if Ratio > 3.0 then Ratio := 3.0;
end;
bcCode_2_5_matrix:
begin
if Ratio < 2.25 then Ratio := 2.25;
if Ratio > 3.0 then Ratio := 3.0;
end;
bcCode128A,
bcCode128B,
bcCode128C,
bcCode93,
bcCode93Extended,
bcCodeMSI,
bcCodePostNet: ;
end;
modules[0] := FModul;
modules[1] := Round(FModul*FRatio);
modules[2] := modules[1] * 3 div 2;
modules[3] := modules[1] * 2;
end;
{
Draw the Barcode
Parameter :
'data' holds the pattern for a Barcode.
A barcode begins always with a black line and
ends with a black line.
The white Lines builds the space between the black Lines.
A black line must always followed by a white Line and vica versa.
Examples:
'50505' // 3 thin black Lines with 2 thin white Lines
'606' // 2 fat black Lines with 1 thin white Line
'5605015' // Error
data[] : see procedure OneBarProps
}
procedure TfrxBarcode.DoLines(data:AnsiString; Canvas:TCanvas);
var i:integer;
lt : TfrxBarLineType;
xadd:integer;
width, height:integer;
a,b,c,d, {Edges of a line (we need 4 Point because the line}
{is a recangle}
orgin : TPoint;
alpha:double;
begin
xadd := 0;
orgin.x := FLeft;
orgin.y := FTop;
alpha := FAngle/180.0*pi;
{ Move the orgin so the entire barcode ends up in the visible region. }
orgin := TranslateQuad2D(alpha,orgin,Point(Self.Width,Self.Height));
with Canvas do begin
Pen.Width := 1;
for i:=1 to Length(data) do {examine the pattern string}
begin
{
input: pattern code
output: Width and Linetype
}
OneBarProps(data[i], width, lt);
if (lt = black) or (lt = black_half) then
begin
Pen.Color := FColorBar;
end
else
begin
Pen.Color := FColor;
end;
Brush.Color := Pen.Color;
if lt = black_half then
height := FHeight * 2 div 5
else
height := FHeight;
a.x := xadd;
a.y := 0;
b.x := xadd;
b.y := height;
{c.x := xadd+width;}
c.x := xadd+Width-1; {23.04.1999 Line was 1 Pixel too wide}
c.y := Height;
{d.x := xadd+width;}
d.x := xadd+Width-1; {23.04.1999 Line was 1 Pixel too wide}
d.y := 0;
{a,b,c,d builds the rectangle we want to draw}
{PostNet bug}
if lt = black_half then
begin
a.Y := FHeight - a.Y;
b.Y := FHeight - b.Y;
c.Y := FHeight - c.Y;
d.Y := FHeight - d.Y;
end;
{rotate the rectangle}
a := Translate2D(Rotate2D(a, alpha), orgin);
b := Translate2D(Rotate2D(b, alpha), orgin);
c := Translate2D(Rotate2D(c, alpha), orgin);
d := Translate2D(Rotate2D(d, alpha), orgin);
{draw the rectangle}
Polygon([a,b,c,d]);
xadd := xadd + width;
end;
end;
end;
procedure TfrxBarcode.DrawBarcode(Canvas: TCanvas; ARect: TRect; ShowText: Boolean);
const
TxtHeight = 14;
var
data : AnsiString;
w, h, BarWidth: Integer;
EMF: TMetafile;
EMFCanvas: TMetafileCanvas;
Zoom: Extended;
function CreateRotatedFont(Font: TFont; Angle: Integer): HFont;
var
F: TLogFont;
begin
GetObject(Font.Handle, SizeOf(TLogFont), @F);
F.lfEscapement := Angle * 10;
F.lfOrientation := Angle * 10;
Result := CreateFontIndirect(F);
end;
procedure TextOutR(x, x1, x2: Integer; s: AnsiString);
begin
with EMFCanvas do
case Round(FAngle) of
90:
begin
FillRect(Rect(w - TxtHeight, h - x1, w, h - x2 - 1));
TextOut(w - TxtHeight, h - x, String(s));
end;
180:
begin
FillRect(Rect(w - x1, 0, w - x2 - 1, TxtHeight + 2));
TextOut(w - x, TxtHeight, String(s));
end;
270:
begin
FillRect(Rect(0, x1, TxtHeight, x2 + 1));
TextOut(TxtHeight, x, String(s));
end;
else
begin
FillRect(Rect(x1, h - TxtHeight - 2, x2 + 1, h));
TextOut(x, h - TxtHeight, String(s));
end;
end;
end;
procedure OutText;
var
TxtWidth: Integer;
FontHandle, OldFontHandle: HFont;
begin
with EMFCanvas do
begin
Font.Name := 'Arial';
Font.Size := 9;
FontHandle := CreateRotatedFont(Font, Round(FAngle));
OldFontHandle := SelectObject(Handle, FontHandle);
Brush.Color := Color;
SetBkMode(Handle, Transparent);
case FTyp of
bcCodeEAN8: // 8 digits, 4+4
begin
TextOutR(3, 3, 30, Copy(FText, 1, 4));
TextOutR(35, 35, BarWidth - 4, Copy(FText, 5, 4));
end;
bcCodeEAN13: // 13 digits, 1+6+6 or 12 digits, 6+6
begin
//if FText[1] <> '0' then
TextOutR(-8, -8, -2, Copy(FText, 1, 1));
TextOutR(3, 3, 44, Copy(FText, 2, 6));
TextOutR(49, 49, BarWidth - 4, Copy(FText, 8, 6));
end;
bcCodeUPC_A: // 12 digits, 1+5+5+1
begin
TextOutR(-8, -8, -2, Copy(FText, 1, 1));
TextOutR(10, 10, 44, Copy(FText, 2, 5));
TextOutR(49, 49, 83, Copy(FText, 7, 5));
TextOutR(BarWidth + 1, BarWidth + 1, BarWidth + 8, Copy(FText, 12, 1));
end;
bcCodeUPC_E0,
bcCodeUPC_E1: // 7 digits, 6+1
begin
TextOutR(3, 3, 44, Copy(FText, 1, 6));
TextOutR(BarWidth + 1, BarWidth + 1, BarWidth + 8, Copy(FText, 7, 1));
end;
else
begin
TxtWidth := TextWidth(String(FText));
TextOutR((BarWidth - TxtWidth) div 2, 0, BarWidth, FText);
end;
end;
SelectObject(Handle, OldFontHandle);
DeleteObject(FontHandle);
end;
end;
begin
data := MakeData;
BarWidth := Width;
FLeft := 0;
FTop := 0;
if (FAngle = 0) or (FAngle = 180) then
begin
Zoom := (ARect.Right - ARect.Left) / BarWidth;
w := BarWidth;
h := ARect.Bottom - ARect.Top;
h := Round(h / Zoom);
FHeight := h;
if ShowText then
if FTyp in [bcCodeEAN8, bcCodeEAN13, bcCodeUPC_A, bcCodeUPC_E0, bcCodeUPC_E1] then
begin
FHeight := h - TxtHeight div 2;
if FAngle = 180 then
FTop := (TxtHeight + 2) div 2;
end
else
begin
FHeight := h - TxtHeight - 2;
if FAngle = 180 then
FTop := TxtHeight + 2;
end;
end
else
begin
Zoom := (ARect.Bottom - ARect.Top) / BarWidth;
w := ARect.Right - ARect.Left;
h := BarWidth;
w := Round(w / Zoom);
FHeight := w;
if ShowText then
if FTyp in [bcCodeEAN8, bcCodeEAN13, bcCodeUPC_A, bcCodeUPC_E0, bcCodeUPC_E1] then
begin
FHeight := w - TxtHeight div 2;
if FAngle = 270 then
FLeft := (TxtHeight + 2) div 2;
end
else
begin
FHeight := w - TxtHeight - 2;
if FAngle = 270 then
FLeft := TxtHeight + 2;
end;
end;
EMF := TMetafile.Create;
EMF.Width := w;
EMF.Height := h;
try
EMFCanvas := TMetafileCanvas.Create(EMF, 0);
try
DoLines(data, EMFCanvas);
if ShowText then
OutText;
finally
EMFCanvas.Free;
end;
Canvas.StretchDraw(ARect, EMF);
finally
EMF.Free;
end;
end;
end.
//13:24 21.10.2008
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -