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

📄 poscontrol.pas

📁 小票样式打印模板设计,和管家婆的pos收银系统小票样式设计差不多
💻 PAS
📖 第 1 页 / 共 3 页
字号:
  FSysVars.AddVar('行数','[@.行数]','');
  FSysVars.AddVar('开发商','[@.开发商]','');
end;

destructor TPosReport.Destroy;
begin
  FTitleVars.Free;
  FSysVars.Free;
  FFont.Free;
  inherited;
end;

function TPosReport.FilterVar(S: String;Out outS:String):Boolean;
Var
  I:integer;
begin
  OutS:=S;
  For I:=0 to FSysVars.Count-1 do
  begin
   OutS:=StringReplace(OutS,FSysVars.Items[I].Name,FSysVars.Items[I].Value,[rfReplaceAll{,rfIgnoreCase}]);
  end;
  For I:=0 To FTitleVars.Count-1 do
  begin
   OutS:=StringReplace(OutS,'[!.' + FTitleVars.Items[I].Name + ']',FTitleVars.Items[I].Value,[rfReplaceAll{,rfIgnoreCase}]);
  end;
  Result:=true;
end;

Function tPosReport.FilterFields(S:String;Row:integer;Out OutS:String):Boolean;
var
  I,J:integer;
begin
  OutS:=S;
  if (FBodyType=btGrid) and (Assigned(FGrid)) then
  begin
    For J:=0 to FGrid.ColCount-1 do
    begin
      OutS:=StringReplace(S,'[#.'+FGrid.Columns[J].Title.Caption +']',FGrid.Cells[J,Row],[rfReplaceAll]);
      S:=OutS;
    end;
  end;
  if (FBodyType=btDataSet) and (Assigned(FDataSet)) and (FDataSet.Active) then
  begin
    For J:=0 to FDataSet.Fields.Count-1 do
    begin
      OutS:=stringReplace(S,'[#.'+FDataSet.Fields[J].Name +']',FDataSet.Fields[J].AsString,[rfReplaceAll]);
      S:=OutS;
    end;
  end;
end;

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

function TPosReport.GetVarValue(VarType: char; VarName: String): String;
begin
  {由变量名及类型获取变量值}
  if VarType in ['@','!','#'] then
  begin
    if VarType='@' then    //系统变量
    begin
      InitSysValues;
      Result:=FSysVars.GetValueByCaption(VarName);
    end;
    if VarType='!' then
    begin
      Result:=VarName;
    end;
    if VarType='#' then
    begin
      Result:=VarName;
    end;

  end else
  begin
    Result:=VarName;
  end;
end;

function TPosReport.GetPrintData:TStringList;
var
  I,J,K:integer;
  RetS:String;
  BodyRow:Array of Integer;  //保存表体行数
  OutMemo:TStringList;
  Procedure GetBodyRow;
  Var
    I:integer;
    ArrayLen:integer;
  begin
    ArrayLen:=0;
    For I:=0 to FReportLines.Count-1 do
    begin
      if Pos('[#.',FReportLines[I])>0 then
      begin
         inc(ArrayLen);
         setLength(BodyRow,ArrayLen);
         BodyRow[ArrayLen-1]:=I;
      end;
    end;
  end;
begin
  OutMemo:=TStringList.Create;
  if not assigned(OutMemo) then exit;
  OutMemo.Clear;
  //OutMemo.Font.Assign(FFont);
  FilterVar(FReportLines.Text,RetS);      //表头及系统变量
  FReportLines.Text:=RetS;
  K:=0;
  while K<FReportLines.Count do
  begin
    if Pos('[#.',FReportLines[K])<=0 then
    begin
      OutMemo.Add(FReportLines[K]);
      inc(k);
    end else
    begin
      //如果是表格
      GetBodyRow;
      if (FBodyType=btGrid) and (Assigned(FGrid)) then
      begin
        For I:=FGrid.FixedRows to FGrid.RowCount-FGrid.FixedRows do
        begin
          For J:=BodyRow[low(BodyRow)] to BodyRow[High(BodyRow)] do
          begin
            FilterFields(FReportLines[J],I,RetS);
            if trim(RetS)<>'' then
              OutMemo.Add(RetS);
          end;
        end;
      end;
      //如果是记录集
      if (FBodyType=btDataSet) and (Assigned(FDataSet)) and (FDataSet.Active) then
      begin
        For I:=0 to FDataSet.RecordCount-1 do
        begin
          For J:=BodyRow[low(BodyRow)] to BodyRow[High(BodyRow)] do
          begin
            FilterFields(FReportLines[J],I,RetS);
            OutMemo.Add(RetS);
            if trim(RetS)<>'' then
              FDataSet.Next;
          end;
        end;
      end;
      K:=BodyRow[high(BodyRow)]+1;
    end;
  end;
  Result:=TStringList.Create;
  Result.Assign(OutMemo); 
  OutMemo.Free;
end;

Function TPosReport.PrintReport(OutMemo:TMemo):Boolean;
begin
  OutMemo.Font.Assign(Font);
  OutMemo.Lines.Assign(TStrings(GetPrintData));
  Result:=true;
end;

procedure TPosReport.InitSysValues;
begin
  FSysVars.SetValueByCaption('日期',FormatDateTime('YYYY-MM-DD',Now));
  FSysVars.SetValueByCaption('长日期',FormatDateTime('YYYY-MM-DD HH:MM:SS',Now));
  FSysVars.SetValueByCaption('时间',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;
  tmpPChar:Array[0..3000] of Char;
  J,charCount:integer;
begin
  if not fileExists(fileName) then exit;
  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(CharCount,sizeOf(CharCount));
      for J:=0 to CharCount-1 do
        Read(tmpPChar[J],1);
      tmpPChar[CharCount]:=#0;
      FComName:=strPas(tmpPChar);

      Read(FComByte,SizeOf(FComByte));

      Read(charCount,sizeOf(CharCount));
      For J:=0 to CharCount-1 do
        Read(tmpPChar[J],1);
      tmpPChar[CharCount]:=#0;
      FOpenBoxCode:=strPas(tmpPChar);

      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(CharCount,sizeOf(CharCount));
        for J:=0 to CharCount-1 do
          Read(tmpPChar[J],1);
        tmpPChar[CharCount]:=#0;
        FReportLines.Add(strPas(tmpPChar));
      end;
      Read(FFontSize,sizeOf(FFontSize));
    end;
    FOpenFlag:=True;
    FFilePathName:=FileName;
    FFont.Size:=FFontSize;
  Finally
    PosFile.Free;
  end;
end;


procedure TPosReport.SaveToFile(FileName: String);
var
  FileFlag:Word;
  PosFile:TFileStream;
  I:integer;
  RowCount:integer;
  tmpPChar:Array[0..3000] of Char;
  J,charCount:integer;
begin
  FFontSize:=FFont.Size;
  PosFile:=TFileStream.Create(FileName,fmOpenWrite Or fmCreate);
  try
    with PosFile do
    begin
      FileFlag:=FileVersion;
      Write(FileFlag,SizeOf(FileFlag));   //保存文件版本类型

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

      CharCount:=length(FComName);
      strPCopy(tmpPchar,FComName);
      write(CharCount,sizeOf(charCount));
      for J:=0 to CharCount-1 do
        Write(tmpPchar[J],1);

      Write(FComByte,SizeOf(FComByte));

      CharCount:=length(FOpenBoxCode);
      write(CharCount,sizeOf(CharCount));
      strPCopy(tmpPChar,FOpenBoxCode);
      For J:=0 to CharCount-1 do
        Write(TmpPChar[J],1);

      Write(FAutoOpenBox,SizeOf(FAutoOpenBox));
      Write(FFootSpaceRow,SizeOf(FFootSpaceRow));
      Write(FPageWidth,SizeOf(FPageWidth));
      Write(FTitleRowCount,SizeOf(FTitleRowCount));
      Write(FQuantityDiciaLength,SizeOf(FQuantityDiciaLength));
      Write(FMoneyDiciaLength,SizeOf(FMoneyDiciaLength));
      RowCount:=FReportLines.Count;
      Write(RowCount,SizeOf(RowCount));
      For I:=0 to RowCount-1 do
      begin
        CharCount:=length(FReportLines[i]);
        write(charCount,SizeOf(CharCount));
        strPCopy(tmpPChar,FReportLines[I]);
        For J:=0 to CharCount-1 do
          Write(tmpPChar[J],1);
      end;
      Write(FFontSize,sizeOf(FFontSize));
    end;
    FOpenFlag:=True;
    FFilePathName:=FileName;
  Finally
    PosFile.Free;
  end;
end;

procedure TPosReport.SetBodyFields(AValue: TDataSet);
begin
  FBodyType:=btDataSet;
  FDataSet:=AValue;
end;

procedure TPosReport.SetBodyFields(AValue: TYTXStringGridEh);
begin
  FBodyType:=btGrid;
  FGrid:=AValue;
end;

procedure TPosReport.SetTitleVars(TitleVars: TReportVars);
begin
  if FTitleVars<>TitleVars then
    FTitleVars:=TitleVars;
end;

procedure TPosReport.ShowVarList(VarType: TDataType;
  out ListFields: TListBox);
var
  I:integer;
  ListVars:TReportVars;
begin
  ListFields.Clear;
  if VarType<>DtBodyFields then  //系统及表头字段处理
  begin
    if VarType=DtSysFields then
      ListVars:=FSysVars;
    if VarType=DtTitleFields then
      ListVars:=FTitleVars;
    ListFields.Clear;
    if Assigned(ListVars) then
    begin
      for I:=0 to ListVars.ItemCount-1 do
      begin
        ListFields.Items.AddObject(ListVars.Items[i].Caption,TObject(ListVars.Items[i]));
      end;
    end;
  end else     //表体处理
  begin
    if (FBodyType=btGrid) and assigned(FGrid) then
    begin
      For I:=1 to FGrid.ColCount-1 do
      begin
        if FGrid.Columns[I].Visible then
        begin
          ListFields.Items.AddObject(FGrid.Columns[i].Title.Caption,TObject(FGrid.Columns[I]));
        end;
      end;
    end;
    if (FBodyType=btDataSet) and assigned(FDataSet) then
    begin
      if TDataSet(FDataSet).Fields[i].Visible then
      begin
        ListFields.Items.AddObject(TDataSet(FDataSet).Fields[I].DisplayName,TObject(TDataSet(FDataSet).Fields[I]));
      end;
    end;
  end;
end;



function TPosReport.GetFont: TFont;
begin
  Result:=FFont;  
end;

procedure TPosReport.SetFont(Value: TFont);
begin
  if FFont<>Value then
    FFont.Assign(Value); 
end;

function TPosReport.UpcaseCurrency(Value: extended): string;
begin
  Result:=CurrencyToStr(Value);
end;

{不用Windows驱动打印}
function TPosReport.PrintNoDrive(Source: TStringList): Boolean;
var
  PrtFile:TextFile;
  I:integer;
  Pstr:string;
  PHandle:THandle;
  FileHandle:integer;
begin
  try
    //查检端口是否可用
    PHandle:=Createfile(PChar(ComName),0,0,nil,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
    if PHandle=INVALID_HANDLE_VALUE then
    begin
        ShowMessage(ComName + ' 端口不可用,打印将被取消!');
        exit;
    end;
    //检查是否有打印机
    {filehandle:=fileopen(ComName,fmopenwrite);
    fileclose(filehandle);
    if filehandle>=0  then
    begin
      showmessage('在端口[' + ComName + ']上没有安装打印机,打印将被取消!');
      exit;
    end;}

    Assignfile(PrtFile,ComName);
    Rewrite(PrtFile);
    for I:=0 to Source.Count-1 do
    begin
      Pstr:=Source.Strings[I] + char(10); //打印的数量源
      write(PrtFile,Pstr);
    end;
    if AutoOpenBox then
    begin
      Rewrite(PrtFile);
      Write(PrtFile,OpenBoxCode);       //如果启用打印后开钱箱,则自动打开钱箱
    end;
    write(PrtFile,'众智金软 13668510783');
  except
    On E:Exception do
    begin
      showMessage(E.Message);
      Result:=false;
    end;
  end;
  CloseFile(PrtFile);
end;

function TPosReport.PrintWithDrive(Source: TStringList): boolean;
var
  txtWidth:integer;
  txtHeight:integer;
  Row:integer;
  RowHeight:Integer;
  PosY:integer;

⌨️ 快捷键说明

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