⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 posprintex.~pas

📁 小票样式打印模板设计,和管家婆的pos收银系统小票样式设计差不多
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
unit PosPrintEx;

interface

uses
  SysUtils,Classes,Controls,stdCtrls,DB,GridsEh,DBGrideh,ytxStringGridEh,FrmPrintManUnit,FrmPreviewDlg;

const
  FileVersion=$AB71;
type
  TDriveMode=(DMNone,DMWindows);
  TDataType=(DtNone,DtTitleFields,DtBodyFields,DtSysFields);
  TBodyType=(btGrid,btDataSet);

  TReportVar=Class;
  TReportVars=Class;
  {表报主体}
  TPosReport = class(TComponent)
  private
    { Private declarations }
        {Private}
    FDriveMode:TDriveMode;        //驱动模式
    FComName:String;              //端口名称
    FComByte:Integer;             //波特率
    FOpenBoxCode:String;          //开钱箱指令
    FAutoOpenBox:Boolean;         //打印后自动开钱箱
    FFootSpaceRow:integer;        //走纸行数
    FPageWidth:Integer;           //页宽
    FTitleRowCount:integer;       //页头行数,用于换页加表头
    FQuantiyDiciaLength:integer;  //数量小数点长度
    FMoneyDiciaLength:integer;    //金额小数点长度

    FSysVars:TReportVars;         //系统变量
    FTitleVars:TReportVars;       //表头字段

    FPageNo:integer;                //页码
    FPageCount:integer;             //页数
    FDetailRowCount:integer;        //行数

    FBodyStartRow:integer;          //表体开始行数
    FBodyEndRow:integer;            //表体结束行数
    FStepRow:integer;               //表体占用行数

    FBodyType:TBodyType;           //表体类型

    FGrid:TYTXStringGridEh;
    FDataSet:TDataSet;
    FOpenFlag:Boolean;   //模板打开标示
    FFilePathName:String; //械板文件位置

    FReportLines:TStringList;
    FQuantityDiciaLength: integer;

    FrmDesign:TFrmPrintMan;
    FrmPreview:TFrmPreview;

    procedure CreateSysValues;
    procedure InitSysValues;
    Procedure SetTitleVars(TitleVars:TReportVars);
    Function GetTitleVars:TReportVars;
  protected
    { Protected declarations }
  public
    { Public declarations }
     Constructor Create(AOwner:TComponent);Override;
     Destructor Destroy;override;
     Procedure ShowVarList(VarType:TDataType;Out ListFields:TListBox);
     Procedure SetBodyFields(AValue:TYTXStringGridEh);overload;
     Procedure SetBodyFields(AValue:TDataSet);Overload;
     Procedure SaveToFile(FileName:String);
     Procedure LoadFromFile(FileName:String);
     Procedure ShowDesign;
     Procedure Print;
     Procedure PrintPreview;
  published
    { Published declarations }
    Property ReportVars:TReportVars Read GetTitleVars Write SetTitleVars;
    Property AutoOpenBox:boolean Read FAutoOpenBox Write FAutoOpenBox;
    Property OpenBoxCode:String Read FOpenBoxCode Write FOpenBoxCode;
    Property DriveMode:TDriveMode Read FDriveMode Write FDriveMode;
    Property ComName:String Read FComName Write FComName;
    Property ComByte:Integer Read FComByte Write FComByte;
    Property FootSpaceRow:Integer Read FFootSpaceRow Write FFootSpaceRow;
    Property PageWidth:integer Read FPageWidth Write FPageWidth;
    Property TitleRowCount:Integer Read FTitleRowCount Write FTitleRowCount;
    Property QuantityDicial:integer Read FQuantityDiciaLength Write FQuantityDiciaLength;
    Property MoneyDicial:integer Read FMoneyDiciaLength Write FMoneyDiciaLength;
    Property ReportLines:TStringList Read FReportLines Write FReportLines;
  end;

    {报表变量}
  TReportVar=Class(TCollectionItem)
  Private
    {Private}
    FVarName:String;
    FVarCaption:String;
    FVarValue:Variant;
    Procedure SetVarName(Value:String);
    Function GetVarName:String;
    Procedure SetVarCaption(Value:String);
    Function GetVarCaption:String;
    Procedure SetVarValue(Value:Variant);
    Function GetVarValue:Variant;
  Protected
    {Protected}
    procedure Assign(Source:TPersistent);override;
    function GetDisplayName: string; override;
    Function Index:integer;
  Public
    {Public}
    Constructor Create(ReportVars:TCollection);
  Published
    {Published}
    Property Name:String Read GetVarName Write SetVarName;
    Property Caption:String Read GetVarCaption Write SetVarCaption;
    Property Value:Variant Read GetVarValue Write SetVarValue;
  end;
    TReportVarClass=class of TReportVar;

  {报表变量集合}
  TReportVars=Class(TCollection)
  Private
    {Private}
    FPosReport:TPosReport;
    Function GetCount:integer;
    Function GetReportVar(Index:integer):TReportVar;
    Procedure SetReportVar(Index:integer;Value:TReportVar);
  protected
    {Protected}
    function GetOwner: TPersistent; override;
  Public
    {Public}
    Constructor Create(Report:TPosReport;ReportVarClass:TReportVarClass);
    Function Add:TReportVar;
    Procedure AddVar(ACaption,AName:String;Value:Variant);
    Procedure Clear;
    Function GetValueByName(VarName:String):Variant;
    Function GetValueByCaption(VarCaption:String):Variant;
    Function GetNameByCaption(Caption:String):String;
    Procedure SetValueByName(varName:String;Value:Variant);
    Procedure SetValueByCaption(varCaption:String;Value:Variant);
    Property Items[Index:integer]:TReportVar Read GetReportVar Write SetReportVar;default;
    Property PosReport:TPosReport Read FPosReport;
  Published
    {Published}
    Property ItemCount:integer Read GetCount;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('YtxReport', [TPosReport]);
end;

{ TPosReport }

constructor TPosReport.Create(AOwner: TComponent);
begin
  inherited;
  FAutoOpenBox:=false;
  FBodyEndRow:=0;
  FBodyStartRow:=0;
  FBodyType:=BtGrid;
  FComByte:=9600;
  FDataSet:=nil;
  FDetailRowCount:=0;
  FDriveMode:=dmNone;
  FFilePathName:='';
  FFootSpaceRow:=3;
  FGrid:=nil;
  FMoneyDiciaLength:=2;
  FOpenBoxCode:='Chr(27)+''p''+Chr(0)+Chr(60)+Chr(255)';
  FOpenFlag:=False;
  FPageCount:=0;
  FPageWidth:=53;
  FQuantityDiciaLength:=0;
  FStepRow:=0;
  FTitleRowCount:=0;
  FTitleVars:=TReportVars.Create(self,TReportVar);
  FSysVars:=TReportVars.Create(self,TReportVar);
  FReportLines:=TStringList.Create;
  FrmDesign:=TFrmPrintMan.Create(AOwner);
  FrmPreview:=TFrmPreview.Create(AOwner);
  CreateSysValues;   //添加系统变
end;

procedure TPosReport.CreateSysValues;
begin
  FSysVars.AddVar('日期时间','[@.长日期]','');
  FSysVars.AddVar('日期','[@.日期]','');
  FSysVars.AddVar('时间','[@.时间]','');
  FSysVars.AddVar('页码','[@.页码]','');
  FSysVars.AddVar('页数','[@.页数]','');
  FSysVars.AddVar('行数','[@.行数]','');
  FSysVars.AddVar('开发商','[@.开发商]','');
end;

destructor TPosReport.Destroy;
begin
  FTitleVars.Free;
  FSysVars.Free;
  FrmDesign.Free;
  FrmDesign:=nil;
  FrmPreview.Free;
  FrmPreview:=nil;
  inherited;
end;

function TPosReport.GetTitleVars: TReportVars;
begin
  if Assigned(FTitleVars) then
    Result:=FTitleVars;
end;

procedure TPosReport.InitSysValues;
begin
  FSysVars.SetValueByCaption('日期',FormatDateTime('YYYY-MM-DD',Now));
  FSysVars.SetValueByCaption('长时间',FormatDateTime('YYYY-MM-DD HH:MM:SS',Now));
  FSysVars.SetValueByName('时间',FormatDateTime('HH:MM:SS',now));
  FSysVars.SetValueByCaption('页码',intToStr(FPageNo));
  FSysVars.SetValueByCaption('页数',intToStr(FPageCount));
  FSysVars.SetValueByCaption('行数',intToStr(FDetailRowCount));
  FSysVars.SetValueByCaption('开发商','贵阳欣安博科技');
end;

procedure TPosReport.LoadFromFile(FileName: String);
var
  FileFlag:Word;
  PosFile:TFileStream;
  I:integer;
  RowCount:Integer;
  tmpLine:String;
begin
  PosFile:=TFileStream.Create(FileName,fmOpenRead);
  try
    with PosFile do
    begin
      Read(FileFlag,SizeOf(FileFlag));
      if FileFlag<>FileVersion then
      begin
        Raise Exception.Create('打开的文件不是有效的小票文件或已不支持该版本!');
        Exit;
      end;
      Read(FDriveMode,SizeOf(FDriveMode));
      Read(FComName,SizeOf(FComName));
      Read(FComByte,SizeOf(FComByte));
      Read(FOpenBoxCode,SizeOf(FOpenBoxCode));
      Read(FAutoOpenBox,SizeOf(FAutoOpenBox));
      Read(FFootSpaceRow,SizeOf(FFootSpaceRow));
      Read(FPageWidth,SizeOf(FPageWidth));
      Read(FTitleRowCount,SizeOf(FTitleRowCount));
      Read(FQuantityDiciaLength,SizeOf(FQuantityDiciaLength));
      Read(FMoneyDiciaLength,SizeOf(FMoneyDiciaLength));
      Read(RowCount,SizeOf(RowCount));
      FReportLines.Clear;
      For I:=0 to RowCount-1 do
      begin
        Read(tmpLine,SizeOf(tmpLine));
        FReportLines.Add(tmpLine);
      end;
    end;
    FOpenFlag:=True;
    FFilePathName:=FileName;
  Finally
    PosFile.Free;
  end;
end;

procedure TPosReport.Print;
begin

end;

procedure TPosReport.PrintPreview;
begin

end;

procedure TPosReport.SaveToFile(FileName: String);
var
  FileFlag:Word;
  PosFile:TFileStream;
  I:integer;
  RowCount:integer;
  tmpLine:String;
begin
  PosFile:=TFileStream.Create(FileName,fmOpenWrite Or fmCreate);
  try
    with PosFile do
    begin
      FileFlag:=FileVersion;
      Write(PosFile,SizeOf(PosFile));   //保存文件版本类型

      {保存小票参数}
      Write(FDriveMode,SizeOf(FDriveMode));
      Write(FComName,SizeOf(FComName));
      Write(FComByte,SizeOf(FComByte));
      Write(FOpenBoxCode,SizeOf(FOpenBoxCode));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -