rm_barc.pas
来自「report machine 2.3 功能强大」· PAS 代码 · 共 567 行
PAS
567 行
{*******************************************}
{ }
{ Report Machine v2.0 }
{ Barcode Add-in object }
{ }
{*******************************************}
unit RM_BarC;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Menus, ExtCtrls, Buttons, RM_Class, RM_BarCode;
type
TRMBarCodeObject = class(TComponent) // fake component
end;
TRMBarCodeRec = packed record
cCheckSum: Boolean;
cShowText: Boolean;
cCadr: Boolean;
cBarType: TRMBarcodeType;
cModul: Integer;
cRatio: Double;
cAngle: Double;
end;
{ TRMBarCodeView }
TRMBarCodeView = class(TRMView)
private
FBarC: TRMBarCode;
procedure BarcodeEditor(Sender: TObject);
protected
function GetViewCommon: string; override;
public
Param: TRMBarCodeRec;
constructor Create; override;
destructor Destroy; override;
procedure LoadFromStream(Stream: TStream); override;
procedure SaveToStream(Stream: TStream); override;
procedure Draw(Canvas: TCanvas); override;
procedure StreamOut(Stream: TStream); override;
procedure DefinePopupMenu(Popup: TPopupMenu); override;
procedure DefineProperties; override;
procedure ShowEditor; override;
end;
{ TRMBarCodeForm }
TRMBarCodeForm = class(TForm)
btnCancel: TButton;
btnOK: TButton;
edtCode: TEdit;
Label1: TLabel;
cbType: TComboBox;
Label2: TLabel;
Panel1: TPanel;
GroupBox1: TGroupBox;
chkCheckSum: TCheckBox;
chkViewText: TCheckBox;
GroupBox2: TGroupBox;
RB1: TRadioButton;
RB2: TRadioButton;
RB3: TRadioButton;
RB4: TRadioButton;
DBBtn: TSpeedButton;
imgSample: TImage;
Label3: TLabel;
eZoom: TEdit;
Panel2: TPanel;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
procedure FormCreate(Sender: TObject);
procedure DBBtnClick(Sender: TObject);
procedure btnOKClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure edtCodeChange(Sender: TObject);
procedure cbTypeChange(Sender: TObject);
procedure chkCheckSumClick(Sender: TObject);
procedure RB1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
private
FBarcode: TRMBarcode;
procedure ShowSample;
procedure Localize;
public
end;
implementation
uses RM_Const, RM_Utils, RM_CmpReg;
{$R *.DFM}
const
cbDefaultText = '12345678';
{$HINTS OFF}
function isNumeric(St: string): Boolean;
var
R: Double;
E: Integer;
begin
Val(St, R, E);
Result := (E = 0);
end;
{$HINTS ON}
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;
{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{TRMBarCodeView}
constructor TRMBarCodeView.Create;
begin
inherited Create;
FBarC := TRMBarCode.Create(nil);
Param.cCheckSum := True;
Param.cShowText := True;
Param.cCadr := False;
Param.cBarType := bcCode39;
Param.cModul := 1;
Param.cRatio := 2;
Param.cAngle := 0;
Memo.Add(cbDefaultText);
BaseName := 'Bar';
end;
destructor TRMBarCodeView.Destroy;
begin
FBarC.Free;
inherited Destroy;
end;
procedure TRMBarCodeView.DefineProperties;
begin
inherited DefineProperties;
AddProperty('Barcode', [RMdtHasEditor, RMdtOneObject], BarcodeEditor);
AddProperty('DataField', [RMdtOneObject, RMdtHasEditor, RMdtString], RMFieldEditor);
AddProperty('OnBeforePrint', [RMdtHasEditor, RMdtOneObject], RMScript_BeforePrintEditor);
AddProperty('OnAfterPrint', [RMdtHasEditor, RMdtOneObject], RMScript_AfterPrintEditor);
end;
procedure TRMBarCodeView.LoadFromStream(Stream: TStream);
begin
inherited LoadFromStream(Stream);
Stream.Read(Param, SizeOf(Param));
end;
procedure TRMBarCodeView.SaveToStream(Stream: TStream);
begin
LVersion := 0;
inherited SaveToStream(Stream);
Stream.Write(Param, SizeOf(Param));
end;
procedure TRMBarCodeView.Draw(Canvas: TCanvas);
var
Txt: string;
hg: Integer;
EMF: TMetafile;
EMFCanvas: TMetafileCanvas;
h, oldh: HFont;
liDx, liDy: Integer;
begin
if (dx < 0) or (dy < 0) or (Memo.Text = #13#10) then Exit;
CalcGaps;
liDx := DRect1.Right - DRect1.Left;
liDy := DRect1.Bottom - DRect1.Top;
BeginDraw(Canvas);
Memo1.Assign(Memo);
if (Memo1.Count > 0) and (Memo1[0][1] <> '[') then
Txt := Memo1.Strings[0]
else
Txt := cbDefaultText;
FBarC.Angle := Param.cAngle;
FBarC.Ratio := Param.cRatio;
FBarC.Modul := Param.cModul;
FBarC.Checksum := Param.cCheckSum;
if FillColor = clNone then
FBarC.Color := clWhite
else
FBarC.Color := FillColor;
FBarC.Typ := Param.cBarType;
if bcData[Param.cBarType].Num = False then
FBarC.Text := Txt
else if IsNumeric(Txt) then
FBarC.Text := Txt
else
FBarC.Text := cbDefaultText;
if (Param.cAngle = 90) or (Param.cAngle = 270) then
liDy := FBarC.Width
else
liDx := FBarC.Width;
if Trim(FBarC.Text) = '0' then
begin
Exit;
end;
if (Param.cAngle = 90) or (Param.cAngle = 270) then
begin
if Param.cShowText then
hg := liDx - 14
else
hg := liDx;
end
else if Param.cShowText then
hg := liDy - 14
else
hg := liDy;
FBarC.Left := 0;
FBarC.Top := 0;
FBarC.Height := hg;
if Param.cAngle = 180 then
FBarC.Top := liDy - hg
else if Param.cAngle = 270 then
FBarC.Left := liDx - hg;
EMF := TMetafile.Create;
EMF.Width := liDx;
EMF.Height := liDy;
EMFCanvas := TMetafileCanvas.Create(EMF, 0);
FBarC.DrawBarcode(EMFCanvas);
Txt := FBarC.Text;
if Param.cShowText then
begin
with EMFCanvas do
begin
Font.Color := clBlack;
Font.Name := 'Courier New';
Font.Height := -12;
Font.Style := [];
h := CreateRotatedFont(Font, Round(Param.cAngle));
oldh := SelectObject(Handle, h);
if Param.cAngle = 0 then
TextOut((liDx - TextWidth(Txt)) div 2, liDy - 12, Txt)
else if Param.cAngle = 90 then
TextOut(liDx - 12, liDy - (liDy - TextWidth(Txt)) div 2, Txt)
else if Param.cAngle = 180 then
TextOut(liDx - (liDx - TextWidth(Txt)) div 2, 12, Txt)
else
TextOut(12, (liDy - TextWidth(Txt)) div 2, Txt);
SelectObject(Handle, oldh);
DeleteObject(h);
end;
end;
EMFCanvas.Free;
ShowBackground;
Canvas.StretchDraw(DRect1, EMF);
EMF.Free;
ShowFrame;
RestoreCoord;
end;
procedure TRMBarCodeView.StreamOut(Stream: TStream);
var
SaveTag: string;
begin
BeginDraw(Canvas);
Memo1.Assign(Memo);
CurReport.InternalOnEnterRect(Memo1, Self);
RMInterpretator.DoScript(Script);
if not Visible then Exit;
if IsPrinting and (not PPrintFrame) then Exit;
SaveTag := Tag;
if (Tag <> '') and (Pos('[', Tag) <> 0) then
ExpandVariables(Tag);
if Memo1.Count > 0 then
begin
if (Length(Memo1[0]) > 0) and (Memo1[0][1] = '[') then
begin
try
Memo1[0] := RMParser.Calc(Memo1[0]);
except
Memo1[0] := '0';
end;
end;
end;
Stream.Write(Typ, 1);
RMWriteString(Stream, ClassName);
SaveToStream(Stream);
RMInterpretator.DoScript(Script_AfterPrint);
Tag := SaveTag;
end;
procedure TRMBarCodeView.DefinePopupMenu(Popup: TPopupMenu);
begin
// no specific items in popup menu
end;
procedure TRMBarCodeView.BarcodeEditor(Sender: TObject);
begin
ShowEditor;
end;
procedure TRMBarCodeView.ShowEditor;
var
tmpForm: TRMBarcodeForm;
begin
tmpForm := TRMBarcodeForm.Create(nil);
try
with tmpForm do
begin
if Memo.Count > 0 then
edtCode.Text := Memo.Strings[0];
cbType.ItemIndex := ord(Param.cBarType);
chkCheckSum.checked := Param.cCheckSum;
chkViewText.Checked := Param.cShowText;
eZoom.Text := IntToStr(Param.cModul);
if Param.cAngle = 0 then
RB1.Checked := True
else if Param.cAngle = 90 then
RB2.Checked := True
else if Param.cAngle = 180 then
RB3.Checked := True
else
RB4.Checked := True;
if ShowModal = mrOk then
begin
RMDesigner.BeforeChange;
Memo.Clear;
Memo.Add(edtCode.Text);
Param.cModul := StrToInt(eZoom.Text);
Param.cCheckSum := chkCheckSum.Checked;
Param.cShowText := chkViewText.Checked;
Param.cBarType := TRMBarcodeType(cbType.ItemIndex);
if RB1.Checked then
Param.cAngle := 0
else if RB2.Checked then
Param.cAngle := 90
else if RB3.Checked then
Param.cAngle := 180
else
Param.cAngle := 270;
RMDesigner.AfterChange;
end;
end;
finally
tmpForm.Free;
end;
end;
function TRMBarCodeView.GetViewCommon: string;
begin
Result := '[BarCode]';
end;
{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{TRMBarCodeForm}
procedure TRMBarCodeForm.ShowSample;
var
Txt: string;
hg: Integer;
h, oldh: HFont;
begin
if IsNumeric(edtCode.Text) then
FBarCode.Text := edtCode.Text
else
FBarCode.Text := cbDefaultText;
FBarCode.Checksum := chkCheckSum.Checked;
FBarCode.Typ := TRMBarcodeType(cbType.ItemIndex);
FBarCode.Ratio := 2;
FBarCode.Modul := StrToInt(eZoom.Text);
if RB1.Checked then
FBarCode.Angle := 0
else if RB2.Checked then
FBarCode.Angle := 90
else if RB3.Checked then
FBarCode.Angle := 180
else
FBarCode.Angle := 270;
imgSample.Canvas.FillRect(Rect(0, 0, imgSample.Width, imgSample.Height));
if (FBarCode.Angle = 90) or (FBarCode.Angle = 270) then
hg := imgSample.Width - 14
else
hg := imgSample.Height - 14;
FBarCode.Left := 0; FBarCode.Top := 0;
FBarCode.Height := hg;
if FBarCode.Angle = 180 then
FBarCode.Top := imgSample.Height - hg
else if FBarCode.Angle = 270 then
FBarCode.Left := imgSample.Width - hg;
Txt := FBarCode.Text;
with imgSample.Canvas do
begin
Font.Color := clBlack;
Font.Name := 'Courier New';
Font.Height := -12;
Font.Style := [];
h := CreateRotatedFont(Font, Round(FBarCode.Angle));
oldh := SelectObject(Handle, h);
if FBarCode.Angle = 0 then
TextOut((imgSample.Width - TextWidth(Txt)) div 2, imgSample.Height - 12, Txt)
else if FBarCode.Angle = 90 then
TextOut(imgSample.Width - 12, imgSample.Height - (imgSample.Height - TextWidth(Txt)) div 2, Txt)
else if FBarCode.Angle = 180 then
TextOut(imgSample.Width - (imgSample.Width - TextWidth(Txt)) div 2, 12, Txt)
else
TextOut(12, (imgSample.Height - TextWidth(Txt)) div 2, Txt);
SelectObject(Handle, oldh);
DeleteObject(h);
end;
FBarCode.DrawBarcode(imgSample.Canvas);
end;
procedure TRMBarCodeForm.FormCreate(Sender: TObject);
var
i: TRMBarcodeType;
begin
Localize;
FBarCode := TRMBarCode.Create(Self);
FBarCode.Height := ImgSample.ClientHeight;
CbType.Items.Clear;
for i := bcCode_2_5_interleaved to bcCodeEAN128C do
cbType.Items.Add(bcData[i].Name);
cbType.ItemIndex := 0;
end;
procedure TRMBarCodeForm.FormActivate(Sender: TObject);
begin
edtCode.SetFocus;
end;
procedure TRMBarCodeForm.DBBtnClick(Sender: TObject);
var
s: string;
begin
s := RMDesigner.InsertExpression;
if s <> '' then
edtCode.Text := s;
end;
procedure TRMBarCodeForm.btnOKClick(Sender: TObject);
var
bc: TRMBarCode;
Bmp: TBitmap;
begin
bc := TRMBarCode.Create(nil);
bc.Text := edtCode.Text;
bc.CheckSum := chkCheckSum.Checked;
bc.Typ := TRMBarcodeType(cbType.ItemIndex);
Bmp := TBitmap.Create;
Bmp.Width := 16; Bmp.Height := 16;
if (bc.Text = '') or (bc.Text[1] <> '[') then
begin
try
bc.DrawBarcode(Bmp.Canvas);
except
MessageBox(0, PChar(RMLoadStr(SBarcodeError)), PChar(RMLoadStr(SError)),
mb_Ok + mb_IconError);
ModalResult := 0;
end;
end;
Bmp.Free;
end;
procedure TRMBarCodeForm.edtCodeChange(Sender: TObject);
begin
ShowSample;
end;
procedure TRMBarCodeForm.cbTypeChange(Sender: TObject);
begin
ShowSample;
end;
procedure TRMBarCodeForm.chkCheckSumClick(Sender: TObject);
begin
ShowSample;
end;
procedure TRMBarCodeForm.RB1Click(Sender: TObject);
begin
ShowSample;
end;
procedure TRMBarCodeForm.FormDestroy(Sender: TObject);
begin
FBarCode.Free;
end;
procedure TRMBarCodeForm.FormShow(Sender: TObject);
begin
ShowSample;
end;
procedure TRMBarCodeForm.SpeedButton1Click(Sender: TObject);
var
i: Integer;
begin
i := StrToInt(eZoom.Text);
Inc(i);
eZoom.Text := IntToStr(i);
end;
procedure TRMBarCodeForm.SpeedButton2Click(Sender: TObject);
var
i: Integer;
begin
i := StrToInt(eZoom.Text);
Dec(i);
if i <= 0 then i := 1;
eZoom.Text := IntToStr(i);
end;
procedure TRMBarCodeForm.Localize;
begin
Font.Name := RMLoadStr(SRMDefaultFontName);
Font.Size := StrToInt(RMLoadStr(SRMDefaultFontSize));
Font.Charset := StrToInt(RMLoadStr(SCharset));
Caption := RMLoadStr(rmRes + 650);
Label1.Caption := RMLoadStr(rmRes + 651);
Label2.Caption := RMLoadStr(rmRes + 652);
Label3.Caption := RMLoadStr(rmRes + 659);
GroupBox1.Caption := RMLoadStr(rmRes + 653);
chkCheckSum.Caption := RMLoadStr(rmRes + 654);
chkViewText.Caption := RMLoadStr(rmRes + 655);
DBBtn.Hint := RMLoadStr(rmRes + 656);
GroupBox2.Caption := RMLoadStr(rmRes + 658);
btnOk.Caption := RMLoadStr(SOk);
btnCancel.Caption := RMLoadStr(SCancel);
end;
initialization
RMRegisterObjectByRes(TRMBarCodeView, 'RM_BARCODEOBJECT', RMLoadStr(SInsBarcode), TRMBarCodeForm);
finalization
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?