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

📄 printerrpt.pas

📁 是一款针对啤酒行业的销售进销存管理系统,包括基本的进货,销售,库存
💻 PAS
字号:
unit PrinterRpt;

interface
//调用Api函数库///
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, ComCtrls, Buttons, PicButton, DB, ADODB,Grids,
  COMObj,Quickrpt,QRExtra,common, QRCtrls;
///Summary简要说明/////////
///定义一个用语打印的类PrinterRpt.pas/////
/////显示打印报表//////////
 type
      TArrayInt=array of integer;
       /////建立水平线或者建立垂直线////
      ////<SUMMARY>
      ////</SUMMARY>
      function  Create_VLine(Sender: TWinControl; ALeft, ATop, AWidth,AHight: Integer): TQRShape;
       ////建立列标题///////////
      procedure Create_Title(Sender: TWinControl; ALeft, ATop, AWidth,AHight: Integer; ACaption: String; AAlignMent: TAlignment);
      procedure CreateList(sender:TObject;MyTable:TAdotable;ctrl:TControl;ColWidth,ColumnWidth:Array of Integer);
      function Create_QRDBText(Sender: TWinControl; ALeft, ATop, AWidth,AHight: Integer; AAlignMent: TAlignment): TQRDBText;
      ////设置数据库的表名//////
      procedure  SetTableName(TableName:string);
      ////设置报表的标题名称/////////
      Procedure  SetReportTitle(ReportTitleName:string);
      ////设置报表的每一列的标题//////
      Procedure  SetColumnTitle(ColumnTitle:TStringList);
      ////连接数据库以及表名/////////
      Procedure  LinkDataSource(MyTable:TADoTable);
      ////得到表的字段个数////
      Function   GetFieldCount(Table:TAdoTable):Integer;

      ////设置明细表格水平线宽度//////
      procedure  SetHorizontalLineWidth(LineWidth:integer);
      ////设置数值型字段的索引列////
      procedure  SetFieldColIndex(IndexCol:Array of Integer);
      /////设置第几列为数字列////////
      procedure  SetIntegerCol(bColumn:boolean);
var
  aReport : TCustomQuickRep;
  FTableName:string; ///存储报表的表名///
  FReportTitleName:string;///存储报表的标题////
  FColumnTitle:TStringList; ///存储列标题////
  FFieldCount:integer;  ////存储字段个数
  //FColumnWidth:Array of integer;
  FHorizLineWidth:integer;
  FIntegerCol:boolean;
implementation
function Create_QRDBText(Sender: TWinControl; ALeft, ATop, AWidth,AHight: Integer; AAlignMent: TAlignment): TQRDBText;
var
AQRDBText : TQRDBText;
begin
   AQRDBText := TQRDBText.Create(Nil);
   with AQRDBText do
   begin
        left:=Aleft;
        top:=Atop;
        width:=Awidth;
        height:=Ahight;
        Alignment:=AAlignment;
        //Font.Assign(Afont);
   end;
   Result := AQRDBText;
end;

//////实现建立列标题////////////
procedure Create_Title(Sender: TWinControl; ALeft, ATop, AWidth,AHight: Integer; ACaption: String; AAlignMent: TAlignment);
var
AQRLabel : TQRLabel;
begin
   AQRLabel := TQRLabel.Create(Nil);
   With AQRLabel do
   begin
        Parent:=sender;
        left:=Aleft;
        top:=Atop;
        Width:=Awidth;
        Height:=Ahight;
        Caption:=Acaption;
        Alignment:=AAlignment;
   end;
end;

////实现建立水平线或者垂直线/////
function  Create_VLine(Sender: TWinControl; ALeft, ATop, AWidth,AHight: Integer): TQRShape;
var
  AQRShapeV : TQRShape;
begin
  AQRShapeV:=TQRShape.Create(Nil);
  with AQRShapeV do
  begin
       Parent:=sender;
       left:=Aleft;
       top:=Atop;
       width:=Awidth;
       height:=Ahight;
  end;
  result:=AQRShapeV;
end;
////设置数据库的表名//////
Procedure  SetTableName(TableName:string);
begin
    FTableName:=Tablename;
end;
////设置报表的标题名称/////////
Procedure  SetReportTitle(ReportTitleName:string);
begin
    FReportTitleName:=ReportTitleName;
end;
////设置报表的每一列的标题//////
Procedure  SetColumnTitle(ColumnTitle:TStringList);
begin
    FColumnTitle:=TStringList.Create;
    FColumnTitle:=ColumnTitle;
end;
////连接数据库以及表名/////////
Procedure  LinkDataSource(MyTable:TADoTable);
begin
    MyTable := TAdoTable.Create(MyTable);
    /////连接数据库以及表名////
    with MyTable do
    begin
       ConnectionString:=ConnectToDatabase;
       TableName :=Ftablename;
       ReadOnly := True;
       Active := True;
    end;
    FFieldCount:=MyTable.FieldCount; 
end;
////得到表的字段个数////
Function   GetFieldCount(Table:TAdoTable):Integer;
begin
    LinkDataSource(Table);
    Result:=FFieldCount;
end;
////设置明细表格水平线宽度//////
procedure  SetHorizontalLineWidth(LineWidth:integer);
begin
    FHorizLineWidth:=LineWidth;
end;
////设置数值型字段的索引列////
procedure  SetFieldColIndex(IndexCol:Array of Integer);
begin
 
end;
/////设置第几列为数字列////////
procedure  SetIntegerCol(bColumn:boolean);
begin
    FIntegerCol:=bColumn;
end;
/////显示打印报表//////////
procedure CreateList(sender:TObject;MyTable:TAdotable;ctrl:TControl;ColWidth,ColumnWidth:Array of integer);
var
   SomeFields: TStringList;
   nIdx: integer;
   DisplayWidthx:Array of integer; ////画垂直线的left位置坐标
   LeftPos:Array of integer; ////显示内容的left位置的坐标
   TitleLeftPos:Array of integer; ///显示标题内容的left的位置坐标
begin
  try

   MyTable := TAdoTable.Create(MyTable);
    /////连接数据库以及表名////
    with MyTable  do
    begin
       ConnectionString:=ConnectToDatabase;
       TableName :=Ftablename;
       ReadOnly := True;
       Active := True;
    end;
    setlength(displayWidthx,FFieldCount); ////设置数组的长度
    setlength(leftPos,FFieldCount);
    setlength(TitleleftPos,FFieldCount);
    //showmessage(Inttostr(length(MyTable.FieldValues[mytable.Fields[2].DisplayName])));

  SomeFields := TStringList.Create;
  
  //////对报表进行设置////////
  areport := nil;

  ///用字符串列表存储字段名称
    displayWidthx[0]:=columnWidth[1];
    for nIdx := 1 to MyTable.FieldCount - 1 do
    begin
       displayWidthx[nIdx]:=displayWidthx[nIdx-1]+ColumnWidth[nIdx+1];
    end;
    /////设置输出内容的对齐位置///////
    leftPos[0]:=3;
     for nIdx := 0 to MyTable.FieldCount - 2 do
    begin
       if Mytable.Fields[nIdx].DataType=ftinteger then
       begin
          leftPos[nIdx+1]:=leftPos[nIdx]+ColumnWidth[nIdx+1]-10;
       end
       else
          leftPos[nIdx+1]:=leftPos[nIdx]+ColumnWidth[nIdx+1]+2;
    end;
     /////设置标题输出内容的对齐位置///////
     TitleleftPos[0]:=3;
     for nIdx := 0 to MyTable.FieldCount - 2 do
    begin
       if Mytable.Fields[nIdx].DataType=ftInteger then
       begin
          TitleleftPos[nIdx+1]:=TitleleftPos[nIdx]+ColumnWidth[nIdx+1]+2;
       end
       else
          TitleleftPos[nIdx+1]:=TitleleftPos[nIdx]+ColumnWidth[nIdx+1];
    end;
    //mytable.Fields[0].DisplayWidth:=14;
    for nIdx := 0 to MyTable.FieldCount - 1 do
    begin
        with MyTable.Fields[nIdx] do
        begin
            /////设置显示宽度////

            DisplayWidth:=colwidth[nIdx];
            /////设置显示标题/////
            //DisplayLabel:=FColumnTitle[nIdx];
        end;
    end;
  ///建立报表/////////
  QRCreateList(aReport, nil, MyTable, FReportTitleName, SomeFields);
  ///设置报表列的标题等属性/////////
  aReport.Bands.ColumnHeaderBand.Font.Style := [fsBold];
  //showmessage(inttostr(aReport.Bands.ColumnHeaderBand.Font.height));
  ////设置显示标题的位置//////
  for nIdx := 0 to aReport.Bands.ColumnHeaderBand.ControlCount -1 do
  begin
     if aReport.Bands.ColumnHeaderBand.Controls[nIdx] is TQRPrintable then
     begin
         Create_VLine(aReport.Bands.ColumnHeaderBand,1,-10,FHorizLineWidth,2);
         Create_VLine(aReport.Bands.ColumnHeaderBand,1,11,FHorizLineWidth,2);
         //Create_Title(aReport.Bands.ColumnHeaderBand,nIdx*70,-4,70,10,FColumnTitle[nIdx],taLeftJustify);
         with TQRPrintable(aReport.Bands.ColumnHeaderBand.Controls[nIdx]) do
         begin
            Left :=leftPos[nIdx];
            width:=0;//ColumnWidth[nIdx+1];
         end;
     end;
  end;
  /////设置列标题///////
  for nIdx := 0 to Mytable.FieldCount-1 do
  begin
      Create_Title(aReport.Bands.ColumnHeaderBand,TitleleftPos[nIdx],-4,ColumnWidth[nIdx+1],10,FColumnTitle[nIdx],taLeftJustify);
  end;
  ////设置显示内容的对齐方式//////////
  //showmessage('kk'+inttostr(aReport.Bands.DetailBand.FontSize));
  for nIdx := 0 to aReport.Bands.DetailBand.ControlCount-1 do
  begin
    if aReport.Bands.DetailBand.Controls[nIdx] is TQRPrintable then
    begin
       with TQRPrintable(aReport.Bands.DetailBand.Controls[nIdx] ) do
       begin
        //showmessage(IntTostr(leftPos[nIdx]));
        if FIntegerCol then
        begin
           if (nIdx=0) then
           begin
              Left :=leftPos[nIdx]-11;
           end
           else
              Left :=leftPos[nIdx];
        end
        else
           Left :=leftPos[nIdx];
        width:=ColumnWidth[nIdx+1];

       end;
    end;
  end;

  ////另一种显示数据内容的一种方式/////////
  for nIdx := 0 to Mytable.FieldCount-2 do
  begin
      //Create_VLine(aReport.Bands.DetailBand,1,15,FHorizLineWidth,1);
      //showmessage(IntToStr(displayWidthx[nIdx]));
       aReport.Bands.DetailBand.FontSize :=11;
      with Create_QRDBtext(aReport.Bands.DetailBand,leftPos[nidx]+2,6,ColumnWidth[nIdx+1],15,tacenter) do
      begin
           DataSet:=MyTable;
           DataField:=MyTable.Fields[nIdx].displayName;
      end;
      Create_VLine(aReport.Bands.DetailBand,displayWidthx[nIdx],-32,1,48);
  end;
  /////画明细表的水平线////////
  for nIdx := 0 to Mytable.FieldCount-2 do
  begin
      Create_VLine(aReport.Bands.DetailBand,1,15,FHorizLineWidth,2);
      //Create_VLine(aReport.Bands.DetailBand,((nIdx+1)*ColumnWidth[nIdx+1]),-32,1,48);
  end;
  //Create_VLine(aReport.Bands.DetailBand,1,48,FHorizLineWidth,1);
  Create_VLine(aReport.Bands.DetailBand,0,-32,2,48); ///画最左边的垂直线
  Create_VLine(aReport.Bands.DetailBand,FHorizLineWidth,-32,2,48); ///画最右边的垂直线
/////关于报表设置结束//////////
  if sender =ctrl then
  begin
     areport.preview;
  end;
  finally
   aReport.Free;
   myTable.Free;
   SomeFields.Free;
  end;
end;


end.///定义类结束

⌨️ 快捷键说明

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